From 45d78ff1dce1ceaccfba544804ef8e9fa3f35632 Mon Sep 17 00:00:00 2001 From: Castro0o Date: Sat, 23 May 2020 10:08:37 +0200 Subject: [PATCH 1/5] .gitignore updated --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index bdaab25..7d7ed5c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ env/ +env/* +venv/ +venv/* +.idea/ \ No newline at end of file -- 2.30.2 From c11d2ef55553b8ddc72ec7a77af77407149ef6bd Mon Sep 17 00:00:00 2001 From: Castro0o Date: Sat, 23 May 2020 10:10:01 +0200 Subject: [PATCH 2/5] correct requirements. stopped tracking venv --- requirements.txt | 138 +- venv/bin/activate | 76 - venv/bin/activate.csh | 37 - venv/bin/activate.fish | 75 - venv/bin/alembic | 10 - venv/bin/easy_install | 10 - venv/bin/easy_install-3.7 | 10 - venv/bin/flask | 10 - venv/bin/gunicorn | 10 - venv/bin/mako-render | 10 - venv/bin/pip | 10 - venv/bin/pip3 | 10 - venv/bin/pip3.7 | 10 - venv/bin/python | 1 - venv/bin/python3 | 1 - .../site/python3.7/greenlet/greenlet.h | 157 - .../Flask-1.1.1.dist-info/INSTALLER | 1 - .../Flask-1.1.1.dist-info/LICENSE.rst | 28 - .../Flask-1.1.1.dist-info/METADATA | 134 - .../Flask-1.1.1.dist-info/RECORD | 48 - .../site-packages/Flask-1.1.1.dist-info/WHEEL | 6 - .../Flask-1.1.1.dist-info/entry_points.txt | 3 - .../Flask-1.1.1.dist-info/top_level.txt | 1 - .../INSTALLER | 1 - .../LICENSE.rst | 28 - .../Flask_SQLAlchemy-2.4.1.dist-info/METADATA | 94 - .../Flask_SQLAlchemy-2.4.1.dist-info/RECORD | 14 - .../Flask_SQLAlchemy-2.4.1.dist-info/WHEEL | 6 - .../top_level.txt | 1 - .../Jinja2-2.11.1.dist-info/INSTALLER | 1 - .../Jinja2-2.11.1.dist-info/LICENSE.rst | 28 - .../Jinja2-2.11.1.dist-info/METADATA | 106 - .../Jinja2-2.11.1.dist-info/RECORD | 61 - .../Jinja2-2.11.1.dist-info/WHEEL | 6 - .../Jinja2-2.11.1.dist-info/entry_points.txt | 3 - .../Jinja2-2.11.1.dist-info/top_level.txt | 1 - .../Mako-1.1.2.dist-info/AUTHORS | 13 - .../Mako-1.1.2.dist-info/INSTALLER | 1 - .../Mako-1.1.2.dist-info/LICENSE | 19 - .../Mako-1.1.2.dist-info/METADATA | 82 - .../site-packages/Mako-1.1.2.dist-info/RECORD | 61 - .../site-packages/Mako-1.1.2.dist-info/WHEEL | 6 - .../Mako-1.1.2.dist-info/entry_points.txt | 20 - .../Mako-1.1.2.dist-info/top_level.txt | 1 - .../MarkupSafe-1.1.1.dist-info/INSTALLER | 1 - .../MarkupSafe-1.1.1.dist-info/LICENSE.rst | 28 - .../MarkupSafe-1.1.1.dist-info/METADATA | 103 - .../MarkupSafe-1.1.1.dist-info/RECORD | 16 - .../MarkupSafe-1.1.1.dist-info/WHEEL | 5 - .../MarkupSafe-1.1.1.dist-info/top_level.txt | 1 - .../SQLAlchemy-1.3.17.dist-info/INSTALLER | 1 - .../SQLAlchemy-1.3.17.dist-info/LICENSE | 19 - .../SQLAlchemy-1.3.17.dist-info/METADATA | 195 - .../SQLAlchemy-1.3.17.dist-info/RECORD | 405 - .../SQLAlchemy-1.3.17.dist-info/WHEEL | 5 - .../SQLAlchemy-1.3.17.dist-info/top_level.txt | 1 - .../Werkzeug-1.0.0.dist-info/INSTALLER | 1 - .../Werkzeug-1.0.0.dist-info/LICENSE.rst | 28 - .../Werkzeug-1.0.0.dist-info/METADATA | 127 - .../Werkzeug-1.0.0.dist-info/RECORD | 101 - .../Werkzeug-1.0.0.dist-info/WHEEL | 6 - .../Werkzeug-1.0.0.dist-info/top_level.txt | 1 - .../__pycache__/console_log.cpython-37.pyc | Bin 2922 -> 0 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 281 -> 0 bytes .../__pycache__/editor.cpython-37.pyc | Bin 2882 -> 0 bytes .../__pycache__/six.cpython-37.pyc | Bin 26832 -> 0 bytes .../alembic-1.4.2.dist-info/INSTALLER | 1 - .../alembic-1.4.2.dist-info/LICENSE | 19 - .../alembic-1.4.2.dist-info/METADATA | 138 - .../alembic-1.4.2.dist-info/RECORD | 123 - .../alembic-1.4.2.dist-info/WHEEL | 6 - .../alembic-1.4.2.dist-info/entry_points.txt | 3 - .../alembic-1.4.2.dist-info/top_level.txt | 1 - .../site-packages/alembic/__init__.py | 11 - .../__pycache__/__init__.cpython-37.pyc | Bin 391 -> 0 bytes .../__pycache__/command.cpython-37.pyc | Bin 15122 -> 0 bytes .../alembic/__pycache__/config.cpython-37.pyc | Bin 15022 -> 0 bytes .../__pycache__/context.cpython-37.pyc | Bin 263 -> 0 bytes .../alembic/__pycache__/op.cpython-37.pyc | Bin 246 -> 0 bytes .../alembic/autogenerate/__init__.py | 10 - .../__pycache__/__init__.cpython-37.pyc | Bin 567 -> 0 bytes .../__pycache__/api.cpython-37.pyc | Bin 12591 -> 0 bytes .../__pycache__/compare.cpython-37.pyc | Bin 24564 -> 0 bytes .../__pycache__/render.cpython-37.pyc | Bin 22431 -> 0 bytes .../__pycache__/rewriter.cpython-37.pyc | Bin 5616 -> 0 bytes .../site-packages/alembic/autogenerate/api.py | 513 - .../alembic/autogenerate/compare.py | 1209 -- .../alembic/autogenerate/render.py | 933 -- .../alembic/autogenerate/rewriter.py | 158 - .../site-packages/alembic/command.py | 611 - .../python3.7/site-packages/alembic/config.py | 581 - .../site-packages/alembic/context.py | 5 - .../site-packages/alembic/ddl/__init__.py | 6 - .../ddl/__pycache__/__init__.cpython-37.pyc | Bin 333 -> 0 bytes .../ddl/__pycache__/base.cpython-37.pyc | Bin 8143 -> 0 bytes .../ddl/__pycache__/impl.cpython-37.pyc | Bin 13794 -> 0 bytes .../ddl/__pycache__/mssql.cpython-37.pyc | Bin 7497 -> 0 bytes .../ddl/__pycache__/mysql.cpython-37.pyc | Bin 8226 -> 0 bytes .../ddl/__pycache__/oracle.cpython-37.pyc | Bin 3990 -> 0 bytes .../ddl/__pycache__/postgresql.cpython-37.pyc | Bin 13958 -> 0 bytes .../ddl/__pycache__/sqlite.cpython-37.pyc | Bin 3316 -> 0 bytes .../site-packages/alembic/ddl/base.py | 227 - .../site-packages/alembic/ddl/impl.py | 509 - .../site-packages/alembic/ddl/mssql.py | 273 - .../site-packages/alembic/ddl/mysql.py | 400 - .../site-packages/alembic/ddl/oracle.py | 123 - .../site-packages/alembic/ddl/postgresql.py | 528 - .../site-packages/alembic/ddl/sqlite.py | 136 - .../lib/python3.7/site-packages/alembic/op.py | 5 - .../alembic/operations/__init__.py | 7 - .../__pycache__/__init__.cpython-37.pyc | Bin 339 -> 0 bytes .../__pycache__/base.cpython-37.pyc | Bin 17795 -> 0 bytes .../__pycache__/batch.cpython-37.pyc | Bin 14147 -> 0 bytes .../operations/__pycache__/ops.cpython-37.pyc | Bin 75705 -> 0 bytes .../__pycache__/schemaobj.cpython-37.pyc | Bin 6087 -> 0 bytes .../__pycache__/toimpl.cpython-37.pyc | Bin 4609 -> 0 bytes .../site-packages/alembic/operations/base.py | 502 - .../site-packages/alembic/operations/batch.py | 532 - .../site-packages/alembic/operations/ops.py | 2472 ---- .../alembic/operations/schemaobj.py | 181 - .../alembic/operations/toimpl.py | 179 - .../site-packages/alembic/runtime/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 148 -> 0 bytes .../__pycache__/environment.cpython-37.pyc | Bin 37147 -> 0 bytes .../__pycache__/migration.cpython-37.pyc | Bin 35535 -> 0 bytes .../alembic/runtime/environment.py | 945 -- .../alembic/runtime/migration.py | 1239 -- .../site-packages/alembic/script/__init__.py | 4 - .../__pycache__/__init__.cpython-37.pyc | Bin 249 -> 0 bytes .../script/__pycache__/base.cpython-37.pyc | Bin 23500 -> 0 bytes .../__pycache__/revision.cpython-37.pyc | Bin 24549 -> 0 bytes .../__pycache__/write_hooks.cpython-37.pyc | Bin 2737 -> 0 bytes .../site-packages/alembic/script/base.py | 924 -- .../site-packages/alembic/script/revision.py | 1063 -- .../alembic/script/write_hooks.py | 113 - .../alembic/templates/generic/README | 1 - .../generic/__pycache__/env.cpython-37.pyc | Bin 1617 -> 0 bytes .../templates/generic/alembic.ini.mako | 85 - .../alembic/templates/generic/env.py | 77 - .../alembic/templates/generic/script.py.mako | 24 - .../alembic/templates/multidb/README | 1 - .../multidb/__pycache__/env.cpython-37.pyc | Bin 2659 -> 0 bytes .../templates/multidb/alembic.ini.mako | 90 - .../alembic/templates/multidb/env.py | 139 - .../alembic/templates/multidb/script.py.mako | 45 - .../alembic/templates/pylons/README | 1 - .../pylons/__pycache__/env.cpython-37.pyc | Bin 1898 -> 0 bytes .../alembic/templates/pylons/alembic.ini.mako | 51 - .../alembic/templates/pylons/env.py | 85 - .../alembic/templates/pylons/script.py.mako | 24 - .../site-packages/alembic/testing/__init__.py | 24 - .../__pycache__/__init__.cpython-37.pyc | Bin 1036 -> 0 bytes .../__pycache__/assertions.cpython-37.pyc | Bin 3158 -> 0 bytes .../testing/__pycache__/env.cpython-37.pyc | Bin 9139 -> 0 bytes .../__pycache__/exclusions.cpython-37.pyc | Bin 15594 -> 0 bytes .../fixture_functions.cpython-37.pyc | Bin 3244 -> 0 bytes .../__pycache__/fixtures.cpython-37.pyc | Bin 7875 -> 0 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 6746 -> 0 bytes .../testing/__pycache__/util.cpython-37.pyc | Bin 2972 -> 0 bytes .../alembic/testing/assertions.py | 112 - .../site-packages/alembic/testing/env.py | 506 - .../alembic/testing/exclusions.py | 484 - .../alembic/testing/fixture_functions.py | 79 - .../site-packages/alembic/testing/fixtures.py | 264 - .../alembic/testing/plugin/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 155 -> 0 bytes .../__pycache__/bootstrap.cpython-37.pyc | Bin 979 -> 0 bytes .../__pycache__/plugin_base.cpython-37.pyc | Bin 3506 -> 0 bytes .../__pycache__/pytestplugin.cpython-37.pyc | Bin 7145 -> 0 bytes .../alembic/testing/plugin/bootstrap.py | 35 - .../alembic/testing/plugin/plugin_base.py | 125 - .../alembic/testing/plugin/pytestplugin.py | 232 - .../alembic/testing/requirements.py | 159 - .../site-packages/alembic/testing/util.py | 97 - .../site-packages/alembic/util/__init__.py | 36 - .../util/__pycache__/__init__.cpython-37.pyc | Bin 1354 -> 0 bytes .../util/__pycache__/compat.cpython-37.pyc | Bin 9303 -> 0 bytes .../util/__pycache__/exc.cpython-37.pyc | Bin 303 -> 0 bytes .../__pycache__/langhelpers.cpython-37.pyc | Bin 10091 -> 0 bytes .../util/__pycache__/messaging.cpython-37.pyc | Bin 2503 -> 0 bytes .../util/__pycache__/pyfiles.cpython-37.pyc | Bin 2746 -> 0 bytes .../__pycache__/sqla_compat.cpython-37.pyc | Bin 8474 -> 0 bytes .../site-packages/alembic/util/compat.py | 371 - .../site-packages/alembic/util/exc.py | 2 - .../site-packages/alembic/util/langhelpers.py | 320 - .../site-packages/alembic/util/messaging.py | 101 - .../site-packages/alembic/util/pyfiles.py | 107 - .../site-packages/alembic/util/sqla_compat.py | 305 - .../click-7.1.1.dist-info/INSTALLER | 1 - .../click-7.1.1.dist-info/LICENSE.rst | 28 - .../click-7.1.1.dist-info/METADATA | 102 - .../click-7.1.1.dist-info/RECORD | 40 - .../site-packages/click-7.1.1.dist-info/WHEEL | 6 - .../click-7.1.1.dist-info/top_level.txt | 1 - .../python3.7/site-packages/click/__init__.py | 79 - .../click/__pycache__/__init__.cpython-37.pyc | Bin 2695 -> 0 bytes .../__pycache__/_bashcomplete.cpython-37.pyc | Bin 9937 -> 0 bytes .../click/__pycache__/_compat.cpython-37.pyc | Bin 18586 -> 0 bytes .../__pycache__/_termui_impl.cpython-37.pyc | Bin 14136 -> 0 bytes .../__pycache__/_textwrap.cpython-37.pyc | Bin 1298 -> 0 bytes .../__pycache__/_unicodefun.cpython-37.pyc | Bin 3270 -> 0 bytes .../__pycache__/_winconsole.cpython-37.pyc | Bin 9365 -> 0 bytes .../click/__pycache__/core.cpython-37.pyc | Bin 61732 -> 0 bytes .../__pycache__/decorators.cpython-37.pyc | Bin 11630 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 9030 -> 0 bytes .../__pycache__/formatting.cpython-37.pyc | Bin 8661 -> 0 bytes .../click/__pycache__/globals.cpython-37.pyc | Bin 1832 -> 0 bytes .../click/__pycache__/parser.cpython-37.pyc | Bin 11746 -> 0 bytes .../click/__pycache__/termui.cpython-37.pyc | Bin 21507 -> 0 bytes .../click/__pycache__/testing.cpython-37.pyc | Bin 11634 -> 0 bytes .../click/__pycache__/types.cpython-37.pyc | Bin 22374 -> 0 bytes .../click/__pycache__/utils.cpython-37.pyc | Bin 15441 -> 0 bytes .../site-packages/click/_bashcomplete.py | 375 - .../python3.7/site-packages/click/_compat.py | 790 -- .../site-packages/click/_termui_impl.py | 661 - .../site-packages/click/_textwrap.py | 37 - .../site-packages/click/_unicodefun.py | 131 - .../site-packages/click/_winconsole.py | 370 - .../lib/python3.7/site-packages/click/core.py | 2030 --- .../site-packages/click/decorators.py | 333 - .../site-packages/click/exceptions.py | 253 - .../site-packages/click/formatting.py | 283 - .../python3.7/site-packages/click/globals.py | 47 - .../python3.7/site-packages/click/parser.py | 428 - .../python3.7/site-packages/click/termui.py | 681 - .../python3.7/site-packages/click/testing.py | 382 - .../python3.7/site-packages/click/types.py | 762 -- .../python3.7/site-packages/click/utils.py | 455 - .../DESCRIPTION.rst | 76 - .../console_log-0.2.10.dist-info/INSTALLER | 1 - .../console_log-0.2.10.dist-info/METADATA | 95 - .../console_log-0.2.10.dist-info/RECORD | 9 - .../console_log-0.2.10.dist-info/WHEEL | 6 - .../metadata.json | 1 - .../top_level.txt | 1 - .../python3.7/site-packages/console_log.py | 105 - .../dataset-1.3.1.dist-info/INSTALLER | 1 - .../dataset-1.3.1.dist-info/LICENSE.txt | 21 - .../dataset-1.3.1.dist-info/METADATA | 50 - .../dataset-1.3.1.dist-info/RECORD | 19 - .../dataset-1.3.1.dist-info/WHEEL | 6 - .../namespace_packages.txt | 1 - .../dataset-1.3.1.dist-info/top_level.txt | 1 - .../site-packages/dataset/__init__.py | 47 - .../__pycache__/__init__.cpython-37.pyc | Bin 2231 -> 0 bytes .../__pycache__/chunked.cpython-37.pyc | Bin 3664 -> 0 bytes .../__pycache__/database.cpython-37.pyc | Bin 9743 -> 0 bytes .../dataset/__pycache__/table.cpython-37.pyc | Bin 22918 -> 0 bytes .../dataset/__pycache__/types.cpython-37.pyc | Bin 1665 -> 0 bytes .../dataset/__pycache__/util.cpython-37.pyc | Bin 3872 -> 0 bytes .../site-packages/dataset/chunked.py | 85 - .../site-packages/dataset/database.py | 273 - .../python3.7/site-packages/dataset/table.py | 719 -- .../python3.7/site-packages/dataset/types.py | 49 - .../python3.7/site-packages/dataset/util.py | 124 - .../site-packages/dateutil/__init__.py | 8 - .../__pycache__/__init__.cpython-37.pyc | Bin 350 -> 0 bytes .../__pycache__/_common.cpython-37.pyc | Bin 1374 -> 0 bytes .../__pycache__/_version.cpython-37.pyc | Bin 166 -> 0 bytes .../__pycache__/easter.cpython-37.pyc | Bin 2167 -> 0 bytes .../__pycache__/relativedelta.cpython-37.pyc | Bin 15121 -> 0 bytes .../dateutil/__pycache__/rrule.cpython-37.pyc | Bin 43318 -> 0 bytes .../dateutil/__pycache__/tzwin.cpython-37.pyc | Bin 169 -> 0 bytes .../dateutil/__pycache__/utils.cpython-37.pyc | Bin 2221 -> 0 bytes .../site-packages/dateutil/_common.py | 43 - .../site-packages/dateutil/_version.py | 4 - .../site-packages/dateutil/easter.py | 89 - .../site-packages/dateutil/parser/__init__.py | 61 - .../__pycache__/__init__.cpython-37.pyc | Bin 2055 -> 0 bytes .../parser/__pycache__/_parser.cpython-37.pyc | Bin 40026 -> 0 bytes .../__pycache__/isoparser.cpython-37.pyc | Bin 11102 -> 0 bytes .../site-packages/dateutil/parser/_parser.py | 1609 --- .../dateutil/parser/isoparser.py | 411 - .../site-packages/dateutil/relativedelta.py | 599 - .../python3.7/site-packages/dateutil/rrule.py | 1735 --- .../site-packages/dateutil/tz/__init__.py | 12 - .../tz/__pycache__/__init__.cpython-37.pyc | Bin 663 -> 0 bytes .../tz/__pycache__/_common.cpython-37.pyc | Bin 12219 -> 0 bytes .../tz/__pycache__/_factories.cpython-37.pyc | Bin 2860 -> 0 bytes .../dateutil/tz/__pycache__/tz.cpython-37.pyc | Bin 45235 -> 0 bytes .../tz/__pycache__/win.cpython-37.pyc | Bin 11073 -> 0 bytes .../site-packages/dateutil/tz/_common.py | 419 - .../site-packages/dateutil/tz/_factories.py | 80 - .../python3.7/site-packages/dateutil/tz/tz.py | 1849 --- .../site-packages/dateutil/tz/win.py | 370 - .../python3.7/site-packages/dateutil/tzwin.py | 2 - .../python3.7/site-packages/dateutil/utils.py | 71 - .../dateutil/zoneinfo/__init__.py | 167 - .../__pycache__/__init__.cpython-37.pyc | Bin 5597 -> 0 bytes .../__pycache__/rebuild.cpython-37.pyc | Bin 1870 -> 0 bytes .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 153315 -> 0 bytes .../dateutil/zoneinfo/rebuild.py | 53 - .../python3.7/site-packages/easy_install.py | 5 - venv/lib/python3.7/site-packages/editor.py | 133 - .../python3.7/site-packages/flask/__init__.py | 60 - .../python3.7/site-packages/flask/__main__.py | 15 - .../flask/__pycache__/__init__.cpython-37.pyc | Bin 2092 -> 0 bytes .../flask/__pycache__/__main__.cpython-37.pyc | Bin 384 -> 0 bytes .../flask/__pycache__/_compat.cpython-37.pyc | Bin 4589 -> 0 bytes .../flask/__pycache__/app.cpython-37.pyc | Bin 74529 -> 0 bytes .../__pycache__/blueprints.cpython-37.pyc | Bin 22894 -> 0 bytes .../flask/__pycache__/cli.cpython-37.pyc | Bin 26171 -> 0 bytes .../flask/__pycache__/config.cpython-37.pyc | Bin 10129 -> 0 bytes .../flask/__pycache__/ctx.cpython-37.pyc | Bin 14290 -> 0 bytes .../__pycache__/debughelpers.cpython-37.pyc | Bin 6550 -> 0 bytes .../flask/__pycache__/globals.cpython-37.pyc | Bin 1696 -> 0 bytes .../flask/__pycache__/helpers.cpython-37.pyc | Bin 34480 -> 0 bytes .../flask/__pycache__/logging.cpython-37.pyc | Bin 3091 -> 0 bytes .../flask/__pycache__/sessions.cpython-37.pyc | Bin 12188 -> 0 bytes .../flask/__pycache__/signals.cpython-37.pyc | Bin 2369 -> 0 bytes .../__pycache__/templating.cpython-37.pyc | Bin 4948 -> 0 bytes .../flask/__pycache__/testing.cpython-37.pyc | Bin 8655 -> 0 bytes .../flask/__pycache__/views.cpython-37.pyc | Bin 4770 -> 0 bytes .../flask/__pycache__/wrappers.cpython-37.pyc | Bin 4256 -> 0 bytes .../python3.7/site-packages/flask/_compat.py | 145 - venv/lib/python3.7/site-packages/flask/app.py | 2466 ---- .../site-packages/flask/blueprints.py | 569 - venv/lib/python3.7/site-packages/flask/cli.py | 970 -- .../python3.7/site-packages/flask/config.py | 269 - venv/lib/python3.7/site-packages/flask/ctx.py | 475 - .../site-packages/flask/debughelpers.py | 183 - .../python3.7/site-packages/flask/globals.py | 62 - .../python3.7/site-packages/flask/helpers.py | 1153 -- .../site-packages/flask/json/__init__.py | 376 - .../json/__pycache__/__init__.cpython-37.pyc | Bin 11542 -> 0 bytes .../flask/json/__pycache__/tag.cpython-37.pyc | Bin 11069 -> 0 bytes .../python3.7/site-packages/flask/json/tag.py | 309 - .../python3.7/site-packages/flask/logging.py | 109 - .../python3.7/site-packages/flask/sessions.py | 388 - .../python3.7/site-packages/flask/signals.py | 65 - .../site-packages/flask/templating.py | 155 - .../python3.7/site-packages/flask/testing.py | 283 - .../python3.7/site-packages/flask/views.py | 163 - .../python3.7/site-packages/flask/wrappers.py | 137 - .../flask_sqlalchemy/__init__.py | 1071 -- .../__pycache__/__init__.cpython-37.pyc | Bin 35311 -> 0 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 1134 -> 0 bytes .../__pycache__/model.cpython-37.pyc | Bin 4590 -> 0 bytes .../__pycache__/utils.cpython-37.pyc | Bin 1429 -> 0 bytes .../site-packages/flask_sqlalchemy/_compat.py | 44 - .../site-packages/flask_sqlalchemy/model.py | 154 - .../site-packages/flask_sqlalchemy/utils.py | 45 - .../gevent-20.5.0.dist-info/AUTHORS | 62 - .../gevent-20.5.0.dist-info/INSTALLER | 1 - .../gevent-20.5.0.dist-info/LICENSE | 25 - .../gevent-20.5.0.dist-info/METADATA | 311 - .../gevent-20.5.0.dist-info/NOTICE | 94 - .../gevent-20.5.0.dist-info/RECORD | 534 - .../gevent-20.5.0.dist-info/WHEEL | 5 - .../gevent-20.5.0.dist-info/entry_points.txt | 3 - .../gevent-20.5.0.dist-info/top_level.txt | 1 - ...inkable.cpython-37m-arm-linux-gnueabihf.so | Bin 410840 -> 0 bytes ...mitives.cpython-37m-arm-linux-gnueabihf.so | Bin 323876 -> 0 bytes ...b_local.cpython-37m-arm-linux-gnueabihf.so | Bin 216008 -> 0 bytes ...mitives.cpython-37m-arm-linux-gnueabihf.so | Bin 645172 -> 0 bytes ...__ident.cpython-37m-arm-linux-gnueabihf.so | Bin 213032 -> 0 bytes .../__imap.cpython-37m-arm-linux-gnueabihf.so | Bin 432812 -> 0 bytes .../site-packages/gevent/__init__.py | 128 - .../__pycache__/__init__.cpython-37.pyc | Bin 2482 -> 0 bytes .../_abstract_linkable.cpython-37.pyc | Bin 4045 -> 0 bytes .../gevent/__pycache__/_compat.cpython-37.pyc | Bin 5211 -> 0 bytes .../gevent/__pycache__/_config.cpython-37.pyc | Bin 20573 -> 0 bytes .../_fileobjectcommon.cpython-37.pyc | Bin 15034 -> 0 bytes .../_fileobjectposix.cpython-37.pyc | Bin 9782 -> 0 bytes .../_greenlet_primitives.cpython-37.pyc | Bin 2811 -> 0 bytes .../__pycache__/_hub_local.cpython-37.pyc | Bin 2734 -> 0 bytes .../_hub_primitives.cpython-37.pyc | Bin 11925 -> 0 bytes .../gevent/__pycache__/_ident.cpython-37.pyc | Bin 2051 -> 0 bytes .../gevent/__pycache__/_imap.cpython-37.pyc | Bin 6141 -> 0 bytes .../__pycache__/_interfaces.cpython-37.pyc | Bin 8994 -> 0 bytes .../__pycache__/_monitor.cpython-37.pyc | Bin 7990 -> 0 bytes .../__pycache__/_patcher.cpython-37.pyc | Bin 6708 -> 0 bytes .../__pycache__/_semaphore.cpython-37.pyc | Bin 7706 -> 0 bytes .../__pycache__/_socket2.cpython-37.pyc | Bin 12799 -> 0 bytes .../__pycache__/_socket3.cpython-37.pyc | Bin 20699 -> 0 bytes .../__pycache__/_socketcommon.cpython-37.pyc | Bin 9097 -> 0 bytes .../gevent/__pycache__/_ssl2.cpython-37.pyc | Bin 11223 -> 0 bytes .../gevent/__pycache__/_ssl3.cpython-37.pyc | Bin 19758 -> 0 bytes .../__pycache__/_sslgte279.cpython-37.pyc | Bin 18495 -> 0 bytes .../gevent/__pycache__/_tblib.cpython-37.pyc | Bin 10006 -> 0 bytes .../__pycache__/_threading.cpython-37.pyc | Bin 4530 -> 0 bytes .../gevent/__pycache__/_tracer.cpython-37.pyc | Bin 4779 -> 0 bytes .../gevent/__pycache__/_util.cpython-37.pyc | Bin 8337 -> 0 bytes .../__pycache__/_util_py2.cpython-37.pyc | Bin 611 -> 0 bytes .../gevent/__pycache__/_waiter.cpython-37.pyc | Bin 6775 -> 0 bytes .../gevent/__pycache__/ares.cpython-37.pyc | Bin 376 -> 0 bytes .../__pycache__/backdoor.cpython-37.pyc | Bin 7676 -> 0 bytes .../__pycache__/baseserver.cpython-37.pyc | Bin 12486 -> 0 bytes .../__pycache__/builtins.cpython-37.pyc | Bin 2674 -> 0 bytes .../__pycache__/contextvars.cpython-37.pyc | Bin 8857 -> 0 bytes .../gevent/__pycache__/core.cpython-37.pyc | Bin 529 -> 0 bytes .../gevent/__pycache__/event.cpython-37.pyc | Bin 14053 -> 0 bytes .../gevent/__pycache__/events.cpython-37.pyc | Bin 15920 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 3738 -> 0 bytes .../__pycache__/fileobject.cpython-37.pyc | Bin 2857 -> 0 bytes .../__pycache__/greenlet.cpython-37.pyc | Bin 31646 -> 0 bytes .../gevent/__pycache__/hub.cpython-37.pyc | Bin 20731 -> 0 bytes .../gevent/__pycache__/local.cpython-37.pyc | Bin 12726 -> 0 bytes .../gevent/__pycache__/lock.cpython-37.pyc | Bin 8950 -> 0 bytes .../gevent/__pycache__/monkey.cpython-37.pyc | Bin 32736 -> 0 bytes .../gevent/__pycache__/os.cpython-37.pyc | Bin 13630 -> 0 bytes .../gevent/__pycache__/pool.cpython-37.pyc | Bin 23938 -> 0 bytes .../gevent/__pycache__/pywsgi.cpython-37.pyc | Bin 38051 -> 0 bytes .../gevent/__pycache__/queue.cpython-37.pyc | Bin 20959 -> 0 bytes .../__pycache__/resolver_ares.cpython-37.pyc | Bin 571 -> 0 bytes .../resolver_thread.cpython-37.pyc | Bin 587 -> 0 bytes .../gevent/__pycache__/select.cpython-37.pyc | Bin 7863 -> 0 bytes .../gevent/__pycache__/server.cpython-37.pyc | Bin 8460 -> 0 bytes .../gevent/__pycache__/signal.cpython-37.pyc | Bin 4029 -> 0 bytes .../gevent/__pycache__/socket.cpython-37.pyc | Bin 2946 -> 0 bytes .../gevent/__pycache__/ssl.cpython-37.pyc | Bin 879 -> 0 bytes .../__pycache__/subprocess.cpython-37.pyc | Bin 39279 -> 0 bytes .../gevent/__pycache__/thread.cpython-37.pyc | Bin 3028 -> 0 bytes .../__pycache__/threading.cpython-37.pyc | Bin 5329 -> 0 bytes .../__pycache__/threadpool.cpython-37.pyc | Bin 21017 -> 0 bytes .../gevent/__pycache__/time.cpython-37.pyc | Bin 529 -> 0 bytes .../gevent/__pycache__/timeout.cpython-37.pyc | Bin 11009 -> 0 bytes .../gevent/__pycache__/util.cpython-37.pyc | Bin 19299 -> 0 bytes .../__pycache__/win32util.cpython-37.pyc | Bin 2633 -> 0 bytes ...maphore.cpython-37m-arm-linux-gnueabihf.so | Bin 417204 -> 0 bytes ..._tracer.cpython-37m-arm-linux-gnueabihf.so | Bin 432504 -> 0 bytes ..._waiter.cpython-37m-arm-linux-gnueabihf.so | Bin 379012 -> 0 bytes .../gevent/_abstract_linkable.py | 218 - .../python3.7/site-packages/gevent/_compat.py | 225 - .../python3.7/site-packages/gevent/_config.py | 701 -- .../_event.cpython-37m-arm-linux-gnueabihf.so | Bin 476656 -> 0 bytes .../site-packages/gevent/_ffi/__init__.py | 27 - .../_ffi/__pycache__/__init__.cpython-37.pyc | Bin 762 -> 0 bytes .../_ffi/__pycache__/callback.cpython-37.pyc | Bin 1457 -> 0 bytes .../_ffi/__pycache__/loop.cpython-37.pyc | Bin 17873 -> 0 bytes .../_ffi/__pycache__/watcher.cpython-37.pyc | Bin 18782 -> 0 bytes .../site-packages/gevent/_ffi/callback.py | 52 - .../site-packages/gevent/_ffi/loop.py | 774 -- .../site-packages/gevent/_ffi/watcher.py | 635 - .../site-packages/gevent/_fileobjectcommon.py | 554 - .../site-packages/gevent/_fileobjectposix.py | 323 - ...reenlet.cpython-37m-arm-linux-gnueabihf.so | Bin 1191564 -> 0 bytes .../gevent/_greenlet_primitives.py | 132 - .../site-packages/gevent/_hub_local.py | 101 - .../site-packages/gevent/_hub_primitives.py | 427 - .../python3.7/site-packages/gevent/_ident.py | 82 - .../python3.7/site-packages/gevent/_imap.py | 226 - .../site-packages/gevent/_interfaces.py | 243 - .../_local.cpython-37m-arm-linux-gnueabihf.so | Bin 630436 -> 0 bytes .../site-packages/gevent/_monitor.py | 311 - .../site-packages/gevent/_patcher.py | 235 - .../_queue.cpython-37m-arm-linux-gnueabihf.so | Bin 1088588 -> 0 bytes .../site-packages/gevent/_semaphore.py | 224 - .../site-packages/gevent/_socket2.py | 493 - .../site-packages/gevent/_socket3.py | 798 -- .../site-packages/gevent/_socketcommon.py | 431 - .../python3.7/site-packages/gevent/_ssl2.py | 437 - .../python3.7/site-packages/gevent/_ssl3.py | 784 -- .../site-packages/gevent/_sslgte279.py | 728 -- .../python3.7/site-packages/gevent/_tblib.py | 476 - .../site-packages/gevent/_threading.py | 160 - .../python3.7/site-packages/gevent/_tracer.py | 179 - .../python3.7/site-packages/gevent/_util.py | 302 - .../site-packages/gevent/_util_py2.py | 23 - .../python3.7/site-packages/gevent/_waiter.py | 204 - .../python3.7/site-packages/gevent/ares.py | 10 - .../site-packages/gevent/backdoor.py | 263 - .../site-packages/gevent/baseserver.py | 440 - .../site-packages/gevent/builtins.py | 135 - .../site-packages/gevent/contextvars.py | 336 - .../python3.7/site-packages/gevent/core.py | 20 - .../python3.7/site-packages/gevent/event.py | 374 - .../python3.7/site-packages/gevent/events.py | 483 - .../site-packages/gevent/exceptions.py | 102 - .../site-packages/gevent/fileobject.py | 85 - .../site-packages/gevent/greenlet.py | 1131 -- .../lib/python3.7/site-packages/gevent/hub.py | 786 -- .../site-packages/gevent/libev/__init__.py | 7 - .../libev/__pycache__/__init__.cpython-37.pyc | Bin 277 -> 0 bytes .../_corecffi_build.cpython-37.pyc | Bin 1904 -> 0 bytes .../libev/__pycache__/corecffi.cpython-37.pyc | Bin 12941 -> 0 bytes .../libev/__pycache__/watcher.cpython-37.pyc | Bin 8909 -> 0 bytes .../gevent/libev/_corecffi.abi3.so | Bin 329016 -> 0 bytes .../gevent/libev/_corecffi_build.py | 125 - ...orecext.cpython-37m-arm-linux-gnueabihf.so | Bin 1528084 -> 0 bytes .../site-packages/gevent/libev/corecffi.py | 447 - .../site-packages/gevent/libev/watcher.py | 286 - .../site-packages/gevent/libuv/__init__.py | 7 - .../libuv/__pycache__/__init__.cpython-37.pyc | Bin 277 -> 0 bytes .../_corecffi_build.cpython-37.pyc | Bin 5315 -> 0 bytes .../libuv/__pycache__/loop.cpython-37.pyc | Bin 12380 -> 0 bytes .../libuv/__pycache__/watcher.cpython-37.pyc | Bin 18436 -> 0 bytes .../gevent/libuv/_corecffi.abi3.so | Bin 981460 -> 0 bytes .../gevent/libuv/_corecffi_build.py | 295 - .../site-packages/gevent/libuv/loop.py | 673 - .../site-packages/gevent/libuv/watcher.py | 745 -- .../python3.7/site-packages/gevent/local.py | 605 - .../python3.7/site-packages/gevent/lock.py | 304 - .../python3.7/site-packages/gevent/monkey.py | 1291 -- venv/lib/python3.7/site-packages/gevent/os.py | 543 - .../python3.7/site-packages/gevent/pool.py | 677 - .../python3.7/site-packages/gevent/pywsgi.py | 1541 --- .../python3.7/site-packages/gevent/queue.py | 697 -- .../site-packages/gevent/resolver/__init__.py | 277 - .../__pycache__/__init__.cpython-37.pyc | Bin 7011 -> 0 bytes .../__pycache__/_addresses.cpython-37.pyc | Bin 2943 -> 0 bytes .../__pycache__/_hostsfile.cpython-37.pyc | Bin 2829 -> 0 bytes .../resolver/__pycache__/ares.cpython-37.pyc | Bin 9314 -> 0 bytes .../__pycache__/blocking.cpython-37.pyc | Bin 1502 -> 0 bytes .../__pycache__/dnspython.cpython-37.pyc | Bin 11100 -> 0 bytes .../__pycache__/thread.cpython-37.pyc | Bin 2777 -> 0 bytes .../gevent/resolver/_addresses.py | 164 - .../gevent/resolver/_hostsfile.py | 145 - .../site-packages/gevent/resolver/ares.py | 339 - .../site-packages/gevent/resolver/blocking.py | 45 - .../cares.cpython-37m-arm-linux-gnueabihf.so | Bin 1334532 -> 0 bytes .../gevent/resolver/dnspython.py | 497 - .../site-packages/gevent/resolver/thread.py | 69 - .../site-packages/gevent/resolver_ares.py | 17 - .../site-packages/gevent/resolver_thread.py | 17 - .../python3.7/site-packages/gevent/select.py | 388 - .../python3.7/site-packages/gevent/server.py | 314 - .../python3.7/site-packages/gevent/signal.py | 142 - .../python3.7/site-packages/gevent/socket.py | 129 - .../lib/python3.7/site-packages/gevent/ssl.py | 35 - .../site-packages/gevent/subprocess.py | 1824 --- .../site-packages/gevent/testing/__init__.py | 171 - .../__pycache__/__init__.cpython-37.pyc | Bin 4124 -> 0 bytes .../__pycache__/errorhandler.cpython-37.pyc | Bin 1149 -> 0 bytes .../__pycache__/exception.cpython-37.pyc | Bin 486 -> 0 bytes .../testing/__pycache__/flaky.cpython-37.pyc | Bin 2987 -> 0 bytes .../testing/__pycache__/hub.cpython-37.pyc | Bin 1025 -> 0 bytes .../__pycache__/leakcheck.cpython-37.pyc | Bin 4941 -> 0 bytes .../__pycache__/modules.cpython-37.pyc | Bin 2546 -> 0 bytes .../__pycache__/monkey_test.cpython-37.pyc | Bin 2036 -> 0 bytes .../__pycache__/openfiles.cpython-37.pyc | Bin 4264 -> 0 bytes .../testing/__pycache__/params.cpython-37.pyc | Bin 779 -> 0 bytes .../patched_tests_setup.cpython-37.pyc | Bin 27079 -> 0 bytes .../__pycache__/resources.cpython-37.pyc | Bin 3134 -> 0 bytes .../testing/__pycache__/six.cpython-37.pyc | Bin 1001 -> 0 bytes .../__pycache__/skipping.cpython-37.pyc | Bin 3599 -> 0 bytes .../__pycache__/sockets.cpython-37.pyc | Bin 1291 -> 0 bytes .../__pycache__/support.cpython-37.pyc | Bin 3553 -> 0 bytes .../__pycache__/switching.cpython-37.pyc | Bin 1516 -> 0 bytes .../__pycache__/sysinfo.cpython-37.pyc | Bin 2768 -> 0 bytes .../__pycache__/testcase.cpython-37.pyc | Bin 13448 -> 0 bytes .../__pycache__/testrunner.cpython-37.pyc | Bin 20006 -> 0 bytes .../testing/__pycache__/timing.cpython-37.pyc | Bin 3771 -> 0 bytes .../testing/__pycache__/travis.cpython-37.pyc | Bin 1191 -> 0 bytes .../testing/__pycache__/util.cpython-37.pyc | Bin 16081 -> 0 bytes .../__pycache__/sitecustomize.cpython-37.pyc | Bin 462 -> 0 bytes .../testing/coveragesite/sitecustomize.py | 17 - .../gevent/testing/errorhandler.py | 52 - .../site-packages/gevent/testing/exception.py | 23 - .../site-packages/gevent/testing/flaky.py | 114 - .../site-packages/gevent/testing/hub.py | 46 - .../site-packages/gevent/testing/leakcheck.py | 216 - .../site-packages/gevent/testing/modules.py | 132 - .../gevent/testing/monkey_test.py | 110 - .../site-packages/gevent/testing/openfiles.py | 195 - .../site-packages/gevent/testing/params.py | 68 - .../gevent/testing/patched_tests_setup.py | 1364 -- .../site-packages/gevent/testing/resources.py | 209 - .../site-packages/gevent/testing/six.py | 43 - .../site-packages/gevent/testing/skipping.py | 201 - .../site-packages/gevent/testing/sockets.py | 49 - .../site-packages/gevent/testing/support.py | 147 - .../site-packages/gevent/testing/switching.py | 64 - .../site-packages/gevent/testing/sysinfo.py | 170 - .../site-packages/gevent/testing/testcase.py | 434 - .../gevent/testing/testrunner.py | 806 -- .../site-packages/gevent/testing/timing.py | 138 - .../site-packages/gevent/testing/travis.py | 41 - .../site-packages/gevent/testing/util.py | 641 - .../gevent/tests/2_7_keycert.pem | 31 - .../site-packages/gevent/tests/__init__.py | 0 .../site-packages/gevent/tests/__main__.py | 6 - .../tests/__pycache__/__init__.cpython-37.pyc | Bin 144 -> 0 bytes .../tests/__pycache__/__main__.cpython-37.pyc | Bin 333 -> 0 bytes .../_blocks_at_top_level.cpython-37.pyc | Bin 226 -> 0 bytes .../_import_import_patch.cpython-37.pyc | Bin 188 -> 0 bytes .../__pycache__/_import_patch.cpython-37.pyc | Bin 213 -> 0 bytes .../__pycache__/_import_wait.cpython-37.pyc | Bin 681 -> 0 bytes .../_imports_at_top_level.cpython-37.pyc | Bin 181 -> 0 bytes ...mports_imports_at_top_level.cpython-37.pyc | Bin 352 -> 0 bytes .../getaddrinfo_module.cpython-37.pyc | Bin 268 -> 0 bytes .../__pycache__/known_failures.cpython-37.pyc | Bin 15262 -> 0 bytes .../__pycache__/lock_tests.cpython-37.pyc | Bin 23559 -> 0 bytes .../test__GreenletExit.cpython-37.pyc | Bin 283 -> 0 bytes .../__pycache__/test___config.cpython-37.pyc | Bin 5927 -> 0 bytes .../__pycache__/test___ident.cpython-37.pyc | Bin 2283 -> 0 bytes .../__pycache__/test___monitor.cpython-37.pyc | Bin 12463 -> 0 bytes .../test___monkey_patching.cpython-37.pyc | Bin 2794 -> 0 bytes .../__pycache__/test__all__.cpython-37.pyc | Bin 7266 -> 0 bytes .../__pycache__/test__api.cpython-37.pyc | Bin 4022 -> 0 bytes .../test__api_timeout.cpython-37.pyc | Bin 5165 -> 0 bytes .../test__ares_host_result.cpython-37.pyc | Bin 1245 -> 0 bytes .../test__ares_timeout.cpython-37.pyc | Bin 1397 -> 0 bytes .../__pycache__/test__backdoor.cpython-37.pyc | Bin 6381 -> 0 bytes .../test__close_backend_fd.cpython-37.pyc | Bin 2469 -> 0 bytes .../__pycache__/test__compat.cpython-37.pyc | Bin 2513 -> 0 bytes .../__pycache__/test__core.cpython-37.pyc | Bin 5697 -> 0 bytes .../test__core_async.cpython-37.pyc | Bin 1028 -> 0 bytes .../test__core_callback.cpython-37.pyc | Bin 970 -> 0 bytes .../test__core_fork.cpython-37.pyc | Bin 1684 -> 0 bytes .../test__core_loop_run.cpython-37.pyc | Bin 721 -> 0 bytes .../test__core_stat.cpython-37.pyc | Bin 3322 -> 0 bytes .../test__core_timer.cpython-37.pyc | Bin 4009 -> 0 bytes .../test__core_watcher.cpython-37.pyc | Bin 3397 -> 0 bytes .../__pycache__/test__destroy.cpython-37.pyc | Bin 1027 -> 0 bytes .../test__destroy_default_loop.cpython-37.pyc | Bin 1688 -> 0 bytes .../__pycache__/test__doctests.cpython-37.pyc | Bin 3640 -> 0 bytes .../__pycache__/test__environ.cpython-37.pyc | Bin 576 -> 0 bytes .../__pycache__/test__event.cpython-37.pyc | Bin 9492 -> 0 bytes .../__pycache__/test__events.cpython-37.pyc | Bin 1882 -> 0 bytes .../test__example_echoserver.cpython-37.pyc | Bin 1443 -> 0 bytes ...test__example_portforwarder.cpython-37.pyc | Bin 1983 -> 0 bytes .../test__example_udp_client.cpython-37.pyc | Bin 1127 -> 0 bytes .../test__example_udp_server.cpython-37.pyc | Bin 838 -> 0 bytes .../test__example_webproxy.cpython-37.pyc | Bin 1199 -> 0 bytes .../test__example_wsgiserver.cpython-37.pyc | Bin 2582 -> 0 bytes ...est__example_wsgiserver_ssl.cpython-37.pyc | Bin 822 -> 0 bytes .../__pycache__/test__examples.cpython-37.pyc | Bin 3316 -> 0 bytes .../__pycache__/test__exc_info.cpython-37.pyc | Bin 1771 -> 0 bytes .../test__execmodules.cpython-37.pyc | Bin 1495 -> 0 bytes .../test__fileobject.cpython-37.pyc | Bin 13689 -> 0 bytes .../test__getaddrinfo_import.cpython-37.pyc | Bin 194 -> 0 bytes .../__pycache__/test__greenio.cpython-37.pyc | Bin 3269 -> 0 bytes .../__pycache__/test__greenlet.cpython-37.pyc | Bin 29711 -> 0 bytes .../test__greenletset.cpython-37.pyc | Bin 6403 -> 0 bytes .../test__greenness.cpython-37.pyc | Bin 2280 -> 0 bytes .../__pycache__/test__hub.cpython-37.pyc | Bin 10690 -> 0 bytes .../__pycache__/test__hub_join.cpython-37.pyc | Bin 630 -> 0 bytes .../test__hub_join_timeout.cpython-37.pyc | Bin 3746 -> 0 bytes ...import_blocking_in_greenlet.cpython-37.pyc | Bin 731 -> 0 bytes .../test__import_wait.cpython-37.pyc | Bin 266 -> 0 bytes .../__pycache__/test__issue112.cpython-37.pyc | Bin 709 -> 0 bytes .../__pycache__/test__issue230.cpython-37.pyc | Bin 851 -> 0 bytes .../__pycache__/test__issue330.cpython-37.pyc | Bin 2512 -> 0 bytes .../__pycache__/test__issue467.cpython-37.pyc | Bin 1137 -> 0 bytes .../__pycache__/test__issue6.cpython-37.pyc | Bin 1126 -> 0 bytes .../__pycache__/test__issue600.cpython-37.pyc | Bin 1352 -> 0 bytes .../__pycache__/test__issue607.cpython-37.pyc | Bin 1698 -> 0 bytes .../__pycache__/test__issue639.cpython-37.pyc | Bin 546 -> 0 bytes .../test__issue_728.cpython-37.pyc | Bin 289 -> 0 bytes .../test__issues461_471.cpython-37.pyc | Bin 2261 -> 0 bytes .../__pycache__/test__iwait.cpython-37.pyc | Bin 1347 -> 0 bytes .../__pycache__/test__joinall.cpython-37.pyc | Bin 691 -> 0 bytes .../__pycache__/test__local.cpython-37.pyc | Bin 14076 -> 0 bytes .../test__loop_callback.cpython-37.pyc | Bin 798 -> 0 bytes .../test__makefile_ref.cpython-37.pyc | Bin 13989 -> 0 bytes .../__pycache__/test__memleak.cpython-37.pyc | Bin 1191 -> 0 bytes .../__pycache__/test__monkey.cpython-37.pyc | Bin 5389 -> 0 bytes ...est__monkey_builtins_future.cpython-37.pyc | Bin 518 -> 0 bytes ...test__monkey_futures_thread.cpython-37.pyc | Bin 1287 -> 0 bytes .../test__monkey_hub_in_thread.cpython-37.pyc | Bin 680 -> 0 bytes .../test__monkey_logging.cpython-37.pyc | Bin 1008 -> 0 bytes .../test__monkey_module_run.cpython-37.pyc | Bin 3957 -> 0 bytes ...st__monkey_multiple_imports.cpython-37.pyc | Bin 204 -> 0 bytes .../test__monkey_queue.cpython-37.pyc | Bin 8828 -> 0 bytes .../test__monkey_select.cpython-37.pyc | Bin 964 -> 0 bytes .../test__monkey_selectors.cpython-37.pyc | Bin 2852 -> 0 bytes .../test__monkey_sigchld.cpython-37.pyc | Bin 1689 -> 0 bytes .../test__monkey_sigchld_2.cpython-37.pyc | Bin 943 -> 0 bytes .../test__monkey_sigchld_3.cpython-37.pyc | Bin 1145 -> 0 bytes .../test__monkey_ssl_warning.cpython-37.pyc | Bin 1176 -> 0 bytes .../test__monkey_ssl_warning2.cpython-37.pyc | Bin 1484 -> 0 bytes .../test__monkey_ssl_warning3.cpython-37.pyc | Bin 1507 -> 0 bytes .../test__nondefaultloop.cpython-37.pyc | Bin 387 -> 0 bytes .../__pycache__/test__order.cpython-37.pyc | Bin 2199 -> 0 bytes .../tests/__pycache__/test__os.cpython-37.pyc | Bin 10288 -> 0 bytes .../__pycache__/test__pool.cpython-37.pyc | Bin 22003 -> 0 bytes .../__pycache__/test__pywsgi.cpython-37.pyc | Bin 63931 -> 0 bytes .../__pycache__/test__queue.cpython-37.pyc | Bin 16639 -> 0 bytes .../test__real_greenlet.cpython-37.pyc | Bin 1122 -> 0 bytes .../__pycache__/test__refcount.cpython-37.pyc | Bin 4298 -> 0 bytes .../test__refcount_core.cpython-37.pyc | Bin 1114 -> 0 bytes .../test__resolver_dnspython.cpython-37.pyc | Bin 1520 -> 0 bytes .../__pycache__/test__select.cpython-37.pyc | Bin 3850 -> 0 bytes .../test__semaphore.cpython-37.pyc | Bin 6290 -> 0 bytes .../__pycache__/test__server.cpython-37.pyc | Bin 17825 -> 0 bytes .../test__server_pywsgi.cpython-37.pyc | Bin 3669 -> 0 bytes .../__pycache__/test__signal.cpython-37.pyc | Bin 2534 -> 0 bytes .../__pycache__/test__sleep0.cpython-37.pyc | Bin 302 -> 0 bytes .../__pycache__/test__socket.cpython-37.pyc | Bin 15987 -> 0 bytes .../test__socket_close.cpython-37.pyc | Bin 1974 -> 0 bytes .../test__socket_dns.cpython-37.pyc | Bin 26792 -> 0 bytes .../test__socket_dns6.cpython-37.pyc | Bin 2705 -> 0 bytes .../test__socket_errors.cpython-37.pyc | Bin 1145 -> 0 bytes .../test__socket_ex.cpython-37.pyc | Bin 1313 -> 0 bytes ...est__socket_send_memoryview.cpython-37.pyc | Bin 1549 -> 0 bytes .../test__socket_ssl.cpython-37.pyc | Bin 1299 -> 0 bytes .../test__socket_timeout.cpython-37.pyc | Bin 1734 -> 0 bytes .../test__socketpair.cpython-37.pyc | Bin 1202 -> 0 bytes .../__pycache__/test__ssl.cpython-37.pyc | Bin 3048 -> 0 bytes .../test__subprocess.cpython-37.pyc | Bin 15417 -> 0 bytes ...est__subprocess_interrupted.cpython-37.pyc | Bin 792 -> 0 bytes .../test__subprocess_poll.cpython-37.pyc | Bin 450 -> 0 bytes .../test__systemerror.cpython-37.pyc | Bin 3573 -> 0 bytes .../test__threading.cpython-37.pyc | Bin 2744 -> 0 bytes .../test__threading_2.cpython-37.pyc | Bin 19108 -> 0 bytes ...st__threading_before_monkey.cpython-37.pyc | Bin 802 -> 0 bytes ...g_holding_lock_while_monkey.cpython-37.pyc | Bin 285 -> 0 bytes ..._threading_monkey_in_thread.cpython-37.pyc | Bin 1938 -> 0 bytes ...eading_native_before_monkey.cpython-37.pyc | Bin 1719 -> 0 bytes ...st__threading_patched_local.cpython-37.pyc | Bin 734 -> 0 bytes ...test__threading_vs_settrace.cpython-37.pyc | Bin 4074 -> 0 bytes .../test__threadpool.cpython-37.pyc | Bin 22495 -> 0 bytes ...threadpool_executor_patched.cpython-37.pyc | Bin 673 -> 0 bytes .../__pycache__/test__timeout.cpython-37.pyc | Bin 5274 -> 0 bytes .../__pycache__/test__util.cpython-37.pyc | Bin 8969 -> 0 bytes .../gevent/tests/_blocks_at_top_level.py | 3 - .../gevent/tests/_import_import_patch.py | 1 - .../gevent/tests/_import_patch.py | 2 - .../gevent/tests/_import_wait.py | 26 - .../gevent/tests/_imports_at_top_level.py | 2 - .../tests/_imports_imports_at_top_level.py | 13 - .../site-packages/gevent/tests/badcert.pem | 36 - .../site-packages/gevent/tests/badkey.pem | 40 - .../gevent/tests/getaddrinfo_module.py | 4 - .../site-packages/gevent/tests/hosts_file.txt | 10351 ---------------- .../tests/https_svn_python_org_root.pem | 41 - .../site-packages/gevent/tests/keycert.pem | 32 - .../gevent/tests/known_failures.py | 513 - .../site-packages/gevent/tests/lock_tests.py | 763 -- .../gevent/tests/monkey_package/__init__.py | 12 - .../gevent/tests/monkey_package/__main__.py | 5 - .../__pycache__/__init__.cpython-37.pyc | Bin 483 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 255 -> 0 bytes .../issue1526_no_monkey.cpython-37.pyc | Bin 636 -> 0 bytes .../issue1526_with_monkey.cpython-37.pyc | Bin 774 -> 0 bytes .../__pycache__/issue302monkey.cpython-37.pyc | Bin 538 -> 0 bytes .../__pycache__/script.cpython-37.pyc | Bin 577 -> 0 bytes .../threadpool_monkey_patches.cpython-37.pyc | Bin 1097 -> 0 bytes .../threadpool_no_monkey.cpython-37.pyc | Bin 999 -> 0 bytes .../monkey_package/issue1526_no_monkey.py | 21 - .../monkey_package/issue1526_with_monkey.py | 28 - .../tests/monkey_package/issue302monkey.py | 28 - .../gevent/tests/monkey_package/script.py | 19 - .../threadpool_monkey_patches.py | 30 - .../monkey_package/threadpool_no_monkey.py | 30 - .../site-packages/gevent/tests/nullcert.pem | 0 .../site-packages/gevent/tests/server.crt | 15 - .../site-packages/gevent/tests/server.key | 15 - .../site-packages/gevent/tests/sha256.pem | 33 - .../gevent/tests/test__GreenletExit.py | 4 - .../gevent/tests/test___config.py | 161 - .../gevent/tests/test___ident.py | 80 - .../gevent/tests/test___monitor.py | 386 - .../gevent/tests/test___monkey_patching.py | 98 - .../site-packages/gevent/tests/test__all__.py | 294 - .../site-packages/gevent/tests/test__api.py | 132 - .../gevent/tests/test__api_timeout.py | 210 - .../gevent/tests/test__ares_host_result.py | 31 - .../gevent/tests/test__ares_timeout.py | 43 - .../gevent/tests/test__backdoor.py | 167 - .../gevent/tests/test__close_backend_fd.py | 94 - .../gevent/tests/test__compat.py | 56 - .../site-packages/gevent/tests/test__core.py | 160 - .../gevent/tests/test__core_async.py | 31 - .../gevent/tests/test__core_callback.py | 32 - .../gevent/tests/test__core_fork.py | 74 - .../gevent/tests/test__core_loop_run.py | 22 - .../gevent/tests/test__core_stat.py | 118 - .../gevent/tests/test__core_timer.py | 157 - .../gevent/tests/test__core_watcher.py | 124 - .../gevent/tests/test__destroy.py | 51 - .../tests/test__destroy_default_loop.py | 72 - .../gevent/tests/test__doctests.py | 133 - .../gevent/tests/test__environ.py | 17 - .../site-packages/gevent/tests/test__event.py | 254 - .../gevent/tests/test__events.py | 50 - .../gevent/tests/test__example_echoserver.py | 40 - .../tests/test__example_portforwarder.py | 67 - .../gevent/tests/test__example_udp_client.py | 35 - .../gevent/tests/test__example_udp_server.py | 22 - .../gevent/tests/test__example_webproxy.py | 29 - .../gevent/tests/test__example_wsgiserver.py | 93 - .../tests/test__example_wsgiserver_ssl.py | 24 - .../gevent/tests/test__examples.py | 108 - .../gevent/tests/test__exc_info.py | 58 - .../gevent/tests/test__execmodules.py | 43 - .../gevent/tests/test__fileobject.py | 424 - .../gevent/tests/test__getaddrinfo_import.py | 7 - .../gevent/tests/test__greenio.py | 146 - .../gevent/tests/test__greenlet.py | 852 -- .../gevent/tests/test__greenletset.py | 183 - .../gevent/tests/test__greenness.py | 87 - .../site-packages/gevent/tests/test__hub.py | 367 - .../gevent/tests/test__hub_join.py | 23 - .../gevent/tests/test__hub_join_timeout.py | 99 - .../test__import_blocking_in_greenlet.py | 22 - .../gevent/tests/test__import_wait.py | 7 - .../gevent/tests/test__issue112.py | 19 - .../gevent/tests/test__issue230.py | 27 - .../gevent/tests/test__issue330.py | 82 - .../gevent/tests/test__issue467.py | 40 - .../gevent/tests/test__issue6.py | 38 - .../gevent/tests/test__issue600.py | 48 - .../gevent/tests/test__issue607.py | 42 - .../gevent/tests/test__issue639.py | 12 - .../gevent/tests/test__issue_728.py | 9 - .../gevent/tests/test__issues461_471.py | 91 - .../site-packages/gevent/tests/test__iwait.py | 42 - .../gevent/tests/test__joinall.py | 20 - .../site-packages/gevent/tests/test__local.py | 428 - .../gevent/tests/test__loop_callback.py | 18 - .../gevent/tests/test__makefile_ref.py | 544 - .../gevent/tests/test__memleak.py | 56 - .../gevent/tests/test__monkey.py | 168 - .../tests/test__monkey_builtins_future.py | 16 - .../tests/test__monkey_futures_thread.py | 49 - .../tests/test__monkey_hub_in_thread.py | 28 - .../gevent/tests/test__monkey_logging.py | 41 - .../gevent/tests/test__monkey_module_run.py | 129 - .../tests/test__monkey_multiple_imports.py | 6 - .../gevent/tests/test__monkey_queue.py | 331 - .../gevent/tests/test__monkey_select.py | 32 - .../gevent/tests/test__monkey_selectors.py | 104 - .../gevent/tests/test__monkey_sigchld.py | 89 - .../gevent/tests/test__monkey_sigchld_2.py | 56 - .../gevent/tests/test__monkey_sigchld_3.py | 58 - .../gevent/tests/test__monkey_ssl_warning.py | 34 - .../gevent/tests/test__monkey_ssl_warning2.py | 44 - .../gevent/tests/test__monkey_ssl_warning3.py | 47 - .../gevent/tests/test__nondefaultloop.py | 12 - .../site-packages/gevent/tests/test__order.py | 61 - .../site-packages/gevent/tests/test__os.py | 180 - .../site-packages/gevent/tests/test__pool.py | 603 - .../gevent/tests/test__pywsgi.py | 1843 --- .../site-packages/gevent/tests/test__queue.py | 470 - .../gevent/tests/test__real_greenlet.py | 34 - .../gevent/tests/test__refcount.py | 189 - .../gevent/tests/test__refcount_core.py | 25 - .../gevent/tests/test__resolver_dnspython.py | 41 - .../gevent/tests/test__select.py | 115 - .../gevent/tests/test__semaphore.py | 177 - .../gevent/tests/test__server.py | 504 - .../gevent/tests/test__server_pywsgi.py | 106 - .../gevent/tests/test__signal.py | 121 - .../gevent/tests/test__sleep0.py | 10 - .../gevent/tests/test__socket.py | 577 - .../gevent/tests/test__socket_close.py | 58 - .../gevent/tests/test__socket_dns.py | 939 -- .../gevent/tests/test__socket_dns6.py | 101 - .../gevent/tests/test__socket_errors.py | 50 - .../gevent/tests/test__socket_ex.py | 44 - .../tests/test__socket_send_memoryview.py | 40 - .../gevent/tests/test__socket_ssl.py | 39 - .../gevent/tests/test__socket_timeout.py | 51 - .../gevent/tests/test__socketpair.py | 35 - .../site-packages/gevent/tests/test__ssl.py | 115 - .../gevent/tests/test__subprocess.py | 518 - .../tests/test__subprocess_interrupted.py | 41 - .../gevent/tests/test__subprocess_poll.py | 13 - .../gevent/tests/test__systemerror.py | 110 - .../gevent/tests/test__threading.py | 92 - .../gevent/tests/test__threading_2.py | 613 - .../tests/test__threading_before_monkey.py | 23 - ...st__threading_holding_lock_while_monkey.py | 8 - .../tests/test__threading_monkey_in_thread.py | 65 - .../test__threading_native_before_monkey.py | 57 - .../tests/test__threading_patched_local.py | 24 - .../tests/test__threading_vs_settrace.py | 154 - .../gevent/tests/test__threadpool.py | 724 -- .../test__threadpool_executor_patched.py | 17 - .../gevent/tests/test__timeout.py | 159 - .../site-packages/gevent/tests/test__util.py | 298 - .../gevent/tests/test_server.crt | 15 - .../gevent/tests/test_server.key | 15 - .../tests/tests_that_dont_do_leakchecks.txt | 9 - .../tests/tests_that_dont_monkeypatch.txt | 28 - .../tests/tests_that_dont_use_resolver.txt | 136 - .../site-packages/gevent/tests/wrongcert.pem | 32 - .../python3.7/site-packages/gevent/thread.py | 164 - .../site-packages/gevent/threading.py | 227 - .../site-packages/gevent/threadpool.py | 749 -- .../python3.7/site-packages/gevent/time.py | 27 - .../python3.7/site-packages/gevent/timeout.py | 381 - .../python3.7/site-packages/gevent/util.py | 651 - .../site-packages/gevent/win32util.py | 98 - .../DESCRIPTION.rst | 125 - .../INSTALLER | 1 - .../METADATA | 135 - .../gevent_websocket-0.10.1.dist-info/RECORD | 37 - .../gevent_websocket-0.10.1.dist-info/WHEEL | 5 - .../metadata.json | 1 - .../top_level.txt | 1 - .../site-packages/geventwebsocket/__init__.py | 21 - .../__pycache__/__init__.cpython-37.pyc | Bin 625 -> 0 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 697 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 868 -> 0 bytes .../__pycache__/handler.cpython-37.pyc | Bin 7498 -> 0 bytes .../__pycache__/logging.cpython-37.pyc | Bin 1427 -> 0 bytes .../__pycache__/resource.cpython-37.pyc | Bin 3205 -> 0 bytes .../__pycache__/server.cpython-37.pyc | Bin 1402 -> 0 bytes .../__pycache__/utf8validator.cpython-37.pyc | Bin 7700 -> 0 bytes .../__pycache__/utils.cpython-37.pyc | Bin 1206 -> 0 bytes .../__pycache__/websocket.cpython-37.pyc | Bin 12858 -> 0 bytes .../site-packages/geventwebsocket/_compat.py | 23 - .../geventwebsocket/exceptions.py | 19 - .../geventwebsocket/gunicorn/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 166 -> 0 bytes .../__pycache__/workers.cpython-37.pyc | Bin 485 -> 0 bytes .../geventwebsocket/gunicorn/workers.py | 6 - .../site-packages/geventwebsocket/handler.py | 283 - .../site-packages/geventwebsocket/logging.py | 31 - .../geventwebsocket/protocols/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 167 -> 0 bytes .../protocols/__pycache__/base.cpython-37.pyc | Bin 1444 -> 0 bytes .../protocols/__pycache__/wamp.cpython-37.pyc | Bin 7257 -> 0 bytes .../geventwebsocket/protocols/base.py | 35 - .../geventwebsocket/protocols/wamp.py | 235 - .../site-packages/geventwebsocket/resource.py | 100 - .../site-packages/geventwebsocket/server.py | 34 - .../geventwebsocket/utf8validator.py | 224 - .../site-packages/geventwebsocket/utils.py | 45 - .../geventwebsocket/websocket.py | 565 - .../greenlet-0.4.15.dist-info/AUTHORS | 49 - .../greenlet-0.4.15.dist-info/INSTALLER | 1 - .../greenlet-0.4.15.dist-info/LICENSE | 30 - .../greenlet-0.4.15.dist-info/LICENSE.PSF | 47 - .../greenlet-0.4.15.dist-info/METADATA | 90 - .../greenlet-0.4.15.dist-info/RECORD | 10 - .../greenlet-0.4.15.dist-info/WHEEL | 5 - .../greenlet-0.4.15.dist-info/top_level.txt | 1 - ...reenlet.cpython-37m-arm-linux-gnueabihf.so | Bin 93640 -> 0 bytes .../gunicorn-20.0.4.dist-info/INSTALLER | 1 - .../gunicorn-20.0.4.dist-info/LICENSE | 23 - .../gunicorn-20.0.4.dist-info/METADATA | 115 - .../gunicorn-20.0.4.dist-info/RECORD | 74 - .../gunicorn-20.0.4.dist-info/WHEEL | 6 - .../entry_points.txt | 7 - .../gunicorn-20.0.4.dist-info/top_level.txt | 1 - .../site-packages/gunicorn/__init__.py | 8 - .../__pycache__/__init__.cpython-37.pyc | Bin 368 -> 0 bytes .../__pycache__/arbiter.cpython-37.pyc | Bin 16639 -> 0 bytes .../__pycache__/config.cpython-37.pyc | Bin 63069 -> 0 bytes .../gunicorn/__pycache__/debug.cpython-37.pyc | Bin 1962 -> 0 bytes .../__pycache__/errors.cpython-37.pyc | Bin 1021 -> 0 bytes .../__pycache__/glogging.cpython-37.pyc | Bin 11094 -> 0 bytes .../__pycache__/pidfile.cpython-37.pyc | Bin 2238 -> 0 bytes .../__pycache__/reloader.cpython-37.pyc | Bin 3855 -> 0 bytes .../gunicorn/__pycache__/sock.cpython-37.pyc | Bin 6160 -> 0 bytes .../__pycache__/systemd.cpython-37.pyc | Bin 2409 -> 0 bytes .../gunicorn/__pycache__/util.cpython-37.pyc | Bin 14094 -> 0 bytes .../site-packages/gunicorn/app/__init__.py | 4 - .../app/__pycache__/__init__.cpython-37.pyc | Bin 146 -> 0 bytes .../app/__pycache__/base.cpython-37.pyc | Bin 6280 -> 0 bytes .../app/__pycache__/pasterapp.cpython-37.pyc | Bin 2112 -> 0 bytes .../app/__pycache__/wsgiapp.cpython-37.pyc | Bin 1897 -> 0 bytes .../site-packages/gunicorn/app/base.py | 228 - .../site-packages/gunicorn/app/pasterapp.py | 75 - .../site-packages/gunicorn/app/wsgiapp.py | 62 - .../site-packages/gunicorn/arbiter.py | 646 - .../site-packages/gunicorn/config.py | 2052 --- .../python3.7/site-packages/gunicorn/debug.py | 69 - .../site-packages/gunicorn/errors.py | 29 - .../site-packages/gunicorn/glogging.py | 463 - .../site-packages/gunicorn/http/__init__.py | 9 - .../http/__pycache__/__init__.cpython-37.pyc | Bin 312 -> 0 bytes .../http/__pycache__/body.cpython-37.pyc | Bin 6394 -> 0 bytes .../http/__pycache__/errors.cpython-37.pyc | Bin 5842 -> 0 bytes .../http/__pycache__/message.cpython-37.pyc | Bin 8637 -> 0 bytes .../http/__pycache__/parser.cpython-37.pyc | Bin 1307 -> 0 bytes .../http/__pycache__/unreader.cpython-37.pyc | Bin 2368 -> 0 bytes .../http/__pycache__/wsgi.cpython-37.pyc | Bin 8989 -> 0 bytes .../site-packages/gunicorn/http/body.py | 262 - .../site-packages/gunicorn/http/errors.py | 120 - .../site-packages/gunicorn/http/message.py | 368 - .../site-packages/gunicorn/http/parser.py | 51 - .../site-packages/gunicorn/http/unreader.py | 79 - .../site-packages/gunicorn/http/wsgi.py | 404 - .../gunicorn/instrument/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 153 -> 0 bytes .../__pycache__/statsd.cpython-37.pyc | Bin 4479 -> 0 bytes .../gunicorn/instrument/statsd.py | 129 - .../site-packages/gunicorn/pidfile.py | 86 - .../site-packages/gunicorn/reloader.py | 130 - .../python3.7/site-packages/gunicorn/sock.py | 212 - .../site-packages/gunicorn/systemd.py | 77 - .../python3.7/site-packages/gunicorn/util.py | 669 - .../gunicorn/workers/__init__.py | 15 - .../__pycache__/__init__.cpython-37.pyc | Bin 511 -> 0 bytes .../workers/__pycache__/base.cpython-37.pyc | Bin 7443 -> 0 bytes .../__pycache__/base_async.cpython-37.pyc | Bin 3810 -> 0 bytes .../__pycache__/geventlet.cpython-37.pyc | Bin 4501 -> 0 bytes .../__pycache__/ggevent.cpython-37.pyc | Bin 5988 -> 0 bytes .../__pycache__/gthread.cpython-37.pyc | Bin 8570 -> 0 bytes .../__pycache__/gtornado.cpython-37.pyc | Bin 4378 -> 0 bytes .../workers/__pycache__/sync.cpython-37.pyc | Bin 5055 -> 0 bytes .../__pycache__/workertmp.cpython-37.pyc | Bin 1663 -> 0 bytes .../site-packages/gunicorn/workers/base.py | 269 - .../gunicorn/workers/base_async.py | 146 - .../gunicorn/workers/geventlet.py | 144 - .../site-packages/gunicorn/workers/ggevent.py | 205 - .../site-packages/gunicorn/workers/gthread.py | 359 - .../gunicorn/workers/gtornado.py | 169 - .../site-packages/gunicorn/workers/sync.py | 207 - .../gunicorn/workers/workertmp.py | 55 - .../itsdangerous-1.1.0.dist-info/INSTALLER | 1 - .../itsdangerous-1.1.0.dist-info/LICENSE.rst | 47 - .../itsdangerous-1.1.0.dist-info/METADATA | 98 - .../itsdangerous-1.1.0.dist-info/RECORD | 26 - .../itsdangerous-1.1.0.dist-info/WHEEL | 6 - .../top_level.txt | 1 - .../site-packages/itsdangerous/__init__.py | 22 - .../__pycache__/__init__.cpython-37.pyc | Bin 978 -> 0 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 1140 -> 0 bytes .../__pycache__/_json.cpython-37.pyc | Bin 823 -> 0 bytes .../__pycache__/encoding.cpython-37.pyc | Bin 1605 -> 0 bytes .../__pycache__/exc.cpython-37.pyc | Bin 3194 -> 0 bytes .../__pycache__/jws.cpython-37.pyc | Bin 6653 -> 0 bytes .../__pycache__/serializer.cpython-37.pyc | Bin 8009 -> 0 bytes .../__pycache__/signer.cpython-37.pyc | Bin 5769 -> 0 bytes .../__pycache__/timed.cpython-37.pyc | Bin 4535 -> 0 bytes .../__pycache__/url_safe.cpython-37.pyc | Bin 2524 -> 0 bytes .../site-packages/itsdangerous/_compat.py | 46 - .../site-packages/itsdangerous/_json.py | 18 - .../site-packages/itsdangerous/encoding.py | 49 - .../site-packages/itsdangerous/exc.py | 98 - .../site-packages/itsdangerous/jws.py | 218 - .../site-packages/itsdangerous/serializer.py | 233 - .../site-packages/itsdangerous/signer.py | 179 - .../site-packages/itsdangerous/timed.py | 147 - .../site-packages/itsdangerous/url_safe.py | 65 - .../site-packages/jinja2/__init__.py | 44 - .../__pycache__/__init__.cpython-37.pyc | Bin 1775 -> 0 bytes .../jinja2/__pycache__/_compat.cpython-37.pyc | Bin 3809 -> 0 bytes .../__pycache__/_identifier.cpython-37.pyc | Bin 1856 -> 0 bytes .../__pycache__/asyncfilters.cpython-37.pyc | Bin 4790 -> 0 bytes .../__pycache__/asyncsupport.cpython-37.pyc | Bin 8208 -> 0 bytes .../jinja2/__pycache__/bccache.cpython-37.pyc | Bin 12102 -> 0 bytes .../__pycache__/compiler.cpython-37.pyc | Bin 48640 -> 0 bytes .../__pycache__/constants.cpython-37.pyc | Bin 1502 -> 0 bytes .../jinja2/__pycache__/debug.cpython-37.pyc | Bin 5139 -> 0 bytes .../__pycache__/defaults.cpython-37.pyc | Bin 1074 -> 0 bytes .../__pycache__/environment.cpython-37.pyc | Bin 43835 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 5619 -> 0 bytes .../jinja2/__pycache__/ext.cpython-37.pyc | Bin 21348 -> 0 bytes .../jinja2/__pycache__/filters.cpython-37.pyc | Bin 39506 -> 0 bytes .../__pycache__/idtracking.cpython-37.pyc | Bin 9912 -> 0 bytes .../jinja2/__pycache__/lexer.cpython-37.pyc | Bin 18877 -> 0 bytes .../jinja2/__pycache__/loaders.cpython-37.pyc | Bin 18126 -> 0 bytes .../jinja2/__pycache__/meta.cpython-37.pyc | Bin 3440 -> 0 bytes .../__pycache__/nativetypes.cpython-37.pyc | Bin 4168 -> 0 bytes .../jinja2/__pycache__/nodes.cpython-37.pyc | Bin 36371 -> 0 bytes .../__pycache__/optimizer.cpython-37.pyc | Bin 1602 -> 0 bytes .../jinja2/__pycache__/parser.cpython-37.pyc | Bin 25076 -> 0 bytes .../jinja2/__pycache__/runtime.cpython-37.pyc | Bin 27226 -> 0 bytes .../jinja2/__pycache__/sandbox.cpython-37.pyc | Bin 13951 -> 0 bytes .../jinja2/__pycache__/tests.cpython-37.pyc | Bin 5286 -> 0 bytes .../jinja2/__pycache__/utils.cpython-37.pyc | Bin 22644 -> 0 bytes .../jinja2/__pycache__/visitor.cpython-37.pyc | Bin 3247 -> 0 bytes .../python3.7/site-packages/jinja2/_compat.py | 132 - .../site-packages/jinja2/_identifier.py | 6 - .../site-packages/jinja2/asyncfilters.py | 159 - .../site-packages/jinja2/asyncsupport.py | 264 - .../python3.7/site-packages/jinja2/bccache.py | 350 - .../site-packages/jinja2/compiler.py | 1843 --- .../site-packages/jinja2/constants.py | 21 - .../python3.7/site-packages/jinja2/debug.py | 271 - .../site-packages/jinja2/defaults.py | 44 - .../site-packages/jinja2/environment.py | 1362 -- .../site-packages/jinja2/exceptions.py | 177 - .../lib/python3.7/site-packages/jinja2/ext.py | 704 -- .../python3.7/site-packages/jinja2/filters.py | 1382 --- .../site-packages/jinja2/idtracking.py | 290 - .../python3.7/site-packages/jinja2/lexer.py | 841 -- .../python3.7/site-packages/jinja2/loaders.py | 572 - .../python3.7/site-packages/jinja2/meta.py | 101 - .../site-packages/jinja2/nativetypes.py | 111 - .../python3.7/site-packages/jinja2/nodes.py | 1088 -- .../site-packages/jinja2/optimizer.py | 41 - .../python3.7/site-packages/jinja2/parser.py | 939 -- .../python3.7/site-packages/jinja2/runtime.py | 1011 -- .../python3.7/site-packages/jinja2/sandbox.py | 510 - .../python3.7/site-packages/jinja2/tests.py | 215 - .../python3.7/site-packages/jinja2/utils.py | 727 -- .../python3.7/site-packages/jinja2/visitor.py | 81 - .../python3.7/site-packages/mako/__init__.py | 8 - .../mako/__pycache__/__init__.cpython-37.pyc | Bin 155 -> 0 bytes .../mako/__pycache__/_ast_util.cpython-37.pyc | Bin 21856 -> 0 bytes .../mako/__pycache__/ast.cpython-37.pyc | Bin 4865 -> 0 bytes .../mako/__pycache__/cache.cpython-37.pyc | Bin 6958 -> 0 bytes .../mako/__pycache__/cmd.cpython-37.pyc | Bin 2335 -> 0 bytes .../mako/__pycache__/codegen.cpython-37.pyc | Bin 32874 -> 0 bytes .../mako/__pycache__/compat.cpython-37.pyc | Bin 3771 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 11737 -> 0 bytes .../mako/__pycache__/filters.cpython-37.pyc | Bin 6067 -> 0 bytes .../mako/__pycache__/lexer.cpython-37.pyc | Bin 10207 -> 0 bytes .../mako/__pycache__/lookup.cpython-37.pyc | Bin 10323 -> 0 bytes .../mako/__pycache__/parsetree.cpython-37.pyc | Bin 19695 -> 0 bytes .../mako/__pycache__/pygen.cpython-37.pyc | Bin 6424 -> 0 bytes .../mako/__pycache__/pyparser.cpython-37.pyc | Bin 6819 -> 0 bytes .../mako/__pycache__/runtime.cpython-37.pyc | Bin 27699 -> 0 bytes .../mako/__pycache__/template.cpython-37.pyc | Bin 21289 -> 0 bytes .../mako/__pycache__/util.cpython-37.pyc | Bin 11358 -> 0 bytes .../python3.7/site-packages/mako/_ast_util.py | 716 -- venv/lib/python3.7/site-packages/mako/ast.py | 205 - .../lib/python3.7/site-packages/mako/cache.py | 240 - venv/lib/python3.7/site-packages/mako/cmd.py | 103 - .../python3.7/site-packages/mako/codegen.py | 1318 -- .../python3.7/site-packages/mako/compat.py | 166 - .../site-packages/mako/exceptions.py | 430 - .../site-packages/mako/ext/__init__.py | 0 .../ext/__pycache__/__init__.cpython-37.pyc | Bin 138 -> 0 bytes .../__pycache__/autohandler.cpython-37.pyc | Bin 1450 -> 0 bytes .../__pycache__/babelplugin.cpython-37.pyc | Bin 2088 -> 0 bytes .../__pycache__/beaker_cache.cpython-37.pyc | Bin 2529 -> 0 bytes .../ext/__pycache__/extract.cpython-37.pyc | Bin 2815 -> 0 bytes .../__pycache__/linguaplugin.cpython-37.pyc | Bin 1595 -> 0 bytes .../__pycache__/preprocessors.cpython-37.pyc | Bin 567 -> 0 bytes .../__pycache__/pygmentplugin.cpython-37.pyc | Bin 4620 -> 0 bytes .../ext/__pycache__/turbogears.cpython-37.pyc | Bin 1614 -> 0 bytes .../site-packages/mako/ext/autohandler.py | 70 - .../site-packages/mako/ext/babelplugin.py | 58 - .../site-packages/mako/ext/beaker_cache.py | 82 - .../site-packages/mako/ext/extract.py | 125 - .../site-packages/mako/ext/linguaplugin.py | 57 - .../site-packages/mako/ext/preprocessors.py | 20 - .../site-packages/mako/ext/pygmentplugin.py | 157 - .../site-packages/mako/ext/turbogears.py | 61 - .../python3.7/site-packages/mako/filters.py | 219 - .../lib/python3.7/site-packages/mako/lexer.py | 490 - .../python3.7/site-packages/mako/lookup.py | 372 - .../python3.7/site-packages/mako/parsetree.py | 665 - .../lib/python3.7/site-packages/mako/pygen.py | 305 - .../python3.7/site-packages/mako/pyparser.py | 242 - .../python3.7/site-packages/mako/runtime.py | 970 -- .../python3.7/site-packages/mako/template.py | 780 -- venv/lib/python3.7/site-packages/mako/util.py | 400 - .../site-packages/markupsafe/__init__.py | 327 - .../__pycache__/__init__.cpython-37.pyc | Bin 10824 -> 0 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 731 -> 0 bytes .../__pycache__/_constants.cpython-37.pyc | Bin 4231 -> 0 bytes .../__pycache__/_native.cpython-37.pyc | Bin 2083 -> 0 bytes .../site-packages/markupsafe/_compat.py | 33 - .../site-packages/markupsafe/_constants.py | 264 - .../site-packages/markupsafe/_native.py | 69 - .../site-packages/markupsafe/_speedups.c | 423 - ...peedups.cpython-37m-arm-linux-gnueabihf.so | Bin 46612 -> 0 bytes .../pip-18.1.dist-info/INSTALLER | 1 - .../pip-18.1.dist-info/LICENSE.txt | 20 - .../site-packages/pip-18.1.dist-info/METADATA | 70 - .../site-packages/pip-18.1.dist-info/RECORD | 172 - .../site-packages/pip-18.1.dist-info/WHEEL | 6 - .../pip-18.1.dist-info/entry_points.txt | 5 - .../pip-18.1.dist-info/top_level.txt | 1 - .../python3.7/site-packages/pip/__init__.py | 1 - .../python3.7/site-packages/pip/__main__.py | 19 - .../pip/__pycache__/__init__.cpython-37.pyc | Bin 152 -> 0 bytes .../pip/__pycache__/__main__.cpython-37.pyc | Bin 406 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 78 - .../__pycache__/__init__.cpython-37.pyc | Bin 1798 -> 0 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 5007 -> 0 bytes .../__pycache__/cache.cpython-37.pyc | Bin 6792 -> 0 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 9791 -> 0 bytes .../__pycache__/download.cpython-37.pyc | Bin 20859 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 11512 -> 0 bytes .../__pycache__/index.cpython-37.pyc | Bin 23133 -> 0 bytes .../__pycache__/locations.cpython-37.pyc | Bin 4188 -> 0 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 7247 -> 0 bytes .../__pycache__/pyproject.cpython-37.pyc | Bin 2671 -> 0 bytes .../__pycache__/resolve.cpython-37.pyc | Bin 8438 -> 0 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 20800 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 142 - .../site-packages/pip/_internal/cache.py | 202 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-37.pyc | Bin 229 -> 0 bytes .../__pycache__/autocompletion.cpython-37.pyc | Bin 5042 -> 0 bytes .../__pycache__/base_command.cpython-37.pyc | Bin 6267 -> 0 bytes .../cli/__pycache__/cmdoptions.cpython-37.pyc | Bin 14988 -> 0 bytes .../__pycache__/main_parser.cpython-37.pyc | Bin 2189 -> 0 bytes .../cli/__pycache__/parser.cpython-37.pyc | Bin 8893 -> 0 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 358 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 152 - .../pip/_internal/cli/base_command.py | 278 - .../pip/_internal/cli/cmdoptions.py | 714 -- .../pip/_internal/cli/main_parser.py | 96 - .../site-packages/pip/_internal/cli/parser.py | 261 - .../pip/_internal/cli/status_codes.py | 8 - .../pip/_internal/commands/__init__.py | 79 - .../__pycache__/__init__.cpython-37.pyc | Bin 2457 -> 0 bytes .../commands/__pycache__/check.cpython-37.pyc | Bin 1259 -> 0 bytes .../__pycache__/completion.cpython-37.pyc | Bin 3031 -> 0 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 6383 -> 0 bytes .../__pycache__/download.cpython-37.pyc | Bin 4611 -> 0 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 2827 -> 0 bytes .../commands/__pycache__/hash.cpython-37.pyc | Bin 2021 -> 0 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 1197 -> 0 bytes .../__pycache__/install.cpython-37.pyc | Bin 12175 -> 0 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 8870 -> 0 bytes .../__pycache__/search.cpython-37.pyc | Bin 4263 -> 0 bytes .../commands/__pycache__/show.cpython-37.pyc | Bin 5844 -> 0 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 2653 -> 0 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 4874 -> 0 bytes .../pip/_internal/commands/check.py | 41 - .../pip/_internal/commands/completion.py | 94 - .../pip/_internal/commands/configuration.py | 227 - .../pip/_internal/commands/download.py | 174 - .../pip/_internal/commands/freeze.py | 96 - .../pip/_internal/commands/hash.py | 57 - .../pip/_internal/commands/help.py | 37 - .../pip/_internal/commands/install.py | 555 - .../pip/_internal/commands/list.py | 306 - .../pip/_internal/commands/search.py | 135 - .../pip/_internal/commands/show.py | 168 - .../pip/_internal/commands/uninstall.py | 78 - .../pip/_internal/commands/wheel.py | 183 - .../pip/_internal/configuration.py | 387 - .../site-packages/pip/_internal/download.py | 921 -- .../site-packages/pip/_internal/exceptions.py | 268 - .../site-packages/pip/_internal/index.py | 899 -- .../site-packages/pip/_internal/locations.py | 194 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-37.pyc | Bin 217 -> 0 bytes .../__pycache__/candidate.cpython-37.pyc | Bin 1052 -> 0 bytes .../__pycache__/format_control.cpython-37.pyc | Bin 2387 -> 0 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 1121 -> 0 bytes .../models/__pycache__/link.cpython-37.pyc | Bin 4719 -> 0 bytes .../pip/_internal/models/candidate.py | 23 - .../pip/_internal/models/format_control.py | 62 - .../pip/_internal/models/index.py | 29 - .../pip/_internal/models/link.py | 141 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 153 -> 0 bytes .../__pycache__/check.cpython-37.pyc | Bin 3330 -> 0 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 6285 -> 0 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 9151 -> 0 bytes .../pip/_internal/operations/check.py | 148 - .../pip/_internal/operations/freeze.py | 264 - .../pip/_internal/operations/prepare.py | 355 - .../site-packages/pip/_internal/pep425tags.py | 317 - .../site-packages/pip/_internal/pyproject.py | 144 - .../pip/_internal/req/__init__.py | 69 - .../req/__pycache__/__init__.cpython-37.pyc | Bin 1521 -> 0 bytes .../__pycache__/constructors.cpython-37.pyc | Bin 6919 -> 0 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 8620 -> 0 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 22770 -> 0 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 5734 -> 0 bytes .../__pycache__/req_tracker.cpython-37.pyc | Bin 2845 -> 0 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 12817 -> 0 bytes .../pip/_internal/req/constructors.py | 298 - .../pip/_internal/req/req_file.py | 340 - .../pip/_internal/req/req_install.py | 860 -- .../pip/_internal/req/req_set.py | 181 - .../pip/_internal/req/req_tracker.py | 76 - .../pip/_internal/req/req_uninstall.py | 460 - .../site-packages/pip/_internal/resolve.py | 353 - .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-37.pyc | Bin 148 -> 0 bytes .../utils/__pycache__/appdirs.cpython-37.pyc | Bin 7869 -> 0 bytes .../utils/__pycache__/compat.cpython-37.pyc | Bin 5939 -> 0 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 2522 -> 0 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 1084 -> 0 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 615 -> 0 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 1506 -> 0 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 3283 -> 0 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 5316 -> 0 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 24407 -> 0 bytes .../utils/__pycache__/models.cpython-37.pyc | Bin 1897 -> 0 bytes .../utils/__pycache__/outdated.cpython-37.pyc | Bin 3869 -> 0 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 2348 -> 0 bytes .../setuptools_build.cpython-37.pyc | Bin 343 -> 0 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 2760 -> 0 bytes .../utils/__pycache__/typing.cpython-37.pyc | Bin 1292 -> 0 bytes .../utils/__pycache__/ui.cpython-37.pyc | Bin 11817 -> 0 bytes .../pip/_internal/utils/appdirs.py | 258 - .../pip/_internal/utils/compat.py | 248 - .../pip/_internal/utils/deprecation.py | 89 - .../pip/_internal/utils/encoding.py | 33 - .../pip/_internal/utils/filesystem.py | 28 - .../pip/_internal/utils/glibc.py | 84 - .../pip/_internal/utils/hashes.py | 94 - .../pip/_internal/utils/logging.py | 225 - .../site-packages/pip/_internal/utils/misc.py | 958 -- .../pip/_internal/utils/models.py | 40 - .../pip/_internal/utils/outdated.py | 154 - .../pip/_internal/utils/packaging.py | 75 - .../pip/_internal/utils/setuptools_build.py | 8 - .../pip/_internal/utils/temp_dir.py | 82 - .../pip/_internal/utils/typing.py | 29 - .../site-packages/pip/_internal/utils/ui.py | 421 - .../pip/_internal/vcs/__init__.py | 509 - .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 15514 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 3777 -> 0 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 9082 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 3750 -> 0 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 6352 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 - .../site-packages/pip/_internal/vcs/git.py | 346 - .../pip/_internal/vcs/mercurial.py | 101 - .../pip/_internal/vcs/subversion.py | 213 - .../site-packages/pip/_internal/wheel.py | 831 -- .../site-packages/pip/_vendor/__init__.py | 114 - .../__pycache__/__init__.cpython-37.pyc | Bin 2874 -> 0 bytes .../pip/_vendor/pep517/__init__.py | 4 - .../__pycache__/__init__.cpython-37.pyc | Bin 237 -> 0 bytes .../__pycache__/_in_process.cpython-37.pyc | Bin 5302 -> 0 bytes .../pep517/__pycache__/check.cpython-37.pyc | Bin 4701 -> 0 bytes .../__pycache__/colorlog.cpython-37.pyc | Bin 2866 -> 0 bytes .../pep517/__pycache__/compat.cpython-37.pyc | Bin 975 -> 0 bytes .../__pycache__/envbuild.cpython-37.pyc | Bin 4132 -> 0 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 4699 -> 0 bytes .../pip/_vendor/pep517/_in_process.py | 182 - .../site-packages/pip/_vendor/pep517/check.py | 194 - .../pip/_vendor/pep517/colorlog.py | 110 - .../pip/_vendor/pep517/compat.py | 23 - .../pip/_vendor/pep517/envbuild.py | 150 - .../pip/_vendor/pep517/wrappers.py | 134 - .../pkg_resources-0.0.0.dist-info/AUTHORS.txt | 421 - .../pkg_resources-0.0.0.dist-info/INSTALLER | 1 - .../pkg_resources-0.0.0.dist-info/LICENSE.txt | 20 - .../pkg_resources-0.0.0.dist-info/METADATA | 13 - .../pkg_resources-0.0.0.dist-info/RECORD | 38 - .../pkg_resources-0.0.0.dist-info/WHEEL | 6 - .../site-packages/pkg_resources/__init__.py | 3236 ----- .../__pycache__/__init__.cpython-37.pyc | Bin 98524 -> 0 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 597 -> 0 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 160 -> 0 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 20648 -> 0 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 203003 -> 0 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 24361 -> 0 bytes .../pkg_resources/_vendor/appdirs.py | 608 - .../_vendor/packaging/__about__.py | 21 - .../_vendor/packaging/__init__.py | 14 - .../__pycache__/__about__.cpython-37.pyc | Bin 696 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 534 -> 0 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 986 -> 0 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2838 -> 0 bytes .../__pycache__/markers.cpython-37.pyc | Bin 8846 -> 0 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 3851 -> 0 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19764 -> 0 bytes .../__pycache__/utils.cpython-37.pyc | Bin 465 -> 0 bytes .../__pycache__/version.cpython-37.pyc | Bin 10531 -> 0 bytes .../_vendor/packaging/_compat.py | 30 - .../_vendor/packaging/_structures.py | 68 - .../_vendor/packaging/markers.py | 301 - .../_vendor/packaging/requirements.py | 127 - .../_vendor/packaging/specifiers.py | 774 -- .../pkg_resources/_vendor/packaging/utils.py | 14 - .../_vendor/packaging/version.py | 393 - .../pkg_resources/_vendor/pyparsing.py | 5742 --------- .../pkg_resources/_vendor/six.py | 868 -- .../pkg_resources/extern/__init__.py | 73 - .../__pycache__/__init__.cpython-37.pyc | Bin 2379 -> 0 bytes .../site-packages/pkg_resources/py31compat.py | 23 - .../python_dateutil-2.8.1.dist-info/INSTALLER | 1 - .../python_dateutil-2.8.1.dist-info/LICENSE | 54 - .../python_dateutil-2.8.1.dist-info/METADATA | 200 - .../python_dateutil-2.8.1.dist-info/RECORD | 44 - .../python_dateutil-2.8.1.dist-info/WHEEL | 6 - .../top_level.txt | 1 - .../python_dateutil-2.8.1.dist-info/zip-safe | 1 - .../DESCRIPTION.rst | 51 - .../python_editor-1.0.4.dist-info/INSTALLER | 1 - .../python_editor-1.0.4.dist-info/METADATA | 73 - .../python_editor-1.0.4.dist-info/RECORD | 9 - .../python_editor-1.0.4.dist-info/WHEEL | 5 - .../metadata.json | 1 - .../top_level.txt | 1 - .../setuptools-40.8.0.dist-info/AUTHORS.txt | 421 - .../setuptools-40.8.0.dist-info/INSTALLER | 1 - .../setuptools-40.8.0.dist-info/LICENSE.txt | 20 - .../setuptools-40.8.0.dist-info/METADATA | 69 - .../setuptools-40.8.0.dist-info/RECORD | 155 - .../setuptools-40.8.0.dist-info/WHEEL | 6 - .../dependency_links.txt | 2 - .../entry_points.txt | 64 - .../setuptools-40.8.0.dist-info/top_level.txt | 3 - .../setuptools-40.8.0.dist-info/zip-safe | 1 - .../site-packages/setuptools/__init__.py | 228 - .../__pycache__/__init__.cpython-37.pyc | Bin 7658 -> 0 bytes .../_deprecation_warning.cpython-37.pyc | Bin 512 -> 0 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 5093 -> 0 bytes .../__pycache__/build_meta.cpython-37.pyc | Bin 7720 -> 0 bytes .../__pycache__/config.cpython-37.pyc | Bin 17655 -> 0 bytes .../__pycache__/dep_util.cpython-37.pyc | Bin 819 -> 0 bytes .../__pycache__/depends.cpython-37.pyc | Bin 5228 -> 0 bytes .../__pycache__/dist.cpython-37.pyc | Bin 42184 -> 0 bytes .../__pycache__/extension.cpython-37.pyc | Bin 1939 -> 0 bytes .../__pycache__/glibc.cpython-37.pyc | Bin 1504 -> 0 bytes .../__pycache__/glob.cpython-37.pyc | Bin 3714 -> 0 bytes .../__pycache__/launch.cpython-37.pyc | Bin 818 -> 0 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 2397 -> 0 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 4598 -> 0 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 34395 -> 0 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 3576 -> 0 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 32669 -> 0 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 7166 -> 0 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 775 -> 0 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 1161 -> 0 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 1384 -> 0 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 15500 -> 0 bytes .../__pycache__/site-patch.cpython-37.pyc | Bin 1466 -> 0 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 6756 -> 0 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 1460 -> 0 bytes .../__pycache__/version.cpython-37.pyc | Bin 292 -> 0 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 6945 -> 0 bytes .../windows_support.cpython-37.pyc | Bin 975 -> 0 bytes .../setuptools/_deprecation_warning.py | 7 - .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 154 -> 0 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 202997 -> 0 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 24355 -> 0 bytes .../setuptools/_vendor/packaging/__about__.py | 21 - .../setuptools/_vendor/packaging/__init__.py | 14 - .../__pycache__/__about__.cpython-37.pyc | Bin 690 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 528 -> 0 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 980 -> 0 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2832 -> 0 bytes .../__pycache__/markers.cpython-37.pyc | Bin 8837 -> 0 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 3839 -> 0 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19758 -> 0 bytes .../__pycache__/utils.cpython-37.pyc | Bin 459 -> 0 bytes .../__pycache__/version.cpython-37.pyc | Bin 10525 -> 0 bytes .../setuptools/_vendor/packaging/_compat.py | 30 - .../_vendor/packaging/_structures.py | 68 - .../setuptools/_vendor/packaging/markers.py | 301 - .../_vendor/packaging/requirements.py | 127 - .../_vendor/packaging/specifiers.py | 774 -- .../setuptools/_vendor/packaging/utils.py | 14 - .../setuptools/_vendor/packaging/version.py | 393 - .../setuptools/_vendor/pyparsing.py | 5742 --------- .../site-packages/setuptools/_vendor/six.py | 868 -- .../site-packages/setuptools/archive_util.py | 173 - .../site-packages/setuptools/build_meta.py | 231 - .../site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .../site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 18 - .../__pycache__/__init__.cpython-37.pyc | Bin 700 -> 0 bytes .../command/__pycache__/alias.cpython-37.pyc | Bin 2368 -> 0 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 14156 -> 0 bytes .../__pycache__/bdist_rpm.cpython-37.pyc | Bin 1747 -> 0 bytes .../__pycache__/bdist_wininst.cpython-37.pyc | Bin 938 -> 0 bytes .../__pycache__/build_clib.cpython-37.pyc | Bin 2417 -> 0 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 9671 -> 0 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 8547 -> 0 bytes .../__pycache__/develop.cpython-37.pyc | Bin 6428 -> 0 bytes .../__pycache__/dist_info.cpython-37.pyc | Bin 1343 -> 0 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 66103 -> 0 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 21654 -> 0 bytes .../__pycache__/install.cpython-37.pyc | Bin 3975 -> 0 bytes .../install_egg_info.cpython-37.pyc | Bin 2875 -> 0 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 5033 -> 0 bytes .../install_scripts.cpython-37.pyc | Bin 2255 -> 0 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 4588 -> 0 bytes .../__pycache__/register.cpython-37.pyc | Bin 745 -> 0 bytes .../command/__pycache__/rotate.cpython-37.pyc | Bin 2494 -> 0 bytes .../__pycache__/saveopts.cpython-37.pyc | Bin 889 -> 0 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 6747 -> 0 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 4487 -> 0 bytes .../command/__pycache__/test.cpython-37.pyc | Bin 8082 -> 0 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 5153 -> 0 bytes .../__pycache__/upload_docs.cpython-37.pyc | Bin 6098 -> 0 bytes .../site-packages/setuptools/command/alias.py | 80 - .../setuptools/command/bdist_egg.py | 502 - .../setuptools/command/bdist_rpm.py | 43 - .../setuptools/command/bdist_wininst.py | 21 - .../setuptools/command/build_clib.py | 98 - .../setuptools/command/build_ext.py | 321 - .../setuptools/command/build_py.py | 270 - .../setuptools/command/develop.py | 221 - .../setuptools/command/dist_info.py | 36 - .../setuptools/command/easy_install.py | 2397 ---- .../setuptools/command/egg_info.py | 717 -- .../setuptools/command/install.py | 125 - .../setuptools/command/install_egg_info.py | 82 - .../setuptools/command/install_lib.py | 148 - .../setuptools/command/install_scripts.py | 65 - .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/py36compat.py | 136 - .../setuptools/command/register.py | 18 - .../setuptools/command/rotate.py | 66 - .../setuptools/command/saveopts.py | 22 - .../site-packages/setuptools/command/sdist.py | 221 - .../setuptools/command/setopt.py | 149 - .../site-packages/setuptools/command/test.py | 270 - .../setuptools/command/upload.py | 196 - .../setuptools/command/upload_docs.py | 206 - .../site-packages/setuptools/config.py | 656 - .../site-packages/setuptools/dep_util.py | 23 - .../site-packages/setuptools/depends.py | 186 - .../site-packages/setuptools/dist.py | 1285 -- .../site-packages/setuptools/extension.py | 57 - .../setuptools/extern/__init__.py | 73 - .../__pycache__/__init__.cpython-37.pyc | Bin 2377 -> 0 bytes .../site-packages/setuptools/glibc.py | 86 - .../site-packages/setuptools/glob.py | 174 - .../site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .../site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/launch.py | 35 - .../site-packages/setuptools/lib2to3_ex.py | 62 - .../site-packages/setuptools/monkey.py | 179 - .../site-packages/setuptools/msvc.py | 1301 -- .../site-packages/setuptools/namespaces.py | 107 - .../site-packages/setuptools/package_index.py | 1136 -- .../site-packages/setuptools/pep425tags.py | 319 - .../site-packages/setuptools/py27compat.py | 28 - .../site-packages/setuptools/py31compat.py | 32 - .../site-packages/setuptools/py33compat.py | 55 - .../site-packages/setuptools/sandbox.py | 491 - .../setuptools/script (dev).tmpl | 6 - .../site-packages/setuptools/script.tmpl | 3 - .../site-packages/setuptools/site-patch.py | 74 - .../site-packages/setuptools/ssl_support.py | 260 - .../site-packages/setuptools/unicode_utils.py | 57 - .../site-packages/setuptools/version.py | 6 - .../site-packages/setuptools/wheel.py | 211 - .../setuptools/windows_support.py | 29 - .../six-1.14.0.dist-info/INSTALLER | 1 - .../six-1.14.0.dist-info/LICENSE | 18 - .../six-1.14.0.dist-info/METADATA | 49 - .../site-packages/six-1.14.0.dist-info/RECORD | 8 - .../site-packages/six-1.14.0.dist-info/WHEEL | 6 - .../six-1.14.0.dist-info/top_level.txt | 1 - venv/lib/python3.7/site-packages/six.py | 980 -- .../site-packages/sqlalchemy/__init__.py | 146 - .../__pycache__/__init__.cpython-37.pyc | Bin 4249 -> 0 bytes .../__pycache__/events.cpython-37.pyc | Bin 55689 -> 0 bytes .../sqlalchemy/__pycache__/exc.cpython-37.pyc | Bin 18046 -> 0 bytes .../__pycache__/inspection.cpython-37.pyc | Bin 2880 -> 0 bytes .../__pycache__/interfaces.cpython-37.pyc | Bin 12305 -> 0 bytes .../sqlalchemy/__pycache__/log.cpython-37.pyc | Bin 6557 -> 0 bytes .../__pycache__/processors.cpython-37.pyc | Bin 4242 -> 0 bytes .../__pycache__/schema.cpython-37.pyc | Bin 1975 -> 0 bytes .../__pycache__/types.cpython-37.pyc | Bin 2372 -> 0 bytes .../sqlalchemy/connectors/__init__.py | 10 - .../__pycache__/__init__.cpython-37.pyc | Bin 314 -> 0 bytes .../__pycache__/mxodbc.cpython-37.pyc | Bin 5062 -> 0 bytes .../__pycache__/pyodbc.cpython-37.pyc | Bin 4458 -> 0 bytes .../__pycache__/zxJDBC.cpython-37.pyc | Bin 2048 -> 0 bytes .../sqlalchemy/connectors/mxodbc.py | 154 - .../sqlalchemy/connectors/pyodbc.py | 164 - .../sqlalchemy/connectors/zxJDBC.py | 68 - ...cessors.cpython-37m-arm-linux-gnueabihf.so | Bin 49424 -> 0 bytes ...ltproxy.cpython-37m-arm-linux-gnueabihf.so | Bin 57836 -> 0 bytes .../cutils.cpython-37m-arm-linux-gnueabihf.so | Bin 31952 -> 0 bytes .../sqlalchemy/databases/__init__.py | 32 - .../__pycache__/__init__.cpython-37.pyc | Bin 640 -> 0 bytes .../sqlalchemy/dialects/__init__.py | 72 - .../__pycache__/__init__.cpython-37.pyc | Bin 1383 -> 0 bytes .../sqlalchemy/dialects/firebird/__init__.py | 41 - .../__pycache__/__init__.cpython-37.pyc | Bin 718 -> 0 bytes .../firebird/__pycache__/base.cpython-37.pyc | Bin 25969 -> 0 bytes .../firebird/__pycache__/fdb.cpython-37.pyc | Bin 4016 -> 0 bytes .../__pycache__/kinterbasdb.cpython-37.pyc | Bin 6366 -> 0 bytes .../sqlalchemy/dialects/firebird/base.py | 961 -- .../sqlalchemy/dialects/firebird/fdb.py | 110 - .../dialects/firebird/kinterbasdb.py | 201 - .../sqlalchemy/dialects/mssql/__init__.py | 85 - .../mssql/__pycache__/__init__.cpython-37.pyc | Bin 1510 -> 0 bytes .../mssql/__pycache__/adodbapi.cpython-37.pyc | Bin 3021 -> 0 bytes .../mssql/__pycache__/base.cpython-37.pyc | Bin 79237 -> 0 bytes .../information_schema.cpython-37.pyc | Bin 3947 -> 0 bytes .../mssql/__pycache__/mxodbc.cpython-37.pyc | Bin 4928 -> 0 bytes .../__pycache__/provision.cpython-37.pyc | Bin 2511 -> 0 bytes .../mssql/__pycache__/pymssql.cpython-37.pyc | Bin 4961 -> 0 bytes .../mssql/__pycache__/pyodbc.cpython-37.pyc | Bin 13527 -> 0 bytes .../mssql/__pycache__/zxjdbc.cpython-37.pyc | Bin 2500 -> 0 bytes .../sqlalchemy/dialects/mssql/adodbapi.py | 90 - .../sqlalchemy/dialects/mssql/base.py | 2841 ----- .../dialects/mssql/information_schema.py | 175 - .../sqlalchemy/dialects/mssql/mxodbc.py | 146 - .../sqlalchemy/dialects/mssql/provision.py | 80 - .../sqlalchemy/dialects/mssql/pymssql.py | 132 - .../sqlalchemy/dialects/mssql/pyodbc.py | 437 - .../sqlalchemy/dialects/mssql/zxjdbc.py | 71 - .../sqlalchemy/dialects/mysql/__init__.py | 99 - .../mysql/__pycache__/__init__.cpython-37.pyc | Bin 1730 -> 0 bytes .../mysql/__pycache__/base.cpython-37.pyc | Bin 85860 -> 0 bytes .../mysql/__pycache__/cymysql.cpython-37.pyc | Bin 2505 -> 0 bytes .../mysql/__pycache__/dml.cpython-37.pyc | Bin 4826 -> 0 bytes .../__pycache__/enumerated.cpython-37.pyc | Bin 10418 -> 0 bytes .../mysql/__pycache__/gaerdbms.cpython-37.pyc | Bin 2986 -> 0 bytes .../mysql/__pycache__/json.cpython-37.pyc | Bin 2732 -> 0 bytes .../__pycache__/mysqlconnector.cpython-37.pyc | Bin 8404 -> 0 bytes .../mysql/__pycache__/mysqldb.cpython-37.pyc | Bin 7510 -> 0 bytes .../mysql/__pycache__/oursql.cpython-37.pyc | Bin 7787 -> 0 bytes .../__pycache__/provision.cpython-37.pyc | Bin 1452 -> 0 bytes .../mysql/__pycache__/pymysql.cpython-37.pyc | Bin 2451 -> 0 bytes .../mysql/__pycache__/pyodbc.cpython-37.pyc | Bin 3740 -> 0 bytes .../__pycache__/reflection.cpython-37.pyc | Bin 12487 -> 0 bytes .../mysql/__pycache__/types.cpython-37.pyc | Bin 27564 -> 0 bytes .../mysql/__pycache__/zxjdbc.cpython-37.pyc | Bin 4131 -> 0 bytes .../sqlalchemy/dialects/mysql/base.py | 3062 ----- .../sqlalchemy/dialects/mysql/cymysql.py | 82 - .../sqlalchemy/dialects/mysql/dml.py | 139 - .../sqlalchemy/dialects/mysql/enumerated.py | 314 - .../sqlalchemy/dialects/mysql/gaerdbms.py | 102 - .../sqlalchemy/dialects/mysql/json.py | 76 - .../dialects/mysql/mysqlconnector.py | 246 - .../sqlalchemy/dialects/mysql/mysqldb.py | 268 - .../sqlalchemy/dialects/mysql/oursql.py | 262 - .../sqlalchemy/dialects/mysql/provision.py | 40 - .../sqlalchemy/dialects/mysql/pymysql.py | 85 - .../sqlalchemy/dialects/mysql/pyodbc.py | 110 - .../sqlalchemy/dialects/mysql/reflection.py | 547 - .../sqlalchemy/dialects/mysql/types.py | 777 -- .../sqlalchemy/dialects/mysql/zxjdbc.py | 120 - .../sqlalchemy/dialects/oracle/__init__.py | 59 - .../__pycache__/__init__.cpython-37.pyc | Bin 1029 -> 0 bytes .../oracle/__pycache__/base.cpython-37.pyc | Bin 65636 -> 0 bytes .../__pycache__/cx_oracle.cpython-37.pyc | Bin 40264 -> 0 bytes .../__pycache__/provision.cpython-37.pyc | Bin 3394 -> 0 bytes .../oracle/__pycache__/zxjdbc.cpython-37.pyc | Bin 8790 -> 0 bytes .../sqlalchemy/dialects/oracle/base.py | 2205 ---- .../sqlalchemy/dialects/oracle/cx_oracle.py | 1217 -- .../sqlalchemy/dialects/oracle/provision.py | 110 - .../sqlalchemy/dialects/oracle/zxjdbc.py | 254 - .../dialects/postgresql/__init__.py | 116 - .../__pycache__/__init__.cpython-37.pyc | Bin 2095 -> 0 bytes .../__pycache__/array.cpython-37.pyc | Bin 11639 -> 0 bytes .../__pycache__/base.cpython-37.pyc | Bin 106716 -> 0 bytes .../postgresql/__pycache__/dml.cpython-37.pyc | Bin 6797 -> 0 bytes .../postgresql/__pycache__/ext.cpython-37.pyc | Bin 6852 -> 0 bytes .../__pycache__/hstore.cpython-37.pyc | Bin 12528 -> 0 bytes .../__pycache__/json.cpython-37.pyc | Bin 10379 -> 0 bytes .../__pycache__/pg8000.cpython-37.pyc | Bin 10631 -> 0 bytes .../__pycache__/provision.cpython-37.pyc | Bin 1771 -> 0 bytes .../__pycache__/psycopg2.cpython-37.pyc | Bin 30968 -> 0 bytes .../__pycache__/psycopg2cffi.cpython-37.pyc | Bin 1723 -> 0 bytes .../__pycache__/pygresql.cpython-37.pyc | Bin 7979 -> 0 bytes .../__pycache__/pypostgresql.cpython-37.pyc | Bin 3320 -> 0 bytes .../__pycache__/ranges.cpython-37.pyc | Bin 5676 -> 0 bytes .../__pycache__/zxjdbc.cpython-37.pyc | Bin 1909 -> 0 bytes .../sqlalchemy/dialects/postgresql/array.py | 385 - .../sqlalchemy/dialects/postgresql/base.py | 3700 ------ .../sqlalchemy/dialects/postgresql/dml.py | 232 - .../sqlalchemy/dialects/postgresql/ext.py | 228 - .../sqlalchemy/dialects/postgresql/hstore.py | 446 - .../sqlalchemy/dialects/postgresql/json.py | 317 - .../sqlalchemy/dialects/postgresql/pg8000.py | 332 - .../dialects/postgresql/provision.py | 64 - .../dialects/postgresql/psycopg2.py | 985 -- .../dialects/postgresql/psycopg2cffi.py | 59 - .../dialects/postgresql/pygresql.py | 266 - .../dialects/postgresql/pypostgresql.py | 109 - .../sqlalchemy/dialects/postgresql/ranges.py | 147 - .../sqlalchemy/dialects/postgresql/zxjdbc.py | 48 - .../sqlalchemy/dialects/sqlite/__init__.py | 51 - .../__pycache__/__init__.cpython-37.pyc | Bin 842 -> 0 bytes .../sqlite/__pycache__/base.cpython-37.pyc | Bin 59185 -> 0 bytes .../sqlite/__pycache__/json.cpython-37.pyc | Bin 3017 -> 0 bytes .../__pycache__/provision.cpython-37.pyc | Bin 2313 -> 0 bytes .../__pycache__/pysqlcipher.cpython-37.pyc | Bin 4917 -> 0 bytes .../__pycache__/pysqlite.cpython-37.pyc | Bin 19820 -> 0 bytes .../sqlalchemy/dialects/sqlite/base.py | 2109 ---- .../sqlalchemy/dialects/sqlite/json.py | 78 - .../sqlalchemy/dialects/sqlite/provision.py | 75 - .../sqlalchemy/dialects/sqlite/pysqlcipher.py | 138 - .../sqlalchemy/dialects/sqlite/pysqlite.py | 528 - .../sqlalchemy/dialects/sybase/__init__.py | 67 - .../__pycache__/__init__.cpython-37.pyc | Bin 1117 -> 0 bytes .../sybase/__pycache__/base.cpython-37.pyc | Bin 28064 -> 0 bytes .../sybase/__pycache__/mxodbc.cpython-37.pyc | Bin 981 -> 0 bytes .../sybase/__pycache__/pyodbc.cpython-37.pyc | Bin 2388 -> 0 bytes .../__pycache__/pysybase.cpython-37.pyc | Bin 3639 -> 0 bytes .../sqlalchemy/dialects/sybase/base.py | 1092 -- .../sqlalchemy/dialects/sybase/mxodbc.py | 34 - .../sqlalchemy/dialects/sybase/pyodbc.py | 85 - .../sqlalchemy/dialects/sybase/pysybase.py | 104 - .../sqlalchemy/engine/__init__.py | 534 - .../__pycache__/__init__.cpython-37.pyc | Bin 24163 -> 0 bytes .../engine/__pycache__/base.cpython-37.pyc | Bin 71126 -> 0 bytes .../engine/__pycache__/default.cpython-37.pyc | Bin 39025 -> 0 bytes .../__pycache__/interfaces.cpython-37.pyc | Bin 46403 -> 0 bytes .../__pycache__/reflection.cpython-37.pyc | Bin 27213 -> 0 bytes .../engine/__pycache__/result.cpython-37.pyc | Bin 45951 -> 0 bytes .../__pycache__/strategies.cpython-37.pyc | Bin 8698 -> 0 bytes .../__pycache__/threadlocal.cpython-37.pyc | Bin 5014 -> 0 bytes .../engine/__pycache__/url.cpython-37.pyc | Bin 8621 -> 0 bytes .../engine/__pycache__/util.cpython-37.pyc | Bin 1724 -> 0 bytes .../site-packages/sqlalchemy/engine/base.py | 2428 ---- .../sqlalchemy/engine/default.py | 1588 --- .../sqlalchemy/engine/interfaces.py | 1457 --- .../sqlalchemy/engine/reflection.py | 1037 -- .../site-packages/sqlalchemy/engine/result.py | 1603 --- .../sqlalchemy/engine/strategies.py | 319 - .../sqlalchemy/engine/threadlocal.py | 161 - .../site-packages/sqlalchemy/engine/url.py | 310 - .../site-packages/sqlalchemy/engine/util.py | 80 - .../sqlalchemy/event/__init__.py | 17 - .../event/__pycache__/__init__.cpython-37.pyc | Bin 499 -> 0 bytes .../event/__pycache__/api.cpython-37.pyc | Bin 7239 -> 0 bytes .../event/__pycache__/attr.cpython-37.pyc | Bin 15450 -> 0 bytes .../event/__pycache__/base.cpython-37.pyc | Bin 9714 -> 0 bytes .../event/__pycache__/legacy.cpython-37.pyc | Bin 4866 -> 0 bytes .../event/__pycache__/registry.cpython-37.pyc | Bin 5693 -> 0 bytes .../site-packages/sqlalchemy/event/api.py | 213 - .../site-packages/sqlalchemy/event/attr.py | 446 - .../site-packages/sqlalchemy/event/base.py | 299 - .../site-packages/sqlalchemy/event/legacy.py | 177 - .../sqlalchemy/event/registry.py | 283 - .../site-packages/sqlalchemy/events.py | 1331 -- .../python3.7/site-packages/sqlalchemy/exc.py | 600 - .../site-packages/sqlalchemy/ext/__init__.py | 11 - .../ext/__pycache__/__init__.cpython-37.pyc | Bin 246 -> 0 bytes .../associationproxy.cpython-37.pyc | Bin 49739 -> 0 bytes .../ext/__pycache__/automap.cpython-37.pyc | Bin 35675 -> 0 bytes .../ext/__pycache__/baked.cpython-37.pyc | Bin 20608 -> 0 bytes .../ext/__pycache__/compiler.cpython-37.pyc | Bin 16576 -> 0 bytes .../horizontal_shard.cpython-37.pyc | Bin 7566 -> 0 bytes .../ext/__pycache__/hybrid.cpython-37.pyc | Bin 41197 -> 0 bytes .../ext/__pycache__/indexable.cpython-37.pyc | Bin 10878 -> 0 bytes .../instrumentation.cpython-37.pyc | Bin 14153 -> 0 bytes .../ext/__pycache__/mutable.cpython-37.pyc | Bin 34091 -> 0 bytes .../__pycache__/orderinglist.cpython-37.pyc | Bin 14184 -> 0 bytes .../ext/__pycache__/serializer.cpython-37.pyc | Bin 4887 -> 0 bytes .../sqlalchemy/ext/associationproxy.py | 1593 --- .../site-packages/sqlalchemy/ext/automap.py | 1137 -- .../site-packages/sqlalchemy/ext/baked.py | 692 -- .../site-packages/sqlalchemy/ext/compiler.py | 486 - .../sqlalchemy/ext/declarative/__init__.py | 33 - .../__pycache__/__init__.cpython-37.pyc | Bin 708 -> 0 bytes .../__pycache__/api.cpython-37.pyc | Bin 27722 -> 0 bytes .../__pycache__/base.cpython-37.pyc | Bin 18841 -> 0 bytes .../__pycache__/clsregistry.cpython-37.pyc | Bin 10940 -> 0 bytes .../sqlalchemy/ext/declarative/api.py | 823 -- .../sqlalchemy/ext/declarative/base.py | 852 -- .../sqlalchemy/ext/declarative/clsregistry.py | 389 - .../sqlalchemy/ext/horizontal_shard.py | 259 - .../site-packages/sqlalchemy/ext/hybrid.py | 1162 -- .../site-packages/sqlalchemy/ext/indexable.py | 352 - .../sqlalchemy/ext/instrumentation.py | 416 - .../site-packages/sqlalchemy/ext/mutable.py | 946 -- .../sqlalchemy/ext/orderinglist.py | 389 - .../sqlalchemy/ext/serializer.py | 173 - .../site-packages/sqlalchemy/inspection.py | 93 - .../site-packages/sqlalchemy/interfaces.py | 363 - .../python3.7/site-packages/sqlalchemy/log.py | 222 - .../site-packages/sqlalchemy/orm/__init__.py | 294 - .../orm/__pycache__/__init__.cpython-37.pyc | Bin 8822 -> 0 bytes .../orm/__pycache__/attributes.cpython-37.pyc | Bin 52342 -> 0 bytes .../orm/__pycache__/base.cpython-37.pyc | Bin 13186 -> 0 bytes .../__pycache__/collections.cpython-37.pyc | Bin 52882 -> 0 bytes .../orm/__pycache__/dependency.cpython-37.pyc | Bin 23442 -> 0 bytes .../deprecated_interfaces.cpython-37.pyc | Bin 19864 -> 0 bytes .../descriptor_props.cpython-37.pyc | Bin 28987 -> 0 bytes .../orm/__pycache__/dynamic.cpython-37.pyc | Bin 11778 -> 0 bytes .../orm/__pycache__/evaluator.cpython-37.pyc | Bin 5639 -> 0 bytes .../orm/__pycache__/events.cpython-37.pyc | Bin 106051 -> 0 bytes .../orm/__pycache__/exc.cpython-37.pyc | Bin 7147 -> 0 bytes .../orm/__pycache__/identity.cpython-37.pyc | Bin 11392 -> 0 bytes .../instrumentation.cpython-37.pyc | Bin 17118 -> 0 bytes .../orm/__pycache__/interfaces.cpython-37.pyc | Bin 26410 -> 0 bytes .../orm/__pycache__/loading.cpython-37.pyc | Bin 18364 -> 0 bytes .../orm/__pycache__/mapper.cpython-37.pyc | Bin 90524 -> 0 bytes .../__pycache__/path_registry.cpython-37.pyc | Bin 12859 -> 0 bytes .../__pycache__/persistence.cpython-37.pyc | Bin 38626 -> 0 bytes .../orm/__pycache__/properties.cpython-37.pyc | Bin 11846 -> 0 bytes .../orm/__pycache__/query.cpython-37.pyc | Bin 142211 -> 0 bytes .../__pycache__/relationships.cpython-37.pyc | Bin 102688 -> 0 bytes .../orm/__pycache__/scoping.cpython-37.pyc | Bin 6292 -> 0 bytes .../orm/__pycache__/session.cpython-37.pyc | Bin 109880 -> 0 bytes .../orm/__pycache__/state.cpython-37.pyc | Bin 26987 -> 0 bytes .../orm/__pycache__/strategies.cpython-37.pyc | Bin 51997 -> 0 bytes .../strategy_options.cpython-37.pyc | Bin 44940 -> 0 bytes .../orm/__pycache__/sync.cpython-37.pyc | Bin 3823 -> 0 bytes .../orm/__pycache__/unitofwork.cpython-37.pyc | Bin 19692 -> 0 bytes .../orm/__pycache__/util.cpython-37.pyc | Bin 39209 -> 0 bytes .../sqlalchemy/orm/attributes.py | 2051 --- .../site-packages/sqlalchemy/orm/base.py | 578 - .../sqlalchemy/orm/collections.py | 1638 --- .../sqlalchemy/orm/dependency.py | 1284 -- .../sqlalchemy/orm/deprecated_interfaces.py | 572 - .../sqlalchemy/orm/descriptor_props.py | 808 -- .../site-packages/sqlalchemy/orm/dynamic.py | 450 - .../site-packages/sqlalchemy/orm/evaluator.py | 192 - .../site-packages/sqlalchemy/orm/events.py | 2713 ---- .../site-packages/sqlalchemy/orm/exc.py | 206 - .../site-packages/sqlalchemy/orm/identity.py | 366 - .../sqlalchemy/orm/instrumentation.py | 563 - .../sqlalchemy/orm/interfaces.py | 775 -- .../site-packages/sqlalchemy/orm/loading.py | 1018 -- .../site-packages/sqlalchemy/orm/mapper.py | 3431 ----- .../sqlalchemy/orm/path_registry.py | 439 - .../sqlalchemy/orm/persistence.py | 2035 --- .../sqlalchemy/orm/properties.py | 374 - .../site-packages/sqlalchemy/orm/query.py | 4932 -------- .../sqlalchemy/orm/relationships.py | 3516 ------ .../site-packages/sqlalchemy/orm/scoping.py | 205 - .../site-packages/sqlalchemy/orm/session.py | 3448 ----- .../site-packages/sqlalchemy/orm/state.py | 952 -- .../sqlalchemy/orm/strategies.py | 2512 ---- .../sqlalchemy/orm/strategy_options.py | 1741 --- .../site-packages/sqlalchemy/orm/sync.py | 167 - .../sqlalchemy/orm/unitofwork.py | 731 -- .../site-packages/sqlalchemy/orm/util.py | 1342 -- .../site-packages/sqlalchemy/pool/__init__.py | 52 - .../pool/__pycache__/__init__.cpython-37.pyc | Bin 1204 -> 0 bytes .../pool/__pycache__/base.cpython-37.pyc | Bin 29731 -> 0 bytes .../__pycache__/dbapi_proxy.cpython-37.pyc | Bin 4772 -> 0 bytes .../pool/__pycache__/impl.cpython-37.pyc | Bin 14765 -> 0 bytes .../site-packages/sqlalchemy/pool/base.py | 1034 -- .../sqlalchemy/pool/dbapi_proxy.py | 150 - .../site-packages/sqlalchemy/pool/impl.py | 480 - .../site-packages/sqlalchemy/processors.py | 176 - .../site-packages/sqlalchemy/schema.py | 59 - .../site-packages/sqlalchemy/sql/__init__.py | 106 - .../sql/__pycache__/__init__.cpython-37.pyc | Bin 3084 -> 0 bytes .../sql/__pycache__/annotation.cpython-37.pyc | Bin 5705 -> 0 bytes .../sql/__pycache__/base.cpython-37.pyc | Bin 23934 -> 0 bytes .../sql/__pycache__/compiler.cpython-37.pyc | Bin 97404 -> 0 bytes .../sql/__pycache__/crud.cpython-37.pyc | Bin 15393 -> 0 bytes .../sql/__pycache__/ddl.cpython-37.pyc | Bin 39053 -> 0 bytes .../default_comparator.cpython-37.pyc | Bin 7368 -> 0 bytes .../sql/__pycache__/dml.cpython-37.pyc | Bin 33329 -> 0 bytes .../sql/__pycache__/elements.cpython-37.pyc | Bin 153722 -> 0 bytes .../sql/__pycache__/expression.cpython-37.pyc | Bin 6779 -> 0 bytes .../sql/__pycache__/functions.cpython-37.pyc | Bin 38108 -> 0 bytes .../sql/__pycache__/naming.cpython-37.pyc | Bin 4770 -> 0 bytes .../sql/__pycache__/operators.cpython-37.pyc | Bin 46770 -> 0 bytes .../sql/__pycache__/schema.cpython-37.pyc | Bin 154336 -> 0 bytes .../sql/__pycache__/selectable.cpython-37.pyc | Bin 130115 -> 0 bytes .../sql/__pycache__/sqltypes.cpython-37.pyc | Bin 94774 -> 0 bytes .../sql/__pycache__/type_api.cpython-37.pyc | Bin 49110 -> 0 bytes .../sql/__pycache__/util.cpython-37.pyc | Bin 24160 -> 0 bytes .../sql/__pycache__/visitors.cpython-37.pyc | Bin 15777 -> 0 bytes .../sqlalchemy/sql/annotation.py | 210 - .../site-packages/sqlalchemy/sql/base.py | 677 - .../site-packages/sqlalchemy/sql/compiler.py | 3830 ------ .../site-packages/sqlalchemy/sql/crud.py | 801 -- .../site-packages/sqlalchemy/sql/ddl.py | 1245 -- .../sqlalchemy/sql/default_comparator.py | 375 - .../site-packages/sqlalchemy/sql/dml.py | 937 -- .../site-packages/sqlalchemy/sql/elements.py | 4875 -------- .../sqlalchemy/sql/expression.py | 267 - .../site-packages/sqlalchemy/sql/functions.py | 1167 -- .../site-packages/sqlalchemy/sql/naming.py | 182 - .../site-packages/sqlalchemy/sql/operators.py | 1506 --- .../site-packages/sqlalchemy/sql/schema.py | 4699 ------- .../sqlalchemy/sql/selectable.py | 4166 ------- .../site-packages/sqlalchemy/sql/sqltypes.py | 3040 ----- .../site-packages/sqlalchemy/sql/type_api.py | 1497 --- .../site-packages/sqlalchemy/sql/util.py | 935 -- .../site-packages/sqlalchemy/sql/visitors.py | 490 - .../sqlalchemy/testing/__init__.py | 72 - .../__pycache__/__init__.cpython-37.pyc | Bin 2318 -> 0 bytes .../__pycache__/assertions.cpython-37.pyc | Bin 19295 -> 0 bytes .../__pycache__/assertsql.cpython-37.pyc | Bin 11312 -> 0 bytes .../testing/__pycache__/config.cpython-37.pyc | Bin 5855 -> 0 bytes .../__pycache__/engines.cpython-37.pyc | Bin 11455 -> 0 bytes .../__pycache__/entities.cpython-37.pyc | Bin 2583 -> 0 bytes .../__pycache__/exclusions.cpython-37.pyc | Bin 14567 -> 0 bytes .../__pycache__/fixtures.cpython-37.pyc | Bin 14772 -> 0 bytes .../testing/__pycache__/mock.cpython-37.pyc | Bin 645 -> 0 bytes .../__pycache__/pickleable.cpython-37.pyc | Bin 5199 -> 0 bytes .../__pycache__/profiling.cpython-37.pyc | Bin 7485 -> 0 bytes .../__pycache__/provision.cpython-37.pyc | Bin 5937 -> 0 bytes .../__pycache__/replay_fixture.cpython-37.pyc | Bin 6502 -> 0 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 43850 -> 0 bytes .../testing/__pycache__/schema.cpython-37.pyc | Bin 2871 -> 0 bytes .../testing/__pycache__/util.cpython-37.pyc | Bin 11136 -> 0 bytes .../__pycache__/warnings.cpython-37.pyc | Bin 1303 -> 0 bytes .../sqlalchemy/testing/assertions.py | 647 - .../sqlalchemy/testing/assertsql.py | 419 - .../sqlalchemy/testing/config.py | 172 - .../sqlalchemy/testing/engines.py | 376 - .../sqlalchemy/testing/entities.py | 109 - .../sqlalchemy/testing/exclusions.py | 453 - .../sqlalchemy/testing/fixtures.py | 522 - .../site-packages/sqlalchemy/testing/mock.py | 32 - .../sqlalchemy/testing/pickleable.py | 141 - .../sqlalchemy/testing/plugin/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 161 -> 0 bytes .../__pycache__/bootstrap.cpython-37.pyc | Bin 1600 -> 0 bytes .../__pycache__/plugin_base.cpython-37.pyc | Bin 16403 -> 0 bytes .../__pycache__/pytestplugin.cpython-37.pyc | Bin 13501 -> 0 bytes .../sqlalchemy/testing/plugin/bootstrap.py | 45 - .../sqlalchemy/testing/plugin/plugin_base.py | 734 -- .../sqlalchemy/testing/plugin/pytestplugin.py | 522 - .../sqlalchemy/testing/profiling.py | 279 - .../sqlalchemy/testing/provision.py | 195 - .../sqlalchemy/testing/replay_fixture.py | 209 - .../sqlalchemy/testing/requirements.py | 1136 -- .../sqlalchemy/testing/schema.py | 116 - .../sqlalchemy/testing/suite/__init__.py | 10 - .../suite/__pycache__/__init__.cpython-37.pyc | Bin 403 -> 0 bytes .../suite/__pycache__/test_cte.cpython-37.pyc | Bin 4892 -> 0 bytes .../suite/__pycache__/test_ddl.cpython-37.pyc | Bin 3336 -> 0 bytes .../__pycache__/test_dialect.cpython-37.pyc | Bin 5988 -> 0 bytes .../__pycache__/test_insert.cpython-37.pyc | Bin 8784 -> 0 bytes .../test_reflection.cpython-37.pyc | Bin 35137 -> 0 bytes .../__pycache__/test_results.cpython-37.pyc | Bin 9450 -> 0 bytes .../__pycache__/test_select.cpython-37.pyc | Bin 25401 -> 0 bytes .../__pycache__/test_sequence.cpython-37.pyc | Bin 5199 -> 0 bytes .../__pycache__/test_types.cpython-37.pyc | Bin 35287 -> 0 bytes .../test_update_delete.cpython-37.pyc | Bin 1976 -> 0 bytes .../sqlalchemy/testing/suite/test_cte.py | 211 - .../sqlalchemy/testing/suite/test_ddl.py | 92 - .../sqlalchemy/testing/suite/test_dialect.py | 211 - .../sqlalchemy/testing/suite/test_insert.py | 319 - .../testing/suite/test_reflection.py | 1199 -- .../sqlalchemy/testing/suite/test_results.py | 350 - .../sqlalchemy/testing/suite/test_select.py | 754 -- .../sqlalchemy/testing/suite/test_sequence.py | 156 - .../sqlalchemy/testing/suite/test_types.py | 1199 -- .../testing/suite/test_update_delete.py | 56 - .../site-packages/sqlalchemy/testing/util.py | 394 - .../sqlalchemy/testing/warnings.py | 61 - .../site-packages/sqlalchemy/types.py | 117 - .../site-packages/sqlalchemy/util/__init__.py | 153 - .../util/__pycache__/__init__.cpython-37.pyc | Bin 5204 -> 0 bytes .../__pycache__/_collections.cpython-37.pyc | Bin 38698 -> 0 bytes .../util/__pycache__/compat.cpython-37.pyc | Bin 14253 -> 0 bytes .../__pycache__/deprecations.cpython-37.pyc | Bin 6972 -> 0 bytes .../__pycache__/langhelpers.cpython-37.pyc | Bin 47159 -> 0 bytes .../util/__pycache__/queue.cpython-37.pyc | Bin 5919 -> 0 bytes .../__pycache__/topological.cpython-37.pyc | Bin 1946 -> 0 bytes .../sqlalchemy/util/_collections.py | 1101 -- .../site-packages/sqlalchemy/util/compat.py | 571 - .../sqlalchemy/util/deprecations.py | 259 - .../sqlalchemy/util/langhelpers.py | 1738 --- .../site-packages/sqlalchemy/util/queue.py | 209 - .../sqlalchemy/util/topological.py | 97 - .../site-packages/werkzeug/__init__.py | 20 - .../__pycache__/__init__.cpython-37.pyc | Bin 690 -> 0 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 7345 -> 0 bytes .../__pycache__/_internal.cpython-37.pyc | Bin 13077 -> 0 bytes .../__pycache__/_reloader.cpython-37.pyc | Bin 9596 -> 0 bytes .../__pycache__/datastructures.cpython-37.pyc | Bin 109425 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 27633 -> 0 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 2129 -> 0 bytes .../__pycache__/formparser.cpython-37.pyc | Bin 16074 -> 0 bytes .../werkzeug/__pycache__/http.cpython-37.pyc | Bin 35439 -> 0 bytes .../werkzeug/__pycache__/local.cpython-37.pyc | Bin 18495 -> 0 bytes .../__pycache__/posixemulation.cpython-37.pyc | Bin 2701 -> 0 bytes .../__pycache__/routing.cpython-37.pyc | Bin 67767 -> 0 bytes .../__pycache__/security.cpython-37.pyc | Bin 7902 -> 0 bytes .../__pycache__/serving.cpython-37.pyc | Bin 29387 -> 0 bytes .../werkzeug/__pycache__/test.cpython-37.pyc | Bin 32844 -> 0 bytes .../__pycache__/testapp.cpython-37.pyc | Bin 9340 -> 0 bytes .../werkzeug/__pycache__/urls.cpython-37.pyc | Bin 35799 -> 0 bytes .../__pycache__/useragents.cpython-37.pyc | Bin 5325 -> 0 bytes .../werkzeug/__pycache__/utils.cpython-37.pyc | Bin 22898 -> 0 bytes .../werkzeug/__pycache__/wsgi.cpython-37.pyc | Bin 30807 -> 0 bytes .../site-packages/werkzeug/_compat.py | 228 - .../site-packages/werkzeug/_internal.py | 473 - .../site-packages/werkzeug/_reloader.py | 341 - .../site-packages/werkzeug/datastructures.py | 3118 ----- .../site-packages/werkzeug/debug/__init__.py | 498 - .../debug/__pycache__/__init__.cpython-37.pyc | Bin 12407 -> 0 bytes .../debug/__pycache__/console.cpython-37.pyc | Bin 7252 -> 0 bytes .../debug/__pycache__/repr.cpython-37.pyc | Bin 8565 -> 0 bytes .../debug/__pycache__/tbtools.cpython-37.pyc | Bin 18419 -> 0 bytes .../site-packages/werkzeug/debug/console.py | 217 - .../site-packages/werkzeug/debug/repr.py | 297 - .../werkzeug/debug/shared/FONT_LICENSE | 96 - .../werkzeug/debug/shared/console.png | Bin 507 -> 0 bytes .../werkzeug/debug/shared/debugger.js | 210 - .../werkzeug/debug/shared/jquery.js | 2 - .../werkzeug/debug/shared/less.png | Bin 191 -> 0 bytes .../werkzeug/debug/shared/more.png | Bin 200 -> 0 bytes .../werkzeug/debug/shared/source.png | Bin 818 -> 0 bytes .../werkzeug/debug/shared/style.css | 154 - .../werkzeug/debug/shared/ubuntu.ttf | Bin 70220 -> 0 bytes .../site-packages/werkzeug/debug/tbtools.py | 628 - .../site-packages/werkzeug/exceptions.py | 829 -- .../site-packages/werkzeug/filesystem.py | 64 - .../site-packages/werkzeug/formparser.py | 584 - .../python3.7/site-packages/werkzeug/http.py | 1305 -- .../python3.7/site-packages/werkzeug/local.py | 420 - .../werkzeug/middleware/__init__.py | 25 - .../__pycache__/__init__.cpython-37.pyc | Bin 710 -> 0 bytes .../__pycache__/dispatcher.cpython-37.pyc | Bin 2399 -> 0 bytes .../__pycache__/http_proxy.cpython-37.pyc | Bin 6314 -> 0 bytes .../__pycache__/lint.cpython-37.pyc | Bin 11622 -> 0 bytes .../__pycache__/profiler.cpython-37.pyc | Bin 4576 -> 0 bytes .../__pycache__/proxy_fix.cpython-37.pyc | Bin 5759 -> 0 bytes .../__pycache__/shared_data.cpython-37.pyc | Bin 8920 -> 0 bytes .../werkzeug/middleware/dispatcher.py | 66 - .../werkzeug/middleware/http_proxy.py | 219 - .../site-packages/werkzeug/middleware/lint.py | 408 - .../werkzeug/middleware/profiler.py | 132 - .../werkzeug/middleware/proxy_fix.py | 169 - .../werkzeug/middleware/shared_data.py | 293 - .../site-packages/werkzeug/posixemulation.py | 117 - .../site-packages/werkzeug/routing.py | 2210 ---- .../site-packages/werkzeug/security.py | 249 - .../site-packages/werkzeug/serving.py | 1117 -- .../python3.7/site-packages/werkzeug/test.py | 1123 -- .../site-packages/werkzeug/testapp.py | 241 - .../python3.7/site-packages/werkzeug/urls.py | 1138 -- .../site-packages/werkzeug/useragents.py | 202 - .../python3.7/site-packages/werkzeug/utils.py | 778 -- .../werkzeug/wrappers/__init__.py | 36 - .../__pycache__/__init__.cpython-37.pyc | Bin 1638 -> 0 bytes .../__pycache__/accept.cpython-37.pyc | Bin 2167 -> 0 bytes .../wrappers/__pycache__/auth.cpython-37.pyc | Bin 1654 -> 0 bytes .../__pycache__/base_request.cpython-37.pyc | Bin 21464 -> 0 bytes .../__pycache__/base_response.cpython-37.pyc | Bin 23138 -> 0 bytes .../common_descriptors.cpython-37.pyc | Bin 12727 -> 0 bytes .../wrappers/__pycache__/cors.cpython-37.pyc | Bin 3230 -> 0 bytes .../wrappers/__pycache__/etag.cpython-37.pyc | Bin 11520 -> 0 bytes .../wrappers/__pycache__/json.cpython-37.pyc | Bin 4269 -> 0 bytes .../__pycache__/request.cpython-37.pyc | Bin 1941 -> 0 bytes .../__pycache__/response.cpython-37.pyc | Bin 3470 -> 0 bytes .../__pycache__/user_agent.cpython-37.pyc | Bin 796 -> 0 bytes .../site-packages/werkzeug/wrappers/accept.py | 50 - .../site-packages/werkzeug/wrappers/auth.py | 33 - .../werkzeug/wrappers/base_request.py | 673 - .../werkzeug/wrappers/base_response.py | 700 -- .../werkzeug/wrappers/common_descriptors.py | 341 - .../site-packages/werkzeug/wrappers/cors.py | 102 - .../site-packages/werkzeug/wrappers/etag.py | 304 - .../site-packages/werkzeug/wrappers/json.py | 145 - .../werkzeug/wrappers/request.py | 49 - .../werkzeug/wrappers/response.py | 84 - .../werkzeug/wrappers/user_agent.py | 14 - .../python3.7/site-packages/werkzeug/wsgi.py | 1000 -- .../wsgigzip-0.1.4.dist-info/DESCRIPTION.rst | 18 - .../wsgigzip-0.1.4.dist-info/INSTALLER | 1 - .../wsgigzip-0.1.4.dist-info/METADATA | 38 - .../wsgigzip-0.1.4.dist-info/RECORD | 11 - .../wsgigzip-0.1.4.dist-info/WHEEL | 5 - .../wsgigzip-0.1.4.dist-info/metadata.json | 1 - .../wsgigzip-0.1.4.dist-info/top_level.txt | 1 - .../site-packages/wsgigzip/__init__.py | 44 - .../__pycache__/__init__.cpython-37.pyc | Bin 915 -> 0 bytes .../wsgigzip/__pycache__/gzip.cpython-37.pyc | Bin 6908 -> 0 bytes .../python3.7/site-packages/wsgigzip/gzip.py | 277 - venv/pyvenv.cfg | 3 - .../CacheControl-0.11.7-py2.py3-none-any.whl | Bin 25197 -> 0 bytes .../appdirs-1.4.3-py2.py3-none-any.whl | Bin 16543 -> 0 bytes .../certifi-2018.8.24-py2.py3-none-any.whl | Bin 152671 -> 0 bytes .../chardet-3.0.4-py2.py3-none-any.whl | Bin 139269 -> 0 bytes .../colorama-0.3.7-py2.py3-none-any.whl | Bin 22127 -> 0 bytes .../distlib-0.2.8-py2.py3-none-any.whl | Bin 149379 -> 0 bytes .../distro-1.3.0-py2.py3-none-any.whl | Bin 19446 -> 0 bytes .../html5lib-1.0.1-py2.py3-none-any.whl | Bin 117801 -> 0 bytes .../idna-2.6-py2.py3-none-any.whl | Bin 60445 -> 0 bytes .../ipaddress-0.0.0-py2.py3-none-any.whl | Bin 24530 -> 0 bytes .../lockfile-0.12.2-py2.py3-none-any.whl | Bin 19752 -> 0 bytes .../packaging-19.0-py2.py3-none-any.whl | Bin 29100 -> 0 bytes .../pip-18.1-py2.py3-none-any.whl | Bin 198470 -> 0 bytes .../pkg_resources-0.0.0-py2.py3-none-any.whl | Bin 124652 -> 0 bytes .../progress-1.2-py2.py3-none-any.whl | Bin 15676 -> 0 bytes .../pyparsing-2.2.0-py2.py3-none-any.whl | Bin 63423 -> 0 bytes .../pytoml-0.1.2-py2.py3-none-any.whl | Bin 13896 -> 0 bytes .../requests-2.21.0-py2.py3-none-any.whl | Bin 65295 -> 0 bytes .../retrying-1.3.3-py2.py3-none-any.whl | Bin 14137 -> 0 bytes .../setuptools-40.8.0-py2.py3-none-any.whl | Bin 468153 -> 0 bytes .../six-1.12.0-py2.py3-none-any.whl | Bin 17683 -> 0 bytes .../urllib3-1.24.1-py2.py3-none-any.whl | Bin 117484 -> 0 bytes .../webencodings-0.5.1-py2.py3-none-any.whl | Bin 18263 -> 0 bytes .../wheel-0.32.3-py2.py3-none-any.whl | Bin 28504 -> 0 bytes 2046 files changed, 117 insertions(+), 364348 deletions(-) delete mode 100644 venv/bin/activate delete mode 100644 venv/bin/activate.csh delete mode 100644 venv/bin/activate.fish delete mode 100755 venv/bin/alembic delete mode 100755 venv/bin/easy_install delete mode 100755 venv/bin/easy_install-3.7 delete mode 100755 venv/bin/flask delete mode 100755 venv/bin/gunicorn delete mode 100755 venv/bin/mako-render delete mode 100755 venv/bin/pip delete mode 100755 venv/bin/pip3 delete mode 100755 venv/bin/pip3.7 delete mode 120000 venv/bin/python delete mode 120000 venv/bin/python3 delete mode 100644 venv/include/site/python3.7/greenlet/greenlet.h delete mode 100644 venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/AUTHORS delete mode 100644 venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/LICENSE delete mode 100644 venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/LICENSE delete mode 100644 venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/__pycache__/console_log.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/__pycache__/editor.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/__pycache__/six.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/LICENSE delete mode 100644 venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/alembic/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/__pycache__/command.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/__pycache__/config.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/__pycache__/context.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/__pycache__/op.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/autogenerate/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/autogenerate/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/autogenerate/__pycache__/api.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/autogenerate/__pycache__/compare.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/autogenerate/__pycache__/render.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/autogenerate/__pycache__/rewriter.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/autogenerate/api.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/autogenerate/compare.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/autogenerate/render.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/autogenerate/rewriter.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/command.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/config.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/context.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/impl.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/mssql.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/mysql.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/oracle.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/postgresql.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/sqlite.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/base.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/impl.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/mssql.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/mysql.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/oracle.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/postgresql.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/ddl/sqlite.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/op.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/operations/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/operations/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/operations/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/operations/__pycache__/batch.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/operations/__pycache__/ops.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/operations/__pycache__/schemaobj.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/operations/__pycache__/toimpl.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/operations/base.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/operations/batch.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/operations/ops.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/operations/schemaobj.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/operations/toimpl.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/runtime/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/runtime/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/runtime/__pycache__/environment.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/runtime/__pycache__/migration.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/runtime/environment.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/runtime/migration.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/script/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/script/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/script/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/script/__pycache__/revision.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/script/__pycache__/write_hooks.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/script/base.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/script/revision.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/script/write_hooks.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/generic/README delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/generic/__pycache__/env.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/generic/alembic.ini.mako delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/generic/env.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/generic/script.py.mako delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/multidb/README delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/multidb/__pycache__/env.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/multidb/alembic.ini.mako delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/multidb/env.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/multidb/script.py.mako delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/pylons/README delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/pylons/__pycache__/env.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/pylons/alembic.ini.mako delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/pylons/env.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/templates/pylons/script.py.mako delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/__pycache__/assertions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/__pycache__/env.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/__pycache__/exclusions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/__pycache__/fixture_functions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/__pycache__/fixtures.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/__pycache__/requirements.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/__pycache__/util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/assertions.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/env.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/exclusions.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/fixture_functions.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/fixtures.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/plugin/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/plugin/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/plugin/__pycache__/bootstrap.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/plugin/__pycache__/plugin_base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/plugin/__pycache__/pytestplugin.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/plugin/bootstrap.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/plugin/plugin_base.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/plugin/pytestplugin.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/requirements.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/testing/util.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/__pycache__/compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/__pycache__/exc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/__pycache__/langhelpers.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/__pycache__/messaging.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/__pycache__/pyfiles.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/__pycache__/sqla_compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/compat.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/exc.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/langhelpers.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/messaging.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/pyfiles.py delete mode 100644 venv/lib/python3.7/site-packages/alembic/util/sqla_compat.py delete mode 100644 venv/lib/python3.7/site-packages/click-7.1.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/click-7.1.1.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.7/site-packages/click-7.1.1.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/click-7.1.1.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/click-7.1.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/click-7.1.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/click/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/_bashcomplete.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/_compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/_termui_impl.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/_textwrap.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/_unicodefun.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/_winconsole.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/core.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/decorators.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/exceptions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/formatting.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/globals.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/parser.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/termui.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/testing.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/types.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/__pycache__/utils.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/click/_bashcomplete.py delete mode 100644 venv/lib/python3.7/site-packages/click/_compat.py delete mode 100644 venv/lib/python3.7/site-packages/click/_termui_impl.py delete mode 100644 venv/lib/python3.7/site-packages/click/_textwrap.py delete mode 100644 venv/lib/python3.7/site-packages/click/_unicodefun.py delete mode 100644 venv/lib/python3.7/site-packages/click/_winconsole.py delete mode 100644 venv/lib/python3.7/site-packages/click/core.py delete mode 100644 venv/lib/python3.7/site-packages/click/decorators.py delete mode 100644 venv/lib/python3.7/site-packages/click/exceptions.py delete mode 100644 venv/lib/python3.7/site-packages/click/formatting.py delete mode 100644 venv/lib/python3.7/site-packages/click/globals.py delete mode 100644 venv/lib/python3.7/site-packages/click/parser.py delete mode 100644 venv/lib/python3.7/site-packages/click/termui.py delete mode 100644 venv/lib/python3.7/site-packages/click/testing.py delete mode 100644 venv/lib/python3.7/site-packages/click/types.py delete mode 100644 venv/lib/python3.7/site-packages/click/utils.py delete mode 100644 venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/DESCRIPTION.rst delete mode 100644 venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/metadata.json delete mode 100644 venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/console_log.py delete mode 100644 venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/namespace_packages.txt delete mode 100644 venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/dataset/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/dataset/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dataset/__pycache__/chunked.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dataset/__pycache__/database.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dataset/__pycache__/table.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dataset/__pycache__/types.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dataset/__pycache__/util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dataset/chunked.py delete mode 100644 venv/lib/python3.7/site-packages/dataset/database.py delete mode 100644 venv/lib/python3.7/site-packages/dataset/table.py delete mode 100644 venv/lib/python3.7/site-packages/dataset/types.py delete mode 100644 venv/lib/python3.7/site-packages/dataset/util.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/__pycache__/_common.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/__pycache__/_version.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/__pycache__/easter.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/__pycache__/relativedelta.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/__pycache__/rrule.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/__pycache__/tzwin.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/__pycache__/utils.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/_common.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/_version.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/easter.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/parser/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/parser/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/parser/__pycache__/_parser.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/parser/__pycache__/isoparser.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/parser/_parser.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/parser/isoparser.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/relativedelta.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/rrule.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/tz/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/_common.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/_factories.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/tz.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/win.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/tz/_common.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/tz/_factories.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/tz/tz.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/tz/win.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/tzwin.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/utils.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/zoneinfo/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz delete mode 100644 venv/lib/python3.7/site-packages/dateutil/zoneinfo/rebuild.py delete mode 100644 venv/lib/python3.7/site-packages/easy_install.py delete mode 100755 venv/lib/python3.7/site-packages/editor.py delete mode 100644 venv/lib/python3.7/site-packages/flask/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/flask/__main__.py delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/__main__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/_compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/app.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/blueprints.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/cli.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/config.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/ctx.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/debughelpers.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/globals.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/helpers.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/logging.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/sessions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/signals.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/templating.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/testing.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/views.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/__pycache__/wrappers.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/_compat.py delete mode 100644 venv/lib/python3.7/site-packages/flask/app.py delete mode 100644 venv/lib/python3.7/site-packages/flask/blueprints.py delete mode 100644 venv/lib/python3.7/site-packages/flask/cli.py delete mode 100644 venv/lib/python3.7/site-packages/flask/config.py delete mode 100644 venv/lib/python3.7/site-packages/flask/ctx.py delete mode 100644 venv/lib/python3.7/site-packages/flask/debughelpers.py delete mode 100644 venv/lib/python3.7/site-packages/flask/globals.py delete mode 100644 venv/lib/python3.7/site-packages/flask/helpers.py delete mode 100644 venv/lib/python3.7/site-packages/flask/json/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/flask/json/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/json/__pycache__/tag.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask/json/tag.py delete mode 100644 venv/lib/python3.7/site-packages/flask/logging.py delete mode 100644 venv/lib/python3.7/site-packages/flask/sessions.py delete mode 100644 venv/lib/python3.7/site-packages/flask/signals.py delete mode 100644 venv/lib/python3.7/site-packages/flask/templating.py delete mode 100644 venv/lib/python3.7/site-packages/flask/testing.py delete mode 100644 venv/lib/python3.7/site-packages/flask/views.py delete mode 100644 venv/lib/python3.7/site-packages/flask/wrappers.py delete mode 100644 venv/lib/python3.7/site-packages/flask_sqlalchemy/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask_sqlalchemy/__pycache__/_compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask_sqlalchemy/__pycache__/model.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask_sqlalchemy/__pycache__/utils.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/flask_sqlalchemy/_compat.py delete mode 100644 venv/lib/python3.7/site-packages/flask_sqlalchemy/model.py delete mode 100644 venv/lib/python3.7/site-packages/flask_sqlalchemy/utils.py delete mode 100644 venv/lib/python3.7/site-packages/gevent-20.5.0.dist-info/AUTHORS delete mode 100644 venv/lib/python3.7/site-packages/gevent-20.5.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/gevent-20.5.0.dist-info/LICENSE delete mode 100644 venv/lib/python3.7/site-packages/gevent-20.5.0.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/gevent-20.5.0.dist-info/NOTICE delete mode 100644 venv/lib/python3.7/site-packages/gevent-20.5.0.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/gevent-20.5.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/gevent-20.5.0.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.7/site-packages/gevent-20.5.0.dist-info/top_level.txt delete mode 100755 venv/lib/python3.7/site-packages/gevent/__abstract_linkable.cpython-37m-arm-linux-gnueabihf.so delete mode 100755 venv/lib/python3.7/site-packages/gevent/__greenlet_primitives.cpython-37m-arm-linux-gnueabihf.so delete mode 100755 venv/lib/python3.7/site-packages/gevent/__hub_local.cpython-37m-arm-linux-gnueabihf.so delete mode 100755 venv/lib/python3.7/site-packages/gevent/__hub_primitives.cpython-37m-arm-linux-gnueabihf.so delete mode 100755 venv/lib/python3.7/site-packages/gevent/__ident.cpython-37m-arm-linux-gnueabihf.so delete mode 100755 venv/lib/python3.7/site-packages/gevent/__imap.cpython-37m-arm-linux-gnueabihf.so delete mode 100644 venv/lib/python3.7/site-packages/gevent/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_abstract_linkable.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_config.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_fileobjectcommon.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_fileobjectposix.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_greenlet_primitives.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_hub_local.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_hub_primitives.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_ident.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_imap.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_interfaces.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_monitor.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_patcher.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_semaphore.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_socket2.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_socket3.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_socketcommon.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_ssl2.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_ssl3.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_sslgte279.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_tblib.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_threading.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_tracer.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_util_py2.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/_waiter.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/ares.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/backdoor.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/baseserver.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/builtins.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/contextvars.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/core.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/event.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/events.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/exceptions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/fileobject.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/greenlet.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/hub.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/local.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/lock.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/monkey.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/os.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/pool.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/pywsgi.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/queue.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/resolver_ares.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/resolver_thread.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/select.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/server.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/signal.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/socket.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/ssl.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/subprocess.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/thread.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/threading.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/threadpool.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/time.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/timeout.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/__pycache__/win32util.cpython-37.pyc delete mode 100755 venv/lib/python3.7/site-packages/gevent/__semaphore.cpython-37m-arm-linux-gnueabihf.so delete mode 100755 venv/lib/python3.7/site-packages/gevent/__tracer.cpython-37m-arm-linux-gnueabihf.so delete mode 100755 venv/lib/python3.7/site-packages/gevent/__waiter.cpython-37m-arm-linux-gnueabihf.so delete mode 100644 venv/lib/python3.7/site-packages/gevent/_abstract_linkable.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_compat.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_config.py delete mode 100755 venv/lib/python3.7/site-packages/gevent/_event.cpython-37m-arm-linux-gnueabihf.so delete mode 100644 venv/lib/python3.7/site-packages/gevent/_ffi/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_ffi/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/_ffi/__pycache__/callback.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/_ffi/__pycache__/loop.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/_ffi/__pycache__/watcher.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/_ffi/callback.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_ffi/loop.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_ffi/watcher.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_fileobjectcommon.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_fileobjectposix.py delete mode 100755 venv/lib/python3.7/site-packages/gevent/_greenlet.cpython-37m-arm-linux-gnueabihf.so delete mode 100644 venv/lib/python3.7/site-packages/gevent/_greenlet_primitives.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_hub_local.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_hub_primitives.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_ident.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_imap.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_interfaces.py delete mode 100755 venv/lib/python3.7/site-packages/gevent/_local.cpython-37m-arm-linux-gnueabihf.so delete mode 100644 venv/lib/python3.7/site-packages/gevent/_monitor.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_patcher.py delete mode 100755 venv/lib/python3.7/site-packages/gevent/_queue.cpython-37m-arm-linux-gnueabihf.so delete mode 100644 venv/lib/python3.7/site-packages/gevent/_semaphore.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_socket2.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_socket3.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_socketcommon.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_ssl2.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_ssl3.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_sslgte279.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_tblib.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_threading.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_tracer.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_util.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_util_py2.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/_waiter.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/ares.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/backdoor.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/baseserver.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/builtins.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/contextvars.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/core.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/event.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/events.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/exceptions.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/fileobject.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/greenlet.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/hub.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/libev/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/libev/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/libev/__pycache__/_corecffi_build.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/libev/__pycache__/corecffi.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/libev/__pycache__/watcher.cpython-37.pyc delete mode 100755 venv/lib/python3.7/site-packages/gevent/libev/_corecffi.abi3.so delete mode 100644 venv/lib/python3.7/site-packages/gevent/libev/_corecffi_build.py delete mode 100755 venv/lib/python3.7/site-packages/gevent/libev/corecext.cpython-37m-arm-linux-gnueabihf.so delete mode 100644 venv/lib/python3.7/site-packages/gevent/libev/corecffi.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/libev/watcher.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/libuv/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/libuv/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/libuv/__pycache__/_corecffi_build.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/libuv/__pycache__/loop.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/libuv/__pycache__/watcher.cpython-37.pyc delete mode 100755 venv/lib/python3.7/site-packages/gevent/libuv/_corecffi.abi3.so delete mode 100644 venv/lib/python3.7/site-packages/gevent/libuv/_corecffi_build.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/libuv/loop.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/libuv/watcher.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/local.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/lock.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/monkey.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/os.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/pool.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/pywsgi.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/queue.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/__pycache__/_addresses.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/__pycache__/_hostsfile.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/__pycache__/ares.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/__pycache__/blocking.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/__pycache__/dnspython.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/__pycache__/thread.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/_addresses.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/_hostsfile.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/ares.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/blocking.py delete mode 100755 venv/lib/python3.7/site-packages/gevent/resolver/cares.cpython-37m-arm-linux-gnueabihf.so delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/dnspython.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver/thread.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver_ares.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/resolver_thread.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/select.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/server.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/signal.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/socket.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/ssl.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/subprocess.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/errorhandler.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/exception.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/flaky.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/hub.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/leakcheck.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/modules.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/monkey_test.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/openfiles.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/params.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/patched_tests_setup.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/resources.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/six.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/skipping.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/sockets.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/support.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/switching.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/sysinfo.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/testcase.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/testrunner.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/timing.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/travis.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/__pycache__/util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/coveragesite/__pycache__/sitecustomize.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/coveragesite/sitecustomize.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/errorhandler.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/exception.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/flaky.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/hub.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/leakcheck.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/modules.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/monkey_test.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/openfiles.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/params.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/patched_tests_setup.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/resources.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/six.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/skipping.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/sockets.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/support.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/switching.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/sysinfo.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/testcase.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/testrunner.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/timing.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/travis.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/testing/util.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/2_7_keycert.pem delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__main__.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/__main__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/_blocks_at_top_level.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/_import_import_patch.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/_import_patch.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/_import_wait.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/_imports_at_top_level.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/_imports_imports_at_top_level.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/getaddrinfo_module.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/known_failures.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/lock_tests.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__GreenletExit.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test___config.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test___ident.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test___monitor.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test___monkey_patching.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__all__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__api.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__api_timeout.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__ares_host_result.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__ares_timeout.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__backdoor.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__close_backend_fd.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__core.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__core_async.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__core_callback.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__core_fork.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__core_loop_run.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__core_stat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__core_timer.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__core_watcher.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__destroy.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__destroy_default_loop.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__doctests.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__environ.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__event.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__events.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__example_echoserver.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__example_portforwarder.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__example_udp_client.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__example_udp_server.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__example_webproxy.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__example_wsgiserver.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__example_wsgiserver_ssl.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__examples.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__exc_info.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__execmodules.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__fileobject.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__getaddrinfo_import.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__greenio.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__greenlet.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__greenletset.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__greenness.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__hub.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__hub_join.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__hub_join_timeout.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__import_blocking_in_greenlet.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__import_wait.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__issue112.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__issue230.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__issue330.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__issue467.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__issue6.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__issue600.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__issue607.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__issue639.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__issue_728.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__issues461_471.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__iwait.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__joinall.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__local.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__loop_callback.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__makefile_ref.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__memleak.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_builtins_future.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_futures_thread.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_hub_in_thread.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_logging.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_module_run.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_multiple_imports.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_queue.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_select.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_selectors.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_sigchld.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_sigchld_2.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_sigchld_3.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_ssl_warning.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_ssl_warning2.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__monkey_ssl_warning3.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__nondefaultloop.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__order.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__os.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__pool.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__pywsgi.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__queue.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__real_greenlet.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__refcount.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__refcount_core.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__resolver_dnspython.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__select.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__semaphore.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__server.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__server_pywsgi.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__signal.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__sleep0.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__socket.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__socket_close.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__socket_dns.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__socket_dns6.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__socket_errors.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__socket_ex.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__socket_send_memoryview.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__socket_ssl.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__socket_timeout.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__socketpair.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__ssl.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__subprocess.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__subprocess_interrupted.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__subprocess_poll.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__systemerror.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__threading.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__threading_2.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__threading_before_monkey.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__threading_holding_lock_while_monkey.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__threading_monkey_in_thread.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__threading_native_before_monkey.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__threading_patched_local.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__threading_vs_settrace.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__threadpool.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__threadpool_executor_patched.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__timeout.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/__pycache__/test__util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/_blocks_at_top_level.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/_import_import_patch.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/_import_patch.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/_import_wait.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/_imports_at_top_level.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/_imports_imports_at_top_level.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/badcert.pem delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/badkey.pem delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/getaddrinfo_module.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/hosts_file.txt delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/https_svn_python_org_root.pem delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/keycert.pem delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/known_failures.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/lock_tests.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/__main__.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/__pycache__/__main__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/__pycache__/issue1526_no_monkey.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/__pycache__/issue1526_with_monkey.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/__pycache__/issue302monkey.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/__pycache__/script.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/__pycache__/threadpool_monkey_patches.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/__pycache__/threadpool_no_monkey.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/issue1526_no_monkey.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/issue1526_with_monkey.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/issue302monkey.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/script.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/threadpool_monkey_patches.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/monkey_package/threadpool_no_monkey.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/nullcert.pem delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/server.crt delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/server.key delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/sha256.pem delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__GreenletExit.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test___config.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test___ident.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test___monitor.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test___monkey_patching.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__all__.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__api.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__api_timeout.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__ares_host_result.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__ares_timeout.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__backdoor.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__close_backend_fd.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__compat.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__core.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__core_async.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__core_callback.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__core_fork.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__core_loop_run.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__core_stat.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__core_timer.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__core_watcher.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__destroy.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__destroy_default_loop.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__doctests.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__environ.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__event.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__events.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__example_echoserver.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__example_portforwarder.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__example_udp_client.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__example_udp_server.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__example_webproxy.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__example_wsgiserver.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__example_wsgiserver_ssl.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__examples.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__exc_info.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__execmodules.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__fileobject.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__getaddrinfo_import.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__greenio.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__greenlet.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__greenletset.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__greenness.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__hub.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__hub_join.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__hub_join_timeout.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__import_blocking_in_greenlet.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__import_wait.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__issue112.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__issue230.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__issue330.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__issue467.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__issue6.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__issue600.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__issue607.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__issue639.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__issue_728.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__issues461_471.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__iwait.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__joinall.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__local.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__loop_callback.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__makefile_ref.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__memleak.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_builtins_future.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_futures_thread.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_hub_in_thread.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_logging.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_module_run.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_multiple_imports.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_queue.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_select.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_selectors.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_sigchld.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_sigchld_2.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_sigchld_3.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_ssl_warning.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_ssl_warning2.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__monkey_ssl_warning3.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__nondefaultloop.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__order.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__os.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__pool.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__pywsgi.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__queue.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__real_greenlet.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__refcount.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__refcount_core.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__resolver_dnspython.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__select.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__semaphore.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__server.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__server_pywsgi.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__signal.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__sleep0.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__socket.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__socket_close.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__socket_dns.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__socket_dns6.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__socket_errors.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__socket_ex.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__socket_send_memoryview.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__socket_ssl.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__socket_timeout.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__socketpair.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__ssl.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__subprocess.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__subprocess_interrupted.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__subprocess_poll.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__systemerror.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__threading.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__threading_2.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__threading_before_monkey.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__threading_holding_lock_while_monkey.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__threading_monkey_in_thread.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__threading_native_before_monkey.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__threading_patched_local.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__threading_vs_settrace.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__threadpool.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__threadpool_executor_patched.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__timeout.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test__util.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test_server.crt delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/test_server.key delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/tests_that_dont_do_leakchecks.txt delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/tests_that_dont_monkeypatch.txt delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/tests_that_dont_use_resolver.txt delete mode 100644 venv/lib/python3.7/site-packages/gevent/tests/wrongcert.pem delete mode 100644 venv/lib/python3.7/site-packages/gevent/thread.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/threading.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/threadpool.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/time.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/timeout.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/util.py delete mode 100644 venv/lib/python3.7/site-packages/gevent/win32util.py delete mode 100644 venv/lib/python3.7/site-packages/gevent_websocket-0.10.1.dist-info/DESCRIPTION.rst delete mode 100644 venv/lib/python3.7/site-packages/gevent_websocket-0.10.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/gevent_websocket-0.10.1.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/gevent_websocket-0.10.1.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/gevent_websocket-0.10.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/gevent_websocket-0.10.1.dist-info/metadata.json delete mode 100644 venv/lib/python3.7/site-packages/gevent_websocket-0.10.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/__pycache__/_compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/__pycache__/exceptions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/__pycache__/handler.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/__pycache__/logging.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/__pycache__/resource.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/__pycache__/server.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/__pycache__/utf8validator.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/__pycache__/utils.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/__pycache__/websocket.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/_compat.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/exceptions.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/gunicorn/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/gunicorn/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/gunicorn/__pycache__/workers.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/gunicorn/workers.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/handler.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/logging.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/protocols/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/protocols/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/protocols/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/protocols/__pycache__/wamp.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/protocols/base.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/protocols/wamp.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/resource.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/server.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/utf8validator.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/utils.py delete mode 100644 venv/lib/python3.7/site-packages/geventwebsocket/websocket.py delete mode 100644 venv/lib/python3.7/site-packages/greenlet-0.4.15.dist-info/AUTHORS delete mode 100644 venv/lib/python3.7/site-packages/greenlet-0.4.15.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/greenlet-0.4.15.dist-info/LICENSE delete mode 100644 venv/lib/python3.7/site-packages/greenlet-0.4.15.dist-info/LICENSE.PSF delete mode 100644 venv/lib/python3.7/site-packages/greenlet-0.4.15.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/greenlet-0.4.15.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/greenlet-0.4.15.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/greenlet-0.4.15.dist-info/top_level.txt delete mode 100755 venv/lib/python3.7/site-packages/greenlet.cpython-37m-arm-linux-gnueabihf.so delete mode 100644 venv/lib/python3.7/site-packages/gunicorn-20.0.4.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/gunicorn-20.0.4.dist-info/LICENSE delete mode 100644 venv/lib/python3.7/site-packages/gunicorn-20.0.4.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/gunicorn-20.0.4.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/gunicorn-20.0.4.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/gunicorn-20.0.4.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.7/site-packages/gunicorn-20.0.4.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/__pycache__/arbiter.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/__pycache__/config.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/__pycache__/debug.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/__pycache__/errors.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/__pycache__/glogging.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/__pycache__/pidfile.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/__pycache__/reloader.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/__pycache__/sock.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/__pycache__/systemd.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/__pycache__/util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/app/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/app/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/app/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/app/__pycache__/pasterapp.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/app/__pycache__/wsgiapp.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/app/base.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/app/pasterapp.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/arbiter.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/config.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/debug.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/errors.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/glogging.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/__pycache__/body.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/__pycache__/errors.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/__pycache__/message.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/__pycache__/parser.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/__pycache__/unreader.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/__pycache__/wsgi.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/body.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/errors.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/message.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/parser.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/unreader.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/http/wsgi.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/instrument/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/instrument/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/instrument/__pycache__/statsd.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/instrument/statsd.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/pidfile.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/reloader.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/sock.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/systemd.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/util.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/__pycache__/base_async.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/__pycache__/geventlet.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/__pycache__/ggevent.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/__pycache__/gthread.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/__pycache__/gtornado.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/__pycache__/sync.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/__pycache__/workertmp.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/base.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/base_async.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/geventlet.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/ggevent.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/gthread.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/gtornado.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/sync.py delete mode 100644 venv/lib/python3.7/site-packages/gunicorn/workers/workertmp.py delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous-1.1.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous-1.1.0.dist-info/LICENSE.rst delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous-1.1.0.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous-1.1.0.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous-1.1.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous-1.1.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/__pycache__/_compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/__pycache__/_json.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/__pycache__/encoding.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/__pycache__/exc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/__pycache__/jws.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/__pycache__/serializer.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/__pycache__/signer.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/__pycache__/timed.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/__pycache__/url_safe.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/_compat.py delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/_json.py delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/encoding.py delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/exc.py delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/jws.py delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/serializer.py delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/signer.py delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/timed.py delete mode 100644 venv/lib/python3.7/site-packages/itsdangerous/url_safe.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/_compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/_identifier.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/asyncfilters.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/asyncsupport.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/bccache.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/compiler.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/constants.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/debug.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/defaults.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/environment.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/exceptions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/ext.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/filters.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/idtracking.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/lexer.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/loaders.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/meta.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/nativetypes.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/nodes.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/optimizer.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/parser.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/runtime.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/sandbox.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/tests.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/utils.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/__pycache__/visitor.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/jinja2/_compat.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/_identifier.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/asyncfilters.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/asyncsupport.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/bccache.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/compiler.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/constants.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/debug.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/defaults.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/environment.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/exceptions.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/ext.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/filters.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/idtracking.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/lexer.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/loaders.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/meta.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/nativetypes.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/nodes.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/optimizer.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/parser.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/runtime.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/sandbox.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/tests.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/utils.py delete mode 100644 venv/lib/python3.7/site-packages/jinja2/visitor.py delete mode 100644 venv/lib/python3.7/site-packages/mako/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/_ast_util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/ast.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/cache.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/cmd.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/codegen.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/exceptions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/filters.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/lexer.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/lookup.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/parsetree.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/pygen.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/pyparser.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/runtime.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/template.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/__pycache__/util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/_ast_util.py delete mode 100644 venv/lib/python3.7/site-packages/mako/ast.py delete mode 100644 venv/lib/python3.7/site-packages/mako/cache.py delete mode 100644 venv/lib/python3.7/site-packages/mako/cmd.py delete mode 100644 venv/lib/python3.7/site-packages/mako/codegen.py delete mode 100644 venv/lib/python3.7/site-packages/mako/compat.py delete mode 100644 venv/lib/python3.7/site-packages/mako/exceptions.py delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/__pycache__/autohandler.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/__pycache__/babelplugin.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/__pycache__/beaker_cache.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/__pycache__/extract.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/__pycache__/linguaplugin.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/__pycache__/preprocessors.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/__pycache__/pygmentplugin.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/__pycache__/turbogears.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/autohandler.py delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/babelplugin.py delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/beaker_cache.py delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/extract.py delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/linguaplugin.py delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/preprocessors.py delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/pygmentplugin.py delete mode 100644 venv/lib/python3.7/site-packages/mako/ext/turbogears.py delete mode 100644 venv/lib/python3.7/site-packages/mako/filters.py delete mode 100644 venv/lib/python3.7/site-packages/mako/lexer.py delete mode 100644 venv/lib/python3.7/site-packages/mako/lookup.py delete mode 100644 venv/lib/python3.7/site-packages/mako/parsetree.py delete mode 100644 venv/lib/python3.7/site-packages/mako/pygen.py delete mode 100644 venv/lib/python3.7/site-packages/mako/pyparser.py delete mode 100644 venv/lib/python3.7/site-packages/mako/runtime.py delete mode 100644 venv/lib/python3.7/site-packages/mako/template.py delete mode 100644 venv/lib/python3.7/site-packages/mako/util.py delete mode 100644 venv/lib/python3.7/site-packages/markupsafe/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/markupsafe/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/markupsafe/__pycache__/_compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/markupsafe/__pycache__/_constants.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/markupsafe/__pycache__/_native.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/markupsafe/_compat.py delete mode 100644 venv/lib/python3.7/site-packages/markupsafe/_constants.py delete mode 100644 venv/lib/python3.7/site-packages/markupsafe/_native.py delete mode 100644 venv/lib/python3.7/site-packages/markupsafe/_speedups.c delete mode 100755 venv/lib/python3.7/site-packages/markupsafe/_speedups.cpython-37m-arm-linux-gnueabihf.so delete mode 100644 venv/lib/python3.7/site-packages/pip-18.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/pip-18.1.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.7/site-packages/pip-18.1.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/pip-18.1.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/pip-18.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/pip-18.1.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.7/site-packages/pip-18.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/pip/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pip/__main__.py delete mode 100644 venv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__pycache__/pyproject.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/build_env.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cache.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/base_command.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/parser.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/show.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/check.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/completion.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/configuration.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/download.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/hash.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/help.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/install.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/list.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/search.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/show.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/configuration.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/download.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/exceptions.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/index.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/locations.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/models/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/models/candidate.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/models/format_control.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/models/index.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/models/link.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/operations/check.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/pep425tags.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/pyproject.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/constructors.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/req_file.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/req_install.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/req_set.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/resolve.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/compat.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/logging.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/misc.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/models.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/typing.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/utils/ui.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/vcs/git.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_internal/wheel.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/check.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py delete mode 100644 venv/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources-0.0.0.dist-info/AUTHORS.txt delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources-0.0.0.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources-0.0.0.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources-0.0.0.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources-0.0.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/pkg_resources/py31compat.py delete mode 100644 venv/lib/python3.7/site-packages/python_dateutil-2.8.1.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/python_dateutil-2.8.1.dist-info/LICENSE delete mode 100644 venv/lib/python3.7/site-packages/python_dateutil-2.8.1.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/python_dateutil-2.8.1.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/python_dateutil-2.8.1.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/python_dateutil-2.8.1.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/python_dateutil-2.8.1.dist-info/zip-safe delete mode 100755 venv/lib/python3.7/site-packages/python_editor-1.0.4.dist-info/DESCRIPTION.rst delete mode 100644 venv/lib/python3.7/site-packages/python_editor-1.0.4.dist-info/INSTALLER delete mode 100755 venv/lib/python3.7/site-packages/python_editor-1.0.4.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/python_editor-1.0.4.dist-info/RECORD delete mode 100755 venv/lib/python3.7/site-packages/python_editor-1.0.4.dist-info/WHEEL delete mode 100755 venv/lib/python3.7/site-packages/python_editor-1.0.4.dist-info/metadata.json delete mode 100755 venv/lib/python3.7/site-packages/python_editor-1.0.4.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/AUTHORS.txt delete mode 100644 venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/LICENSE.txt delete mode 100644 venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/dependency_links.txt delete mode 100644 venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/entry_points.txt delete mode 100644 venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/setuptools-40.8.0.dist-info/zip-safe delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_deprecation_warning.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/_vendor/six.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/archive_util.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/build_meta.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/cli-32.exe delete mode 100644 venv/lib/python3.7/site-packages/setuptools/cli-64.exe delete mode 100644 venv/lib/python3.7/site-packages/setuptools/cli.exe delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/alias.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/build_clib.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/build_ext.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/build_py.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/develop.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/dist_info.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/easy_install.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/egg_info.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/install.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/install_lib.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/install_scripts.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/py36compat.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/register.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/rotate.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/saveopts.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/sdist.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/setopt.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/test.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/upload.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/command/upload_docs.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/config.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/dep_util.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/depends.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/dist.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/extension.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/extern/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/setuptools/glibc.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/glob.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/gui-32.exe delete mode 100644 venv/lib/python3.7/site-packages/setuptools/gui-64.exe delete mode 100644 venv/lib/python3.7/site-packages/setuptools/gui.exe delete mode 100644 venv/lib/python3.7/site-packages/setuptools/launch.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/monkey.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/msvc.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/namespaces.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/package_index.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/pep425tags.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/py27compat.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/py31compat.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/py33compat.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/sandbox.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/script (dev).tmpl delete mode 100644 venv/lib/python3.7/site-packages/setuptools/script.tmpl delete mode 100644 venv/lib/python3.7/site-packages/setuptools/site-patch.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/ssl_support.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/unicode_utils.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/version.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/wheel.py delete mode 100644 venv/lib/python3.7/site-packages/setuptools/windows_support.py delete mode 100644 venv/lib/python3.7/site-packages/six-1.14.0.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/six-1.14.0.dist-info/LICENSE delete mode 100644 venv/lib/python3.7/site-packages/six-1.14.0.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/six-1.14.0.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/six-1.14.0.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/six-1.14.0.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/six.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/__pycache__/events.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/__pycache__/exc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/__pycache__/inspection.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/__pycache__/interfaces.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/__pycache__/log.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/__pycache__/processors.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/__pycache__/schema.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/__pycache__/types.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/connectors/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/connectors/__pycache__/mxodbc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/connectors/__pycache__/zxJDBC.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/connectors/mxodbc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/connectors/pyodbc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/connectors/zxJDBC.py delete mode 100755 venv/lib/python3.7/site-packages/sqlalchemy/cprocessors.cpython-37m-arm-linux-gnueabihf.so delete mode 100755 venv/lib/python3.7/site-packages/sqlalchemy/cresultproxy.cpython-37m-arm-linux-gnueabihf.so delete mode 100755 venv/lib/python3.7/site-packages/sqlalchemy/cutils.cpython-37m-arm-linux-gnueabihf.so delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/databases/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/databases/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/firebird/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/firebird/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/firebird/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/firebird/fdb.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/firebird/kinterbasdb.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__pycache__/provision.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/adodbapi.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/information_schema.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/mxodbc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/provision.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/pymssql.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/pyodbc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/zxjdbc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/dml.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/provision.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/cymysql.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/dml.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/enumerated.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/gaerdbms.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/json.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/oursql.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/provision.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/pymysql.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/pyodbc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/reflection.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/types.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/zxjdbc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/__pycache__/provision.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/provision.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/oracle/zxjdbc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/array.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/json.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pygresql.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/array.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/dml.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/ext.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/hstore.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/json.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/pg8000.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/provision.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/psycopg2cffi.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/pygresql.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/pypostgresql.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/ranges.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/postgresql/zxjdbc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/__pycache__/json.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/json.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/provision.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/pysqlcipher.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sybase/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sybase/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sybase/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sybase/mxodbc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sybase/pyodbc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/dialects/sybase/pysybase.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/__pycache__/default.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/__pycache__/reflection.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/__pycache__/result.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/__pycache__/strategies.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/__pycache__/threadlocal.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/__pycache__/url.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/__pycache__/util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/interfaces.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/reflection.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/result.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/strategies.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/threadlocal.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/url.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/engine/util.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/event/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/event/__pycache__/api.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/event/__pycache__/attr.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/event/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/event/__pycache__/registry.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/event/api.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/event/attr.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/event/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/event/legacy.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/event/registry.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/events.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/exc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__pycache__/associationproxy.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__pycache__/automap.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__pycache__/baked.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__pycache__/compiler.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__pycache__/horizontal_shard.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__pycache__/hybrid.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__pycache__/indexable.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__pycache__/instrumentation.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__pycache__/mutable.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__pycache__/orderinglist.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/__pycache__/serializer.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/associationproxy.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/automap.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/baked.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/compiler.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/declarative/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/declarative/__pycache__/api.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/declarative/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/declarative/api.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/declarative/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/declarative/clsregistry.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/horizontal_shard.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/hybrid.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/indexable.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/instrumentation.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/mutable.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/orderinglist.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/ext/serializer.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/inspection.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/interfaces.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/log.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/attributes.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/collections.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/dependency.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/events.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/properties.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/query.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/session.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/state.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/strategies.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/__pycache__/util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/collections.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/dependency.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/deprecated_interfaces.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/descriptor_props.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/dynamic.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/evaluator.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/events.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/exc.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/identity.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/instrumentation.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/interfaces.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/loading.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/mapper.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/path_registry.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/properties.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/query.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/relationships.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/scoping.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/state.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/strategies.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/strategy_options.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/sync.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/orm/util.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/pool/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/pool/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/pool/__pycache__/dbapi_proxy.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/pool/__pycache__/impl.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/pool/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/pool/dbapi_proxy.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/pool/impl.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/processors.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/schema.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/annotation.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/default_comparator.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/dml.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/naming.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/schema.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/__pycache__/visitors.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/annotation.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/compiler.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/crud.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/ddl.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/default_comparator.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/dml.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/elements.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/expression.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/functions.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/naming.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/operators.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/schema.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/selectable.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/sqltypes.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/type_api.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/util.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/sql/visitors.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/assertions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/assertsql.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/config.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/engines.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/entities.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/exclusions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/fixtures.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/mock.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/pickleable.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/profiling.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/provision.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/replay_fixture.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/requirements.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/schema.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/util.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/__pycache__/warnings.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/assertions.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/assertsql.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/config.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/engines.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/entities.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/exclusions.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/fixtures.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/mock.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/pickleable.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/plugin/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/plugin/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/plugin/bootstrap.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/plugin/plugin_base.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/plugin/pytestplugin.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/profiling.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/provision.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/replay_fixture.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/requirements.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/schema.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/__pycache__/test_cte.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/__pycache__/test_insert.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/__pycache__/test_results.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/__pycache__/test_select.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/__pycache__/test_types.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/test_cte.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/test_ddl.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/test_dialect.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/test_insert.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/test_reflection.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/test_results.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/test_select.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/test_sequence.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/test_types.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/suite/test_update_delete.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/util.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/testing/warnings.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/types.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/__pycache__/compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/__pycache__/langhelpers.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/__pycache__/queue.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/__pycache__/topological.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/_collections.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/deprecations.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/queue.py delete mode 100644 venv/lib/python3.7/site-packages/sqlalchemy/util/topological.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/_compat.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/_internal.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/_reloader.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/datastructures.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/exceptions.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/filesystem.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/formparser.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/http.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/local.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/posixemulation.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/routing.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/security.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/serving.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/test.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/testapp.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/urls.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/useragents.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/utils.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/__pycache__/wsgi.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/_compat.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/_internal.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/_reloader.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/datastructures.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/__pycache__/console.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/__pycache__/repr.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/console.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/repr.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/shared/FONT_LICENSE delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/shared/console.png delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/shared/debugger.js delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/shared/jquery.js delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/shared/less.png delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/shared/more.png delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/shared/source.png delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/shared/style.css delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/shared/ubuntu.ttf delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/debug/tbtools.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/exceptions.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/filesystem.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/formparser.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/http.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/local.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/lint.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/dispatcher.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/http_proxy.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/lint.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/profiler.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/proxy_fix.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/middleware/shared_data.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/posixemulation.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/routing.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/security.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/serving.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/test.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/testapp.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/urls.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/useragents.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/utils.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/cors.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/etag.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/json.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/request.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/response.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/accept.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/auth.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/base_request.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/base_response.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/common_descriptors.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/cors.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/etag.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/json.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/request.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/response.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wrappers/user_agent.py delete mode 100644 venv/lib/python3.7/site-packages/werkzeug/wsgi.py delete mode 100644 venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/DESCRIPTION.rst delete mode 100644 venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/INSTALLER delete mode 100644 venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/METADATA delete mode 100644 venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/RECORD delete mode 100644 venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/WHEEL delete mode 100644 venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/metadata.json delete mode 100644 venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/top_level.txt delete mode 100644 venv/lib/python3.7/site-packages/wsgigzip/__init__.py delete mode 100644 venv/lib/python3.7/site-packages/wsgigzip/__pycache__/__init__.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/wsgigzip/__pycache__/gzip.cpython-37.pyc delete mode 100644 venv/lib/python3.7/site-packages/wsgigzip/gzip.py delete mode 100644 venv/pyvenv.cfg delete mode 100644 venv/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/appdirs-1.4.3-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/certifi-2018.8.24-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/chardet-3.0.4-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/colorama-0.3.7-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/distlib-0.2.8-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/distro-1.3.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/html5lib-1.0.1-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/idna-2.6-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/ipaddress-0.0.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/lockfile-0.12.2-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/packaging-19.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/pip-18.1-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/pkg_resources-0.0.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/progress-1.2-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/pytoml-0.1.2-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/requests-2.21.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/retrying-1.3.3-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/setuptools-40.8.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/six-1.12.0-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/urllib3-1.24.1-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/webencodings-0.5.1-py2.py3-none-any.whl delete mode 100644 venv/share/python-wheels/wheel-0.32.3-py2.py3-none-any.whl diff --git a/requirements.txt b/requirements.txt index 02e4857..e5adb79 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,21 +1,117 @@ -alembic -click -console-log -dataset -Flask -Flask-SQLAlchemy -gevent -gevent-websocket -greenlet -gunicorn -itsdangerous -Jinja2 -Mako -MarkupSafe -python-dateutil -python-editor -setuptools -six -SQLAlchemy -Werkzeug -wsgigzip +alembic==1.0.0.dev0 +ansible==2.7.7 +apache-libcloud==2.4.0 +argcomplete==1.11.1 +arrow==0.15.5 +asn1crypto==0.24.0 +Babel==2.6.0 +bcrypt==3.1.6 +binaryornot==0.4.4 +blinker==1.4 +certifi==2018.8.24 +chardet==3.0.4 +Click==7.0 +colorama==0.3.7 +configobj==5.0.6 +console-log==0.2.10 +cookiecutter==1.7.0 +cryptography==2.6.1 +dataset==1.3.1 +decorator==4.3.0 +distro-info==0.21 +Flask==1.0.2 +Flask-BabelEx==0.9.3 +Flask-Compress==1.4.0 +Flask-Gravatar==0.4.2 +Flask-Login==0.4.1 +Flask-Mail==0.9.1 +Flask-Migrate==2.1.1 +Flask-Paranoid==0.2.0 +Flask-Principal==0.4.0 +Flask-Security==1.7.5 +Flask-SQLAlchemy==2.1 +Flask-WTF==0.14.2 +future==0.18.2 +gevent==20.5.0 +gevent-websocket==0.10.1 +greenlet==0.4.15 +gunicorn==20.0.4 +httpie==0.9.8 +httplib2==0.11.3 +hupper==1.9.1 +idna==2.6 +importlib-metadata==1.6.0 +ipython==5.8.0 +ipython-genutils==0.2.0 +itsdangerous==0.24 +Jinja2==2.11.1 +jinja2-time==0.2.0 +jmespath==0.9.4 +lockfile==0.12.2 +Mako==1.0.7 +MarkupSafe==1.1.1 +netaddr==0.7.19 +ntlm-auth==1.1.0 +olefile==0.46 +paramiko==2.4.2 +passlib==1.7.1 +PasteDeploy==2.1.0 +pexpect==4.6.0 +pickleshare==0.7.5 +Pillow==7.0.0 +plaster==1.0 +plaster-pastedeploy==0.7 +poyo==0.5.0 +prompt-toolkit==1.0.15 +psutil==5.5.1 +psycopg2==2.8.5 +pyasn1==0.4.2 +pycairo==1.16.2 +pycrypto==2.6.1 +pycurl==7.43.0.2 +Pygments==2.3.1 +PyGObject==3.30.4 +pyinotify==0.9.6 +pykerberos==1.1.14 +PyNaCl==1.3.0 +pyOpenSSL==19.0.0 +pyramid==1.10.4 +PySimpleSOAP==1.16.2 +pyStrich==0.8 +python-apt==1.8.4.1 +python-dateutil==2.8.1 +python-debian==0.1.35 +python-debianbts==2.8.2 +python-editor==1.0.3 +pytz==2019.1 +pywinrm==0.3.0 +PyYAML==3.13 +reportbug===7.5.3-deb10u1 +reportlab==3.5.13 +requests==2.22.0 +requests-kerberos==0.11.0 +requests-ntlm==1.1.0 +scour==0.37 +simplegeneric==0.8.1 +simplejson==3.16.0 +six==1.12.0 +SQLAlchemy>=1.3.1 +sqlparse==0.2.4 +sshtunnel==0.1.4 +traitlets==4.3.2 +translationstring==1.3 +unattended-upgrades==0.1 +urllib3==1.24.1 +venusian==3.0.0 +virtualenv==16.7.9 +wcwidth==0.1.7 +WebOb==1.8.6 +Werkzeug==0.16.0 +whichcraft==0.6.1 +wsgigzip==0.1.4 +WTForms==2.2.1 +xmltodict==0.11.0 +yq==2.10.0 +zipp==3.1.0 +zope.deprecation==4.4.0 +zope.interface==4.7.1 diff --git a/venv/bin/activate b/venv/bin/activate deleted file mode 100644 index 3971a44..0000000 --- a/venv/bin/activate +++ /dev/null @@ -1,76 +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 - fi - - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - if [ ! "$1" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -VIRTUAL_ENV="/var/www/TacticalApp/venv" -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:-}" - if [ "x(venv) " != x ] ; then - PS1="(venv) ${PS1:-}" - else - if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" - else - PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" - fi - fi - export PS1 -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 -fi diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh deleted file mode 100644 index d45085f..0000000 --- a/venv/bin/activate.csh +++ /dev/null @@ -1,37 +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; test "\!:*" != "nondestructive" && unalias deactivate' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV "/var/www/TacticalApp/venv" - -set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/bin:$PATH" - - -set _OLD_VIRTUAL_PROMPT="$prompt" - -if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - if ("venv" != "") then - set env_name = "venv" - else - if (`basename "VIRTUAL_ENV"` == "__") then - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` - else - set env_name = `basename "$VIRTUAL_ENV"` - endif - endif - set prompt = "[$env_name] $prompt" - unset env_name -endif - -alias pydoc python -m pydoc - -rehash diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish deleted file mode 100644 index c91a377..0000000 --- a/venv/bin/activate.fish +++ /dev/null @@ -1,75 +0,0 @@ -# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) -# you cannot run it directly - -function deactivate -d "Exit virtualenv 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" - functions -e fish_prompt - set -e _OLD_FISH_PROMPT_OVERRIDE - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - end - - set -e VIRTUAL_ENV - if test "$argv[1]" != "nondestructive" - # Self destruct! - functions -e deactivate - end -end - -# unset irrelevant variables -deactivate nondestructive - -set -gx VIRTUAL_ENV "/var/www/TacticalApp/venv" - -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 - - # Prompt override? - if test -n "(venv) " - printf "%s%s" "(venv) " (set_color normal) - else - # ...Otherwise, prepend env - set -l _checkbase (basename "$VIRTUAL_ENV") - if test $_checkbase = "__" - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) - else - printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) - end - end - - # Restore the return status of the previous command. - echo "exit $old_status" | . - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" -end diff --git a/venv/bin/alembic b/venv/bin/alembic deleted file mode 100755 index 67387f4..0000000 --- a/venv/bin/alembic +++ /dev/null @@ -1,10 +0,0 @@ -#!/var/www/TacticalApp/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from alembic.config import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/easy_install b/venv/bin/easy_install deleted file mode 100755 index 7671bcb..0000000 --- a/venv/bin/easy_install +++ /dev/null @@ -1,10 +0,0 @@ -#!/var/www/TacticalApp/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from setuptools.command.easy_install import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/easy_install-3.7 b/venv/bin/easy_install-3.7 deleted file mode 100755 index 7671bcb..0000000 --- a/venv/bin/easy_install-3.7 +++ /dev/null @@ -1,10 +0,0 @@ -#!/var/www/TacticalApp/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from setuptools.command.easy_install import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/flask b/venv/bin/flask deleted file mode 100755 index 0c6b1fb..0000000 --- a/venv/bin/flask +++ /dev/null @@ -1,10 +0,0 @@ -#!/var/www/TacticalApp/venv/bin/python3 -# -*- 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/bin/gunicorn b/venv/bin/gunicorn deleted file mode 100755 index 39136ce..0000000 --- a/venv/bin/gunicorn +++ /dev/null @@ -1,10 +0,0 @@ -#!/var/www/TacticalApp/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from gunicorn.app.wsgiapp import run - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(run()) diff --git a/venv/bin/mako-render b/venv/bin/mako-render deleted file mode 100755 index 16006e8..0000000 --- a/venv/bin/mako-render +++ /dev/null @@ -1,10 +0,0 @@ -#!/var/www/TacticalApp/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from mako.cmd import cmdline - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(cmdline()) diff --git a/venv/bin/pip b/venv/bin/pip deleted file mode 100755 index 56a52d0..0000000 --- a/venv/bin/pip +++ /dev/null @@ -1,10 +0,0 @@ -#!/var/www/TacticalApp/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip3 b/venv/bin/pip3 deleted file mode 100755 index 56a52d0..0000000 --- a/venv/bin/pip3 +++ /dev/null @@ -1,10 +0,0 @@ -#!/var/www/TacticalApp/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/pip3.7 b/venv/bin/pip3.7 deleted file mode 100755 index 56a52d0..0000000 --- a/venv/bin/pip3.7 +++ /dev/null @@ -1,10 +0,0 @@ -#!/var/www/TacticalApp/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/python b/venv/bin/python deleted file mode 120000 index b8a0adb..0000000 --- a/venv/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/venv/bin/python3 b/venv/bin/python3 deleted file mode 120000 index ae65fda..0000000 --- a/venv/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/venv/include/site/python3.7/greenlet/greenlet.h b/venv/include/site/python3.7/greenlet/greenlet.h deleted file mode 100644 index 8fff3f5..0000000 --- a/venv/include/site/python3.7/greenlet/greenlet.h +++ /dev/null @@ -1,157 +0,0 @@ -/* vim:set noet ts=8 sw=8 : */ - -/* Greenlet object interface */ - -#ifndef Py_GREENLETOBJECT_H -#define Py_GREENLETOBJECT_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define GREENLET_VERSION "0.4.15" - -#if PY_VERSION_HEX >= 0x030700A3 -# define GREENLET_USE_EXC_INFO -#endif - -typedef struct _greenlet { - PyObject_HEAD - char* stack_start; - char* stack_stop; - char* stack_copy; - intptr_t stack_saved; - struct _greenlet* stack_prev; - struct _greenlet* parent; - PyObject* run_info; - struct _frame* top_frame; - int recursion_depth; - PyObject* weakreflist; -#ifdef GREENLET_USE_EXC_INFO - _PyErr_StackItem* exc_info; - _PyErr_StackItem exc_state; -#else - PyObject* exc_type; - PyObject* exc_value; - PyObject* exc_traceback; -#endif - PyObject* dict; -} PyGreenlet; - -#define PyGreenlet_Check(op) PyObject_TypeCheck(op, &PyGreenlet_Type) -#define PyGreenlet_MAIN(op) (((PyGreenlet*)(op))->stack_stop == (char*) -1) -#define PyGreenlet_STARTED(op) (((PyGreenlet*)(op))->stack_stop != NULL) -#define PyGreenlet_ACTIVE(op) (((PyGreenlet*)(op))->stack_start != NULL) -#define PyGreenlet_GET_PARENT(op) (((PyGreenlet*)(op))->parent) - -#if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 7) || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 1) || PY_MAJOR_VERSION > 3 -#define GREENLET_USE_PYCAPSULE -#endif - -/* C API functions */ - -/* Total number of symbols that are exported */ -#define PyGreenlet_API_pointers 8 - -#define PyGreenlet_Type_NUM 0 -#define PyExc_GreenletError_NUM 1 -#define PyExc_GreenletExit_NUM 2 - -#define PyGreenlet_New_NUM 3 -#define PyGreenlet_GetCurrent_NUM 4 -#define PyGreenlet_Throw_NUM 5 -#define PyGreenlet_Switch_NUM 6 -#define PyGreenlet_SetParent_NUM 7 - -#ifndef GREENLET_MODULE -/* This section is used by modules that uses the greenlet C API */ -static void **_PyGreenlet_API = NULL; - -#define PyGreenlet_Type (*(PyTypeObject *) _PyGreenlet_API[PyGreenlet_Type_NUM]) - -#define PyExc_GreenletError \ - ((PyObject *) _PyGreenlet_API[PyExc_GreenletError_NUM]) - -#define PyExc_GreenletExit \ - ((PyObject *) _PyGreenlet_API[PyExc_GreenletExit_NUM]) - -/* - * PyGreenlet_New(PyObject *args) - * - * greenlet.greenlet(run, parent=None) - */ -#define PyGreenlet_New \ - (* (PyGreenlet * (*)(PyObject *run, PyGreenlet *parent)) \ - _PyGreenlet_API[PyGreenlet_New_NUM]) - -/* - * PyGreenlet_GetCurrent(void) - * - * greenlet.getcurrent() - */ -#define PyGreenlet_GetCurrent \ - (* (PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) - -/* - * PyGreenlet_Throw( - * PyGreenlet *greenlet, - * PyObject *typ, - * PyObject *val, - * PyObject *tb) - * - * g.throw(...) - */ -#define PyGreenlet_Throw \ - (* (PyObject * (*) \ - (PyGreenlet *self, PyObject *typ, PyObject *val, PyObject *tb)) \ - _PyGreenlet_API[PyGreenlet_Throw_NUM]) - -/* - * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) - * - * g.switch(*args, **kwargs) - */ -#define PyGreenlet_Switch \ - (* (PyObject * (*)(PyGreenlet *greenlet, PyObject *args, PyObject *kwargs)) \ - _PyGreenlet_API[PyGreenlet_Switch_NUM]) - -/* - * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) - * - * g.parent = new_parent - */ -#define PyGreenlet_SetParent \ - (* (int (*)(PyGreenlet *greenlet, PyGreenlet *nparent)) \ - _PyGreenlet_API[PyGreenlet_SetParent_NUM]) - -/* Macro that imports greenlet and initializes C API */ -#ifdef GREENLET_USE_PYCAPSULE -#define PyGreenlet_Import() \ -{ \ - _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ -} -#else -#define PyGreenlet_Import() \ -{ \ - PyObject *module = PyImport_ImportModule("greenlet"); \ - if (module != NULL) { \ - PyObject *c_api_object = PyObject_GetAttrString( \ - module, "_C_API"); \ - if (c_api_object != NULL && PyCObject_Check(c_api_object)) { \ - _PyGreenlet_API = \ - (void **) PyCObject_AsVoidPtr(c_api_object); \ - Py_DECREF(c_api_object); \ - } \ - Py_DECREF(module); \ - } \ -} -#endif - -#endif /* GREENLET_MODULE */ - -#ifdef __cplusplus -} -#endif -#endif /* !Py_GREENLETOBJECT_H */ diff --git a/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/LICENSE.rst b/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/LICENSE.rst deleted file mode 100644 index 9d227a0..0000000 --- a/venv/lib/python3.7/site-packages/Flask-1.1.1.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/lib/python3.7/site-packages/Flask-1.1.1.dist-info/METADATA b/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/METADATA deleted file mode 100644 index 08fcc91..0000000 --- a/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/METADATA +++ /dev/null @@ -1,134 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask -Version: 1.1.1 -Summary: A simple framework for building complex web applications. -Home-page: https://palletsprojects.com/p/flask/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: Pallets -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Documentation, https://flask.palletsprojects.com/ -Project-URL: Code, https://github.com/pallets/flask -Project-URL: Issue tracker, https://github.com/pallets/flask/issues -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Flask -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application -Classifier: Topic :: Software Development :: Libraries :: Application Frameworks -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* -Requires-Dist: Werkzeug (>=0.15) -Requires-Dist: Jinja2 (>=2.10.1) -Requires-Dist: itsdangerous (>=0.24) -Requires-Dist: click (>=5.1) -Provides-Extra: dev -Requires-Dist: pytest ; extra == 'dev' -Requires-Dist: coverage ; extra == 'dev' -Requires-Dist: tox ; extra == 'dev' -Requires-Dist: sphinx ; extra == 'dev' -Requires-Dist: pallets-sphinx-themes ; extra == 'dev' -Requires-Dist: sphinxcontrib-log-cabinet ; extra == 'dev' -Requires-Dist: sphinx-issues ; extra == 'dev' -Provides-Extra: docs -Requires-Dist: sphinx ; extra == 'docs' -Requires-Dist: pallets-sphinx-themes ; extra == 'docs' -Requires-Dist: sphinxcontrib-log-cabinet ; extra == 'docs' -Requires-Dist: sphinx-issues ; extra == 'docs' -Provides-Extra: dotenv -Requires-Dist: python-dotenv ; extra == 'dotenv' - -Flask -===== - -Flask is a lightweight `WSGI`_ web application framework. It is designed -to make getting started quick and easy, with the ability to scale up to -complex applications. It began as a simple wrapper around `Werkzeug`_ -and `Jinja`_ and has become one of the most popular Python web -application frameworks. - -Flask offers suggestions, but doesn't enforce any dependencies or -project layout. It is up to the developer to choose the tools and -libraries they want to use. There are many extensions provided by the -community that make adding new functionality easy. - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - pip install -U Flask - - -A Simple Example ----------------- - -.. code-block:: python - - from flask import Flask - - app = Flask(__name__) - - @app.route("/") - def hello(): - return "Hello, World!" - -.. code-block:: text - - $ env FLASK_APP=hello.py flask run - * Serving Flask app "hello" - * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) - - -Contributing ------------- - -For guidance on setting up a development environment and how to make a -contribution to Flask, see the `contributing guidelines`_. - -.. _contributing guidelines: https://github.com/pallets/flask/blob/master/CONTRIBUTING.rst - - -Donate ------- - -The Pallets organization develops and supports Flask and the libraries -it uses. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, `please -donate today`_. - -.. _please donate today: https://psfmember.org/civicrm/contribute/transact?reset=1&id=20 - - -Links ------ - -* Website: https://palletsprojects.com/p/flask/ -* Documentation: https://flask.palletsprojects.com/ -* Releases: https://pypi.org/project/Flask/ -* Code: https://github.com/pallets/flask -* Issue tracker: https://github.com/pallets/flask/issues -* Test status: https://dev.azure.com/pallets/flask/_build -* Official chat: https://discord.gg/t6rrQZH - -.. _WSGI: https://wsgi.readthedocs.io -.. _Werkzeug: https://www.palletsprojects.com/p/werkzeug/ -.. _Jinja: https://www.palletsprojects.com/p/jinja/ -.. _pip: https://pip.pypa.io/en/stable/quickstart/ - - diff --git a/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/RECORD b/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/RECORD deleted file mode 100644 index bc0c526..0000000 --- a/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/RECORD +++ /dev/null @@ -1,48 +0,0 @@ -../../../bin/flask,sha256=s-6d4F3VC8_p4RMKgO4CDN_Wbz-3ik6F2Qv69FO-mCU,232 -Flask-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask-1.1.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -Flask-1.1.1.dist-info/METADATA,sha256=Ht4R6TpTKOaXOmmQHhEF3A0Obpzde2Ai0kzNdu6-VWQ,4400 -Flask-1.1.1.dist-info/RECORD,, -Flask-1.1.1.dist-info/WHEEL,sha256=h_aVn5OB2IERUjMbi2pucmR_zzWJtk303YXvhh60NJ8,110 -Flask-1.1.1.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42 -Flask-1.1.1.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 -flask/__init__.py,sha256=qaBW4gy9Xxmdc3ygYO0_H214H1VpF7fq8xRR4XbqRjE,1894 -flask/__main__.py,sha256=fjVtt3QTANXlpJCOv3Ha7d5H-76MwzSIOab7SFD9TEk,254 -flask/__pycache__/__init__.cpython-37.pyc,, -flask/__pycache__/__main__.cpython-37.pyc,, -flask/__pycache__/_compat.cpython-37.pyc,, -flask/__pycache__/app.cpython-37.pyc,, -flask/__pycache__/blueprints.cpython-37.pyc,, -flask/__pycache__/cli.cpython-37.pyc,, -flask/__pycache__/config.cpython-37.pyc,, -flask/__pycache__/ctx.cpython-37.pyc,, -flask/__pycache__/debughelpers.cpython-37.pyc,, -flask/__pycache__/globals.cpython-37.pyc,, -flask/__pycache__/helpers.cpython-37.pyc,, -flask/__pycache__/logging.cpython-37.pyc,, -flask/__pycache__/sessions.cpython-37.pyc,, -flask/__pycache__/signals.cpython-37.pyc,, -flask/__pycache__/templating.cpython-37.pyc,, -flask/__pycache__/testing.cpython-37.pyc,, -flask/__pycache__/views.cpython-37.pyc,, -flask/__pycache__/wrappers.cpython-37.pyc,, -flask/_compat.py,sha256=8KPT54Iig96TuLipdogLRHNYToIcg-xPhnSV5VRERnw,4099 -flask/app.py,sha256=gLZInxueeQ9dkBo1wrntZ-bZqiDT4rYxy_AQ1xraFDc,98066 -flask/blueprints.py,sha256=vkdm8NusGsfZUeIfPdCluj733QFmiQcT4Sk1tuZLUjw,21400 -flask/cli.py,sha256=_WhPG1bggNdrP0QO95Vex6VJpDqTsVK0z54Y5poljKU,30933 -flask/config.py,sha256=3dejvQRYfNHw_V7dCLMxU8UNFpL34xIKemN7gHZIZ8Y,10052 -flask/ctx.py,sha256=cks-omGedkxawHFo6bKIrdOHsJCAgg1i_NWw_htxb5U,16724 -flask/debughelpers.py,sha256=-whvPKuAoU8AZ9c1z_INuOeBgfYDqE1J2xNBsoriugU,6475 -flask/globals.py,sha256=OgcHb6_NCyX6-TldciOdKcyj4PNfyQwClxdMhvov6aA,1637 -flask/helpers.py,sha256=x2Pa85R5dV6uA5f5423JTb6x4u6ZaMGf8sfosUZ76dQ,43004 -flask/json/__init__.py,sha256=6nITbZYiYOPB8Qfi1-dvsblwn01KRz8VOsMBIZyaYek,11988 -flask/json/__pycache__/__init__.cpython-37.pyc,, -flask/json/__pycache__/tag.cpython-37.pyc,, -flask/json/tag.py,sha256=vq9GOllg_0kTWKuVFrwmkeOQzR-jdBD23x-89JyCCQI,8306 -flask/logging.py,sha256=WcY5UkqTysGfmosyygSlXyZYGwOp3y-VsE6ehoJ48dk,3250 -flask/sessions.py,sha256=G0KsEkr_i1LG_wOINwFSOW3ts7Xbv4bNgEZKc7TRloc,14360 -flask/signals.py,sha256=yYLOed2x8WnQ7pirGalQYfpYpCILJ0LJhmNSrnWvjqw,2212 -flask/templating.py,sha256=F8E_IZXn9BGsjMzUJ5N_ACMyZdiFBp_SSEaUunvfZ7g,4939 -flask/testing.py,sha256=b0QaEejx0UcXqfSFP43k5W57bTVeDyrNK3uPD8JUpCk,10146 -flask/views.py,sha256=eeWnadLAj0QdQPLtjKipDetRZyG62CT2y7fNOFDJz0g,5802 -flask/wrappers.py,sha256=kgsvtZuMM6RQaDqhRbc5Pcj9vqTnaERl2pmXcdGL7LU,4736 diff --git a/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/WHEEL b/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/WHEEL deleted file mode 100644 index 78e6f69..0000000 --- a/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.33.4) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/entry_points.txt b/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/entry_points.txt deleted file mode 100644 index 1eb0252..0000000 --- a/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -flask = flask.cli:main - diff --git a/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/top_level.txt deleted file mode 100644 index 7e10602..0000000 --- a/venv/lib/python3.7/site-packages/Flask-1.1.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -flask diff --git a/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/LICENSE.rst b/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/LICENSE.rst deleted file mode 100644 index 9d227a0..0000000 --- a/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.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/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/METADATA b/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/METADATA deleted file mode 100644 index 4686cd3..0000000 --- a/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/METADATA +++ /dev/null @@ -1,94 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask-SQLAlchemy -Version: 2.4.1 -Summary: Adds SQLAlchemy support to your Flask application. -Home-page: https://github.com/pallets/flask-sqlalchemy -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: Pallets -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Documentation, https://flask-sqlalchemy.palletsprojects.com/ -Project-URL: Code, https://github.com/pallets/flask-sqlalchemy -Project-URL: Issue tracker, https://github.com/pallets/flask-sqlalchemy/issues -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.* -Requires-Dist: Flask (>=0.10) -Requires-Dist: SQLAlchemy (>=0.8.0) - -Flask-SQLAlchemy -================ - -Flask-SQLAlchemy is an extension for `Flask`_ that adds support for -`SQLAlchemy`_ to your application. It aims to simplify using SQLAlchemy -with Flask by providing useful defaults and extra helpers that make it -easier to accomplish common tasks. - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - $ pip install -U Flask-SQLAlchemy - - -A Simple Example ----------------- - -.. code-block:: python - - from flask import Flask - from flask_sqlalchemy import SQLAlchemy - - app = Flask(__name__) - app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.sqlite" - db = SQLAlchemy(app) - - - class User(db.Model): - id = db.Column(db.Integer, primary_key=True) - username = db.Column(db.String, unique=True, nullable=False) - email = db.Column(db.String, unique=True, nullable=False) - - - db.session.add(User(name="Flask", email="example@example.com")) - db.session.commit() - - users = User.query.all() - - -Links ------ - -- Documentation: https://flask-sqlalchemy.palletsprojects.com/ -- Releases: https://pypi.org/project/Flask-SQLAlchemy/ -- Code: https://github.com/pallets/flask-sqlalchemy -- Issue tracker: https://github.com/pallets/flask-sqlalchemy/issues -- Test status: https://travis-ci.org/pallets/flask-sqlalchemy -- Test coverage: https://codecov.io/gh/pallets/flask-sqlalchemy - -.. _Flask: https://palletsprojects.com/p/flask/ -.. _SQLAlchemy: https://www.sqlalchemy.org -.. _pip: https://pip.pypa.io/en/stable/quickstart/ - - diff --git a/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/RECORD b/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/RECORD deleted file mode 100644 index 9065e34..0000000 --- a/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/RECORD +++ /dev/null @@ -1,14 +0,0 @@ -Flask_SQLAlchemy-2.4.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask_SQLAlchemy-2.4.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -Flask_SQLAlchemy-2.4.1.dist-info/METADATA,sha256=SO2Yy86hBglL9QIQxNdZqKPPBaS-3LrvuYbMG6wHuKI,3128 -Flask_SQLAlchemy-2.4.1.dist-info/RECORD,, -Flask_SQLAlchemy-2.4.1.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 -Flask_SQLAlchemy-2.4.1.dist-info/top_level.txt,sha256=w2K4fNNoTh4HItoFfz2FRQShSeLcvHYrzU_sZov21QU,17 -flask_sqlalchemy/__init__.py,sha256=qaMQKMcAVz3et6XhUqOyjzpn8V7NUghH5hHSZvyEJUw,39027 -flask_sqlalchemy/__pycache__/__init__.cpython-37.pyc,, -flask_sqlalchemy/__pycache__/_compat.cpython-37.pyc,, -flask_sqlalchemy/__pycache__/model.cpython-37.pyc,, -flask_sqlalchemy/__pycache__/utils.cpython-37.pyc,, -flask_sqlalchemy/_compat.py,sha256=yua0ZSgVWwi56QpEgwaPInzkNQ9PFb7YQdvEk3dImXo,821 -flask_sqlalchemy/model.py,sha256=9jBoPU1k0c4nqz2-KyYnfoE55n-1G8Zxfo2Z-ZHV0v4,4992 -flask_sqlalchemy/utils.py,sha256=4eHqAbYElnJ3NbSAHhuINckoAHDABoxjleMJD0iKgyg,1390 diff --git a/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/WHEEL b/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/WHEEL deleted file mode 100644 index 8b701e9..0000000 --- a/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.33.6) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/top_level.txt deleted file mode 100644 index 8a5538e..0000000 --- a/venv/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -flask_sqlalchemy diff --git a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/LICENSE.rst b/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/LICENSE.rst deleted file mode 100644 index c37cae4..0000000 --- a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.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/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/METADATA b/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/METADATA deleted file mode 100644 index 3d5bbb4..0000000 --- a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/METADATA +++ /dev/null @@ -1,106 +0,0 @@ -Metadata-Version: 2.1 -Name: Jinja2 -Version: 2.11.1 -Summary: A very fast and expressive template engine. -Home-page: https://palletsprojects.com/p/jinja/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: Pallets -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Documentation, https://jinja.palletsprojects.com/ -Project-URL: Code, https://github.com/pallets/jinja -Project-URL: Issue tracker, https://github.com/pallets/jinja/issues -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Text Processing :: Markup :: HTML -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* -Description-Content-Type: text/x-rst -Requires-Dist: MarkupSafe (>=0.23) -Provides-Extra: i18n -Requires-Dist: Babel (>=0.8) ; extra == 'i18n' - -Jinja -===== - -Jinja is a fast, expressive, extensible templating engine. Special -placeholders in the template allow writing code similar to Python -syntax. Then the template is passed data to render the final document. - -It includes: - -- Template inheritance and inclusion. -- Define and import macros within templates. -- HTML templates can use autoescaping to prevent XSS from untrusted - user input. -- A sandboxed environment can safely render untrusted templates. -- AsyncIO support for generating templates and calling async - functions. -- I18N support with Babel. -- Templates are compiled to optimized Python code just-in-time and - cached, or can be compiled ahead-of-time. -- Exceptions point to the correct line in templates to make debugging - easier. -- Extensible filters, tests, functions, and even syntax. - -Jinja's philosophy is that while application logic belongs in Python if -possible, it shouldn't make the template designer's job difficult by -restricting functionality too much. - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - $ pip install -U Jinja2 - -.. _pip: https://pip.pypa.io/en/stable/quickstart/ - - -In A Nutshell -------------- - -.. code-block:: jinja - - {% extends "base.html" %} - {% block title %}Members{% endblock %} - {% block content %} - - {% endblock %} - - -Links ------ - -- Website: https://palletsprojects.com/p/jinja/ -- Documentation: https://jinja.palletsprojects.com/ -- Releases: https://pypi.org/project/Jinja2/ -- Code: https://github.com/pallets/jinja -- Issue tracker: https://github.com/pallets/jinja/issues -- Test status: https://dev.azure.com/pallets/jinja/_build -- Official chat: https://discord.gg/t6rrQZH - - diff --git a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/RECORD b/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/RECORD deleted file mode 100644 index 5a1dddb..0000000 --- a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/RECORD +++ /dev/null @@ -1,61 +0,0 @@ -Jinja2-2.11.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Jinja2-2.11.1.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -Jinja2-2.11.1.dist-info/METADATA,sha256=7e9_tz7RirTbxIeiHTSq3e5g6ddCjoym3o5vdlRLuxU,3535 -Jinja2-2.11.1.dist-info/RECORD,, -Jinja2-2.11.1.dist-info/WHEEL,sha256=hq9T7ntHzQqUTLUmJ2UVhPL-W4tJi3Yb2Lh5lMfs2mk,110 -Jinja2-2.11.1.dist-info/entry_points.txt,sha256=Qy_DkVo6Xj_zzOtmErrATe8lHZhOqdjpt3e4JJAGyi8,61 -Jinja2-2.11.1.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 -jinja2/__init__.py,sha256=Nq1rzGErXYjIQnqc1pDCJht5LmInBRIZkeL2qkrYEyI,1549 -jinja2/__pycache__/__init__.cpython-37.pyc,, -jinja2/__pycache__/_compat.cpython-37.pyc,, -jinja2/__pycache__/_identifier.cpython-37.pyc,, -jinja2/__pycache__/asyncfilters.cpython-37.pyc,, -jinja2/__pycache__/asyncsupport.cpython-37.pyc,, -jinja2/__pycache__/bccache.cpython-37.pyc,, -jinja2/__pycache__/compiler.cpython-37.pyc,, -jinja2/__pycache__/constants.cpython-37.pyc,, -jinja2/__pycache__/debug.cpython-37.pyc,, -jinja2/__pycache__/defaults.cpython-37.pyc,, -jinja2/__pycache__/environment.cpython-37.pyc,, -jinja2/__pycache__/exceptions.cpython-37.pyc,, -jinja2/__pycache__/ext.cpython-37.pyc,, -jinja2/__pycache__/filters.cpython-37.pyc,, -jinja2/__pycache__/idtracking.cpython-37.pyc,, -jinja2/__pycache__/lexer.cpython-37.pyc,, -jinja2/__pycache__/loaders.cpython-37.pyc,, -jinja2/__pycache__/meta.cpython-37.pyc,, -jinja2/__pycache__/nativetypes.cpython-37.pyc,, -jinja2/__pycache__/nodes.cpython-37.pyc,, -jinja2/__pycache__/optimizer.cpython-37.pyc,, -jinja2/__pycache__/parser.cpython-37.pyc,, -jinja2/__pycache__/runtime.cpython-37.pyc,, -jinja2/__pycache__/sandbox.cpython-37.pyc,, -jinja2/__pycache__/tests.cpython-37.pyc,, -jinja2/__pycache__/utils.cpython-37.pyc,, -jinja2/__pycache__/visitor.cpython-37.pyc,, -jinja2/_compat.py,sha256=B6Se8HjnXVpzz9-vfHejn-DV2NjaVK-Iewupc5kKlu8,3191 -jinja2/_identifier.py,sha256=EdgGJKi7O1yvr4yFlvqPNEqV6M1qHyQr8Gt8GmVTKVM,1775 -jinja2/asyncfilters.py,sha256=8uwjG1zgHTv3K4nEvsj4HXWkK4NsOlfx7-CcnCULDWw,4185 -jinja2/asyncsupport.py,sha256=ZBFsDLuq3Gtji3Ia87lcyuDbqaHZJRdtShZcqwpFnSQ,7209 -jinja2/bccache.py,sha256=3Pmp4jo65M9FQuIxdxoDBbEDFwe4acDMQf77nEJfrHA,12139 -jinja2/compiler.py,sha256=xCNpF7-xAduODbGKSVEyzU7XZGeLWHZr1cwcZTQob30,66236 -jinja2/constants.py,sha256=RR1sTzNzUmKco6aZicw4JpQpJGCuPuqm1h1YmCNUEFY,1458 -jinja2/debug.py,sha256=UmsW6OxNmbIGvIkwytOyM1NsZB6xJvl_nSz3VgNETUk,8597 -jinja2/defaults.py,sha256=85B6YUUCyWPSdrSeVhcqFVuu_bHUAQXeey--FIwSeVQ,1126 -jinja2/environment.py,sha256=XqCM_GmncAXPm--CxpRPVF6uV_sPKb0Q0jVa7Znry04,50605 -jinja2/exceptions.py,sha256=VjNLawcmf2ODffqVMCQK1cRmvFaUfQWF4u8ouP3QPcE,5425 -jinja2/ext.py,sha256=AtwL5O5enT_L3HR9-oBvhGyUTdGoyaqG_ICtnR_EVd4,26441 -jinja2/filters.py,sha256=4xEq1qfJ7burpHW5GyL6bkGomp0W47jOXg-HG5aLP-Y,41401 -jinja2/idtracking.py,sha256=J3O4VHsrbf3wzwiBc7Cro26kHb6_5kbULeIOzocchIU,9211 -jinja2/lexer.py,sha256=VeGdW_t82Le4H-jLy-hX6UeosLf7ApUq2kuUos8YF4Y,29942 -jinja2/loaders.py,sha256=UUy5ud3lNtGtnn8iorlF9o1FJ6UqZZKMxd0VGnnqMHI,20350 -jinja2/meta.py,sha256=QjyYhfNRD3QCXjBJpiPl9KgkEkGXJbAkCUq4-Ur10EQ,4131 -jinja2/nativetypes.py,sha256=Arb2_3IuM386vWZbGPY7DmxryrXg3WzXAEnaHJNdWa0,3576 -jinja2/nodes.py,sha256=YwErhE9plVWeoxTQPtMwl10wovsyBRY4x9eAVgtP6zg,31071 -jinja2/optimizer.py,sha256=gQLlMYzvQhluhzmAIFA1tXS0cwgWYOjprN-gTRcHVsc,1457 -jinja2/parser.py,sha256=fcfdqePNTNyvosIvczbytVA332qpsURvYnCGcjDHSkA,35660 -jinja2/runtime.py,sha256=94chnK20a1m1t5AaLWeuiTq6L3g3GLs6AxVPfbNXIHE,30582 -jinja2/sandbox.py,sha256=knayyUvXsZ-F0mk15mO2-ehK9gsw04UhB8td-iUOtLc,17127 -jinja2/tests.py,sha256=iO_Y-9Vo60zrVe1lMpSl5sKHqAxe2leZHC08OoZ8K24,4799 -jinja2/utils.py,sha256=26B9HI2lVWaHY8iOnQTJzAcCL4PYOLiA3V79dm3oOSE,22456 -jinja2/visitor.py,sha256=DUHupl0a4PGp7nxRtZFttUzAi1ccxzqc2hzetPYUz8U,3240 diff --git a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/WHEEL b/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/WHEEL deleted file mode 100644 index 03bcde7..0000000 --- a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.34.1) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/entry_points.txt b/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/entry_points.txt deleted file mode 100644 index 3619483..0000000 --- a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[babel.extractors] -jinja2 = jinja2.ext:babel_extract [i18n] - diff --git a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/top_level.txt deleted file mode 100644 index 7f7afbf..0000000 --- a/venv/lib/python3.7/site-packages/Jinja2-2.11.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -jinja2 diff --git a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/AUTHORS b/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/AUTHORS deleted file mode 100644 index 81d16dc..0000000 --- a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/AUTHORS +++ /dev/null @@ -1,13 +0,0 @@ -Mako was created by Michael Bayer. - -Major contributing authors include: - -- Michael Bayer -- Geoffrey T. Dairiki -- Philip Jenvey -- David Peckam -- Armin Ronacher -- Ben Bangert -- Ben Trofatter - - diff --git a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/LICENSE b/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/LICENSE deleted file mode 100644 index 1f835e9..0000000 --- a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2006-2020 the Mako authors and 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. \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/METADATA b/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/METADATA deleted file mode 100644 index fb64a7a..0000000 --- a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/METADATA +++ /dev/null @@ -1,82 +0,0 @@ -Metadata-Version: 2.1 -Name: Mako -Version: 1.1.2 -Summary: A super-fast templating language that borrows the best ideas from the existing templating languages. -Home-page: https://www.makotemplates.org/ -Author: Mike Bayer -Author-email: mike@zzzcomputing.com -License: MIT -Project-URL: Documentation, https://docs.makotemplates.org -Project-URL: Issue Tracker, https://github.com/sqlalchemy/mako -Keywords: templates -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: MIT License -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* -Requires-Dist: MarkupSafe (>=0.9.2) -Provides-Extra: babel -Requires-Dist: Babel ; extra == 'babel' -Provides-Extra: lingua -Requires-Dist: lingua ; extra == 'lingua' - -========================= -Mako Templates for Python -========================= - -Mako is a template library written in Python. It provides a familiar, non-XML -syntax which compiles into Python modules for maximum performance. Mako's -syntax and API borrows from the best ideas of many others, including Django -templates, Cheetah, Myghty, and Genshi. Conceptually, Mako is an embedded -Python (i.e. Python Server Page) language, which refines the familiar ideas -of componentized layout and inheritance to produce one of the most -straightforward and flexible models available, while also maintaining close -ties to Python calling and scoping semantics. - -Nutshell -======== - -:: - - <%inherit file="base.html"/> - <% - rows = [[v for v in range(0,10)] for row in range(0,10)] - %> - - % for row in rows: - ${makerow(row)} - % endfor -
- - <%def name="makerow(row)"> - - % for name in row: - ${name}\ - % endfor - - - -Philosophy -=========== - -Python is a great scripting language. Don't reinvent the wheel...your templates can handle it ! - -Documentation -============== - -See documentation for Mako at https://docs.makotemplates.org/en/latest/ - -License -======== - -Mako is licensed under an MIT-style license (see LICENSE). -Other incorporated projects may be licensed under different licenses. -All licenses allow for non-commercial and commercial use. - - diff --git a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/RECORD b/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/RECORD deleted file mode 100644 index 36cc2c4..0000000 --- a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/RECORD +++ /dev/null @@ -1,61 +0,0 @@ -../../../bin/mako-render,sha256=hcT69q_NmFY5G8c2FRh1t7TfhjyYqH2B1-m-aMxY5Y4,237 -Mako-1.1.2.dist-info/AUTHORS,sha256=Io2Vw70mjYS7yFcUuJxhIGiMUQt8FWJuxiiwyUW1WRg,282 -Mako-1.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Mako-1.1.2.dist-info/LICENSE,sha256=R80NQbEJL5Fhz7Yp7RXlzqGFFEcQ_0YzpCge8Ij_Xec,1097 -Mako-1.1.2.dist-info/METADATA,sha256=fxw2oNdTkNQnafc1Enid-QapQv1OaYnqwtNDJoeihoo,2600 -Mako-1.1.2.dist-info/RECORD,, -Mako-1.1.2.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 -Mako-1.1.2.dist-info/entry_points.txt,sha256=GSuruj6eMrGwr7dHBGOdDkmgTTUQXr5ZrQjMmkPclKA,603 -Mako-1.1.2.dist-info/top_level.txt,sha256=LItdH8cDPetpUu8rUyBG3DObS6h9Gcpr9j_WLj2S-R0,5 -mako/__init__.py,sha256=kukH4UZzZx0XHsTBrfQMJ2fxcncjreyZv2m6PzvPWAM,242 -mako/__pycache__/__init__.cpython-37.pyc,, -mako/__pycache__/_ast_util.cpython-37.pyc,, -mako/__pycache__/ast.cpython-37.pyc,, -mako/__pycache__/cache.cpython-37.pyc,, -mako/__pycache__/cmd.cpython-37.pyc,, -mako/__pycache__/codegen.cpython-37.pyc,, -mako/__pycache__/compat.cpython-37.pyc,, -mako/__pycache__/exceptions.cpython-37.pyc,, -mako/__pycache__/filters.cpython-37.pyc,, -mako/__pycache__/lexer.cpython-37.pyc,, -mako/__pycache__/lookup.cpython-37.pyc,, -mako/__pycache__/parsetree.cpython-37.pyc,, -mako/__pycache__/pygen.cpython-37.pyc,, -mako/__pycache__/pyparser.cpython-37.pyc,, -mako/__pycache__/runtime.cpython-37.pyc,, -mako/__pycache__/template.cpython-37.pyc,, -mako/__pycache__/util.cpython-37.pyc,, -mako/_ast_util.py,sha256=QKXZC0DbpYefKhTrQZjLgjcNXlTgY38sbB-vmBR2HpU,20414 -mako/ast.py,sha256=T5KnOwZewqAfULULLLWp6joGD-j14SiCtrH1-KGJCpQ,6789 -mako/cache.py,sha256=N1VoKHul8K7RUwsGwoUL-HMtylDvrL6iGWNh7_AI1dc,7736 -mako/cmd.py,sha256=HZxSUsAFVHVrcWvb43Nh_vdbrGeJLFNTR6ejyhdZ0dc,2859 -mako/codegen.py,sha256=DoxSM34-305v0E4Ox7Y31nsVtKAmCEbRVC3BmNFy_54,47892 -mako/compat.py,sha256=08w8lB0Z3QKQi9vd4n4xUtjG_A3wOrk3QdvxkHlribY,3848 -mako/exceptions.py,sha256=ogXjpZO1beh37cWWa0pm4IHVNKsuNIUnqOjWznEKMLQ,13110 -mako/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -mako/ext/__pycache__/__init__.cpython-37.pyc,, -mako/ext/__pycache__/autohandler.cpython-37.pyc,, -mako/ext/__pycache__/babelplugin.cpython-37.pyc,, -mako/ext/__pycache__/beaker_cache.cpython-37.pyc,, -mako/ext/__pycache__/extract.cpython-37.pyc,, -mako/ext/__pycache__/linguaplugin.cpython-37.pyc,, -mako/ext/__pycache__/preprocessors.cpython-37.pyc,, -mako/ext/__pycache__/pygmentplugin.cpython-37.pyc,, -mako/ext/__pycache__/turbogears.cpython-37.pyc,, -mako/ext/autohandler.py,sha256=FJs1cY6Vz_NePboCUr-3STZY38btxFRZsPhMNe6NSms,1885 -mako/ext/babelplugin.py,sha256=EquybfGr6ffla72QapzkwTNpEwi_P87f1s9C7xNFuJw,2138 -mako/ext/beaker_cache.py,sha256=oDN-vSLeKfnAJKlPgrKKuHI-g7zszwd2y1uApBoOkeM,2599 -mako/ext/extract.py,sha256=oBx6lQqLOtDMu8YpBYK_klCZvMuVvbAAA3I-WUyTPXo,4616 -mako/ext/linguaplugin.py,sha256=Z8bV4RHjDJhqMApINSadycM1Xj-B2vB1_i3YN3l2KSc,1954 -mako/ext/preprocessors.py,sha256=TfHmG6EgzYumbCiFU06IHXG_n5y2sA6RFtDBNJ613M8,576 -mako/ext/pygmentplugin.py,sha256=wYJixnCqHJ7zHPT6gB3tGUg-R6yctFNpEhNIKbHHl-E,4951 -mako/ext/turbogears.py,sha256=BcKxkPpkeawkFqj6zS5sUQYt4I6LafRDYMLIDOg0ZPY,2165 -mako/filters.py,sha256=vzpdxOOXWco5_evH_6_9a8b92lHuDC7Sl3XZhFyIVV8,6063 -mako/lexer.py,sha256=pNKb5MVSzOdW0L2S97TYPFBATmHD_mo8Br9-5RSfIUM,16926 -mako/lookup.py,sha256=TQ-wx1DR8rj2HqsNJBsrS4ZqROwAeTRkw-LrTbSQxFc,12718 -mako/parsetree.py,sha256=epGi5wKtZA8LcpzdrEXl_jjPGPvuO-IjuDSAYoLAp4Y,19411 -mako/pygen.py,sha256=dKxVMCSPMaXbMTgQyd5_J7WvdzPpuUprufR4PS3cyqY,10073 -mako/pyparser.py,sha256=eU3-mgdrmj1cL9SgFxh1rvIFcio_6oJxoNJnyMuGiCI,7789 -mako/runtime.py,sha256=2fhZBgmnP3wrWlZAVd6PZCSeuuGVXVA8BmRdXs6VEDo,28040 -mako/template.py,sha256=hKYaXvRzqU7Map8wXaGTGXc8gPl8EDF4WqoNpIF-EqQ,26558 -mako/util.py,sha256=5DoK9dvPpzFK6ZnL3hhzMHQ0meanhXrH8aHoO8fbkCs,11038 diff --git a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/WHEEL b/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/WHEEL deleted file mode 100644 index 8b701e9..0000000 --- a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.33.6) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/entry_points.txt b/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/entry_points.txt deleted file mode 100644 index 8e033c0..0000000 --- a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/entry_points.txt +++ /dev/null @@ -1,20 +0,0 @@ - - [python.templating.engines] - mako = mako.ext.turbogears:TGPlugin - - [pygments.lexers] - mako = mako.ext.pygmentplugin:MakoLexer - html+mako = mako.ext.pygmentplugin:MakoHtmlLexer - xml+mako = mako.ext.pygmentplugin:MakoXmlLexer - js+mako = mako.ext.pygmentplugin:MakoJavascriptLexer - css+mako = mako.ext.pygmentplugin:MakoCssLexer - - [babel.extractors] - mako = mako.ext.babelplugin:extract [babel] - - [lingua.extractors] - mako = mako.ext.linguaplugin:LinguaMakoExtractor [lingua] - - [console_scripts] - mako-render = mako.cmd:cmdline - \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/top_level.txt deleted file mode 100644 index 2951cdd..0000000 --- a/venv/lib/python3.7/site-packages/Mako-1.1.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -mako diff --git a/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.rst b/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.rst deleted file mode 100644 index 9d227a0..0000000 --- a/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.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/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/METADATA b/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/METADATA deleted file mode 100644 index b208d93..0000000 --- a/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/METADATA +++ /dev/null @@ -1,103 +0,0 @@ -Metadata-Version: 2.1 -Name: MarkupSafe -Version: 1.1.1 -Summary: Safely add untrusted strings to HTML/XML markup. -Home-page: https://palletsprojects.com/p/markupsafe/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: The Pallets Team -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Documentation, https://markupsafe.palletsprojects.com/ -Project-URL: Code, https://github.com/pallets/markupsafe -Project-URL: Issue tracker, https://github.com/pallets/markupsafe/issues -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Text Processing :: Markup :: HTML -Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* - -MarkupSafe -========== - -MarkupSafe implements a text object that escapes characters so it is -safe to use in HTML and XML. Characters that have special meanings are -replaced so that they display as the actual characters. This mitigates -injection attacks, meaning untrusted user input can safely be displayed -on a page. - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - pip install -U MarkupSafe - -.. _pip: https://pip.pypa.io/en/stable/quickstart/ - - -Examples --------- - -.. code-block:: pycon - - >>> from markupsafe import Markup, escape - >>> # escape replaces special characters and wraps in Markup - >>> escape('') - Markup(u'<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 text subclass (str on Python 3, unicode on Python 2) - >>> # methods and operators escape their arguments - >>> template = Markup("Hello %s") - >>> template % '"World"' - Markup('Hello "World"') - - -Donate ------- - -The Pallets organization develops and supports MarkupSafe and other -libraries that use it. In order to grow the community of contributors -and users, and allow the maintainers to devote more time to the -projects, `please donate today`_. - -.. _please donate today: https://palletsprojects.com/donate - - -Links ------ - -* Website: https://palletsprojects.com/p/markupsafe/ -* Documentation: https://markupsafe.palletsprojects.com/ -* License: `BSD-3-Clause `_ -* Releases: https://pypi.org/project/MarkupSafe/ -* Code: https://github.com/pallets/markupsafe -* Issue tracker: https://github.com/pallets/markupsafe/issues -* Test status: - - * Linux, Mac: https://travis-ci.org/pallets/markupsafe - * Windows: https://ci.appveyor.com/project/pallets/markupsafe - -* Test coverage: https://codecov.io/gh/pallets/markupsafe - - diff --git a/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/RECORD b/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/RECORD deleted file mode 100644 index 0e7516b..0000000 --- a/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/RECORD +++ /dev/null @@ -1,16 +0,0 @@ -MarkupSafe-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -MarkupSafe-1.1.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -MarkupSafe-1.1.1.dist-info/METADATA,sha256=nJHwJ4_4ka-V39QH883jPrslj6inNdyyNASBXbYgHXQ,3570 -MarkupSafe-1.1.1.dist-info/RECORD,, -MarkupSafe-1.1.1.dist-info/WHEEL,sha256=GMu0CcHnECe7JSPnzBUPyOsrcZoHb7dOBGXgpe8vHSQ,104 -MarkupSafe-1.1.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 -markupsafe/__init__.py,sha256=oTblO5f9KFM-pvnq9bB0HgElnqkJyqHnFN1Nx2NIvnY,10126 -markupsafe/__pycache__/__init__.cpython-37.pyc,, -markupsafe/__pycache__/_compat.cpython-37.pyc,, -markupsafe/__pycache__/_constants.cpython-37.pyc,, -markupsafe/__pycache__/_native.cpython-37.pyc,, -markupsafe/_compat.py,sha256=uEW1ybxEjfxIiuTbRRaJpHsPFf4yQUMMKaPgYEC5XbU,558 -markupsafe/_constants.py,sha256=zo2ajfScG-l1Sb_52EP3MlDCqO7Y1BVHUXXKRsVDRNk,4690 -markupsafe/_native.py,sha256=d-8S_zzYt2y512xYcuSxq0NeG2DUUvG80wVdTn-4KI8,1873 -markupsafe/_speedups.c,sha256=k0fzEIK3CP6MmMqeY0ob43TP90mVN0DTyn7BAl3RqSg,9884 -markupsafe/_speedups.cpython-37m-arm-linux-gnueabihf.so,sha256=UdHbkGis1TxK619S8APiKVHwcmcMKsR0rEA9WFeXTUs,46612 diff --git a/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL b/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL deleted file mode 100644 index a194ea7..0000000 --- a/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.32.3) -Root-Is-Purelib: false -Tag: cp37-cp37m-linux_armv7l - diff --git a/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt deleted file mode 100644 index 75bf729..0000000 --- a/venv/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -markupsafe diff --git a/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/LICENSE b/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/LICENSE deleted file mode 100644 index d3be6f0..0000000 --- a/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2005-2020 SQLAlchemy authors and 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/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/METADATA b/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/METADATA deleted file mode 100644 index cef62de..0000000 --- a/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/METADATA +++ /dev/null @@ -1,195 +0,0 @@ -Metadata-Version: 2.1 -Name: SQLAlchemy -Version: 1.3.17 -Summary: Database Abstraction Library -Home-page: http://www.sqlalchemy.org -Author: Mike Bayer -Author-email: mike_mp@zzzcomputing.com -License: MIT -Project-URL: Documentation, https://docs.sqlalchemy.org -Project-URL: Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/ -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Database :: Front-Ends -Classifier: Operating System :: OS Independent -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* -Provides-Extra: mssql -Requires-Dist: pyodbc ; extra == 'mssql' -Provides-Extra: mssql_pymssql -Requires-Dist: pymssql ; extra == 'mssql_pymssql' -Provides-Extra: mssql_pyodbc -Requires-Dist: pyodbc ; extra == 'mssql_pyodbc' -Provides-Extra: mysql -Requires-Dist: mysqlclient ; extra == 'mysql' -Provides-Extra: oracle -Requires-Dist: cx-oracle ; extra == 'oracle' -Provides-Extra: postgresql -Requires-Dist: psycopg2 ; extra == 'postgresql' -Provides-Extra: postgresql_pg8000 -Requires-Dist: pg8000 ; extra == 'postgresql_pg8000' -Provides-Extra: postgresql_psycopg2binary -Requires-Dist: psycopg2-binary ; extra == 'postgresql_psycopg2binary' -Provides-Extra: postgresql_psycopg2cffi -Requires-Dist: psycopg2cffi ; extra == 'postgresql_psycopg2cffi' -Provides-Extra: pymysql -Requires-Dist: pymysql ; extra == 'pymysql' - -SQLAlchemy -========== - -The Python SQL Toolkit and Object Relational Mapper - -Introduction -------------- - -SQLAlchemy is the Python SQL toolkit and Object Relational Mapper -that gives application developers the full power and -flexibility of SQL. SQLAlchemy provides a full suite -of well known enterprise-level persistence patterns, -designed for efficient and high-performing database -access, adapted into a simple and Pythonic domain -language. - -Major SQLAlchemy features include: - -* An industrial strength ORM, built - from the core on the identity map, unit of work, - and data mapper patterns. These patterns - allow transparent persistence of objects - using a declarative configuration system. - Domain models - can be constructed and manipulated naturally, - and changes are synchronized with the - current transaction automatically. -* A relationally-oriented query system, exposing - the full range of SQL's capabilities - explicitly, including joins, subqueries, - correlation, and most everything else, - in terms of the object model. - Writing queries with the ORM uses the same - techniques of relational composition you use - when writing SQL. While you can drop into - literal SQL at any time, it's virtually never - needed. -* A comprehensive and flexible system - of eager loading for related collections and objects. - Collections are cached within a session, - and can be loaded on individual access, all - at once using joins, or by query per collection - across the full result set. -* A Core SQL construction system and DBAPI - interaction layer. The SQLAlchemy Core is - separate from the ORM and is a full database - abstraction layer in its own right, and includes - an extensible Python-based SQL expression - language, schema metadata, connection pooling, - type coercion, and custom types. -* All primary and foreign key constraints are - assumed to be composite and natural. Surrogate - integer primary keys are of course still the - norm, but SQLAlchemy never assumes or hardcodes - to this model. -* Database introspection and generation. Database - schemas can be "reflected" in one step into - Python structures representing database metadata; - those same structures can then generate - CREATE statements right back out - all within - the Core, independent of the ORM. - -SQLAlchemy's philosophy: - -* SQL databases behave less and less like object - collections the more size and performance start to - matter; object collections behave less and less like - tables and rows the more abstraction starts to matter. - SQLAlchemy aims to accommodate both of these - principles. -* An ORM doesn't need to hide the "R". A relational - database provides rich, set-based functionality - that should be fully exposed. SQLAlchemy's - ORM provides an open-ended set of patterns - that allow a developer to construct a custom - mediation layer between a domain model and - a relational schema, turning the so-called - "object relational impedance" issue into - a distant memory. -* The developer, in all cases, makes all decisions - regarding the design, structure, and naming conventions - of both the object model as well as the relational - schema. SQLAlchemy only provides the means - to automate the execution of these decisions. -* With SQLAlchemy, there's no such thing as - "the ORM generated a bad query" - you - retain full control over the structure of - queries, including how joins are organized, - how subqueries and correlation is used, what - columns are requested. Everything SQLAlchemy - does is ultimately the result of a developer- - initiated decision. -* Don't use an ORM if the problem doesn't need one. - SQLAlchemy consists of a Core and separate ORM - component. The Core offers a full SQL expression - language that allows Pythonic construction - of SQL constructs that render directly to SQL - strings for a target database, returning - result sets that are essentially enhanced DBAPI - cursors. -* Transactions should be the norm. With SQLAlchemy's - ORM, nothing goes to permanent storage until - commit() is called. SQLAlchemy encourages applications - to create a consistent means of delineating - the start and end of a series of operations. -* Never render a literal value in a SQL statement. - Bound parameters are used to the greatest degree - possible, allowing query optimizers to cache - query plans effectively and making SQL injection - attacks a non-issue. - -Documentation -------------- - -Latest documentation is at: - -http://www.sqlalchemy.org/docs/ - -Installation / Requirements ---------------------------- - -Full documentation for installation is at -`Installation `_. - -Getting Help / Development / Bug reporting ------------------------------------------- - -Please refer to the `SQLAlchemy Community Guide `_. - -Code of Conduct ---------------- - -Above all, SQLAlchemy places great emphasis on polite, thoughtful, and -constructive communication between users and developers. -Please see our current Code of Conduct at -`Code of Conduct `_. - -License -------- - -SQLAlchemy is distributed under the `MIT license -`_. - - - diff --git a/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/RECORD b/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/RECORD deleted file mode 100644 index 18869f4..0000000 --- a/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/RECORD +++ /dev/null @@ -1,405 +0,0 @@ -SQLAlchemy-1.3.17.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -SQLAlchemy-1.3.17.dist-info/LICENSE,sha256=WG4lA_RQxK6BaWDKMtQTuCDHQWJpdWvZThIkXGD4WXI,1100 -SQLAlchemy-1.3.17.dist-info/METADATA,sha256=xcBflt2jZsh5GZQV77WLVJDaHeBAF3PCbg0kvAGFxKI,7341 -SQLAlchemy-1.3.17.dist-info/RECORD,, -SQLAlchemy-1.3.17.dist-info/WHEEL,sha256=GMu0CcHnECe7JSPnzBUPyOsrcZoHb7dOBGXgpe8vHSQ,104 -SQLAlchemy-1.3.17.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11 -sqlalchemy/__init__.py,sha256=QoFu5r-vTXw_u7p7onkV160CcUz2_3tmxTeuzYvsJ2k,4659 -sqlalchemy/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/__pycache__/events.cpython-37.pyc,, -sqlalchemy/__pycache__/exc.cpython-37.pyc,, -sqlalchemy/__pycache__/inspection.cpython-37.pyc,, -sqlalchemy/__pycache__/interfaces.cpython-37.pyc,, -sqlalchemy/__pycache__/log.cpython-37.pyc,, -sqlalchemy/__pycache__/processors.cpython-37.pyc,, -sqlalchemy/__pycache__/schema.cpython-37.pyc,, -sqlalchemy/__pycache__/types.cpython-37.pyc,, -sqlalchemy/connectors/__init__.py,sha256=78tsbgw8Kh1tPCC2te-KV7DqeE7gRzUE2Qq64XIoUkU,278 -sqlalchemy/connectors/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/connectors/__pycache__/mxodbc.cpython-37.pyc,, -sqlalchemy/connectors/__pycache__/pyodbc.cpython-37.pyc,, -sqlalchemy/connectors/__pycache__/zxJDBC.cpython-37.pyc,, -sqlalchemy/connectors/mxodbc.py,sha256=h_fyp3zVvJ22bBhHl0296MtieO977XHVhbugT9sYrFo,5352 -sqlalchemy/connectors/pyodbc.py,sha256=xR_EfAvOqA_qXLgTlWQ7m8dUtHKErZY3ZI0N5t7wj2g,5586 -sqlalchemy/connectors/zxJDBC.py,sha256=wJlwdsmRov3naSY71JvifytEC4lPqO5_eiF_K9UDb3E,1878 -sqlalchemy/cprocessors.cpython-37m-arm-linux-gnueabihf.so,sha256=b3bL8vUTD9dD_0J-eDS8GK1ZuLN6QvoCPvg_oto_C78,49424 -sqlalchemy/cresultproxy.cpython-37m-arm-linux-gnueabihf.so,sha256=KErxAJkXTEXyiuWtD8qpfUgyHyW9nZ3cKULg373VZcg,57836 -sqlalchemy/cutils.cpython-37m-arm-linux-gnueabihf.so,sha256=eyykgO7az8k5BbMu0HNSAzEQfaKxRcUNeIhDDuCFsYI,31952 -sqlalchemy/databases/__init__.py,sha256=IywgDc8lo4rrxtHR7u1S1ttUMTKrKpYS3wwnd8bISQA,819 -sqlalchemy/databases/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/dialects/__init__.py,sha256=2Cra66jK1L9BzcAJUhVaJXR0vPG06L3MI6GEh-b69KI,1909 -sqlalchemy/dialects/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/dialects/firebird/__init__.py,sha256=xiywqBgVlgc1yaV-IlwJdgLXhAb9ise-B-vfcoFzQLw,1152 -sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/dialects/firebird/__pycache__/base.cpython-37.pyc,, -sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-37.pyc,, -sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-37.pyc,, -sqlalchemy/dialects/firebird/base.py,sha256=wml5psIvyvrLsBGFne--M2sHjEYbPRamcr5L3QuS-0w,30221 -sqlalchemy/dialects/firebird/fdb.py,sha256=kQQ3atPmEdsgxqtYBRZwg0HGitQiS5-VtL2f13WDWpI,4079 -sqlalchemy/dialects/firebird/kinterbasdb.py,sha256=X7UfqENJaVFJaQj_7dK7NyxmGU8bvAfKkv5m2lQl4rs,6437 -sqlalchemy/dialects/mssql/__init__.py,sha256=OMkEnG7PSHt4ee_P0DKfhXG1jLh5nzRuvxqKLfYLPO8,1812 -sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-37.pyc,, -sqlalchemy/dialects/mssql/__pycache__/base.cpython-37.pyc,, -sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-37.pyc,, -sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-37.pyc,, -sqlalchemy/dialects/mssql/__pycache__/provision.cpython-37.pyc,, -sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-37.pyc,, -sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-37.pyc,, -sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-37.pyc,, -sqlalchemy/dialects/mssql/adodbapi.py,sha256=u8QnHUI6C5nImuzyuk25D6oiBAQRjspM5SGjLySse1s,2719 -sqlalchemy/dialects/mssql/base.py,sha256=L7oD-TAPER0rKsdWJUr4fCbHzQ1IsX9JRJYtDlyQCpw,89821 -sqlalchemy/dialects/mssql/information_schema.py,sha256=plSgus0f7PsR28oTB8y4-UkXU43rTxh0ltaFRvua9-A,5639 -sqlalchemy/dialects/mssql/mxodbc.py,sha256=geB0M9CAYo0AbPgiGLhWEGmx76B5SNGcQJ_PDl5yJMw,4616 -sqlalchemy/dialects/mssql/provision.py,sha256=0WXdFXwePVPYVrV3mmbbiAkuj-Tv5Rr-i3aizbD6Z7w,2786 -sqlalchemy/dialects/mssql/pymssql.py,sha256=RmV43rpu7EqMcNCsA31L9uRT272e9p0juEO6crBoaS0,4677 -sqlalchemy/dialects/mssql/pyodbc.py,sha256=xNeG4Cf489s1NPApg53ckpOSI1d3Plg6Ql0lZv4sF2A,14823 -sqlalchemy/dialects/mssql/zxjdbc.py,sha256=zxUozig0SWOlC6JuqzuyG6ojI55oI44P1RkaToWYul4,2311 -sqlalchemy/dialects/mysql/__init__.py,sha256=9mlm4mqt_CxcbFh9KC38Srw0_OnvrSluBmOcaWoOlV8,2056 -sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/base.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/dml.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/json.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/provision.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/types.cpython-37.pyc,, -sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-37.pyc,, -sqlalchemy/dialects/mysql/base.py,sha256=hMSuQKFrZZnpOQ1eFLOHCmB5Nl3OrhllNE13k3kxDls,101213 -sqlalchemy/dialects/mysql/cymysql.py,sha256=iZIQWKba3Ap6N6Af5MEtCgHN4SoHSUKFJwD_3gktsME,2245 -sqlalchemy/dialects/mysql/dml.py,sha256=yq9Kgm2IvLkt0_Uw1RGsuyjNQVgpWIWMFd2Ntm_R65Y,4764 -sqlalchemy/dialects/mysql/enumerated.py,sha256=9hhAfnVzvFjXKEShwqp52XT6Kaq8aw4uD7CD6doPd6k,11307 -sqlalchemy/dialects/mysql/gaerdbms.py,sha256=khU9l7SolzCyhF7d7q1iBn_OhPj3gw3IqGGtzomsugo,3375 -sqlalchemy/dialects/mysql/json.py,sha256=AJ_-DkzgByPy-3XQhXms2JiTM7MxGr2Le6E4k2-eT50,2050 -sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=2piMPvg48daNXr2XzpLwmMm1VYVs9mw0AJ43OLXQgvI,7889 -sqlalchemy/dialects/mysql/mysqldb.py,sha256=aSkj-xdGYIhPlH2sOvGOo0qrbX3lkR1r8RX-84Rxe4Q,8383 -sqlalchemy/dialects/mysql/oursql.py,sha256=GzFBpEZGwWnLPVmC4IlU5_Y9gZvc-8-44-s6Xo2BXpg,8086 -sqlalchemy/dialects/mysql/provision.py,sha256=sJ7IpiIB1Eb9AdRK3loRlsCHKzzsFGJzMgICyRrkFpY,1269 -sqlalchemy/dialects/mysql/pymysql.py,sha256=8-V0VEWKOv1ooPQgRnm2Piqkk1lAqVDq16wZQB-xq58,2440 -sqlalchemy/dialects/mysql/pyodbc.py,sha256=0UdZSRnCF-0EWsX36Azrvc15xE87YEzyJSSGQJqVx0U,3470 -sqlalchemy/dialects/mysql/reflection.py,sha256=FgrerZD3x-KkXh5XbfYrPfNf_zNKFUVSRqW9Lv2iKjI,18267 -sqlalchemy/dialects/mysql/types.py,sha256=sOIRc3hnpuYVOQZyDadJjigJvA3rjaz66yD4_dAibS4,24601 -sqlalchemy/dialects/mysql/zxjdbc.py,sha256=u-jcqk3ZnpuPv89Hv3iEiCEhN0Ck4J48OLSYChZ3H-s,3970 -sqlalchemy/dialects/oracle/__init__.py,sha256=0800ZWZlvJfZ8qd_K4OfDEUq0TnAL7WkvaJPkMLiRDU,1257 -sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/dialects/oracle/__pycache__/base.cpython-37.pyc,, -sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-37.pyc,, -sqlalchemy/dialects/oracle/__pycache__/provision.cpython-37.pyc,, -sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-37.pyc,, -sqlalchemy/dialects/oracle/base.py,sha256=x6GAt5W6R6MXOx5JMn5mALccY387sBMAgzPY_ev-kB8,76224 -sqlalchemy/dialects/oracle/cx_oracle.py,sha256=dZT9x1zkopNAk0SYbn8X06mDXZo2Z34qXmR2fwOYVFU,44915 -sqlalchemy/dialects/oracle/provision.py,sha256=zpAooUqZY741vrjplNkxV2v3uf4kbZb3r_LfH9dKkJw,3862 -sqlalchemy/dialects/oracle/zxjdbc.py,sha256=eBqslfHL08YaEUzZ32-faQo9nxLCR3s8IadVAI200FY,8207 -sqlalchemy/dialects/postgresql/__init__.py,sha256=G0qS6NaThvmq48RH378d90vBbfglrgKt_LxuGyq8UAM,2461 -sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/array.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/base.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/json.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/pygresql.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-37.pyc,, -sqlalchemy/dialects/postgresql/array.py,sha256=XrpqVaX2xvF8poI5CyD6gIq-3XgoSqIEeBwU_BSA41I,12043 -sqlalchemy/dialects/postgresql/base.py,sha256=gTzhOkwkXn7pmSWfvxqDorNq1A4r_h994eNdyBYTIs0,124341 -sqlalchemy/dialects/postgresql/dml.py,sha256=JWLLh1Z9Kuu6TgReIFMKqOHoQBwc0xDqzIwRLik7Yoc,7790 -sqlalchemy/dialects/postgresql/ext.py,sha256=-lBaLXWbzapvozj1I8yP47GGtTmjXYPjnInJOTuHHTU,6905 -sqlalchemy/dialects/postgresql/hstore.py,sha256=p62Vdg4REY-p4B3Y6dsIekj85vqMqEVj2DWUn8Z6Iig,12443 -sqlalchemy/dialects/postgresql/json.py,sha256=MihPxRbtlVN54ya9EaDGHiB3IS2icpXmQVb7Vwol-e0,10132 -sqlalchemy/dialects/postgresql/pg8000.py,sha256=bQI9hm4lr4JshUlFWSDpAYBWXsMCsgWyETkSZPDexJg,9722 -sqlalchemy/dialects/postgresql/provision.py,sha256=E8LOoSNSWUlx77ihNLQfW9csAxsmL-qleiLPbVlSlVw,2008 -sqlalchemy/dialects/postgresql/psycopg2.py,sha256=2H7YaVaNkitKwYlHztS5iAX5kjAvu2tHHevpbfAUgJ8,35979 -sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=8X5uLoW2am61rqwYs0agfngZ8awYia7AAnbgWwDF27w,1657 -sqlalchemy/dialects/postgresql/pygresql.py,sha256=eyRnGRlqeEbiwYbhcazQUkyHnB4yCeh9c7nhnQyPJ8E,8129 -sqlalchemy/dialects/postgresql/pypostgresql.py,sha256=9giPOxOzVlJHc7r4g-YsVsFWONZQQjIi_mVWzKopI2c,2915 -sqlalchemy/dialects/postgresql/ranges.py,sha256=vvc2NmQsprM81VZeO1zukk4D_T3GTWJ_MoFa7E2chHE,4478 -sqlalchemy/dialects/postgresql/zxjdbc.py,sha256=YMtRIy1IbMVMQKMxa_gORzXHbkEVxiJVBpeg4IFuYvM,1415 -sqlalchemy/dialects/sqlite/__init__.py,sha256=EvPKdQyHTkXlziZo6wYrJ2D1V8Pa52zK5kb2I59uX4s,1042 -sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/base.cpython-37.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/json.cpython-37.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-37.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-37.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-37.pyc,, -sqlalchemy/dialects/sqlite/base.py,sha256=_cBzmfDarBg5tO13VoH0dZgSrN58Rn4UfrM1oH4fuXs,72609 -sqlalchemy/dialects/sqlite/json.py,sha256=IwhCnGL_BKtASpm0-OzeNByp3qtkcLZgAeBGY_EPUvM,2292 -sqlalchemy/dialects/sqlite/provision.py,sha256=PEmgxbdz67KsONOEhFVQFLX3s4BXWKLb2gvNgj0gn9M,2591 -sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=RwePrdk3xrEg2c0vpFQSos6823EKEHJKrF-jgo7mYrE,4692 -sqlalchemy/dialects/sqlite/pysqlite.py,sha256=wDRcXcw8JFnGjbeu4qAeEp1vK8M_z86vY8Ls4AOSzEI,20983 -sqlalchemy/dialects/sybase/__init__.py,sha256=W9wFI2eRTBJVLaoplH5esmiITkz9LiNa-nDhiG8DwpM,1363 -sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/dialects/sybase/__pycache__/base.cpython-37.pyc,, -sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-37.pyc,, -sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-37.pyc,, -sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-37.pyc,, -sqlalchemy/dialects/sybase/base.py,sha256=N1G5tUKOtBjeOXeRciZP6iui1M8CYWFW9KchA-qDi_s,31953 -sqlalchemy/dialects/sybase/mxodbc.py,sha256=LqEEcLRrXuLICWLpg2ePgczZhuGzU20JsO2j_W3M2Ho,902 -sqlalchemy/dialects/sybase/pyodbc.py,sha256=013aGwoG1C19S_v4lPSZj4ComdPrdlwSMH8F7pjyMS8,2120 -sqlalchemy/dialects/sybase/pysybase.py,sha256=7iF-t7qfR5VGNeYzHkDoPNthUAJGSAIjeLwXrC5BJQE,3313 -sqlalchemy/engine/__init__.py,sha256=YTdumyq5iYjIsQ1P1FDgTDnEPqZgGasCao6k15prmUw,24256 -sqlalchemy/engine/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/engine/__pycache__/base.cpython-37.pyc,, -sqlalchemy/engine/__pycache__/default.cpython-37.pyc,, -sqlalchemy/engine/__pycache__/interfaces.cpython-37.pyc,, -sqlalchemy/engine/__pycache__/reflection.cpython-37.pyc,, -sqlalchemy/engine/__pycache__/result.cpython-37.pyc,, -sqlalchemy/engine/__pycache__/strategies.cpython-37.pyc,, -sqlalchemy/engine/__pycache__/threadlocal.cpython-37.pyc,, -sqlalchemy/engine/__pycache__/url.cpython-37.pyc,, -sqlalchemy/engine/__pycache__/util.cpython-37.pyc,, -sqlalchemy/engine/base.py,sha256=k5WVUNgasJE56I3nMvW8sAfap3UTuGxzXz9L4lwrSXM,87719 -sqlalchemy/engine/default.py,sha256=r4NyJf2d6qVcBgQrh1c5PWxdcg1FI0KhCms_1nQXcw0,54994 -sqlalchemy/engine/interfaces.py,sha256=AzkS3nGoNk3VI85GPiDFb7ugSmPdWTYpMHI9MmC0AdQ,46993 -sqlalchemy/engine/reflection.py,sha256=Ccbz18UE3XJrGShy5ZSa6S-PZTkIfn-WTVsOsuwTktg,34561 -sqlalchemy/engine/result.py,sha256=1-nFJlpdlJFODmmGaQrRF1R3UDS3X8EUEhGHtPHLs4A,54716 -sqlalchemy/engine/strategies.py,sha256=BuDOCGp6TMAej65TOresW9VHW2VfS60hx-rH4WfDPis,9847 -sqlalchemy/engine/threadlocal.py,sha256=EsPbaSO4S8WU4beLAyZ22iHV5YfxXt4ZejxuSMTu6pI,4764 -sqlalchemy/engine/url.py,sha256=PjgwmYtCr7CHP2TCiZBoOgctTjS7zK7GMMShPoQLBmU,9411 -sqlalchemy/engine/util.py,sha256=wDnfhJyQyxToapCC1jw6FRyW006dnChVIXYBIavzGF4,2421 -sqlalchemy/event/__init__.py,sha256=BuOhHzdZQnfPwXK3cvVUbsGJ7vhwwRzN673a8ImEPlA,596 -sqlalchemy/event/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/event/__pycache__/api.cpython-37.pyc,, -sqlalchemy/event/__pycache__/attr.cpython-37.pyc,, -sqlalchemy/event/__pycache__/base.cpython-37.pyc,, -sqlalchemy/event/__pycache__/legacy.cpython-37.pyc,, -sqlalchemy/event/__pycache__/registry.cpython-37.pyc,, -sqlalchemy/event/api.py,sha256=FeyGUN3Gtwh3g7JQTlDnn1zuILSWd-lEwb4Rvk7Eez0,7085 -sqlalchemy/event/attr.py,sha256=k4tXlwyPpXaAFyHp11nk7I9ZV4yEFgNpESGMt9Er1BQ,13853 -sqlalchemy/event/base.py,sha256=stD9Z3dWlFTDSFqcViREtgf4c8omBs2rvyeFEOXwi1g,9753 -sqlalchemy/event/legacy.py,sha256=T9ZOjmibgXCOqW2XADc1nsXxbS159ZYl2ueRUEfsZrU,5904 -sqlalchemy/event/registry.py,sha256=xA0dKdRoyE7mz3m4uhQDZ7nxC0LVWfPDOxjzxpPX0m8,8243 -sqlalchemy/events.py,sha256=7pAnJ3mPX7O-C7yPU7gQmBW5Zv-S8dcvY01NrUK3AHU,53052 -sqlalchemy/exc.py,sha256=lfTTGCfcvq8ibrgA7c0rbwQQTgO1gzm8EhMB_eY8fW4,17361 -sqlalchemy/ext/__init__.py,sha256=A8EjxtBgEW-qCJX0qqqo3OUJQe9sjjBYPYw5dN866bE,322 -sqlalchemy/ext/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/ext/__pycache__/associationproxy.cpython-37.pyc,, -sqlalchemy/ext/__pycache__/automap.cpython-37.pyc,, -sqlalchemy/ext/__pycache__/baked.cpython-37.pyc,, -sqlalchemy/ext/__pycache__/compiler.cpython-37.pyc,, -sqlalchemy/ext/__pycache__/horizontal_shard.cpython-37.pyc,, -sqlalchemy/ext/__pycache__/hybrid.cpython-37.pyc,, -sqlalchemy/ext/__pycache__/indexable.cpython-37.pyc,, -sqlalchemy/ext/__pycache__/instrumentation.cpython-37.pyc,, -sqlalchemy/ext/__pycache__/mutable.cpython-37.pyc,, -sqlalchemy/ext/__pycache__/orderinglist.cpython-37.pyc,, -sqlalchemy/ext/__pycache__/serializer.cpython-37.pyc,, -sqlalchemy/ext/associationproxy.py,sha256=8TpfZ8gA3X0lI7eDqVex7wySKxjcqcaIJJlM0qkRpTU,49768 -sqlalchemy/ext/automap.py,sha256=4g3HrD-jyJ1LctT3O4iTNLAYVPrP4OwdMCruQrXbLiI,42157 -sqlalchemy/ext/baked.py,sha256=7fjqFZhTGXe5C1cDw4Y-ldO8hWLzCxYacUDsx5TzXSo,21989 -sqlalchemy/ext/compiler.py,sha256=q5kP9F7PaReG7HEx1H5P0EuwN0mJ25Uk-KutMfuj-JY,17147 -sqlalchemy/ext/declarative/__init__.py,sha256=7c0OfggXwiLSVvehkwJJDDunv3AuY6Kq-4eMuNT-VNA,902 -sqlalchemy/ext/declarative/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/ext/declarative/__pycache__/api.cpython-37.pyc,, -sqlalchemy/ext/declarative/__pycache__/base.cpython-37.pyc,, -sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-37.pyc,, -sqlalchemy/ext/declarative/api.py,sha256=9clomjjILIdqQGE8x2kgZdRxjfRfM27WbdjMoSs7mNE,27636 -sqlalchemy/ext/declarative/base.py,sha256=vAVhpcwXCXFhQ_Yl-yL6D1ypnmogue4AW4CHgCXgQQI,32093 -sqlalchemy/ext/declarative/clsregistry.py,sha256=Nvxdt0KmYDIscE7V9tUEpDauf4EEc6dFZLiS2Cx0Cdo,12049 -sqlalchemy/ext/horizontal_shard.py,sha256=fBwLdomhyoa5iBVRaealC5TUzcm64Qx8QXTVGIf3SaA,9138 -sqlalchemy/ext/hybrid.py,sha256=JCyVxtk3ZSTGsIXFCjiNY4OxXGA_K4r9FRBhTGF6FJE,40325 -sqlalchemy/ext/indexable.py,sha256=pj8WNfIe_YsOIqFsel_93sMzTNsA9Rg03mGs11UNA3E,11254 -sqlalchemy/ext/instrumentation.py,sha256=7pxb7SDAnFvtHUxXnx8rqg4XKCadnWDGOBzFQHqeBS8,14351 -sqlalchemy/ext/mutable.py,sha256=qPhBEnRCj3GuRUF1a44J9jEdcvfsDCcgeGzZN_eSOHM,31820 -sqlalchemy/ext/orderinglist.py,sha256=sOdhObx8L8E7-LV2nSwRFOYFJK5hcz-g7K8gNKKewms,13900 -sqlalchemy/ext/serializer.py,sha256=ece4dfFCNbKgg-PbzDG_vZXM3C04w-C1REpF9h6INgQ,5784 -sqlalchemy/inspection.py,sha256=d4_LstciZQ766aPV5E8DlVI922f7eZ5L4rSMOCECyB4,3031 -sqlalchemy/interfaces.py,sha256=F8zw_dufYkf7zfc2bxb00AZUmOuSr5zoiWqx3GCNWNk,12740 -sqlalchemy/log.py,sha256=9K0QmnWqg4YTKdHkcJpudvdNsY2m9LmH5MKxj9INqlU,6705 -sqlalchemy/orm/__init__.py,sha256=PxbRLhF3nBDgTh198el-akJ29gsu0X6ooF1pZKk11zs,9558 -sqlalchemy/orm/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/attributes.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/base.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/collections.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/dependency.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/descriptor_props.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/dynamic.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/evaluator.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/events.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/exc.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/identity.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/instrumentation.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/interfaces.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/loading.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/mapper.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/path_registry.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/persistence.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/properties.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/query.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/relationships.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/scoping.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/session.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/state.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/strategies.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/strategy_options.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/sync.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/unitofwork.cpython-37.pyc,, -sqlalchemy/orm/__pycache__/util.cpython-37.pyc,, -sqlalchemy/orm/attributes.py,sha256=F7bOBInY4KWB4erAeH3ImmUMJlyuDm4uNin1Qa6bD4Q,67867 -sqlalchemy/orm/base.py,sha256=8X7-3ZM5MYSAz1n_CYlIM2spYEELf_u9ZRdDqtuNYAE,15317 -sqlalchemy/orm/collections.py,sha256=CLeCvvSuoMpn7ms-2l0PUNADiUTjHvNAcuZz4-XJg_c,52683 -sqlalchemy/orm/dependency.py,sha256=02Jyovdu-dyQ6umen79zeggcYnocRk4QW4zT2StA4vs,46556 -sqlalchemy/orm/deprecated_interfaces.py,sha256=NoUlf7eCwxS2QB-IC_Gr1d6IplYpvXWSHuftu0gzvV0,20763 -sqlalchemy/orm/descriptor_props.py,sha256=S0EJbqAQFsMxGF7gMdZwjsZn4NACa-sinwWeV3XGqOs,28377 -sqlalchemy/orm/dynamic.py,sha256=GcrMj7Uwvmh2CD-OatPExTvY0H6DtysBcQfX89dwgs8,14666 -sqlalchemy/orm/evaluator.py,sha256=clC6Tf6Ppv-xwmDTAcNh5axOqrvrnzC5Jq7rowPo3kA,5441 -sqlalchemy/orm/events.py,sha256=dV_-UqtxyN-1mJvRhZOAoBvjl7SM_5Aq0kXI3Pdm5fw,104408 -sqlalchemy/orm/exc.py,sha256=G_szgGYDr2ojIaYk9-qAjQA6B3d5Kbi0tVTIgq5HHbs,6616 -sqlalchemy/orm/identity.py,sha256=7Jhn-byH1e-K7xihNaYEpQLEkUaTuvykR3seXY7ahgU,10436 -sqlalchemy/orm/instrumentation.py,sha256=b1CcLwYzBa_ppCimxruTDEdoUNuCp8M5lP3WxEdSOf4,18131 -sqlalchemy/orm/interfaces.py,sha256=7hJtC3irDY9htapLJdjzxKCCja8MBrJobOYn5UTG-NA,25851 -sqlalchemy/orm/loading.py,sha256=oITlYdKbQoqgfa8gZSxUukS4tdbYwffOW0NBaedXsdw,33847 -sqlalchemy/orm/mapper.py,sha256=Na8nmNbm110CzQ4-jleDDEe18BATT_rup63QJCIoGcY,129890 -sqlalchemy/orm/path_registry.py,sha256=AT4cnr3fvxo44FthmyKjzX7LTHrfdgOotr8jStycWXY,13764 -sqlalchemy/orm/persistence.py,sha256=nHp_TCPOfBQiNYj5s8Q3L0zesHQrcJ2WbUK87JPhPXI,65927 -sqlalchemy/orm/properties.py,sha256=xIKHjXzA42KL-FtoFWuUe_9xsos3zSbZ8vHEuAPzV5k,12695 -sqlalchemy/orm/query.py,sha256=wMWrOosgc8OHkvPQW-7t5PpEbwPaN_LVSqVQlr86Rjo,178949 -sqlalchemy/orm/relationships.py,sha256=fdvc1ds4mbUN50gP7jyStuM-KMNX5bd1clzj6PsQ8Io,136637 -sqlalchemy/orm/scoping.py,sha256=F-RHAC3Ynw3kl_kwfalr8dGoiN50oyunXUGL0Tyz3U4,6414 -sqlalchemy/orm/session.py,sha256=CM-KKA5iWl6ozqsV0-iEoFQqBe4XP4OIdIVbiEvuV_4,131284 -sqlalchemy/orm/state.py,sha256=ZCEcx38aRsD3aCWF1XUiaGajFcYUjlDWK4sXfzsDe58,30794 -sqlalchemy/orm/strategies.py,sha256=M1ECN149rJRIWyTZopF3eeuBewEh207JKOkIYlOO4Dg,87001 -sqlalchemy/orm/strategy_options.py,sha256=1ggl_tsAjg37ors2cfoNN3mFxwepoSEe43gI3bPB3Oc,57376 -sqlalchemy/orm/sync.py,sha256=564q5ie_-aOiswgHZtaK-pnB8sCfzakOXte_V9V27Dk,5823 -sqlalchemy/orm/unitofwork.py,sha256=OAYzkT_p5Yul4krfnZTuN84zuuYxGe1EzZCOkdpeocI,24735 -sqlalchemy/orm/util.py,sha256=FLVsN4QcZP5pIptjJ4CcdMyd0xTbA7NnIftu89KkV0g,45432 -sqlalchemy/pool/__init__.py,sha256=-Vflck_t3sr66dgA4mehtNPZdvOsK7CgkjvY7UC7CbY,1483 -sqlalchemy/pool/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/pool/__pycache__/base.cpython-37.pyc,, -sqlalchemy/pool/__pycache__/dbapi_proxy.cpython-37.pyc,, -sqlalchemy/pool/__pycache__/impl.cpython-37.pyc,, -sqlalchemy/pool/base.py,sha256=-RL2p09Jx_X-kxmDltHdyG2cCSmYCrSDAELLNnFjd4g,36523 -sqlalchemy/pool/dbapi_proxy.py,sha256=zKCnvTcKfKuf04zqPMDjuuLtmdpIbkIKnk4dICLg_WA,4320 -sqlalchemy/pool/impl.py,sha256=oJYs7lUgfU7HbWp5VvTuHUXqBB1DSNTWuskevw6vNBA,14645 -sqlalchemy/processors.py,sha256=i_DiEYBHp5JJvvp7omB_TXSXf5efWTILvjVYvu8LHmw,5744 -sqlalchemy/schema.py,sha256=mkZmV4FQ4XWqRMsRoIf0lmB13bftAFPZjcszEKaE5gE,2418 -sqlalchemy/sql/__init__.py,sha256=12olVEiRBSf27BGAt_aWOUsLBF3sptfDvt-o-4K_7ts,3789 -sqlalchemy/sql/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/annotation.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/base.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/compiler.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/crud.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/ddl.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/default_comparator.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/dml.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/elements.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/expression.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/functions.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/naming.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/operators.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/schema.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/selectable.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/sqltypes.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/type_api.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/util.cpython-37.pyc,, -sqlalchemy/sql/__pycache__/visitors.cpython-37.pyc,, -sqlalchemy/sql/annotation.py,sha256=8XH8I_XmZI5iF2QwqX9N0auQCnh0EHZkOeoPiFQoUZM,6725 -sqlalchemy/sql/base.py,sha256=vDkZqV6Q-IigRLdEzf-IuQqHW6DeckQ5N85vbgzXpVA,21740 -sqlalchemy/sql/compiler.py,sha256=OkqHP1UOVR0fysEWdUFl44w9X582YDlOgKLTrkin2uc,126523 -sqlalchemy/sql/crud.py,sha256=ca_9Rjlxw_OnWZxBas_ElvMGtClvIUhLjxWOHhHJ6BE,25889 -sqlalchemy/sql/ddl.py,sha256=Mwfkqrc551QMnDeozZLRDu62je2SlP6ABXs6L9PGrtE,41416 -sqlalchemy/sql/default_comparator.py,sha256=tRDxI3AGdgrhG-hWymXgH2952Fqfw5f5-zB8Rbfq2qQ,12234 -sqlalchemy/sql/dml.py,sha256=YF3tCrAUdXskjLyUe5KPKlDp_zbCnujVlyGxa4MdQlk,35335 -sqlalchemy/sql/elements.py,sha256=dFZ8KSm_mFkYMJjEAEP3ipl3Uf0p0U3dpUQCFqE6GYs,159917 -sqlalchemy/sql/expression.py,sha256=BVhn2KBPg3CQBmBfKPQqvYMgTHqHkt_-bqej3RLSD-g,9209 -sqlalchemy/sql/functions.py,sha256=gxWSE5KoTnh7ylVLwPnmGwVKwvJY38VjMjdOOtsvXEI,35833 -sqlalchemy/sql/naming.py,sha256=zVMDaA0Npbe8NzBSVBykw69cobe-dfQDC4r451cpvUk,5889 -sqlalchemy/sql/operators.py,sha256=J7ghLip6g-S-xGjNTx5RBo-hjM48RZ9pqVI8dIUY77A,42548 -sqlalchemy/sql/schema.py,sha256=28UI94JEdxrJq8G3RnQj6x-f4pNIOwckhQaPfq_kKmg,172921 -sqlalchemy/sql/selectable.py,sha256=enoXrsZIMlmFFo3fTK5w3wCxEttTSIvXFjKG8jmPlRw,137999 -sqlalchemy/sql/sqltypes.py,sha256=edW3yywfapznqhcBfbcirbg_8Ow44HLKzar80eyl23M,100787 -sqlalchemy/sql/type_api.py,sha256=BhCUsW--YVXV2iCoA3eWao608YmNkFw8plEwR1dhb9A,52229 -sqlalchemy/sql/util.py,sha256=gnU_xzrrmhD4vJ2RG5qAmWCe-jqG7dkmGRr-t2t3ZTg,29192 -sqlalchemy/sql/visitors.py,sha256=frayBlJ-hGW5wWJJC_EwA0WXs-RJuKSVgJr-bJ-VAf4,15953 -sqlalchemy/testing/__init__.py,sha256=dvAdeVcRveMsKSxAV71HG_wyxNgUjvIg03zyasFaVCI,2789 -sqlalchemy/testing/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/assertions.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/assertsql.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/config.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/engines.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/entities.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/exclusions.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/fixtures.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/mock.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/pickleable.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/profiling.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/provision.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/replay_fixture.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/requirements.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/schema.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/util.cpython-37.pyc,, -sqlalchemy/testing/__pycache__/warnings.cpython-37.pyc,, -sqlalchemy/testing/assertions.py,sha256=bqhUma94aCjrAVS6_w2OOECkCClHkvV0YlOpo_mMZOU,19779 -sqlalchemy/testing/assertsql.py,sha256=Qss3YS3O0ac68rBh2FPGskgDd6yJzG_5KUn0UhhtQS0,13573 -sqlalchemy/testing/config.py,sha256=OQC0OW8r_rlj3Bljv03Vb1pVABJoLwM0MWUll-daaGk,5521 -sqlalchemy/testing/engines.py,sha256=vL6jvWWIXe5XJKCzx2NRkgeT6aNatiNdes_ZHbdH5pw,10437 -sqlalchemy/testing/entities.py,sha256=c40-zDP6Y6vx18Pmj9Lx4JZ26lr4dQ_42JoffyEP9cA,3203 -sqlalchemy/testing/exclusions.py,sha256=0hOS3GnCs9T149eB4fZfxtGSWsPU_bi1VAlLhldr16w,13037 -sqlalchemy/testing/fixtures.py,sha256=eMARL5rpAaypiTpiK8YCAUFOZztrTTWCoLyElMTUSNA,15034 -sqlalchemy/testing/mock.py,sha256=TMVhpHQtM3v-2CFNYsP6np2vsF7aNDMWXCnjfI9rNvI,893 -sqlalchemy/testing/pickleable.py,sha256=6JlSnkXCrbbjeHkbFBwdA8BBrYfLz-PVA7slVhGNYYE,2693 -sqlalchemy/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -sqlalchemy/testing/plugin/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-37.pyc,, -sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-37.pyc,, -sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-37.pyc,, -sqlalchemy/testing/plugin/bootstrap.py,sha256=0rkror_9S175GPGNnbtbDmfdLEhu9v-AAv715lR8KyU,1468 -sqlalchemy/testing/plugin/plugin_base.py,sha256=3VM5tJHm74gCTawivXHCQeLhx9-aiPZ71UPQ8v8aD9Y,20361 -sqlalchemy/testing/plugin/pytestplugin.py,sha256=fvT5LeUX6kyIxN3y5FZSaaaTBkilGNPi54qGz51fsMM,16189 -sqlalchemy/testing/profiling.py,sha256=Sm1jEw_H0IOFl_fL8xSvYH5oSOYnRi-jYN1krlR7rJI,8855 -sqlalchemy/testing/provision.py,sha256=qWmrATrDsGAJUgQgg5gyS7iRxAYvsHY2T_psTvV4GTg,5509 -sqlalchemy/testing/replay_fixture.py,sha256=W_QZD96t7ichRNvILOjhuoQXTCYnd2usiHBQhPkzUYI,5875 -sqlalchemy/testing/requirements.py,sha256=YMD5ILDKaYFY2g9pTY_7UwkTneuBpPgiigDMunGt_BQ,32131 -sqlalchemy/testing/schema.py,sha256=V5Kggty3LB9YDzbLqmSHsc60J7fUXLDnBJnt_ZmXkas,3712 -sqlalchemy/testing/suite/__init__.py,sha256=SUWU-LR3asH2hN2YsIhlpqxeuo8fpvej3o6nct-L4xU,358 -sqlalchemy/testing/suite/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/testing/suite/__pycache__/test_cte.cpython-37.pyc,, -sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-37.pyc,, -sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-37.pyc,, -sqlalchemy/testing/suite/__pycache__/test_insert.cpython-37.pyc,, -sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-37.pyc,, -sqlalchemy/testing/suite/__pycache__/test_results.cpython-37.pyc,, -sqlalchemy/testing/suite/__pycache__/test_select.cpython-37.pyc,, -sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-37.pyc,, -sqlalchemy/testing/suite/__pycache__/test_types.cpython-37.pyc,, -sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-37.pyc,, -sqlalchemy/testing/suite/test_cte.py,sha256=VbBzRrNWXk2EkuFAz5f5vFXaR9tU240c63dSY88qpf0,6801 -sqlalchemy/testing/suite/test_ddl.py,sha256=TGFhoJEy-_NqPb5ypR8x8eYW7Xus323kt4p9DXRsjtk,2896 -sqlalchemy/testing/suite/test_dialect.py,sha256=LQmHD11UKObwB5bwh4QCJChk501AExe7FHvScOB5QAE,6197 -sqlalchemy/testing/suite/test_insert.py,sha256=Hiwa4iE-oG4csNG57CieNgN2-hGfHX8xgbMQT3rM0TE,9672 -sqlalchemy/testing/suite/test_reflection.py,sha256=YhJ7O4MN9R__VOjr0yrNnkudiaSezj493gwQi25d84s,41641 -sqlalchemy/testing/suite/test_results.py,sha256=wemYY7ZTVisKLbks8p1Maf1HEOLZ9vigIsGoHHc4Cbw,10971 -sqlalchemy/testing/suite/test_select.py,sha256=r_Whu2VLr6l_9BNp8vYikzOYzbh-V73l_yn-OX98nVc,23049 -sqlalchemy/testing/suite/test_sequence.py,sha256=oacBvtAqW3Ua3gcqyqnT1U_hpJutEW_EmEbwvf7Xq7E,4661 -sqlalchemy/testing/suite/test_types.py,sha256=ttLLKd5faoa0Uvr-HKRTvieNhlASaSnwj7c9HuB50jk,37159 -sqlalchemy/testing/suite/test_update_delete.py,sha256=I2NOhWu7iwKLJzcqM_6sLh3WCE1jmcN8tLwBzvNYLPg,1491 -sqlalchemy/testing/util.py,sha256=Pn41mDkl_Bb7mCbzGmqA4m1d5LCrpvh8v4C7lUCKvwY,10149 -sqlalchemy/testing/warnings.py,sha256=m0M3oN0gR7VH7d_VbFZaQu2igcsJDKTJvKRwNdfEwsY,1671 -sqlalchemy/types.py,sha256=LRIjlg-DVeBMAhVI7iXXY8NhQQDDr2UPKp3ONwyMZhI,3377 -sqlalchemy/util/__init__.py,sha256=ohFYPWxLu_BxGvDgCLvl7r2CrkB0y3vcN3DnePBsauA,6648 -sqlalchemy/util/__pycache__/__init__.cpython-37.pyc,, -sqlalchemy/util/__pycache__/_collections.cpython-37.pyc,, -sqlalchemy/util/__pycache__/compat.cpython-37.pyc,, -sqlalchemy/util/__pycache__/deprecations.cpython-37.pyc,, -sqlalchemy/util/__pycache__/langhelpers.cpython-37.pyc,, -sqlalchemy/util/__pycache__/queue.cpython-37.pyc,, -sqlalchemy/util/__pycache__/topological.cpython-37.pyc,, -sqlalchemy/util/_collections.py,sha256=MfX2a2MJ95_cYqGQFDWTuf_y7frdtY-z7LBI261HJWE,29219 -sqlalchemy/util/compat.py,sha256=LqV8UIGP7-WEmBI7H-sIsxGi1B9XRppxuxJyGoYE4_c,16828 -sqlalchemy/util/deprecations.py,sha256=odcWi5Ciq7T-kpYbavOjMaK89fuX6BvN4j-zB_Pr8BA,7474 -sqlalchemy/util/langhelpers.py,sha256=aaV0kbtmiQfRXCYaHgYGITYE01apkoFuJWlwYTO0p5U,50512 -sqlalchemy/util/queue.py,sha256=QHh_QckIfyisS9q_blxbwamt92JPXKZgt-pf971dsEs,6827 -sqlalchemy/util/topological.py,sha256=lbXO1ZDDTtYHps_rE7NlEZ3AG773IDLP_7L941DTt6U,2767 diff --git a/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/WHEEL b/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/WHEEL deleted file mode 100644 index a194ea7..0000000 --- a/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.32.3) -Root-Is-Purelib: false -Tag: cp37-cp37m-linux_armv7l - diff --git a/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/top_level.txt deleted file mode 100644 index 39fb2be..0000000 --- a/venv/lib/python3.7/site-packages/SQLAlchemy-1.3.17.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -sqlalchemy diff --git a/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/LICENSE.rst b/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/LICENSE.rst deleted file mode 100644 index c37cae4..0000000 --- a/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.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/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/METADATA b/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/METADATA deleted file mode 100644 index 25977a3..0000000 --- a/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/METADATA +++ /dev/null @@ -1,127 +0,0 @@ -Metadata-Version: 2.1 -Name: Werkzeug -Version: 1.0.0 -Summary: The comprehensive WSGI web application library. -Home-page: https://palletsprojects.com/p/werkzeug/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: Pallets -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Documentation, https://werkzeug.palletsprojects.com/ -Project-URL: Code, https://github.com/pallets/werkzeug -Project-URL: Issue tracker, https://github.com/pallets/werkzeug/issues -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware -Classifier: Topic :: Software Development :: Libraries :: Application Frameworks -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* -Description-Content-Type: text/x-rst -Provides-Extra: dev -Requires-Dist: pytest ; extra == 'dev' -Requires-Dist: coverage ; extra == 'dev' -Requires-Dist: tox ; extra == 'dev' -Requires-Dist: sphinx ; extra == 'dev' -Requires-Dist: pallets-sphinx-themes ; extra == 'dev' -Requires-Dist: sphinx-issues ; extra == 'dev' -Provides-Extra: watchdog -Requires-Dist: watchdog ; extra == 'watchdog' - -Werkzeug -======== - -*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") - -Werkzeug is a comprehensive `WSGI`_ web application library. It began as -a simple collection of various utilities for WSGI applications and has -become one of the most advanced WSGI utility libraries. - -It includes: - -- An interactive debugger that allows inspecting stack traces and - source code in the browser with an interactive interpreter for any - frame in the stack. -- A full-featured request object with objects to interact with - headers, query args, form data, files, and cookies. -- A response object that can wrap other WSGI applications and handle - streaming data. -- A routing system for matching URLs to endpoints and generating URLs - for endpoints, with an extensible system for capturing variables - from URLs. -- HTTP utilities to handle entity tags, cache control, dates, user - agents, cookies, files, and more. -- A threaded WSGI server for use while developing applications - locally. -- A test client for simulating HTTP requests during testing without - requiring running a server. - -Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up -to the developer to choose a template engine, database adapter, and even -how to handle requests. It can be used to build all sorts of end user -applications such as blogs, wikis, or bulletin boards. - -`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while -providing more structure and patterns for defining powerful -applications. - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - pip install -U Werkzeug - - -A Simple Example ----------------- - -.. code-block:: python - - from werkzeug.wrappers import Request, Response - - @Request.application - def application(request): - return Response('Hello, World!') - - if __name__ == '__main__': - from werkzeug.serving import run_simple - run_simple('localhost', 4000, application) - - -Links ------ - -- Website: https://palletsprojects.com/p/werkzeug/ -- Documentation: https://werkzeug.palletsprojects.com/ -- Releases: https://pypi.org/project/Werkzeug/ -- Code: https://github.com/pallets/werkzeug -- Issue tracker: https://github.com/pallets/werkzeug/issues -- Test status: https://dev.azure.com/pallets/werkzeug/_build -- Official chat: https://discord.gg/t6rrQZH - -.. _WSGI: https://wsgi.readthedocs.io/en/latest/ -.. _Flask: https://www.palletsprojects.com/p/flask/ -.. _pip: https://pip.pypa.io/en/stable/quickstart/ - - diff --git a/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/RECORD b/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/RECORD deleted file mode 100644 index 7ffb320..0000000 --- a/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/RECORD +++ /dev/null @@ -1,101 +0,0 @@ -Werkzeug-1.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Werkzeug-1.0.0.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -Werkzeug-1.0.0.dist-info/METADATA,sha256=PYrtVKBaudcg8XAd-XR_FP0XKeHwh2svMnYDkF3NMEM,4683 -Werkzeug-1.0.0.dist-info/RECORD,, -Werkzeug-1.0.0.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 -Werkzeug-1.0.0.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 -werkzeug/__init__.py,sha256=tuMKcU_g68IyAqFr7KP27w82oHdbHCJo5jsELm56krM,502 -werkzeug/__pycache__/__init__.cpython-37.pyc,, -werkzeug/__pycache__/_compat.cpython-37.pyc,, -werkzeug/__pycache__/_internal.cpython-37.pyc,, -werkzeug/__pycache__/_reloader.cpython-37.pyc,, -werkzeug/__pycache__/datastructures.cpython-37.pyc,, -werkzeug/__pycache__/exceptions.cpython-37.pyc,, -werkzeug/__pycache__/filesystem.cpython-37.pyc,, -werkzeug/__pycache__/formparser.cpython-37.pyc,, -werkzeug/__pycache__/http.cpython-37.pyc,, -werkzeug/__pycache__/local.cpython-37.pyc,, -werkzeug/__pycache__/posixemulation.cpython-37.pyc,, -werkzeug/__pycache__/routing.cpython-37.pyc,, -werkzeug/__pycache__/security.cpython-37.pyc,, -werkzeug/__pycache__/serving.cpython-37.pyc,, -werkzeug/__pycache__/test.cpython-37.pyc,, -werkzeug/__pycache__/testapp.cpython-37.pyc,, -werkzeug/__pycache__/urls.cpython-37.pyc,, -werkzeug/__pycache__/useragents.cpython-37.pyc,, -werkzeug/__pycache__/utils.cpython-37.pyc,, -werkzeug/__pycache__/wsgi.cpython-37.pyc,, -werkzeug/_compat.py,sha256=zjufTNrhQ8BgYSGSh-sVu6iW3r3O9WzjE9j-qJobx-g,6671 -werkzeug/_internal.py,sha256=d_4AqheyS6dHMViwdc0drFrjs67ZzT6Ej2gWf-Z-Iys,14351 -werkzeug/_reloader.py,sha256=I3mg3oRQ0lLzl06oEoVopN3bN7CtINuuUQdqDcmTnEs,11531 -werkzeug/datastructures.py,sha256=lgSnQ5E_hMlbKD6_Iq0eT1CBW_CPobVUqhunHqUWrPs,100436 -werkzeug/debug/__init__.py,sha256=3RtUMc5Y9hYyK11ugHltgkQ9Dt-ViR945Vy_X5NV7zU,17289 -werkzeug/debug/__pycache__/__init__.cpython-37.pyc,, -werkzeug/debug/__pycache__/console.cpython-37.pyc,, -werkzeug/debug/__pycache__/repr.cpython-37.pyc,, -werkzeug/debug/__pycache__/tbtools.cpython-37.pyc,, -werkzeug/debug/console.py,sha256=YHfFF7b4gRfG9aM7_KxwnUBN5nX8mr0OBTPOIMCpyiQ,5461 -werkzeug/debug/repr.py,sha256=lIwuhbyrMwVe3P_cFqNyqzHL7P93TLKod7lw9clydEw,9621 -werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 -werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 -werkzeug/debug/shared/debugger.js,sha256=rOhqZMRfpZnnu6_XCGn6wMWPhtfwRAcyZKksdIxPJas,6400 -werkzeug/debug/shared/jquery.js,sha256=CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo,88145 -werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 -werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 -werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818 -werkzeug/debug/shared/style.css,sha256=gZ9uhmb5zj3XLuT9RvnMp6jMINgQ-VVBCp-2AZbG3YQ,6604 -werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 -werkzeug/debug/tbtools.py,sha256=2iJ8RURUZUSbopOIehy53LnVJWx47lsHN2V2l6hc7Wc,20363 -werkzeug/exceptions.py,sha256=UTYSDkmAsH-vt8VSidlEffwqBVNXuT7bRg-_NqgUe8A,25188 -werkzeug/filesystem.py,sha256=HzKl-j0Hd8Jl66j778UbPTAYNnY6vUZgYLlBZ0e7uw0,2101 -werkzeug/formparser.py,sha256=Sto0jZid9im9ZVIf56vilCdyX-arK33wSftkYsLCnzo,21788 -werkzeug/http.py,sha256=YLEcmPFGAwltCLUl-D97l1EEWwLOl_UshuMOXssGm0M,43052 -werkzeug/local.py,sha256=_Tk7gB238pPWUU7habxFkZF02fiCMRVW6d62YWL1Rh0,14371 -werkzeug/middleware/__init__.py,sha256=f1SFZo67IlW4k1uqKzNHxYQlsakUS-D6KK_j0e3jjwQ,549 -werkzeug/middleware/__pycache__/__init__.cpython-37.pyc,, -werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc,, -werkzeug/middleware/__pycache__/http_proxy.cpython-37.pyc,, -werkzeug/middleware/__pycache__/lint.cpython-37.pyc,, -werkzeug/middleware/__pycache__/profiler.cpython-37.pyc,, -werkzeug/middleware/__pycache__/proxy_fix.cpython-37.pyc,, -werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc,, -werkzeug/middleware/dispatcher.py,sha256=_-KoMzHtcISHS7ouWKAOraqlCLprdh83YOAn_8DjLp8,2240 -werkzeug/middleware/http_proxy.py,sha256=lRjTdMmghHiZuZrS7_UJ3gZc-vlFizhBbFZ-XZPLwIA,7117 -werkzeug/middleware/lint.py,sha256=ItTwuWJnflF8xMT1uqU_Ty1ryhux-CjeUfskqaUpxsw,12967 -werkzeug/middleware/profiler.py,sha256=8B_s23d6BGrU_q54gJsm6kcCbOJbTSqrXCsioHON0Xs,4471 -werkzeug/middleware/proxy_fix.py,sha256=K5oZ3DPXOzdZi0Xba5zW7ClPOxgUuqXHQHvY2-AWCGw,6431 -werkzeug/middleware/shared_data.py,sha256=2V4lLqK9CZLFcxtOAjZE7ZVY4SIU_cKLdKKaMmJPO3o,9581 -werkzeug/posixemulation.py,sha256=gSSiv1SCmOyzOM_nq1ZaZCtxP__C5MeDJl_4yXJmi4Q,3541 -werkzeug/routing.py,sha256=zF5Px2KLYThv634WBZRK3jiOPUQIcRe1iGz0R0eaSzM,79014 -werkzeug/security.py,sha256=81149MplFq7-hD4RK4sKp9kzXXejjV9D4lWBzaRyeQ8,8106 -werkzeug/serving.py,sha256=YvTqvurA-Mnj8mkqRe2kBdVr2ap4ibCq1ByQjOA6g1w,38694 -werkzeug/test.py,sha256=GJ9kxTMSJ-nB7kfGtxuROr9JGmXxDRev-2U1SkeUJGE,39564 -werkzeug/testapp.py,sha256=bHekqMsqRfVxwgFbvOMem-DYa_sdB7R47yUXpt1RUTo,9329 -werkzeug/urls.py,sha256=T8-hV_1vwhu6xhX93FwsHteK-W-kIE2orj5WoMf-WFw,39322 -werkzeug/useragents.py,sha256=UOckz1Ts8buNA_KJvVOT6iqNP5EFl3P5JqlpwiQUI-w,5451 -werkzeug/utils.py,sha256=hrVK4u_wi8z9viBO9bgOLlm1aaIvCpn-p2d1FeZQDEo,25251 -werkzeug/wrappers/__init__.py,sha256=S4VioKAmF_av9Ec9zQvG71X1EOkYfPx1TYck9jyDiyY,1384 -werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc,, -werkzeug/wrappers/__pycache__/accept.cpython-37.pyc,, -werkzeug/wrappers/__pycache__/auth.cpython-37.pyc,, -werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc,, -werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc,, -werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc,, -werkzeug/wrappers/__pycache__/cors.cpython-37.pyc,, -werkzeug/wrappers/__pycache__/etag.cpython-37.pyc,, -werkzeug/wrappers/__pycache__/json.cpython-37.pyc,, -werkzeug/wrappers/__pycache__/request.cpython-37.pyc,, -werkzeug/wrappers/__pycache__/response.cpython-37.pyc,, -werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc,, -werkzeug/wrappers/accept.py,sha256=TIvjUc0g73fhTWX54wg_D9NNzKvpnG1X8u1w26tK1o8,1760 -werkzeug/wrappers/auth.py,sha256=Pmn6iaGHBrUyHbJpW0lZhO_q9RVoAa5QalaTqcavdAI,1158 -werkzeug/wrappers/base_request.py,sha256=4TuGlKWeKQdlq4eU94hJYcXSfWo8Rk7CS1Ef5lJ3ZM0,26012 -werkzeug/wrappers/base_response.py,sha256=JTxJZ8o-IBetpoWJqt2HFwPaNWNDAlM3_GXJe1Whw80,27784 -werkzeug/wrappers/common_descriptors.py,sha256=X2Ktd5zUWsmcd4ciaF62Dd8Lru9pLGP_XDUNukc8cXs,12829 -werkzeug/wrappers/cors.py,sha256=hwbXEVjiqDT4MybRgstMYQw4NqgiXEiQ9wmlC3sqNA8,3512 -werkzeug/wrappers/etag.py,sha256=XMXtyfByBsOjxwaX8U7ZtUY7JXkbQLP45oXZ0qkyTNs,12217 -werkzeug/wrappers/json.py,sha256=HvK_A4NpO0sLqgb10sTJcoZydYOwyNiPCJPV7SVgcgE,4343 -werkzeug/wrappers/request.py,sha256=QbHGqDpGPN684pnOPEokwkPESfm-NnfYM7ydOMxW_NI,1514 -werkzeug/wrappers/response.py,sha256=Oqv8TMG_dnOKTq_V30ddgkO5B7IJhkVPODvm7cbhZ3c,2524 -werkzeug/wrappers/user_agent.py,sha256=YJb-vr12cujG7sQMG9V89VsJa-03SWSenhg1W4cT0EY,435 -werkzeug/wsgi.py,sha256=ZGk85NzRyQTzkYis-xl8V9ydJgfClBdStvhzDzER2mw,34367 diff --git a/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/WHEEL b/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/WHEEL deleted file mode 100644 index 8b701e9..0000000 --- a/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.33.6) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/top_level.txt deleted file mode 100644 index 6fe8da8..0000000 --- a/venv/lib/python3.7/site-packages/Werkzeug-1.0.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -werkzeug diff --git a/venv/lib/python3.7/site-packages/__pycache__/console_log.cpython-37.pyc b/venv/lib/python3.7/site-packages/__pycache__/console_log.cpython-37.pyc deleted file mode 100644 index c38aa215d8e66ae23edd0e3b135108264428ba8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2922 zcmZuzOK%&=5$>KBha-xTZ0*CrCLpw%SWMOw5E$9St2HdkT0gL%6p2~yP9B31yG4;2 z&WyX8rX>w8k%2w!KgdA_a>*q>VlTPo+{i7LG?)H`o04{uYWG(oKH^~NPx<~{);;2CONdOE zkzM|5#HH%=hddi8jQG1;=2#^3@64iq4fr4I|)%y~&d=NsaX(8VoXJ@=sBRgdD7C0ul^*#@RJ&1@)_ zK@>S7=kyh!q@V?fEJm=HwwtzgwN`d*vFbD`lT%+8)ZDb_Oy_;rh`qm%7?H z&UuL@lmwj4u%8`@rf*CSeK*Q?IJrxVpPkXIa>t^%Q zpqx~Vv21+SNcp&N8EC63V|iz7?Q}nue6kirV*qdk3&ygQr8ARY&A}+`s(zL>R^hEw zH5;d=K?9FDQ#D|H$UNEGZnyGSNIn&6u~@~}>Ou~v{S72rrPF@5YS@|6AvBqM8vIYF z-ZN_c2;?GES(RDLen}Ci4s%VQGLKczyUYim0v&8l!{dvr_j&>9%xn@xt%2;8VS(LT zG!wWb?r(!BLzXCd28>2lVS(C(4eBTtsI|`M#6fSLdxdj}UIceV+i{)?lL)5x@?iTO zg1s`3kwI(e8Xd%p%@Rn{Em0>vHcM_9(gM+y!)boGa{1KPCZazN zLtr}y?9Zoxy+gjn*jH#ziE_`#A7~n4FAJ%G47?*t{H4G?452NaW8B6WZu$do4mb}z zlE|dOyz@%o6_o>%K3wIi>L4gwR{55~z<%Mw4c3{p2X~y$F`rdmS(B>rkuu0&zM%Mm z42n>I^Zs6t^M%64K7LUZ|17FF!$-wfp7PZq(lR<<{lL&h~ESHN9i1jfs(Pxs>17+}zsfL|g66 z?FWzB4>dWdD*i&P9jal{T+&`Q$s}h}P}n`LOs-FvFb)z1hEumYgRGwl14kV^+4yo} zZ*%wYPDgtOnHa`O+j*9U{(;Dbk%5`PjP{49gbKM$d;N64yGnQ%ZU)n2R^jRMzR1$B zj;bM4BxbczTVp9cH0S=*Y~mbd5?9JIp|pP?6D}Vrl}B;6%X1a+w3{*HkGBwM5?UAa zD2nc3BWZRc0Ht{YI?aVO@O69z$d86wq=8+dbsHnLW8|#2z&qXVvML#K7!zGaC!^;E zW)#jwZ7Si4=mc2l0MR&cm^C1XS%=x*Vm@*U^LOF2Pgd7uSM+n$kfQt9%IRdK5zFHg zY}u{cU0<8d-#uA8g|d7SoX%4J#1v;UBtF7Lnx6Otx~a>2I5RSdO?wQ5gP~q@4^7U4 zJgC~g|E zYKTb?;=Unfw>M5Gi&t4MevFBqp-BT2n7`_OD9l*%hWI`@6j9_Xcv@F7iS&)6^)80P zTCdFXt@3B3OmX4Dbm%gSN;rqt$6Oqp@KLYDUl{11O2`u9;nL;ISOCCW$P(+JZ=%us zx|P_~K2YCzyt(m(cDHtSw|8~r>Ber`M3rMARJ#wh?*ICs_S)N>y{(S;UU}(RJ}nch o_&J73o&KKzw7)(rymu+YWCNrGtW|@#%hyFtoxOo`?E}aD4^D~O)&Kwi diff --git a/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc b/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc deleted file mode 100644 index 55391d1d1a5086a67fa47266c9cca9f561133c32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmYk!y-LJD5C`zt-RK4JofJ)&0XNx#zb2v+Dmw6^1cC Sv0n8?pE82tq-8v3yX+euaZVus diff --git a/venv/lib/python3.7/site-packages/__pycache__/editor.cpython-37.pyc b/venv/lib/python3.7/site-packages/__pycache__/editor.cpython-37.pyc deleted file mode 100644 index c481453e5df669349fca30795c488cb95f61e384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2882 zcmZuzOLH5?5uVu>mLLd16h-Pq8ex(up(-H#$kTCb%a)vSm5Wv+IZkaJTT9FUS`yfW zX9lE*0xyBCtmKv)fn%z2_Bp>}uBjYy@elCHUk^x1QDwJgrl)77x2OB-?)_+GrONR9 z=WqY|(?6FP`!`K4pAf`{XnLD7CRoA*7hazayu{-~`+Yz0-54Z+8^a`WV}&isct9Srs+0g0Ug$BEoo0tcnK4 zHSva66X6S2HIymd%hSJ2h57b5?hT3GgTx)VGux6o zb4U^X6V_^ufAq90`?}dJRWmP+%cH#LHKoW+sdRIw%AU#wgUsZetlvM~{V&OQpz0op?s^Z!vX0PAB~ zBNgE_PxvC}1yC{Ex6#Et{o{OKLpjJg+6F~dlrQypg#v7uy-wy4vYUAT0@cP=CCHZucP5d1o9GY4YN9?6tdSrK)4!*l!mnN!X)1gLyKp zwcCX}X`cWF<%wFQEnfSvyKsvuve)aEUww&`Y{6HlK7IQ6rWsQ%eII_L`^VNHu@3kl8%Wl#|hltXFDVk;QSY z%EJ1vjPtspYdS=>d}qVNlfnkW%shL|nu^liPti1?g?Tr5zyrTVmV^yE#Jha1&_lK+ za{)h|stXvxB?VkQgd5*^dmMcH`To1(cu&aVJ!4K=p7n7(8xQ-LLB<%oqJs-Lhv^2n z6}!`J-j@`TpWri^0+{hCv{D3c%Q_TG^w7yAH0RB4Ko~YG&dLu#EfG~?@GU@n6std&>f!PPx&EA=MU&{T21LNW@cQ4) z3Mg;tspAQs)#nVjSj8zs^SSqz##v=jnKdT(8fRZZ)^FHj_B%ESC#=VRhOY~D7Ee6& zwOKXSrZ_eA&SJB6czqIza1x8?+&^2IEX~&Eh*l@J;^bDH+#7QsY$4HMEvEDt=~1_v zKSvHJI;D`-J2?P1K!%e~VfLj?ztl4A3XPpclp|w3bimh@*L7qg-e3kJ@pY0oEaT%C7ChSK=wArOMRlC&WYg8c17tmeC2Nw&_Gr z4rKv^sNBefFROZVfLhU!THElETVC#zgTbgk-7t^>HAJgw<4Z)?7;#}_VRTX%;a;T8 z7Gyh!+kldR^^v$O?=G|qNc<~kBcLe)&}V4+9y-P&zKwjbfmWl;;Z=eAI$!sy9wLF) zyoQ_q|2#?=%`n5KY)Yk(QUKqF-9uOCoR#4Yuh6gQV3*UENvu!0P;fD>-bH`)DdJIh zI)uLsV!{rAxC<=a1pQ~@U;T>dok)~rR z=@(TKHt{b zBZX3~$X1Hbs(y*iR!Y6=0PNtsOMLRST@|@DBa`>_t{!G5g-etq5hWfHm(%oEDvf^= z`a5_$Doj3*?#II=(?xEjnz9HW%18?vk>A{fRfRqi;~v9IX=&^CRc|x^WFOH~C0;hP z^-PGAup1rvMk2N7 diff --git a/venv/lib/python3.7/site-packages/__pycache__/six.cpython-37.pyc b/venv/lib/python3.7/site-packages/__pycache__/six.cpython-37.pyc deleted file mode 100644 index 9d354e81377044cbea0ae8069be7772007b79eef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26832 zcmc(H378zmb>2+RxwEs2<>Dqma(IBmg1~^pL69H_;yy%R2>~Dh4oD4Wr+OE&J3BL| z?ge&7yQIh^Me2qwQk1WSEX$TGUrOXFcH;O_EG14H$2mH2Vn=dhCX#YEaUAAQ{{K~X z&#?=_r1E{4`MUd6^{c8^uU=KXdiARJ_w{8W_I%yTGDB)N&R*1XnQPH&#m7K5& zy>Ecd;@GM2n*c4h*8#6z@NQnXMfF^b>aW`aDl;ENs-s6Ds#j%SjHs-A>wK(`o9VZ2 zvvc#2`Diq9Hd4DK9@M_R`H)1v*W{p~ln6-j2gz$~(CWLR295&h; z?R!wxCd98(HzWRLdjryKwujU$_}{8>^KrnpsoT{Z>P~grd;+2M2;HvkQtKsjx7vVr zL+Wk`ZA9pv`53S^Nt(@Slf>uM7X0s3c?sPop}e|JLR-}~wO!Keki70!J0yOm+Ft5Xtl zTAfjk3-p9KE2+*+M3Cyw)e}hdq`WDp^Xe&qo>uQsMS-4CB{d>YSt(@;G^)nb1%WDR zTulg6RgaMdeNu$CG~!Zd0D-pJ|Jm6s6M1VEYL^PN7cs!x}rX=J|WO2)u+^_1$tGz zramLk>*}-WhXndz^&{#>1^O|ypsot^IrZb}^8)>Z`huVHPpY3%UzE5nsh?I~7U*Zx z&-!KjoPCe_`PC8i3ljeog#HFXe^WwVMd%k-N6cMfeo6hZ`W1nGRsAjXYXbec`rGR7 z%*V#|7xHMOo7HbjSXbiuvvwY>`ghfD&Rb*AosmL*dY7F)7F$NU23+{IH zJH$fI`(5=l^t`W0&)WeB{(I{8q)tQX>ml@w5c>Ne^bbPl_e1FSLg*ic&_4>HKM0|{ z>Z^Vk|2TyHFoga|2>lTu^@r+@q=)>|F#ex~&_55Me-T1n2>r{j#D5h+e;h*pI)wg> zfyUMr?w?*~-w$rD5N_{iar;X0V!!b7etQS_Nq+ADPay&GQS~S4Pp_gyz|DWFz6oxA zQ@FVk-29gMGm(iQ_3uLH+n^6}G8QX5fYKfaOWWB|+N_lJfW6Z%Z6`|mb1Cf&_3!=C z{)74sO8btK_8?08F3R{GWNS$M#}N8YA@rY7u6g@kLg+6-=)Z<||1E_6GKBtn2>n$E z{f`iOGlc$U2>q`R`rje+e?sW{0dys*B5iQA4Yu0gSQ{K~gA;9VvJFnP!Ra=*rwz^o zbq5W-ZE&^??rVel+u&tw`3x9%?2f`NwCAp{Js)gq&-BIP(w@8Q2mSVZ(7p%d-oO^c za}d{Z)2e`0;KIzxyR_{?_7LDz>Z`b~X8Yo~rX#erBXnaB8jBZpgQndfO%HX@^d~~o zZu=phriX;4n|zwqp_H3Lnr=bpR-x%uq3L0vB4@_6v1nlr%Gnc^^Ke@^Jr|EkIeYAf z{c;|ba&Gg>xg9y*5tef&LhGfR^}ZhQi1fBcApaOsg73D#D@+9p`r1#5?3-CsB| zleUi*jzM#}9h%d-pgCpqL8Cb#^-f$5pwwf~o-Alj#|lS*|7hXS4tzJne-QY)fd8nE zpG9s9hhFm-�X+k?;}0S=z5@jkpICTl5}M<_9@?Lpz+ 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.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* -Requires-Dist: SQLAlchemy (>=1.1.0) -Requires-Dist: Mako -Requires-Dist: python-editor (>=0.3) -Requires-Dist: python-dateutil - -Alembic is a database migrations tool written by the author -of `SQLAlchemy `_. A migrations tool -offers the following functionality: - -* Can emit ALTER statements to a database in order to change - the structure of tables and other constructs -* Provides a system whereby "migration scripts" may be constructed; - each script indicates a particular series of steps that can "upgrade" a - target database to a new version, and optionally a series of steps that can - "downgrade" similarly, doing the same steps in reverse. -* Allows the scripts to execute in some sequential manner. - -The goals of Alembic are: - -* Very open ended and transparent configuration and operation. A new - Alembic environment is generated from a set of templates which is selected - among a set of options when setup first occurs. The templates then deposit a - series of scripts that define fully how database connectivity is established - and how migration scripts are invoked; the migration scripts themselves are - generated from a template within that series of scripts. The scripts can - then be further customized to define exactly how databases will be - interacted with and what structure new migration files should take. -* Full support for transactional DDL. The default scripts ensure that all - migrations occur within a transaction - for those databases which support - this (Postgresql, Microsoft SQL Server), migrations can be tested with no - need to manually undo changes upon failure. -* Minimalist script construction. Basic operations like renaming - tables/columns, adding/removing columns, changing column attributes can be - performed through one line commands like alter_column(), rename_table(), - add_constraint(). There is no need to recreate full SQLAlchemy Table - structures for simple operations like these - the functions themselves - generate minimalist schema structures behind the scenes to achieve the given - DDL sequence. -* "auto generation" of migrations. While real world migrations are far more - complex than what can be automatically determined, Alembic can still - eliminate the initial grunt work in generating new migration directives - from an altered schema. The ``--autogenerate`` feature will inspect the - current status of a database using SQLAlchemy's schema inspection - capabilities, compare it to the current state of the database model as - specified in Python, and generate a series of "candidate" migrations, - rendering them into a new migration script as Python directives. The - developer then edits the new file, adding additional directives and data - migrations as needed, to produce a finished migration. Table and column - level changes can be detected, with constraints and indexes to follow as - well. -* Full support for migrations generated as SQL scripts. Those of us who - work in corporate environments know that direct access to DDL commands on a - production database is a rare privilege, and DBAs want textual SQL scripts. - Alembic's usage model and commands are oriented towards being able to run a - series of migrations into a textual output file as easily as it runs them - directly to a database. Care must be taken in this mode to not invoke other - operations that rely upon in-memory SELECTs of rows - Alembic tries to - provide helper constructs like bulk_insert() to help with data-oriented - operations that are compatible with script-based DDL. -* Non-linear, dependency-graph versioning. Scripts are given UUID - identifiers similarly to a DVCS, and the linkage of one script to the next - is achieved via human-editable markers within the scripts themselves. - The structure of a set of migration files is considered as a - directed-acyclic graph, meaning any migration file can be dependent - on any other arbitrary set of migration files, or none at - all. Through this open-ended system, migration files can be organized - into branches, multiple roots, and mergepoints, without restriction. - Commands are provided to produce new branches, roots, and merges of - branches automatically. -* Provide a library of ALTER constructs that can be used by any SQLAlchemy - application. The DDL constructs build upon SQLAlchemy's own DDLElement base - and can be used standalone by any application or script. -* At long last, bring SQLite and its inablity to ALTER things into the fold, - but in such a way that SQLite's very special workflow needs are accommodated - in an explicit way that makes the most of a bad situation, through the - concept of a "batch" migration, where multiple changes to a table can - be batched together to form a series of instructions for a single, subsequent - "move-and-copy" workflow. You can even use "move-and-copy" workflow for - other databases, if you want to recreate a table in the background - on a busy system. - -Documentation and status of Alembic is at https://alembic.sqlalchemy.org/ - -The SQLAlchemy Project -====================== - -Alembic is part of the `SQLAlchemy Project `_ and -adheres to the same standards and conventions as the core project. - -Development / Bug reporting / Pull requests -___________________________________________ - -Please refer to the -`SQLAlchemy Community Guide `_ for -guidelines on coding and participating in this project. - -Code of Conduct -_______________ - -Above all, SQLAlchemy places great emphasis on polite, thoughtful, and -constructive communication between users and developers. -Please see our current Code of Conduct at -`Code of Conduct `_. - -License -======= - -Alembic is distributed under the `MIT license -`_. - - diff --git a/venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/RECORD b/venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/RECORD deleted file mode 100644 index 1400cbf..0000000 --- a/venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/RECORD +++ /dev/null @@ -1,123 +0,0 @@ -../../../bin/alembic,sha256=VhYgSnMwRngw1J3SuVvszUPA9Z7S5ggue9MFG8vbWrY,237 -alembic-1.4.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -alembic-1.4.2.dist-info/LICENSE,sha256=vEAGUIuUWeKAHsWgwcUTyJRHJWjUmGO9MZ84k2KBhFE,1058 -alembic-1.4.2.dist-info/METADATA,sha256=LaCIAVi-eI4fLOHSaX9v0PJpFyBLdDX2DXPcLS0v9iM,7011 -alembic-1.4.2.dist-info/RECORD,, -alembic-1.4.2.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 -alembic-1.4.2.dist-info/entry_points.txt,sha256=jOSnN_2fhU8xzDQ50rdNr425J8kf_exuY8GrAo1daz8,49 -alembic-1.4.2.dist-info/top_level.txt,sha256=FwKWd5VsPFC8iQjpu1u9Cn-JnK3-V1RhUCmWqz1cl-s,8 -alembic/__init__.py,sha256=DzXW72ndu6EzMX0RlBznxpIQI1TfpxLm7fo6ah6yiKM,249 -alembic/__pycache__/__init__.cpython-37.pyc,, -alembic/__pycache__/command.cpython-37.pyc,, -alembic/__pycache__/config.cpython-37.pyc,, -alembic/__pycache__/context.cpython-37.pyc,, -alembic/__pycache__/op.cpython-37.pyc,, -alembic/autogenerate/__init__.py,sha256=98WZvBQ3k-cfpa1GsVFEq0Kqmzl1-UPYCtau9urpsIQ,431 -alembic/autogenerate/__pycache__/__init__.cpython-37.pyc,, -alembic/autogenerate/__pycache__/api.cpython-37.pyc,, -alembic/autogenerate/__pycache__/compare.cpython-37.pyc,, -alembic/autogenerate/__pycache__/render.cpython-37.pyc,, -alembic/autogenerate/__pycache__/rewriter.cpython-37.pyc,, -alembic/autogenerate/api.py,sha256=Bg1pnUM9qpSGk6sxGMaYCSME8RaRHz3K4mb0Qar4o6A,17027 -alembic/autogenerate/compare.py,sha256=cRBt7ZBFRiRjhvo0pA3XvuUw0YOdmZwy_2k_pJoZaL0,39009 -alembic/autogenerate/render.py,sha256=m8vE8w1XKI9aoaq6cmbzO0pWh2wgnKGY5E6M0Y8YYq4,29117 -alembic/autogenerate/rewriter.py,sha256=rERJzPZtzzs9rHA6XLz8M5M9PVEHFBrMZ2YZBO09f6E,5721 -alembic/command.py,sha256=C_nGc-Ay0mkKQA3Po4BgPygUS8Po87kap6-YRLgsdLM,18129 -alembic/config.py,sha256=cTJTxr1buPkVLap32k-mnu8ccd4s5so0dL4YKaZVi5w,19865 -alembic/context.py,sha256=hK1AJOQXJ29Bhn276GYcosxeG7pC5aZRT5E8c4bMJ4Q,195 -alembic/ddl/__init__.py,sha256=7cwkSz69tWKVbUxbHpE0SDOYUgbxSBkVIHHTyJ1O7V8,185 -alembic/ddl/__pycache__/__init__.cpython-37.pyc,, -alembic/ddl/__pycache__/base.cpython-37.pyc,, -alembic/ddl/__pycache__/impl.cpython-37.pyc,, -alembic/ddl/__pycache__/mssql.cpython-37.pyc,, -alembic/ddl/__pycache__/mysql.cpython-37.pyc,, -alembic/ddl/__pycache__/oracle.cpython-37.pyc,, -alembic/ddl/__pycache__/postgresql.cpython-37.pyc,, -alembic/ddl/__pycache__/sqlite.cpython-37.pyc,, -alembic/ddl/base.py,sha256=tjjyvaxbgY2q5POm8MEEqGMIdQHaUjBS3dAkN5qVFrQ,6812 -alembic/ddl/impl.py,sha256=44AQywPLQl3cKS7bUQLw1PpDX05sIKizQHNpk-FpFpg,16557 -alembic/ddl/mssql.py,sha256=7iSSBE2izonS7GWKbB2qd0OprD35oBRSIEJIxY-iRyc,9361 -alembic/ddl/mysql.py,sha256=VPU7BoxUFh-kZcxFkHsPO17On-ijiQsvsiEQg3Ckj34,13911 -alembic/ddl/oracle.py,sha256=RIaGxJV0Gp58thdrXW9UqH-4jYke-RKmHj7nGc9396A,3810 -alembic/ddl/postgresql.py,sha256=bKzEZOGYJ8Lcd5bob_HMNlo6xnkZCosQglC2iGIZFwM,17602 -alembic/ddl/sqlite.py,sha256=w1pcH1CZgDfDIu9TJAnZezF8TPpuY1lDEttJ4_dyJmU,4700 -alembic/op.py,sha256=flHtcsVqOD-ZgZKK2pv-CJ5Cwh-KJ7puMUNXzishxLw,167 -alembic/operations/__init__.py,sha256=nJbmMAwapU2py4fJ4GUBanBp-EMXhDyMngb717NIHM8,192 -alembic/operations/__pycache__/__init__.cpython-37.pyc,, -alembic/operations/__pycache__/base.cpython-37.pyc,, -alembic/operations/__pycache__/batch.cpython-37.pyc,, -alembic/operations/__pycache__/ops.cpython-37.pyc,, -alembic/operations/__pycache__/schemaobj.cpython-37.pyc,, -alembic/operations/__pycache__/toimpl.cpython-37.pyc,, -alembic/operations/base.py,sha256=6C9hWmpdYfVMnCzV_1AqUvtZ-Ixfx_5u8mBw2gxjNdM,17999 -alembic/operations/batch.py,sha256=hbbMe5bYdM6G2f9b_8AUlJkuKccFUbGZcLrVDp8n8LM,19357 -alembic/operations/ops.py,sha256=LYLcaz_dVGmhYhUl7wJ3FLU8SD_Af-rzkJbiM-fS0JY,83044 -alembic/operations/schemaobj.py,sha256=hFUtUzV-kSEq9TnXqH6IygM-aCcB5VjIpUm0kAKYGE4,5736 -alembic/operations/toimpl.py,sha256=p4CuVYHKeJiUMboY_uxG1_A8lXCTiEjjRCKXoCuNr1M,5716 -alembic/runtime/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -alembic/runtime/__pycache__/__init__.cpython-37.pyc,, -alembic/runtime/__pycache__/environment.cpython-37.pyc,, -alembic/runtime/__pycache__/migration.cpython-37.pyc,, -alembic/runtime/environment.py,sha256=l1EgAiKX9kO7mam9wrgpQ90X1qGWCuC4t3xOCfYN7bU,37862 -alembic/runtime/migration.py,sha256=wHtXMMrHV76agAVWVip3g2wlUfo5bBbgDMN3ak7NfqE,42389 -alembic/script/__init__.py,sha256=SxmoPlnSDLFW_9p-OTG-yaev76Ok7TiyN6u2TAKczkU,116 -alembic/script/__pycache__/__init__.cpython-37.pyc,, -alembic/script/__pycache__/base.cpython-37.pyc,, -alembic/script/__pycache__/revision.cpython-37.pyc,, -alembic/script/__pycache__/write_hooks.cpython-37.pyc,, -alembic/script/base.py,sha256=WdY4-7RottWuwv07AcOB0xZMpcMWfy7isq6kqmRlpcI,31774 -alembic/script/revision.py,sha256=v_eTBexwhZJYUrlSh_MH97fXBWh1yZBcO25ganPQLLY,34453 -alembic/script/write_hooks.py,sha256=0heAelcqI2n4WW440Mz1cqPkHUNvfuS-meMzpiMBDd4,2768 -alembic/templates/generic/README,sha256=MVlc9TYmr57RbhXET6QxgyCcwWP7w-vLkEsirENqiIQ,38 -alembic/templates/generic/__pycache__/env.cpython-37.pyc,, -alembic/templates/generic/alembic.ini.mako,sha256=wexLbI6y199q77PCKJADZAmUIXUhGBhlYUMt-hzzwQ0,2044 -alembic/templates/generic/env.py,sha256=LN06WkE0nj1RGL--SbzYfx4DRopSl5g2Ihu6knUJMZQ,2039 -alembic/templates/generic/script.py.mako,sha256=8_xgA-gm_OhehnO7CiIijWgnm00ZlszEHtIHrAYFJl0,494 -alembic/templates/multidb/README,sha256=c7CNHkVvVSJsGZ75Qlcuo1nXKQITDu0W3hSULyz1pWg,41 -alembic/templates/multidb/__pycache__/env.cpython-37.pyc,, -alembic/templates/multidb/alembic.ini.mako,sha256=1ci-FAmvH99PCOcWwq-D8fWs4Hx2XxMQPr-2VWe2BQI,2138 -alembic/templates/multidb/env.py,sha256=kDOOlbzDLc1nhFbsKJ-bclZ0mpEjLMeJdS9Gu_H5zWo,4162 -alembic/templates/multidb/script.py.mako,sha256=k09J7yYXfXFyedV6D5VgJzuPQxPnYKxID0huIabH46w,923 -alembic/templates/pylons/README,sha256=gr4MQnn_ScvV_kasPpXgo6ntAtcIWmOlga9vURbgUwI,59 -alembic/templates/pylons/__pycache__/env.cpython-37.pyc,, -alembic/templates/pylons/alembic.ini.mako,sha256=i-NMyRa8jZoX89ra-pDHdXQzsB3q7YvQRDFTaz6z2Jw,1523 -alembic/templates/pylons/env.py,sha256=VZyuB0IllLLu1i8jec_-Wj5Ry7D0KgOr8cSISLYFK_8,2245 -alembic/templates/pylons/script.py.mako,sha256=8_xgA-gm_OhehnO7CiIijWgnm00ZlszEHtIHrAYFJl0,494 -alembic/testing/__init__.py,sha256=sWNfwWdj_gDR2nk08lA8zZtsqLbfYMPT25W4JJu-gIY,1065 -alembic/testing/__pycache__/__init__.cpython-37.pyc,, -alembic/testing/__pycache__/assertions.cpython-37.pyc,, -alembic/testing/__pycache__/env.cpython-37.pyc,, -alembic/testing/__pycache__/exclusions.cpython-37.pyc,, -alembic/testing/__pycache__/fixture_functions.cpython-37.pyc,, -alembic/testing/__pycache__/fixtures.cpython-37.pyc,, -alembic/testing/__pycache__/requirements.cpython-37.pyc,, -alembic/testing/__pycache__/util.cpython-37.pyc,, -alembic/testing/assertions.py,sha256=zgQkrDYUPFixItL3hWr0OmNMDZyKY0lZUTsy9xQ1nzc,3292 -alembic/testing/env.py,sha256=A--5nnemVi8mmimkNxF_d2dqBjGl2IOVRlUH3JJvWZI,10250 -alembic/testing/exclusions.py,sha256=ppAglvtwGg442E0F6TOmuuTgLT_NkWs3mbQ3Zv8uPeU,14289 -alembic/testing/fixture_functions.py,sha256=FOhaHKaDtNlItGIyOG6uVGB2pj6Aoi4Qlr9H-xPPF1Y,2952 -alembic/testing/fixtures.py,sha256=Q5XxgJAeWXEhCcBmaYRndTG89ZZj4jo0Qu8dn1TMTRM,7869 -alembic/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -alembic/testing/plugin/__pycache__/__init__.cpython-37.pyc,, -alembic/testing/plugin/__pycache__/bootstrap.cpython-37.pyc,, -alembic/testing/plugin/__pycache__/plugin_base.cpython-37.pyc,, -alembic/testing/plugin/__pycache__/pytestplugin.cpython-37.pyc,, -alembic/testing/plugin/bootstrap.py,sha256=5sN6F4OJ3UUNVUeNBzY-MjN_r3tOH5NrGx4maJuRC9U,857 -alembic/testing/plugin/plugin_base.py,sha256=Hcs-ODRbzUSFvtVQ7eiL_d6bXbGeLut0-Y2XQAEwIMw,3080 -alembic/testing/plugin/pytestplugin.py,sha256=1MF5hq73_Xiu97sVMuuS-uex0mSvvhtFZh_Io6QJnkM,7529 -alembic/testing/requirements.py,sha256=dZUI-PhV2TOPuxFZQEUAAivXynitjWgCkJIipjGz-1w,4136 -alembic/testing/util.py,sha256=sA_4b_EQ0gfz2BozAw-eNYanJYBQh8oO66iLMVIs7tw,2577 -alembic/util/__init__.py,sha256=HCPvV0cpyhdIgyVRKDuYIP_S9EJE0adE97d92zW81p8,1473 -alembic/util/__pycache__/__init__.cpython-37.pyc,, -alembic/util/__pycache__/compat.cpython-37.pyc,, -alembic/util/__pycache__/exc.cpython-37.pyc,, -alembic/util/__pycache__/langhelpers.cpython-37.pyc,, -alembic/util/__pycache__/messaging.cpython-37.pyc,, -alembic/util/__pycache__/pyfiles.cpython-37.pyc,, -alembic/util/__pycache__/sqla_compat.cpython-37.pyc,, -alembic/util/compat.py,sha256=knJEgDHsBcUDzotYEvg23V0Gj2ZvS8i0fj8IpG4kBeM,10563 -alembic/util/exc.py,sha256=GBd-Fw-pvtsUNg6wrub7yhY2venv1MD1eMuJZebJiMY,40 -alembic/util/langhelpers.py,sha256=BXkBYZQxh96Jb2B3GKlZvnhJ0bBVRujatLosBlVeZmk,9246 -alembic/util/messaging.py,sha256=r8nAmwzbvGmO8Rtdxq-a6EJdEJEG1zP4l0eUEMTyItM,2633 -alembic/util/pyfiles.py,sha256=mpcMVT6fVcTSLFxB2fWD6RSExMW6jkv4p5FWDDF7yJs,3028 -alembic/util/sqla_compat.py,sha256=czTo3m1Mrs51BQOQCcKhBhsh9ATIZMplfjqAjoWFp1g,8718 diff --git a/venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/WHEEL b/venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/WHEEL deleted file mode 100644 index 8b701e9..0000000 --- a/venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.33.6) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/entry_points.txt b/venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/entry_points.txt deleted file mode 100644 index 27ac374..0000000 --- a/venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -alembic = alembic.config:main - diff --git a/venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/top_level.txt deleted file mode 100644 index b5bd98d..0000000 --- a/venv/lib/python3.7/site-packages/alembic-1.4.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -alembic diff --git a/venv/lib/python3.7/site-packages/alembic/__init__.py b/venv/lib/python3.7/site-packages/alembic/__init__.py deleted file mode 100644 index 3bcbd64..0000000 --- a/venv/lib/python3.7/site-packages/alembic/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -import sys - -from . import context # noqa -from . import op # noqa -from .runtime import environment -from .runtime import migration - -__version__ = "1.4.2" - -sys.modules["alembic.migration"] = migration -sys.modules["alembic.environment"] = environment diff --git a/venv/lib/python3.7/site-packages/alembic/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4f6900ebeef0ecd212bc80d7fe068bc54552a3d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 zcmYk1O-{ow5QS~$KcPs7Q*_Y;5Zy%xaR4@DR!8x);EP4c3 zF%A?M%Wpo<*w31)$s|V*@6WHdACTYtVIKj&C2V^G(xMhiL{UrHKw?EG!Jb3lfCeK+ zGE@+~{mqOCEgWNI XzZuf{+w8&*Y7aqDa)8H0LXzVz6!2x; diff --git a/venv/lib/python3.7/site-packages/alembic/__pycache__/command.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/__pycache__/command.cpython-37.pyc deleted file mode 100644 index 7e14a68f0c6a09ee9bcb744bb9764d035d80ae23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15122 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 diff --git a/venv/lib/python3.7/site-packages/alembic/__pycache__/config.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/__pycache__/config.cpython-37.pyc deleted file mode 100644 index 38d7149069e8cea3c5b37cca4df4b5dad4429f0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15022 zcmeHO&2Jn>cJJ=_mmo=0|fCU`Mp=wJv|h? zL4sTYWTdI-uC99h>V3ag#kYRT;~e+#Vw{}x+CQ4qy`X;5yJF{U6&xURG+d|mEW2Gv%TuPgnTL9JCYjrR;u z6*Kn@G2_nOE41ctUlX&qpXK`_VqVONBlpc#-JKWpo0j}Dw|>t64C|_~y6`oyGFHu` zepzmf2Cg4{eaq%6oBu-$& z6XLWuDNf;PiK*~ZQdX;Q{%+PVK6Z!F4M7Uq@$Jifcd+So?Jlo!B%R0${AR6Y<8$4M zwmqLlbvmwpyE)wLbnLJzy@;EGq8Vq42b||mj}DHx?En>#MpL$ zmVZ0A>G@k3*@iOM0zgo$>-77(=WWOK-8;OX^={t@L(l*VhX8f#E(p2l+Fj{7kt^)Y zU3-WDfX2g#YQ8gY?Vv{#Z+gCG_q@JqM*&k5%LyYn>PCV5ww3F}qy$j!W#B|3O`dkQ zw}thqhi8}9AnDs{QLwfffceAWT1scUKU+HF01JC;LBZyZ+l44#DlZO8@cDIelou@4 zuh7<{%4lVeXzjc<;Yk4UZo45*hY+j}0+kY;8v+b&t`9tjC!-5y5*YgAB;gQHxB5=MyX_8knB!##P17f*NxFw%VLJUN2#ip(Y2R_A4^haG?K&x&l8?OD zOk1h*_Q1L6+Tln-Nw$^!!Rm6hiuDK5Gzwj^D9WyTuvIJ$EP9b6q5IQ--$*It`Q83V zC@F;zA{8YyCzbqY7xF}gu^()0VMLSOrIl(GX3|rl419ut7m>buJqGaY>#;@PhW-l7 zayJ^0HG#RI_h&29ud*lVq7~xZK&H0D_5;5GLqSO2R+0^DVZBo`9G(ZoU}+((Fe!d2 z%&COCK33ym5YdbloLX|Vwq|Cv!w&FZO>pFHj&+K(3QTj;1+=rP(=S_3$xE_0C5#i` zpRP=hTe+d^wZ?U7w)Wo5(GYSj+_O2+hL~-;j!2Ezy0ZMlrq9~znW?2EPTAUE=)(UI zW_kt;VOvY^^fdApnIq66c=hDOQhCf^=Rv{{4M$OXbJXj(a$P$br_W}o(f1(Ko{s^x z8ep?)RLf3n4tWm9l=cmoG5j!9cW{fnq}?D!@<8b-xlw><-3kqIILkq=*9YJ2E!TII z!C1y?GbOyNqlCQhl7vnXDvSgmu1~Obm14qzKpdmx-1{`!CN`A95e3YC+wD1{eiYK; zI-PJgY%0K=)co5p8Mj>-!U#Kp&8>Z*`90;OHP0YCaJg;hcDQa|&Iu|l_NKdwu*Dad zer!XxQ^FFp6oqhG+Bwzg64@b;_YaL6zL}A_-%a+HR7A zHDx1J2&xnG}Dn?$}H(azw~9!P@3!+ps?vYV;RQfR0wl2 z$_5A4z}ZqsfDj(p9SAbeja-P8(iTwuTAF;>l(Tx#ZeG?^CPmqXjvo*cME1@Iimw8L z5GGnh!T^QXKzn?wIt>S4mM8>tY!y`_9Dp%&e8fBySGfHU*w9@1{E+n)x(*#7bx-Hu z?PTeE3O+!}EOAVuk9_h&a3%=`BF!`eP2&g$Zv>q+elSbqo5*4UpA3`Ct8hAacna}Y zaGz=`FgVPwyw*$=Rt-2rX9@ZLLT_mZeUy7*9oK1LKA@WLmnC-9l*b@7e65-jbW1Y* zr}%~tBf~fzAJy_VQI{@1!9xMAkm+ z#ZGZt5ay!-ECN+f3eIN`;*VWlxDWw*;D#XyC|C=r^o1h@`SlzX*)y#V+-N(?eVZHr zw6!1SP#mm-*Q2b=hHFU$ofJP~CjxAU7P`1@qhkdq2{K5Er=2atUyy0?VTem^dk6(= z3VO6L2e|`0lXpBoxr00bbpbe79rQdli$aP`q)LO_QrzZNGjE-Vg_kZ}(yo7MRcBYO zqP)QGx6gzt=j|0BzB0+VXey7m1`KIY6J{r7ZDX}0%ivEkLknm}yF*tJ<684~q!+nu zAPv=ZodFxT)glW7TGjzsN#^o|e?(HiZlhi_7p$5UAJd|fAC;M}0)`U~ zY`)0+K{O2cbY$*8Ot^(x*)bkLl=e)&DA1DYp`zDCBP!F?J#!Ck2(vyITl*Ed+QMkl z@aJ$}#r+K3jg^=cSa-}03(qJ5^Kp?pALBa{;K_(p{ z{e&$fS%f~pM7pwv=qtCD#7K&S<7!P()itpKxJRne!1r&4>H?8G`C8@Vs1BJFAsr%_ zg)XH?OO*PczRHH!G-fsz93GGqxq<}G6NIZA*i4JIBTWtw@Q+P2it1!zIPpQ1jigCOO%Nq==MW)^|B<|VA+#+8nuep`UFu45&?Wiu zjTSUi3!o@NFNG*hn2(Ty$)>)1Nf1y_~hc+!${k8kOeEqLoQ(Zpaj2GTU~X3A0bcAq!@)>*HY9 zS%)XRit-Sm7?o8#7Cx{G)0yE4nSqtGK$u%B3uXWZBVh;N$dGWlxI^I!C3G$pOlX*! zrjuEsz;xw-la`4C(c`#xoteg$$VxYYh>|LVlold7Tl3 zqal^l34qQI*>DX5=ptptT&bIY8ty7DZJ#9v3dm>9a_ya8zZ!Nrt5kQrY)j{k4M*3d z%ro@1e2!C*2u8@#C(t;Kg_+FW7VZux6&P|D4q{}$(vO@znNupjF*!+uD;eMd$dpv1%oYRIAl$ zp-ZAuhPlZi&y+bR-19Uw=UIM30?wh`e7vL$z=0uIns4k_&~*#39p@q& zP%~D;Bhno}K&LRYlHGiNg=zi!KV%n_^OGd^@_95#0g9Z4^%c!< z$(l!L+X3~HFQV_?@Kx^a_?(FVE!DZl?akpj_crF|bk3&aPf+|`9Gg9)hL6lI=+4+L zu}`$*MZPPmyQ{{ya8)OW@s%`W$h;&c;IOCK-li&sDjan_R^fwvj$hpf@+DRKj8yR* zmmWx4Y(xt15cbNaXTlqqm)$@VMixxbk}OIxcSUXKzawQJRSaFDC_{Phq=0}xlUlw; zGnve5bVYR{)ljCLEapN7J$oKOU|7dPqlh5Gw9L9y$2X(?<1-GAIjE8}Hu5nC2VcMW zc1lhM7gWdoHd1o5p#vsPhBjTwq8uuGtH6zBb~>Nxp!h~E?$w;a_K)A^REkG7{Iy1d z%nbtPUf;Y^%oiDK+qM+fklUhIlC3J{27qFt`e$fs!-OXUl6b%C0f zsdV5_Jd~wVJu^Iqrn*rqS`amh1+Hw))r<9Fp;)aiRiCJzsLs`D z)uYuy^<=FsX{GzioA`!=Lv}_5XHP@{r$cZO2WL_YoXO!cD6Nv13(&%Jt!x4IQz0SkPl|%mznn^!;8}`qPsJ1`*0M=Cg;(>unu@zB?kmgX2oS zi0b?EG-9tbE{W5pFi%!-MI)bz7F6FobJqA{>y)uqR!{Q%LOrSY$J1H5r@UqCRUQ}* z%$sGvT>lbu0+pTyp4D-gaNH{cr=xq-aTU*hiqSK7UmaKX7sWG=fd7r_m{?~>WJls*3Yc5g|}N{Y&G0N zb?1S#bK-$PcfEr6?n6Mh^^5D^0yZN~ve-Pgk+~{Llu1TNWWs*{i;1}r&WlCN(1!(p z05c;4_ry*M_o!q-e!)uIS)$I*=J}Z=7WnR{zFXvx$Mi^4M2VI9?gWoKsYjmTyC?PC zclhqKzI#eM&2XOKnFSOd>HW`YILmzZU48c)-<{ES&x;k@pB1Zm<~i{KKR>VU8+_N) zqu2QEg1&q4my3Hv@sfC1d{4ac%fepi?pxymn6(bkD36QGY8yK~We7`UToJE|*GO=1 z_1Y=JLLbWAD0j`ybgA+ld|~7sUKLNcU(sA8xN6bKupASgBg5rBeoh*Tx&Ga5=X1TM#AgH z%U7o=JaGP!Jd7$4uTa%y1<4Be2-H1MAEhE$e+YPkc&5?NW$F0Lhq^wkk3b-^n*fpS zZI5=1S73|Y0U-GS9AU=wdqrQIXzVhX-<-ND9k1;Q>6d_eaiFeDQL& zKe>YY6?H+Pb-=?G-EYQeO7b8%BT zes`Ok-laGBDVD%1qC-uSk$y9-f+EAd*LCApFZcVw9UI%#I8`zYQg2kRQ11$pgQsA* zQ4r5H8p6dv3K2E}AIlxmb-a-xhmCJSX+V3%*_%-s@guM2VP{{L9kAOJPM(LT)b@p~ z;NmrmCuTQ15r030>>x^%q6<3bR`22PjbaOhP3aK_ghaq2t~VO`FhPTAtMN-IsE{d% zqmk6D;wDuKW6{)ec>AAVDC#zF64LF*FQ+gZTlL%A&vk|&Z9;(b6ocg{4@tgFk_^C` z*!PG}{1C#%6w*C<=OSKeG;kOz=-+lVja|R%xncamHOgK!ebBd?9+E%}E`%uF@iSV6 zgt0SIWC__O^pA^CFAjuK-fv_bFOFC8!XK{%(BXZ90ldF(VX)Hxje;Gm&#ULu!8mM3Mx8*bZ^ta+4CPZT#Yd z;+a74fHw#bc8n;!{}ek`GP<$;DTMI`KzZ?E1DnArYHf5!k|NglsrS=3mRO{FGqS{$ zMq@a_nX&k_ANr7obn6OC1v$Vnnv@C$M~^rn2oz9fh@8O?fjBW)SAgSpuhaGp49yT* zxakHmZI+TP$u=@_r?id z_^mRi)%HYdPQ%3c*l4>or=+&cQkzt?0Je^6xoax`O72>7c|mH;(5nEszuTH2*vy31 zLQ3Vfre{)OA|{oT5>KUzAr)1}86mW3{X0IEadl!Q;G4cr^H0==Yc#5jGyN6IO$ZB8eu6QP<+WxJ4=?RY+ADj?FI zjeJdMu%u>c8D(^E>Oz{#%Q(JgJ}@63j7H6ej$ceI2FV%5fusUIT#v$ai>^D=OzHwX z+}5xJwG309qQ}pm`Np(U+hisM9IIMAC26Vh$JBg6&9i8diuNV^!lX`WlUb0EDcOQY zg`-Leu#`y!aTCIzD5-g2Z{(|}^#=s)5;e5U)}kH*D$-$U8lM#Ut}oxjQ}}0ug%P=F z{MiW0DGqkwt=ed<(wI4_S*E%sKSkH-tlE1ZMV6b?P;aX?!4(I=@FMvcx|0$c)1*YU zvz@>L;fIe#6zNPWlMnhgp{GLtxz2J0SLaDAh_HrP|J*oV)0W3VQMFo7R)}q;?ynYA zU)8Ewb?Y>&Ro$!=$bLO(p0*aS^H{@vd9_Gq#Bj_4{Y7gDbBnNTby&Fg$!{0EtX5b7 zHnjOqf)##&2D!EISz)iRSKKS@eh)db*)zX1dZwy*jEj`b{}p!DxesL>WcVfOyJu38 zhb;YK5u3d`g_|`wHc>?|jrcTR7UfUAKwgj9ZwV(ha4?YadP>#=#{9JWiSc8@w?0wH zTWRBP5vRf!i}(U*Dsn~q9n`&o(p4_R$u34{;ZDq(_`9l#Hq{3t`}s_=jd&$bCHy@} z8!~;EW;?Vp86C1zSg^#Bgv;CX z%+#W+apV$pMU%!RRX*(F^F-$gUo6+kTw zH5>uc8$QRq__H>W5dZ0@IJS05`0_c9hmcH^04tD7>ruM7Slr;n$48?euzScc(-?{N z_6b$_1T|DXT&=QxBT}MM!0g(S3QG25-jkB@7gX?*Kc%Kg%^#sjH%ur}y3Hhm>FXUV zE+$2)AFmOCsOk;^L0{`266s{siWl;{q@lWcT#*w)_dA%UD!@b~e!2V;x?g`kf~V6D#2p6Gk3k$5U;#25fVfxzNTe{NFy=7iGDa~nGNdvtU`l0fW=Lge zW?0C?$dJMm%%I8qk`bs(lkt|2YhGDqQGQ--YF>$ReqKpxMTws#Ym{(NXF~|WtEC7%7OH=>= diff --git a/venv/lib/python3.7/site-packages/alembic/__pycache__/op.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/__pycache__/op.cpython-37.pyc deleted file mode 100644 index e8daa779a4fe06362e4ff0a84b7f203ec3493058..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmZ?b<>g`kf~V6D#4QKXk3k$5U;#25fVfxzNTe{NFy=7iGDa~nGNdvtU`l0fW=Lge zW?0C?$dJMm%%I8qk`bs(lkpape?e+dVo7FxUa_AhYZQMzoU50VSe#nK1XLC!nOu~b zSdto_o1apelNz6#lUQ6FUr>}^QF)6!JtsdYF{k(zTTXs5kY349#0t~`CVuJbm*f`c z7i1RbX66-_B=_lr-<|bt(!|D72y@JYH95xUu>_Dz72HDNS0s!Hi BL(u>L diff --git a/venv/lib/python3.7/site-packages/alembic/autogenerate/__init__.py b/venv/lib/python3.7/site-packages/alembic/autogenerate/__init__.py deleted file mode 100644 index a0f8ec2..0000000 --- a/venv/lib/python3.7/site-packages/alembic/autogenerate/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -from .api import _render_migration_diffs # noqa -from .api import compare_metadata # noqa -from .api import produce_migrations # noqa -from .api import render_python_code # noqa -from .api import RevisionContext # noqa -from .compare import _produce_net_changes # noqa -from .compare import comparators # noqa -from .render import render_op_text # noqa -from .render import renderers # noqa -from .rewriter import Rewriter # noqa diff --git a/venv/lib/python3.7/site-packages/alembic/autogenerate/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/autogenerate/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 7d2ed9f8b5a25764df6430b0d5caf8a11e8071c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 567 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 diff --git a/venv/lib/python3.7/site-packages/alembic/autogenerate/__pycache__/rewriter.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/autogenerate/__pycache__/rewriter.cpython-37.pyc deleted file mode 100644 index 3a94a6067dfe71ab8113c805d7bc88bca4ccd613..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5616 zcmdT|OLN><71paC?l_L)yfY9kW|+9a>4X#mlxrrHi4!P_BAJ>A3DZ+SR&=ks<)|g) zO7g2Z8xo2I3wFSUD!Xbn`~-IV4s9tG^A}k0oqHv9w{60}4pr%Ob?&+6@tw!jz0;>V z29AIH@o&HS?4n`(onETL!NXmg=_)SV;AUuy%)V*TvlUt+yKkGuPYiBz=Z(P~;k>r{ z4c_?F=r+H^45MonPM!rJ?slA{K8;m}jfcB9(?8)NjK0Z@zQxVHEu4eKq0w)0tKZU` z`)%If%{NAWj<Txacq&Jdc6RaLY+kuRuk%+SO7%X

!628Sm&n)`Y3fR`9i%}Vxjc{%KiC%OhT^0c322GsnHRB*4H0eklD&-$mijVC zvL4C)DDnjZS7?;`nc%A+-D6QcdM>151C5up0YtjYHuDH;fSmbY30<1oZvYj9s zvLIV!JHx;q;x!D3VgQjMttRXgCrK=`JPNWsvc@Rp!6u&YMN0tH6r(uL*wEXC(TNOC zf{EQE4E!Kdyk11{PAK>Q95>bUcpLu2iZz=l=TuTN_@XpEtyuf)=fOaFq*iI>+IL>W z)oL3Xm6>6^EKfpF!UWP*43!TV`!^0$Z2mhh*2ZR0EJx67Z&h)DP)g%$7)YQ<4st>W z=?0es5f8Qlo_isy0a2MK+e7j2T{n0^p3+Fn{bOD#lI4}>5 zvEf?WKqfLDc5O)nMdyByCSK+bg)G{Jig5EUhHQiApZ9KNqvU21BsT(tD-3qy zR{VY{(#`0m7mCsIz@OZ;7Kn&U+^keV>=$j<4G?>-`)!hm);7%jvsKRORbPGe1s^G; z)2UQ=4-aEw3rf)S(0pZ$tu5=o#+!9$n#R~1Tdp&vBx`zq#k7xQ%yW3mW6S=~3!-I> zL?E>ey=rNMRSf*bfQc;KL{51;Bv|WYob8Y=wOf>9V`Ob82xrPb;U`9-D|53B6=ETJ zgWj~CX-qTu9{Z4${#K0Y+`ZCO*d$6iH1+MbP|uLxExGqfVbc|qjNV6_ug76NiXJ7i z+_~6f0FmpfuWpowq4zu#D@e+e@>ij=&hS8e(p{TbilmDZR0U$(tENKG$1>NUP88Ll zqZbn})tl|==ui(K&`L`Zwot*rD8CXpWxo@qsOCgfR+;Pct%HC{a?PfWGA-3AWpPcsti)L^ zgYU#L<*PZ89qhf#}R9S*;syd-M5JuH+O2wH{mk#4Rp2wF4C%s`>-!ZO@44f{`!APFiy7;Hj&6Q)}FL;)S_*AZ0B39e0#xs>e)K$?vza z*rf)hXrLL6qi$0hq*bQ<0tV1&znH7rnf_eem-J7`NymRQ)Y=tUpR92i7sIs7MZ}w9 z&RZR`Z8gm$oE>Y*q}80-q-5F#P8EQ<_8+Jk50l!c_QsYem&eo%C=cQ%;D`2$uz{YOnRil#&_kVwY&;$lF{W|;%h@;NiC@)oE`Q4;zS(1bA1V-l;L7n05p&= z4|q4NC7iSG`&a7Xa+F7nlNp$w2Typjg!z^^3+jal6AE2vgZdbbwQiJ)ri$Oi$;>!G zs~2TxhlTttsC06(_P=q0sMEAF0+Y`buu1wd>eO;yO`J;;aj@N=B$D4v$-_>NXNI^I zh@z~Hv^#jo$cA-Vc#ZtK``*|=tXzAgHVfD?P*z4JMb_2X)j@n+rufns)F~Wg;dj6d ztw;q&l~>DDImsN_;$H`8f3BuH0wVcMeEvPoRQ($>m&^`Ovt;gHJV8x>envTRrn2@A z@SxHN8{1IlGE{H?mP%P95|t=AI#J-4n(-U!gUUZ$t7xL3NBk&Zj;lc$6b=_amWq#A z49PA&{{g3NpODHs=4EUD(h2gD>1qXL@V$ij6MRpj+f@9I!-s@AYRj)-?9U`gxq*DQ zmf_fZYj!#-Dba4?$34QUn<{v glh$2{UNrR|NHy)Gm5cTV+Guwu{8N%+-ki7p1vPo), schema=None)), - ( 'remove_table', - Table(u'bar', MetaData(bind=None), - Column(u'data', VARCHAR(), table=), schema=None)), - ( 'add_column', - None, - 'foo', - Column('data', Integer(), table=)), - ( 'remove_column', - None, - 'foo', - Column(u'old_data', VARCHAR(), table=None)), - [ ( 'modify_nullable', - None, - 'foo', - u'x', - { 'existing_server_default': None, - 'existing_type': INTEGER()}, - True, - False)]] - - - :param context: a :class:`.MigrationContext` - instance. - :param metadata: a :class:`~sqlalchemy.schema.MetaData` - instance. - - .. seealso:: - - :func:`.produce_migrations` - produces a :class:`.MigrationScript` - structure based on metadata comparison. - - """ - - migration_script = produce_migrations(context, metadata) - return migration_script.upgrade_ops.as_diffs() - - -def produce_migrations(context, metadata): - """Produce a :class:`.MigrationScript` structure based on schema - comparison. - - This function does essentially what :func:`.compare_metadata` does, - but then runs the resulting list of diffs to produce the full - :class:`.MigrationScript` object. For an example of what this looks like, - see the example in :ref:`customizing_revision`. - - .. versionadded:: 0.8.0 - - .. seealso:: - - :func:`.compare_metadata` - returns more fundamental "diff" - data from comparing a schema. - - """ - - autogen_context = AutogenContext(context, metadata=metadata) - - migration_script = ops.MigrationScript( - rev_id=None, - upgrade_ops=ops.UpgradeOps([]), - downgrade_ops=ops.DowngradeOps([]), - ) - - compare._populate_migration_script(autogen_context, migration_script) - - return migration_script - - -def render_python_code( - up_or_down_op, - sqlalchemy_module_prefix="sa.", - alembic_module_prefix="op.", - render_as_batch=False, - imports=(), - render_item=None, - migration_context=None, -): - """Render Python code given an :class:`.UpgradeOps` or - :class:`.DowngradeOps` object. - - This is a convenience function that can be used to test the - autogenerate output of a user-defined :class:`.MigrationScript` structure. - - """ - opts = { - "sqlalchemy_module_prefix": sqlalchemy_module_prefix, - "alembic_module_prefix": alembic_module_prefix, - "render_item": render_item, - "render_as_batch": render_as_batch, - } - - if migration_context is None: - from ..runtime.migration import MigrationContext - from sqlalchemy.engine.default import DefaultDialect - - migration_context = MigrationContext.configure( - dialect=DefaultDialect() - ) - - autogen_context = AutogenContext(migration_context, opts=opts) - autogen_context.imports = set(imports) - return render._indent( - render._render_cmd_body(up_or_down_op, autogen_context) - ) - - -def _render_migration_diffs(context, template_args): - """legacy, used by test_autogen_composition at the moment""" - - autogen_context = AutogenContext(context) - - upgrade_ops = ops.UpgradeOps([]) - compare._produce_net_changes(autogen_context, upgrade_ops) - - migration_script = ops.MigrationScript( - rev_id=None, - upgrade_ops=upgrade_ops, - downgrade_ops=upgrade_ops.reverse(), - ) - - render._render_python_into_templatevars( - autogen_context, migration_script, template_args - ) - - -class AutogenContext(object): - """Maintains configuration and state that's specific to an - autogenerate operation.""" - - metadata = None - """The :class:`~sqlalchemy.schema.MetaData` object - representing the destination. - - This object is the one that is passed within ``env.py`` - to the :paramref:`.EnvironmentContext.configure.target_metadata` - parameter. It represents the structure of :class:`.Table` and other - objects as stated in the current database model, and represents the - destination structure for the database being examined. - - While the :class:`~sqlalchemy.schema.MetaData` object is primarily - known as a collection of :class:`~sqlalchemy.schema.Table` objects, - it also has an :attr:`~sqlalchemy.schema.MetaData.info` dictionary - that may be used by end-user schemes to store additional schema-level - objects that are to be compared in custom autogeneration schemes. - - """ - - connection = None - """The :class:`~sqlalchemy.engine.base.Connection` object currently - connected to the database backend being compared. - - This is obtained from the :attr:`.MigrationContext.bind` and is - utimately set up in the ``env.py`` script. - - """ - - dialect = None - """The :class:`~sqlalchemy.engine.Dialect` object currently in use. - - This is normally obtained from the - :attr:`~sqlalchemy.engine.base.Connection.dialect` attribute. - - """ - - imports = None - """A ``set()`` which contains string Python import directives. - - The directives are to be rendered into the ``${imports}`` section - of a script template. The set is normally empty and can be modified - within hooks such as the - :paramref:`.EnvironmentContext.configure.render_item` hook. - - .. versionadded:: 0.8.3 - - .. seealso:: - - :ref:`autogen_render_types` - - """ - - migration_context = None - """The :class:`.MigrationContext` established by the ``env.py`` script.""" - - def __init__( - self, migration_context, metadata=None, opts=None, autogenerate=True - ): - - if ( - autogenerate - and migration_context is not None - and migration_context.as_sql - ): - raise util.CommandError( - "autogenerate can't use as_sql=True as it prevents querying " - "the database for schema information" - ) - - if opts is None: - opts = migration_context.opts - - self.metadata = metadata = ( - opts.get("target_metadata", None) if metadata is None else metadata - ) - - if ( - autogenerate - and metadata is None - and migration_context is not None - and migration_context.script is not None - ): - raise util.CommandError( - "Can't proceed with --autogenerate option; environment " - "script %s does not provide " - "a MetaData object or sequence of objects to the context." - % (migration_context.script.env_py_location) - ) - - include_symbol = opts.get("include_symbol", None) - include_object = opts.get("include_object", None) - - object_filters = [] - if include_symbol: - - def include_symbol_filter( - object_, name, type_, reflected, compare_to - ): - if type_ == "table": - return include_symbol(name, object_.schema) - else: - return True - - object_filters.append(include_symbol_filter) - if include_object: - object_filters.append(include_object) - - self._object_filters = object_filters - - self.migration_context = migration_context - if self.migration_context is not None: - self.connection = self.migration_context.bind - self.dialect = self.migration_context.dialect - - self.imports = set() - self.opts = opts - self._has_batch = False - - @util.memoized_property - def inspector(self): - return inspect(self.connection) - - @contextlib.contextmanager - def _within_batch(self): - self._has_batch = True - yield - self._has_batch = False - - def run_filters(self, object_, name, type_, reflected, compare_to): - """Run the context's object filters and return True if the targets - should be part of the autogenerate operation. - - This method should be run for every kind of object encountered within - an autogenerate operation, giving the environment the chance - to filter what objects should be included in the comparison. - The filters here are produced directly via the - :paramref:`.EnvironmentContext.configure.include_object` - and :paramref:`.EnvironmentContext.configure.include_symbol` - functions, if present. - - """ - for fn in self._object_filters: - if not fn(object_, name, type_, reflected, compare_to): - return False - else: - return True - - @util.memoized_property - def sorted_tables(self): - """Return an aggregate of the :attr:`.MetaData.sorted_tables` collection(s). - - For a sequence of :class:`.MetaData` objects, this - concatenates the :attr:`.MetaData.sorted_tables` collection - for each individual :class:`.MetaData` in the order of the - sequence. It does **not** collate the sorted tables collections. - - .. versionadded:: 0.9.0 - - """ - result = [] - for m in util.to_list(self.metadata): - result.extend(m.sorted_tables) - return result - - @util.memoized_property - def table_key_to_table(self): - """Return an aggregate of the :attr:`.MetaData.tables` dictionaries. - - The :attr:`.MetaData.tables` collection is a dictionary of table key - to :class:`.Table`; this method aggregates the dictionary across - multiple :class:`.MetaData` objects into one dictionary. - - Duplicate table keys are **not** supported; if two :class:`.MetaData` - objects contain the same table key, an exception is raised. - - .. versionadded:: 0.9.0 - - """ - result = {} - for m in util.to_list(self.metadata): - intersect = set(result).intersection(set(m.tables)) - if intersect: - raise ValueError( - "Duplicate table keys across multiple " - "MetaData objects: %s" - % (", ".join('"%s"' % key for key in sorted(intersect))) - ) - - result.update(m.tables) - return result - - -class RevisionContext(object): - """Maintains configuration and state that's specific to a revision - file generation operation.""" - - def __init__( - self, - config, - script_directory, - command_args, - process_revision_directives=None, - ): - self.config = config - self.script_directory = script_directory - self.command_args = command_args - self.process_revision_directives = process_revision_directives - self.template_args = { - "config": config # Let templates use config for - # e.g. multiple databases - } - self.generated_revisions = [self._default_revision()] - - def _to_script(self, migration_script): - template_args = {} - for k, v in self.template_args.items(): - template_args.setdefault(k, v) - - if getattr(migration_script, "_needs_render", False): - autogen_context = self._last_autogen_context - - # clear out existing imports if we are doing multiple - # renders - autogen_context.imports = set() - if migration_script.imports: - autogen_context.imports.update(migration_script.imports) - render._render_python_into_templatevars( - autogen_context, migration_script, template_args - ) - - return self.script_directory.generate_revision( - migration_script.rev_id, - migration_script.message, - refresh=True, - head=migration_script.head, - splice=migration_script.splice, - branch_labels=migration_script.branch_label, - version_path=migration_script.version_path, - depends_on=migration_script.depends_on, - **template_args - ) - - def run_autogenerate(self, rev, migration_context): - self._run_environment(rev, migration_context, True) - - def run_no_autogenerate(self, rev, migration_context): - self._run_environment(rev, migration_context, False) - - def _run_environment(self, rev, migration_context, autogenerate): - if autogenerate: - if self.command_args["sql"]: - raise util.CommandError( - "Using --sql with --autogenerate does not make any sense" - ) - if set(self.script_directory.get_revisions(rev)) != set( - self.script_directory.get_revisions("heads") - ): - raise util.CommandError("Target database is not up to date.") - - upgrade_token = migration_context.opts["upgrade_token"] - downgrade_token = migration_context.opts["downgrade_token"] - - migration_script = self.generated_revisions[-1] - if not getattr(migration_script, "_needs_render", False): - migration_script.upgrade_ops_list[-1].upgrade_token = upgrade_token - migration_script.downgrade_ops_list[ - -1 - ].downgrade_token = downgrade_token - migration_script._needs_render = True - else: - migration_script._upgrade_ops.append( - ops.UpgradeOps([], upgrade_token=upgrade_token) - ) - migration_script._downgrade_ops.append( - ops.DowngradeOps([], downgrade_token=downgrade_token) - ) - - self._last_autogen_context = autogen_context = AutogenContext( - migration_context, autogenerate=autogenerate - ) - - if autogenerate: - compare._populate_migration_script( - autogen_context, migration_script - ) - - if self.process_revision_directives: - self.process_revision_directives( - migration_context, rev, self.generated_revisions - ) - - hook = migration_context.opts["process_revision_directives"] - if hook: - hook(migration_context, rev, self.generated_revisions) - - for migration_script in self.generated_revisions: - migration_script._needs_render = True - - def _default_revision(self): - op = ops.MigrationScript( - rev_id=self.command_args["rev_id"] or util.rev_id(), - message=self.command_args["message"], - upgrade_ops=ops.UpgradeOps([]), - downgrade_ops=ops.DowngradeOps([]), - head=self.command_args["head"], - splice=self.command_args["splice"], - branch_label=self.command_args["branch_label"], - version_path=self.command_args["version_path"], - depends_on=self.command_args["depends_on"], - ) - return op - - def generate_scripts(self): - for generated_revision in self.generated_revisions: - yield self._to_script(generated_revision) diff --git a/venv/lib/python3.7/site-packages/alembic/autogenerate/compare.py b/venv/lib/python3.7/site-packages/alembic/autogenerate/compare.py deleted file mode 100644 index 1b8fb52..0000000 --- a/venv/lib/python3.7/site-packages/alembic/autogenerate/compare.py +++ /dev/null @@ -1,1209 +0,0 @@ -import contextlib -import logging -import re - -from sqlalchemy import event -from sqlalchemy import inspect -from sqlalchemy import schema as sa_schema -from sqlalchemy import types as sqltypes -from sqlalchemy.util import OrderedSet - -from alembic.ddl.base import _fk_spec -from .render import _user_defined_render -from .. import util -from ..operations import ops -from ..util import compat -from ..util import sqla_compat - -log = logging.getLogger(__name__) - - -def _populate_migration_script(autogen_context, migration_script): - upgrade_ops = migration_script.upgrade_ops_list[-1] - downgrade_ops = migration_script.downgrade_ops_list[-1] - - _produce_net_changes(autogen_context, upgrade_ops) - upgrade_ops.reverse_into(downgrade_ops) - - -comparators = util.Dispatcher(uselist=True) - - -def _produce_net_changes(autogen_context, upgrade_ops): - - connection = autogen_context.connection - include_schemas = autogen_context.opts.get("include_schemas", False) - - inspector = inspect(connection) - - default_schema = connection.dialect.default_schema_name - if include_schemas: - schemas = set(inspector.get_schema_names()) - # replace default schema name with None - schemas.discard("information_schema") - # replace the "default" schema with None - schemas.discard(default_schema) - schemas.add(None) - else: - schemas = [None] - - comparators.dispatch("schema", autogen_context.dialect.name)( - autogen_context, upgrade_ops, schemas - ) - - -@comparators.dispatch_for("schema") -def _autogen_for_tables(autogen_context, upgrade_ops, schemas): - inspector = autogen_context.inspector - - conn_table_names = set() - - version_table_schema = ( - autogen_context.migration_context.version_table_schema - ) - version_table = autogen_context.migration_context.version_table - - for s in schemas: - tables = set(inspector.get_table_names(schema=s)) - if s == version_table_schema: - tables = tables.difference( - [autogen_context.migration_context.version_table] - ) - conn_table_names.update(zip([s] * len(tables), tables)) - - metadata_table_names = OrderedSet( - [(table.schema, table.name) for table in autogen_context.sorted_tables] - ).difference([(version_table_schema, version_table)]) - - _compare_tables( - conn_table_names, - metadata_table_names, - inspector, - upgrade_ops, - autogen_context, - ) - - -def _compare_tables( - conn_table_names, - metadata_table_names, - inspector, - upgrade_ops, - autogen_context, -): - - default_schema = inspector.bind.dialect.default_schema_name - - # tables coming from the connection will not have "schema" - # set if it matches default_schema_name; so we need a list - # of table names from local metadata that also have "None" if schema - # == default_schema_name. Most setups will be like this anyway but - # some are not (see #170) - metadata_table_names_no_dflt_schema = OrderedSet( - [ - (schema if schema != default_schema else None, tname) - for schema, tname in metadata_table_names - ] - ) - - # to adjust for the MetaData collection storing the tables either - # as "schemaname.tablename" or just "tablename", create a new lookup - # which will match the "non-default-schema" keys to the Table object. - tname_to_table = dict( - ( - no_dflt_schema, - autogen_context.table_key_to_table[ - sa_schema._get_table_key(tname, schema) - ], - ) - for no_dflt_schema, (schema, tname) in zip( - metadata_table_names_no_dflt_schema, metadata_table_names - ) - ) - metadata_table_names = metadata_table_names_no_dflt_schema - - for s, tname in metadata_table_names.difference(conn_table_names): - name = "%s.%s" % (s, tname) if s else tname - metadata_table = tname_to_table[(s, tname)] - if autogen_context.run_filters( - metadata_table, tname, "table", False, None - ): - upgrade_ops.ops.append( - ops.CreateTableOp.from_table(metadata_table) - ) - log.info("Detected added table %r", name) - modify_table_ops = ops.ModifyTableOps(tname, [], schema=s) - - comparators.dispatch("table")( - autogen_context, - modify_table_ops, - s, - tname, - None, - metadata_table, - ) - if not modify_table_ops.is_empty(): - upgrade_ops.ops.append(modify_table_ops) - - removal_metadata = sa_schema.MetaData() - for s, tname in conn_table_names.difference(metadata_table_names): - name = sa_schema._get_table_key(tname, s) - exists = name in removal_metadata.tables - t = sa_schema.Table(tname, removal_metadata, schema=s) - - if not exists: - event.listen( - t, - "column_reflect", - # fmt: off - autogen_context.migration_context.impl. - _compat_autogen_column_reflect - (inspector), - # fmt: on - ) - inspector.reflecttable(t, None) - if autogen_context.run_filters(t, tname, "table", True, None): - - modify_table_ops = ops.ModifyTableOps(tname, [], schema=s) - - comparators.dispatch("table")( - autogen_context, modify_table_ops, s, tname, t, None - ) - if not modify_table_ops.is_empty(): - upgrade_ops.ops.append(modify_table_ops) - - upgrade_ops.ops.append(ops.DropTableOp.from_table(t)) - log.info("Detected removed table %r", name) - - existing_tables = conn_table_names.intersection(metadata_table_names) - - existing_metadata = sa_schema.MetaData() - conn_column_info = {} - for s, tname in existing_tables: - name = sa_schema._get_table_key(tname, s) - exists = name in existing_metadata.tables - t = sa_schema.Table(tname, existing_metadata, schema=s) - if not exists: - event.listen( - t, - "column_reflect", - # fmt: off - autogen_context.migration_context.impl. - _compat_autogen_column_reflect(inspector), - # fmt: on - ) - inspector.reflecttable(t, None) - conn_column_info[(s, tname)] = t - - for s, tname in sorted(existing_tables, key=lambda x: (x[0] or "", x[1])): - s = s or None - name = "%s.%s" % (s, tname) if s else tname - metadata_table = tname_to_table[(s, tname)] - conn_table = existing_metadata.tables[name] - - if autogen_context.run_filters( - metadata_table, tname, "table", False, conn_table - ): - - modify_table_ops = ops.ModifyTableOps(tname, [], schema=s) - with _compare_columns( - s, - tname, - conn_table, - metadata_table, - modify_table_ops, - autogen_context, - inspector, - ): - - comparators.dispatch("table")( - autogen_context, - modify_table_ops, - s, - tname, - conn_table, - metadata_table, - ) - - if not modify_table_ops.is_empty(): - upgrade_ops.ops.append(modify_table_ops) - - -def _make_index(params, conn_table): - ix = sa_schema.Index( - params["name"], - *[conn_table.c[cname] for cname in params["column_names"]], - unique=params["unique"] - ) - if "duplicates_constraint" in params: - ix.info["duplicates_constraint"] = params["duplicates_constraint"] - return ix - - -def _make_unique_constraint(params, conn_table): - uq = sa_schema.UniqueConstraint( - *[conn_table.c[cname] for cname in params["column_names"]], - name=params["name"] - ) - if "duplicates_index" in params: - uq.info["duplicates_index"] = params["duplicates_index"] - - return uq - - -def _make_foreign_key(params, conn_table): - tname = params["referred_table"] - if params["referred_schema"]: - tname = "%s.%s" % (params["referred_schema"], tname) - - options = params.get("options", {}) - - const = sa_schema.ForeignKeyConstraint( - [conn_table.c[cname] for cname in params["constrained_columns"]], - ["%s.%s" % (tname, n) for n in params["referred_columns"]], - onupdate=options.get("onupdate"), - ondelete=options.get("ondelete"), - deferrable=options.get("deferrable"), - initially=options.get("initially"), - name=params["name"], - ) - # needed by 0.7 - conn_table.append_constraint(const) - return const - - -@contextlib.contextmanager -def _compare_columns( - schema, - tname, - conn_table, - metadata_table, - modify_table_ops, - autogen_context, - inspector, -): - name = "%s.%s" % (schema, tname) if schema else tname - metadata_cols_by_name = dict( - (c.name, c) for c in metadata_table.c if not c.system - ) - conn_col_names = dict((c.name, c) for c in conn_table.c) - metadata_col_names = OrderedSet(sorted(metadata_cols_by_name)) - - for cname in metadata_col_names.difference(conn_col_names): - if autogen_context.run_filters( - metadata_cols_by_name[cname], cname, "column", False, None - ): - modify_table_ops.ops.append( - ops.AddColumnOp.from_column_and_tablename( - schema, tname, metadata_cols_by_name[cname] - ) - ) - log.info("Detected added column '%s.%s'", name, cname) - - for colname in metadata_col_names.intersection(conn_col_names): - metadata_col = metadata_cols_by_name[colname] - conn_col = conn_table.c[colname] - if not autogen_context.run_filters( - metadata_col, colname, "column", False, conn_col - ): - continue - alter_column_op = ops.AlterColumnOp(tname, colname, schema=schema) - - comparators.dispatch("column")( - autogen_context, - alter_column_op, - schema, - tname, - colname, - conn_col, - metadata_col, - ) - - if alter_column_op.has_changes(): - modify_table_ops.ops.append(alter_column_op) - - yield - - for cname in set(conn_col_names).difference(metadata_col_names): - if autogen_context.run_filters( - conn_table.c[cname], cname, "column", True, None - ): - modify_table_ops.ops.append( - ops.DropColumnOp.from_column_and_tablename( - schema, tname, conn_table.c[cname] - ) - ) - log.info("Detected removed column '%s.%s'", name, cname) - - -class _constraint_sig(object): - def md_name_to_sql_name(self, context): - return sqla_compat._get_constraint_final_name( - self.const, context.dialect - ) - - def __eq__(self, other): - return self.const == other.const - - def __ne__(self, other): - return self.const != other.const - - def __hash__(self): - return hash(self.const) - - -class _uq_constraint_sig(_constraint_sig): - is_index = False - is_unique = True - - def __init__(self, const): - self.const = const - self.name = const.name - self.sig = tuple(sorted([col.name for col in const.columns])) - - @property - def column_names(self): - return [col.name for col in self.const.columns] - - -class _ix_constraint_sig(_constraint_sig): - is_index = True - - def __init__(self, const): - self.const = const - self.name = const.name - self.sig = tuple(sorted([col.name for col in const.columns])) - self.is_unique = bool(const.unique) - - def md_name_to_sql_name(self, context): - return sqla_compat._get_constraint_final_name( - self.const, context.dialect - ) - - @property - def column_names(self): - return sqla_compat._get_index_column_names(self.const) - - -class _fk_constraint_sig(_constraint_sig): - def __init__(self, const, include_options=False): - self.const = const - self.name = const.name - - ( - self.source_schema, - self.source_table, - self.source_columns, - self.target_schema, - self.target_table, - self.target_columns, - onupdate, - ondelete, - deferrable, - initially, - ) = _fk_spec(const) - - self.sig = ( - self.source_schema, - self.source_table, - tuple(self.source_columns), - self.target_schema, - self.target_table, - tuple(self.target_columns), - ) - if include_options: - self.sig += ( - (None if onupdate.lower() == "no action" else onupdate.lower()) - if onupdate - else None, - (None if ondelete.lower() == "no action" else ondelete.lower()) - if ondelete - else None, - # convert initially + deferrable into one three-state value - "initially_deferrable" - if initially and initially.lower() == "deferred" - else "deferrable" - if deferrable - else "not deferrable", - ) - - -@comparators.dispatch_for("table") -def _compare_indexes_and_uniques( - autogen_context, modify_ops, schema, tname, conn_table, metadata_table -): - - inspector = autogen_context.inspector - is_create_table = conn_table is None - is_drop_table = metadata_table is None - - # 1a. get raw indexes and unique constraints from metadata ... - if metadata_table is not None: - metadata_unique_constraints = set( - uq - for uq in metadata_table.constraints - if isinstance(uq, sa_schema.UniqueConstraint) - ) - metadata_indexes = set(metadata_table.indexes) - else: - metadata_unique_constraints = set() - metadata_indexes = set() - - conn_uniques = conn_indexes = frozenset() - - supports_unique_constraints = False - - unique_constraints_duplicate_unique_indexes = False - - if conn_table is not None: - # 1b. ... and from connection, if the table exists - if hasattr(inspector, "get_unique_constraints"): - try: - conn_uniques = inspector.get_unique_constraints( - tname, schema=schema - ) - supports_unique_constraints = True - except NotImplementedError: - pass - except TypeError: - # number of arguments is off for the base - # method in SQLAlchemy due to the cache decorator - # not being present - pass - else: - for uq in conn_uniques: - if uq.get("duplicates_index"): - unique_constraints_duplicate_unique_indexes = True - try: - conn_indexes = inspector.get_indexes(tname, schema=schema) - except NotImplementedError: - pass - - # 2. convert conn-level objects from raw inspector records - # into schema objects - if is_drop_table: - # for DROP TABLE uniques are inline, don't need them - conn_uniques = set() - else: - conn_uniques = set( - _make_unique_constraint(uq_def, conn_table) - for uq_def in conn_uniques - ) - - conn_indexes = set(_make_index(ix, conn_table) for ix in conn_indexes) - - # 2a. if the dialect dupes unique indexes as unique constraints - # (mysql and oracle), correct for that - - if unique_constraints_duplicate_unique_indexes: - _correct_for_uq_duplicates_uix( - conn_uniques, - conn_indexes, - metadata_unique_constraints, - metadata_indexes, - autogen_context.dialect, - ) - - # 3. give the dialect a chance to omit indexes and constraints that - # we know are either added implicitly by the DB or that the DB - # can't accurately report on - autogen_context.migration_context.impl.correct_for_autogen_constraints( - conn_uniques, - conn_indexes, - metadata_unique_constraints, - metadata_indexes, - ) - - # 4. organize the constraints into "signature" collections, the - # _constraint_sig() objects provide a consistent facade over both - # Index and UniqueConstraint so we can easily work with them - # interchangeably - metadata_unique_constraints = set( - _uq_constraint_sig(uq) for uq in metadata_unique_constraints - ) - - metadata_indexes = set(_ix_constraint_sig(ix) for ix in metadata_indexes) - - conn_unique_constraints = set( - _uq_constraint_sig(uq) for uq in conn_uniques - ) - - conn_indexes = set(_ix_constraint_sig(ix) for ix in conn_indexes) - - # 5. index things by name, for those objects that have names - metadata_names = dict( - (c.md_name_to_sql_name(autogen_context), c) - for c in metadata_unique_constraints.union(metadata_indexes) - if isinstance(c, _ix_constraint_sig) - or sqla_compat._constraint_is_named(c.const, autogen_context.dialect) - ) - - conn_uniques_by_name = dict((c.name, c) for c in conn_unique_constraints) - conn_indexes_by_name = dict((c.name, c) for c in conn_indexes) - conn_names = dict( - (c.name, c) - for c in conn_unique_constraints.union(conn_indexes) - if c.name is not None - ) - - doubled_constraints = dict( - (name, (conn_uniques_by_name[name], conn_indexes_by_name[name])) - for name in set(conn_uniques_by_name).intersection( - conn_indexes_by_name - ) - ) - - # 6. index things by "column signature", to help with unnamed unique - # constraints. - conn_uniques_by_sig = dict((uq.sig, uq) for uq in conn_unique_constraints) - metadata_uniques_by_sig = dict( - (uq.sig, uq) for uq in metadata_unique_constraints - ) - metadata_indexes_by_sig = dict((ix.sig, ix) for ix in metadata_indexes) - unnamed_metadata_uniques = dict( - (uq.sig, uq) - for uq in metadata_unique_constraints - if not sqla_compat._constraint_is_named( - uq.const, autogen_context.dialect - ) - ) - - # assumptions: - # 1. a unique constraint or an index from the connection *always* - # has a name. - # 2. an index on the metadata side *always* has a name. - # 3. a unique constraint on the metadata side *might* have a name. - # 4. The backend may double up indexes as unique constraints and - # vice versa (e.g. MySQL, Postgresql) - - def obj_added(obj): - if obj.is_index: - if autogen_context.run_filters( - obj.const, obj.name, "index", False, None - ): - modify_ops.ops.append(ops.CreateIndexOp.from_index(obj.const)) - log.info( - "Detected added index '%s' on %s", - obj.name, - ", ".join(["'%s'" % obj.column_names]), - ) - else: - if not supports_unique_constraints: - # can't report unique indexes as added if we don't - # detect them - return - if is_create_table or is_drop_table: - # unique constraints are created inline with table defs - return - if autogen_context.run_filters( - obj.const, obj.name, "unique_constraint", False, None - ): - modify_ops.ops.append( - ops.AddConstraintOp.from_constraint(obj.const) - ) - log.info( - "Detected added unique constraint '%s' on %s", - obj.name, - ", ".join(["'%s'" % obj.column_names]), - ) - - def obj_removed(obj): - if obj.is_index: - if obj.is_unique and not supports_unique_constraints: - # many databases double up unique constraints - # as unique indexes. without that list we can't - # be sure what we're doing here - return - - if autogen_context.run_filters( - obj.const, obj.name, "index", True, None - ): - modify_ops.ops.append(ops.DropIndexOp.from_index(obj.const)) - log.info( - "Detected removed index '%s' on '%s'", obj.name, tname - ) - else: - if is_create_table or is_drop_table: - # if the whole table is being dropped, we don't need to - # consider unique constraint separately - return - if autogen_context.run_filters( - obj.const, obj.name, "unique_constraint", True, None - ): - modify_ops.ops.append( - ops.DropConstraintOp.from_constraint(obj.const) - ) - log.info( - "Detected removed unique constraint '%s' on '%s'", - obj.name, - tname, - ) - - def obj_changed(old, new, msg): - if old.is_index: - if autogen_context.run_filters( - new.const, new.name, "index", False, old.const - ): - log.info( - "Detected changed index '%s' on '%s':%s", - old.name, - tname, - ", ".join(msg), - ) - modify_ops.ops.append(ops.DropIndexOp.from_index(old.const)) - modify_ops.ops.append(ops.CreateIndexOp.from_index(new.const)) - else: - if autogen_context.run_filters( - new.const, new.name, "unique_constraint", False, old.const - ): - log.info( - "Detected changed unique constraint '%s' on '%s':%s", - old.name, - tname, - ", ".join(msg), - ) - modify_ops.ops.append( - ops.DropConstraintOp.from_constraint(old.const) - ) - modify_ops.ops.append( - ops.AddConstraintOp.from_constraint(new.const) - ) - - for added_name in sorted(set(metadata_names).difference(conn_names)): - obj = metadata_names[added_name] - obj_added(obj) - - for existing_name in sorted(set(metadata_names).intersection(conn_names)): - metadata_obj = metadata_names[existing_name] - - if existing_name in doubled_constraints: - conn_uq, conn_idx = doubled_constraints[existing_name] - if metadata_obj.is_index: - conn_obj = conn_idx - else: - conn_obj = conn_uq - else: - conn_obj = conn_names[existing_name] - - if conn_obj.is_index != metadata_obj.is_index: - obj_removed(conn_obj) - obj_added(metadata_obj) - else: - msg = [] - if conn_obj.is_unique != metadata_obj.is_unique: - msg.append( - " unique=%r to unique=%r" - % (conn_obj.is_unique, metadata_obj.is_unique) - ) - if conn_obj.sig != metadata_obj.sig: - msg.append( - " columns %r to %r" % (conn_obj.sig, metadata_obj.sig) - ) - - if msg: - obj_changed(conn_obj, metadata_obj, msg) - - for removed_name in sorted(set(conn_names).difference(metadata_names)): - conn_obj = conn_names[removed_name] - if not conn_obj.is_index and conn_obj.sig in unnamed_metadata_uniques: - continue - elif removed_name in doubled_constraints: - if ( - conn_obj.sig not in metadata_indexes_by_sig - and conn_obj.sig not in metadata_uniques_by_sig - ): - conn_uq, conn_idx = doubled_constraints[removed_name] - obj_removed(conn_uq) - obj_removed(conn_idx) - else: - obj_removed(conn_obj) - - for uq_sig in unnamed_metadata_uniques: - if uq_sig not in conn_uniques_by_sig: - obj_added(unnamed_metadata_uniques[uq_sig]) - - -def _correct_for_uq_duplicates_uix( - conn_unique_constraints, - conn_indexes, - metadata_unique_constraints, - metadata_indexes, - dialect, -): - # dedupe unique indexes vs. constraints, since MySQL / Oracle - # doesn't really have unique constraints as a separate construct. - # but look in the metadata and try to maintain constructs - # that already seem to be defined one way or the other - # on that side. This logic was formerly local to MySQL dialect, - # generalized to Oracle and others. See #276 - - # resolve final rendered name for unique constraints defined in the - # metadata. this includes truncation of long names. naming convention - # names currently should already be set as cons.name, however leave this - # to the sqla_compat to decide. - metadata_cons_names = [ - (sqla_compat._get_constraint_final_name(cons, dialect), cons) - for cons in metadata_unique_constraints - ] - - metadata_uq_names = set( - name for name, cons in metadata_cons_names if name is not None - ) - - unnamed_metadata_uqs = set( - [ - _uq_constraint_sig(cons).sig - for name, cons in metadata_cons_names - if name is None - ] - ) - - metadata_ix_names = set( - [ - sqla_compat._get_constraint_final_name(cons, dialect) - for cons in metadata_indexes - if cons.unique - ] - ) - - # for reflection side, names are in their final database form - # already since they're from the database - conn_ix_names = dict( - (cons.name, cons) for cons in conn_indexes if cons.unique - ) - - uqs_dupe_indexes = dict( - (cons.name, cons) - for cons in conn_unique_constraints - if cons.info["duplicates_index"] - ) - - for overlap in uqs_dupe_indexes: - if overlap not in metadata_uq_names: - if ( - _uq_constraint_sig(uqs_dupe_indexes[overlap]).sig - not in unnamed_metadata_uqs - ): - - conn_unique_constraints.discard(uqs_dupe_indexes[overlap]) - elif overlap not in metadata_ix_names: - conn_indexes.discard(conn_ix_names[overlap]) - - -@comparators.dispatch_for("column") -def _compare_nullable( - autogen_context, - alter_column_op, - schema, - tname, - cname, - conn_col, - metadata_col, -): - - # work around SQLAlchemy issue #3023 - if metadata_col.primary_key: - return - - metadata_col_nullable = metadata_col.nullable - conn_col_nullable = conn_col.nullable - alter_column_op.existing_nullable = conn_col_nullable - - if conn_col_nullable is not metadata_col_nullable: - alter_column_op.modify_nullable = metadata_col_nullable - log.info( - "Detected %s on column '%s.%s'", - "NULL" if metadata_col_nullable else "NOT NULL", - tname, - cname, - ) - - -@comparators.dispatch_for("column") -def _setup_autoincrement( - autogen_context, - alter_column_op, - schema, - tname, - cname, - conn_col, - metadata_col, -): - - if metadata_col.table._autoincrement_column is metadata_col: - alter_column_op.kw["autoincrement"] = True - elif metadata_col.autoincrement is True: - alter_column_op.kw["autoincrement"] = True - elif metadata_col.autoincrement is False: - alter_column_op.kw["autoincrement"] = False - - -@comparators.dispatch_for("column") -def _compare_type( - autogen_context, - alter_column_op, - schema, - tname, - cname, - conn_col, - metadata_col, -): - - conn_type = conn_col.type - alter_column_op.existing_type = conn_type - metadata_type = metadata_col.type - if conn_type._type_affinity is sqltypes.NullType: - log.info( - "Couldn't determine database type " "for column '%s.%s'", - tname, - cname, - ) - return - if metadata_type._type_affinity is sqltypes.NullType: - log.info( - "Column '%s.%s' has no type within " "the model; can't compare", - tname, - cname, - ) - return - - isdiff = autogen_context.migration_context._compare_type( - conn_col, metadata_col - ) - - if isdiff: - alter_column_op.modify_type = metadata_type - log.info( - "Detected type change from %r to %r on '%s.%s'", - conn_type, - metadata_type, - tname, - cname, - ) - - -def _render_server_default_for_compare( - metadata_default, metadata_col, autogen_context -): - rendered = _user_defined_render( - "server_default", metadata_default, autogen_context - ) - if rendered is not False: - return rendered - - if isinstance(metadata_default, sa_schema.DefaultClause): - if isinstance(metadata_default.arg, compat.string_types): - metadata_default = metadata_default.arg - else: - metadata_default = str( - metadata_default.arg.compile( - dialect=autogen_context.dialect, - compile_kwargs={"literal_binds": True}, - ) - ) - if isinstance(metadata_default, compat.string_types): - if metadata_col.type._type_affinity is sqltypes.String: - metadata_default = re.sub(r"^'|'$", "", metadata_default) - return repr(metadata_default) - else: - return metadata_default - else: - return None - - -def _normalize_computed_default(sqltext): - """we want to warn if a computed sql expression has changed. however - we don't want false positives and the warning is not that critical. - so filter out most forms of variability from the SQL text. - - """ - - return re.sub(r"[ \(\)'\"`\[\]]", "", sqltext).lower() - - -def _compare_computed_default( - autogen_context, - alter_column_op, - schema, - tname, - cname, - conn_col, - metadata_col, -): - rendered_metadata_default = str( - metadata_col.server_default.sqltext.compile( - dialect=autogen_context.dialect, - compile_kwargs={"literal_binds": True}, - ) - ) - - # since we cannot change computed columns, we do only a crude comparison - # here where we try to eliminate syntactical differences in order to - # get a minimal comparison just to emit a warning. - - rendered_metadata_default = _normalize_computed_default( - rendered_metadata_default - ) - - if isinstance(conn_col.server_default, sa_schema.Computed): - rendered_conn_default = str( - conn_col.server_default.sqltext.compile( - dialect=autogen_context.dialect, - compile_kwargs={"literal_binds": True}, - ) - ) - if rendered_conn_default is None: - rendered_conn_default = "" - else: - rendered_conn_default = _normalize_computed_default( - rendered_conn_default - ) - else: - rendered_conn_default = "" - - if rendered_metadata_default != rendered_conn_default: - _warn_computed_not_supported(tname, cname) - - -def _warn_computed_not_supported(tname, cname): - util.warn("Computed default on %s.%s cannot be modified" % (tname, cname)) - - -@comparators.dispatch_for("column") -def _compare_server_default( - autogen_context, - alter_column_op, - schema, - tname, - cname, - conn_col, - metadata_col, -): - - metadata_default = metadata_col.server_default - conn_col_default = conn_col.server_default - if conn_col_default is None and metadata_default is None: - return False - - if sqla_compat.has_computed and isinstance( - metadata_default, sa_schema.Computed - ): - # return False in case of a computed column as the server - # default. Note that DDL for adding or removing "GENERATED AS" from - # an existing column is not currently known for any backend. - # Once SQLAlchemy can reflect "GENERATED" as the "computed" element, - # we would also want to ignore and/or warn for changes vs. the - # metadata (or support backend specific DDL if applicable). - if not sqla_compat.has_computed_reflection: - return False - - else: - return _compare_computed_default( - autogen_context, - alter_column_op, - schema, - tname, - cname, - conn_col, - metadata_col, - ) - rendered_metadata_default = _render_server_default_for_compare( - metadata_default, metadata_col, autogen_context - ) - - if sqla_compat.has_computed_reflection and isinstance( - conn_col.server_default, sa_schema.Computed - ): - _warn_computed_not_supported(tname, cname) - return False - else: - rendered_conn_default = ( - conn_col.server_default.arg.text - if conn_col.server_default - else None - ) - - alter_column_op.existing_server_default = conn_col_default - - isdiff = autogen_context.migration_context._compare_server_default( - conn_col, - metadata_col, - rendered_metadata_default, - rendered_conn_default, - ) - if isdiff: - alter_column_op.modify_server_default = metadata_default - log.info("Detected server default on column '%s.%s'", tname, cname) - - -@comparators.dispatch_for("column") -def _compare_column_comment( - autogen_context, - alter_column_op, - schema, - tname, - cname, - conn_col, - metadata_col, -): - - if not sqla_compat._dialect_supports_comments(autogen_context.dialect): - return - - metadata_comment = metadata_col.comment - conn_col_comment = conn_col.comment - if conn_col_comment is None and metadata_comment is None: - return False - - alter_column_op.existing_comment = conn_col_comment - - if conn_col_comment != metadata_comment: - alter_column_op.modify_comment = metadata_comment - log.info("Detected column comment '%s.%s'", tname, cname) - - -@comparators.dispatch_for("table") -def _compare_foreign_keys( - autogen_context, - modify_table_ops, - schema, - tname, - conn_table, - metadata_table, -): - - # if we're doing CREATE TABLE, all FKs are created - # inline within the table def - if conn_table is None or metadata_table is None: - return - - inspector = autogen_context.inspector - metadata_fks = set( - fk - for fk in metadata_table.constraints - if isinstance(fk, sa_schema.ForeignKeyConstraint) - ) - - conn_fks = inspector.get_foreign_keys(tname, schema=schema) - - backend_reflects_fk_options = conn_fks and "options" in conn_fks[0] - - conn_fks = set(_make_foreign_key(const, conn_table) for const in conn_fks) - - # give the dialect a chance to correct the FKs to match more - # closely - autogen_context.migration_context.impl.correct_for_autogen_foreignkeys( - conn_fks, metadata_fks - ) - - metadata_fks = set( - _fk_constraint_sig(fk, include_options=backend_reflects_fk_options) - for fk in metadata_fks - ) - - conn_fks = set( - _fk_constraint_sig(fk, include_options=backend_reflects_fk_options) - for fk in conn_fks - ) - - conn_fks_by_sig = dict((c.sig, c) for c in conn_fks) - metadata_fks_by_sig = dict((c.sig, c) for c in metadata_fks) - - metadata_fks_by_name = dict( - (c.name, c) for c in metadata_fks if c.name is not None - ) - conn_fks_by_name = dict( - (c.name, c) for c in conn_fks if c.name is not None - ) - - def _add_fk(obj, compare_to): - if autogen_context.run_filters( - obj.const, obj.name, "foreign_key_constraint", False, compare_to - ): - modify_table_ops.ops.append( - ops.CreateForeignKeyOp.from_constraint(const.const) - ) - - log.info( - "Detected added foreign key (%s)(%s) on table %s%s", - ", ".join(obj.source_columns), - ", ".join(obj.target_columns), - "%s." % obj.source_schema if obj.source_schema else "", - obj.source_table, - ) - - def _remove_fk(obj, compare_to): - if autogen_context.run_filters( - obj.const, obj.name, "foreign_key_constraint", True, compare_to - ): - modify_table_ops.ops.append( - ops.DropConstraintOp.from_constraint(obj.const) - ) - log.info( - "Detected removed foreign key (%s)(%s) on table %s%s", - ", ".join(obj.source_columns), - ", ".join(obj.target_columns), - "%s." % obj.source_schema if obj.source_schema else "", - obj.source_table, - ) - - # so far it appears we don't need to do this by name at all. - # SQLite doesn't preserve constraint names anyway - - for removed_sig in set(conn_fks_by_sig).difference(metadata_fks_by_sig): - const = conn_fks_by_sig[removed_sig] - if removed_sig not in metadata_fks_by_sig: - compare_to = ( - metadata_fks_by_name[const.name].const - if const.name in metadata_fks_by_name - else None - ) - _remove_fk(const, compare_to) - - for added_sig in set(metadata_fks_by_sig).difference(conn_fks_by_sig): - const = metadata_fks_by_sig[added_sig] - if added_sig not in conn_fks_by_sig: - compare_to = ( - conn_fks_by_name[const.name].const - if const.name in conn_fks_by_name - else None - ) - _add_fk(const, compare_to) - - -@comparators.dispatch_for("table") -def _compare_table_comment( - autogen_context, - modify_table_ops, - schema, - tname, - conn_table, - metadata_table, -): - - if not sqla_compat._dialect_supports_comments(autogen_context.dialect): - return - - # if we're doing CREATE TABLE, comments will be created inline - # with the create_table op. - if conn_table is None or metadata_table is None: - return - - if conn_table.comment is None and metadata_table.comment is None: - return - - if metadata_table.comment is None and conn_table.comment is not None: - modify_table_ops.ops.append( - ops.DropTableCommentOp( - tname, existing_comment=conn_table.comment, schema=schema - ) - ) - elif metadata_table.comment != conn_table.comment: - modify_table_ops.ops.append( - ops.CreateTableCommentOp( - tname, - metadata_table.comment, - existing_comment=conn_table.comment, - schema=schema, - ) - ) diff --git a/venv/lib/python3.7/site-packages/alembic/autogenerate/render.py b/venv/lib/python3.7/site-packages/alembic/autogenerate/render.py deleted file mode 100644 index 99c15c3..0000000 --- a/venv/lib/python3.7/site-packages/alembic/autogenerate/render.py +++ /dev/null @@ -1,933 +0,0 @@ -import re - -from mako.pygen import PythonPrinter -from sqlalchemy import schema as sa_schema -from sqlalchemy import sql -from sqlalchemy import types as sqltypes - -from .. import util -from ..operations import ops -from ..util import compat -from ..util import sqla_compat -from ..util.compat import string_types -from ..util.compat import StringIO - - -MAX_PYTHON_ARGS = 255 - -try: - from sqlalchemy.sql.naming import conv - - def _render_gen_name(autogen_context, name): - if isinstance(name, conv): - return _f_name(_alembic_autogenerate_prefix(autogen_context), name) - else: - return name - - -except ImportError: - - def _render_gen_name(autogen_context, name): - return name - - -def _indent(text): - text = re.compile(r"^", re.M).sub(" ", text).strip() - text = re.compile(r" +$", re.M).sub("", text) - return text - - -def _render_python_into_templatevars( - autogen_context, migration_script, template_args -): - imports = autogen_context.imports - - for upgrade_ops, downgrade_ops in zip( - migration_script.upgrade_ops_list, migration_script.downgrade_ops_list - ): - template_args[upgrade_ops.upgrade_token] = _indent( - _render_cmd_body(upgrade_ops, autogen_context) - ) - template_args[downgrade_ops.downgrade_token] = _indent( - _render_cmd_body(downgrade_ops, autogen_context) - ) - template_args["imports"] = "\n".join(sorted(imports)) - - -default_renderers = renderers = util.Dispatcher() - - -def _render_cmd_body(op_container, autogen_context): - - buf = StringIO() - printer = PythonPrinter(buf) - - printer.writeline( - "# ### commands auto generated by Alembic - please adjust! ###" - ) - - has_lines = False - for op in op_container.ops: - lines = render_op(autogen_context, op) - has_lines = has_lines or lines - - for line in lines: - printer.writeline(line) - - if not has_lines: - printer.writeline("pass") - - printer.writeline("# ### end Alembic commands ###") - - return buf.getvalue() - - -def render_op(autogen_context, op): - renderer = renderers.dispatch(op) - lines = util.to_list(renderer(autogen_context, op)) - return lines - - -def render_op_text(autogen_context, op): - return "\n".join(render_op(autogen_context, op)) - - -@renderers.dispatch_for(ops.ModifyTableOps) -def _render_modify_table(autogen_context, op): - opts = autogen_context.opts - render_as_batch = opts.get("render_as_batch", False) - - if op.ops: - lines = [] - if render_as_batch: - with autogen_context._within_batch(): - lines.append( - "with op.batch_alter_table(%r, schema=%r) as batch_op:" - % (op.table_name, op.schema) - ) - for t_op in op.ops: - t_lines = render_op(autogen_context, t_op) - lines.extend(t_lines) - lines.append("") - else: - for t_op in op.ops: - t_lines = render_op(autogen_context, t_op) - lines.extend(t_lines) - - return lines - else: - return [] - - -@renderers.dispatch_for(ops.CreateTableCommentOp) -def _render_create_table_comment(autogen_context, op): - - templ = ( - "{prefix}create_table_comment(\n" - "{indent}'{tname}',\n" - "{indent}{comment},\n" - "{indent}existing_comment={existing},\n" - "{indent}schema={schema}\n" - ")" - ) - return templ.format( - prefix=_alembic_autogenerate_prefix(autogen_context), - tname=op.table_name, - comment="%r" % op.comment if op.comment is not None else None, - existing="%r" % op.existing_comment - if op.existing_comment is not None - else None, - schema="'%s'" % op.schema if op.schema is not None else None, - indent=" ", - ) - - -@renderers.dispatch_for(ops.DropTableCommentOp) -def _render_drop_table_comment(autogen_context, op): - - templ = ( - "{prefix}drop_table_comment(\n" - "{indent}'{tname}',\n" - "{indent}existing_comment={existing},\n" - "{indent}schema={schema}\n" - ")" - ) - return templ.format( - prefix=_alembic_autogenerate_prefix(autogen_context), - tname=op.table_name, - existing="%r" % op.existing_comment - if op.existing_comment is not None - else None, - schema="'%s'" % op.schema if op.schema is not None else None, - indent=" ", - ) - - -@renderers.dispatch_for(ops.CreateTableOp) -def _add_table(autogen_context, op): - table = op.to_table() - - args = [ - col - for col in [ - _render_column(col, autogen_context) for col in table.columns - ] - if col - ] + sorted( - [ - rcons - for rcons in [ - _render_constraint(cons, autogen_context) - for cons in table.constraints - ] - if rcons is not None - ] - ) - - if len(args) > MAX_PYTHON_ARGS: - args = "*[" + ",\n".join(args) + "]" - else: - args = ",\n".join(args) - - text = "%(prefix)screate_table(%(tablename)r,\n%(args)s" % { - "tablename": _ident(op.table_name), - "prefix": _alembic_autogenerate_prefix(autogen_context), - "args": args, - } - if op.schema: - text += ",\nschema=%r" % _ident(op.schema) - - comment = sqla_compat._comment_attribute(table) - if comment: - text += ",\ncomment=%r" % _ident(comment) - for k in sorted(op.kw): - text += ",\n%s=%r" % (k.replace(" ", "_"), op.kw[k]) - text += "\n)" - return text - - -@renderers.dispatch_for(ops.DropTableOp) -def _drop_table(autogen_context, op): - text = "%(prefix)sdrop_table(%(tname)r" % { - "prefix": _alembic_autogenerate_prefix(autogen_context), - "tname": _ident(op.table_name), - } - if op.schema: - text += ", schema=%r" % _ident(op.schema) - text += ")" - return text - - -@renderers.dispatch_for(ops.CreateIndexOp) -def _add_index(autogen_context, op): - index = op.to_index() - - has_batch = autogen_context._has_batch - - if has_batch: - tmpl = ( - "%(prefix)screate_index(%(name)r, [%(columns)s], " - "unique=%(unique)r%(kwargs)s)" - ) - else: - tmpl = ( - "%(prefix)screate_index(%(name)r, %(table)r, [%(columns)s], " - "unique=%(unique)r%(schema)s%(kwargs)s)" - ) - - text = tmpl % { - "prefix": _alembic_autogenerate_prefix(autogen_context), - "name": _render_gen_name(autogen_context, index.name), - "table": _ident(index.table.name), - "columns": ", ".join( - _get_index_rendered_expressions(index, autogen_context) - ), - "unique": index.unique or False, - "schema": (", schema=%r" % _ident(index.table.schema)) - if index.table.schema - else "", - "kwargs": ( - ", " - + ", ".join( - [ - "%s=%s" - % (key, _render_potential_expr(val, autogen_context)) - for key, val in index.kwargs.items() - ] - ) - ) - if len(index.kwargs) - else "", - } - return text - - -@renderers.dispatch_for(ops.DropIndexOp) -def _drop_index(autogen_context, op): - has_batch = autogen_context._has_batch - - if has_batch: - tmpl = "%(prefix)sdrop_index(%(name)r)" - else: - tmpl = ( - "%(prefix)sdrop_index(%(name)r, " - "table_name=%(table_name)r%(schema)s)" - ) - - text = tmpl % { - "prefix": _alembic_autogenerate_prefix(autogen_context), - "name": _render_gen_name(autogen_context, op.index_name), - "table_name": _ident(op.table_name), - "schema": ((", schema=%r" % _ident(op.schema)) if op.schema else ""), - } - return text - - -@renderers.dispatch_for(ops.CreateUniqueConstraintOp) -def _add_unique_constraint(autogen_context, op): - return [_uq_constraint(op.to_constraint(), autogen_context, True)] - - -@renderers.dispatch_for(ops.CreateForeignKeyOp) -def _add_fk_constraint(autogen_context, op): - - args = [repr(_render_gen_name(autogen_context, op.constraint_name))] - if not autogen_context._has_batch: - args.append(repr(_ident(op.source_table))) - - args.extend( - [ - repr(_ident(op.referent_table)), - repr([_ident(col) for col in op.local_cols]), - repr([_ident(col) for col in op.remote_cols]), - ] - ) - - kwargs = [ - "referent_schema", - "onupdate", - "ondelete", - "initially", - "deferrable", - "use_alter", - ] - if not autogen_context._has_batch: - kwargs.insert(0, "source_schema") - - for k in kwargs: - if k in op.kw: - value = op.kw[k] - if value is not None: - args.append("%s=%r" % (k, value)) - - return "%(prefix)screate_foreign_key(%(args)s)" % { - "prefix": _alembic_autogenerate_prefix(autogen_context), - "args": ", ".join(args), - } - - -@renderers.dispatch_for(ops.CreatePrimaryKeyOp) -def _add_pk_constraint(constraint, autogen_context): - raise NotImplementedError() - - -@renderers.dispatch_for(ops.CreateCheckConstraintOp) -def _add_check_constraint(constraint, autogen_context): - raise NotImplementedError() - - -@renderers.dispatch_for(ops.DropConstraintOp) -def _drop_constraint(autogen_context, op): - - if autogen_context._has_batch: - template = "%(prefix)sdrop_constraint" "(%(name)r, type_=%(type)r)" - else: - template = ( - "%(prefix)sdrop_constraint" - "(%(name)r, '%(table_name)s'%(schema)s, type_=%(type)r)" - ) - - text = template % { - "prefix": _alembic_autogenerate_prefix(autogen_context), - "name": _render_gen_name(autogen_context, op.constraint_name), - "table_name": _ident(op.table_name), - "type": op.constraint_type, - "schema": (", schema=%r" % _ident(op.schema)) if op.schema else "", - } - return text - - -@renderers.dispatch_for(ops.AddColumnOp) -def _add_column(autogen_context, op): - - schema, tname, column = op.schema, op.table_name, op.column - if autogen_context._has_batch: - template = "%(prefix)sadd_column(%(column)s)" - else: - template = "%(prefix)sadd_column(%(tname)r, %(column)s" - if schema: - template += ", schema=%(schema)r" - template += ")" - text = template % { - "prefix": _alembic_autogenerate_prefix(autogen_context), - "tname": tname, - "column": _render_column(column, autogen_context), - "schema": schema, - } - return text - - -@renderers.dispatch_for(ops.DropColumnOp) -def _drop_column(autogen_context, op): - - schema, tname, column_name = op.schema, op.table_name, op.column_name - - if autogen_context._has_batch: - template = "%(prefix)sdrop_column(%(cname)r)" - else: - template = "%(prefix)sdrop_column(%(tname)r, %(cname)r" - if schema: - template += ", schema=%(schema)r" - template += ")" - - text = template % { - "prefix": _alembic_autogenerate_prefix(autogen_context), - "tname": _ident(tname), - "cname": _ident(column_name), - "schema": _ident(schema), - } - return text - - -@renderers.dispatch_for(ops.AlterColumnOp) -def _alter_column(autogen_context, op): - - tname = op.table_name - cname = op.column_name - server_default = op.modify_server_default - type_ = op.modify_type - nullable = op.modify_nullable - comment = op.modify_comment - autoincrement = op.kw.get("autoincrement", None) - existing_type = op.existing_type - existing_nullable = op.existing_nullable - existing_comment = op.existing_comment - existing_server_default = op.existing_server_default - schema = op.schema - - indent = " " * 11 - - if autogen_context._has_batch: - template = "%(prefix)salter_column(%(cname)r" - else: - template = "%(prefix)salter_column(%(tname)r, %(cname)r" - - text = template % { - "prefix": _alembic_autogenerate_prefix(autogen_context), - "tname": tname, - "cname": cname, - } - if existing_type is not None: - text += ",\n%sexisting_type=%s" % ( - indent, - _repr_type(existing_type, autogen_context), - ) - if server_default is not False: - rendered = _render_server_default(server_default, autogen_context) - text += ",\n%sserver_default=%s" % (indent, rendered) - - if type_ is not None: - text += ",\n%stype_=%s" % (indent, _repr_type(type_, autogen_context)) - if nullable is not None: - text += ",\n%snullable=%r" % (indent, nullable) - if comment is not False: - text += ",\n%scomment=%r" % (indent, comment) - if existing_comment is not None: - text += ",\n%sexisting_comment=%r" % (indent, existing_comment) - if nullable is None and existing_nullable is not None: - text += ",\n%sexisting_nullable=%r" % (indent, existing_nullable) - if autoincrement is not None: - text += ",\n%sautoincrement=%r" % (indent, autoincrement) - if server_default is False and existing_server_default: - rendered = _render_server_default( - existing_server_default, autogen_context - ) - text += ",\n%sexisting_server_default=%s" % (indent, rendered) - if schema and not autogen_context._has_batch: - text += ",\n%sschema=%r" % (indent, schema) - text += ")" - return text - - -class _f_name(object): - def __init__(self, prefix, name): - self.prefix = prefix - self.name = name - - def __repr__(self): - return "%sf(%r)" % (self.prefix, _ident(self.name)) - - -def _ident(name): - """produce a __repr__() object for a string identifier that may - use quoted_name() in SQLAlchemy 0.9 and greater. - - The issue worked around here is that quoted_name() doesn't have - very good repr() behavior by itself when unicode is involved. - - """ - if name is None: - return name - elif isinstance(name, sql.elements.quoted_name): - if compat.py2k: - # the attempt to encode to ascii here isn't super ideal, - # however we are trying to cut down on an explosion of - # u'' literals only when py2k + SQLA 0.9, in particular - # makes unit tests testing code generation very difficult - try: - return name.encode("ascii") - except UnicodeError: - return compat.text_type(name) - else: - return compat.text_type(name) - elif isinstance(name, compat.string_types): - return name - - -def _render_potential_expr( - value, autogen_context, wrap_in_text=True, is_server_default=False -): - if isinstance(value, sql.ClauseElement): - - if wrap_in_text: - template = "%(prefix)stext(%(sql)r)" - else: - template = "%(sql)r" - - return template % { - "prefix": _sqlalchemy_autogenerate_prefix(autogen_context), - "sql": autogen_context.migration_context.impl.render_ddl_sql_expr( - value, is_server_default=is_server_default - ), - } - - else: - return repr(value) - - -def _get_index_rendered_expressions(idx, autogen_context): - return [ - repr(_ident(getattr(exp, "name", None))) - if isinstance(exp, sa_schema.Column) - else _render_potential_expr(exp, autogen_context) - for exp in idx.expressions - ] - - -def _uq_constraint(constraint, autogen_context, alter): - opts = [] - - has_batch = autogen_context._has_batch - - if constraint.deferrable: - opts.append(("deferrable", str(constraint.deferrable))) - if constraint.initially: - opts.append(("initially", str(constraint.initially))) - if not has_batch and alter and constraint.table.schema: - opts.append(("schema", _ident(constraint.table.schema))) - if not alter and constraint.name: - opts.append( - ("name", _render_gen_name(autogen_context, constraint.name)) - ) - - if alter: - args = [repr(_render_gen_name(autogen_context, constraint.name))] - if not has_batch: - args += [repr(_ident(constraint.table.name))] - args.append(repr([_ident(col.name) for col in constraint.columns])) - args.extend(["%s=%r" % (k, v) for k, v in opts]) - return "%(prefix)screate_unique_constraint(%(args)s)" % { - "prefix": _alembic_autogenerate_prefix(autogen_context), - "args": ", ".join(args), - } - else: - args = [repr(_ident(col.name)) for col in constraint.columns] - args.extend(["%s=%r" % (k, v) for k, v in opts]) - return "%(prefix)sUniqueConstraint(%(args)s)" % { - "prefix": _sqlalchemy_autogenerate_prefix(autogen_context), - "args": ", ".join(args), - } - - -def _user_autogenerate_prefix(autogen_context, target): - prefix = autogen_context.opts["user_module_prefix"] - if prefix is None: - return "%s." % target.__module__ - else: - return prefix - - -def _sqlalchemy_autogenerate_prefix(autogen_context): - return autogen_context.opts["sqlalchemy_module_prefix"] or "" - - -def _alembic_autogenerate_prefix(autogen_context): - if autogen_context._has_batch: - return "batch_op." - else: - return autogen_context.opts["alembic_module_prefix"] or "" - - -def _user_defined_render(type_, object_, autogen_context): - if "render_item" in autogen_context.opts: - render = autogen_context.opts["render_item"] - if render: - rendered = render(type_, object_, autogen_context) - if rendered is not False: - return rendered - return False - - -def _render_column(column, autogen_context): - rendered = _user_defined_render("column", column, autogen_context) - if rendered is not False: - return rendered - - args = [] - opts = [] - - if column.server_default: - if sqla_compat._server_default_is_computed(column): - rendered = _render_computed(column.computed, autogen_context) - if rendered: - args.append(rendered) - else: - rendered = _render_server_default( - column.server_default, autogen_context - ) - if rendered: - opts.append(("server_default", rendered)) - - if ( - column.autoincrement is not None - and column.autoincrement != sqla_compat.AUTOINCREMENT_DEFAULT - ): - opts.append(("autoincrement", column.autoincrement)) - - if column.nullable is not None: - opts.append(("nullable", column.nullable)) - - if column.system: - opts.append(("system", column.system)) - - comment = sqla_compat._comment_attribute(column) - if comment: - opts.append(("comment", "%r" % comment)) - - # TODO: for non-ascii colname, assign a "key" - return "%(prefix)sColumn(%(name)r, %(type)s, %(args)s%(kwargs)s)" % { - "prefix": _sqlalchemy_autogenerate_prefix(autogen_context), - "name": _ident(column.name), - "type": _repr_type(column.type, autogen_context), - "args": ", ".join([str(arg) for arg in args]) + ", " if args else "", - "kwargs": ( - ", ".join( - ["%s=%s" % (kwname, val) for kwname, val in opts] - + [ - "%s=%s" - % (key, _render_potential_expr(val, autogen_context)) - for key, val in sqla_compat._column_kwargs(column).items() - ] - ) - ), - } - - -def _render_server_default(default, autogen_context, repr_=True): - rendered = _user_defined_render("server_default", default, autogen_context) - if rendered is not False: - return rendered - - if sqla_compat.has_computed and isinstance(default, sa_schema.Computed): - return _render_computed(default, autogen_context) - elif isinstance(default, sa_schema.DefaultClause): - if isinstance(default.arg, compat.string_types): - default = default.arg - else: - return _render_potential_expr( - default.arg, autogen_context, is_server_default=True - ) - - if isinstance(default, string_types) and repr_: - default = repr(re.sub(r"^'|'$", "", default)) - - return default - - -def _render_computed(computed, autogen_context): - text = _render_potential_expr( - computed.sqltext, autogen_context, wrap_in_text=False - ) - - kwargs = {} - if computed.persisted is not None: - kwargs["persisted"] = computed.persisted - return "%(prefix)sComputed(%(text)s, %(kwargs)s)" % { - "prefix": _sqlalchemy_autogenerate_prefix(autogen_context), - "text": text, - "kwargs": (", ".join("%s=%s" % pair for pair in kwargs.items())), - } - - -def _repr_type(type_, autogen_context): - rendered = _user_defined_render("type", type_, autogen_context) - if rendered is not False: - return rendered - - if hasattr(autogen_context.migration_context, "impl"): - impl_rt = autogen_context.migration_context.impl.render_type( - type_, autogen_context - ) - else: - impl_rt = None - - mod = type(type_).__module__ - imports = autogen_context.imports - if mod.startswith("sqlalchemy.dialects"): - dname = re.match(r"sqlalchemy\.dialects\.(\w+)", mod).group(1) - if imports is not None: - imports.add("from sqlalchemy.dialects import %s" % dname) - if impl_rt: - return impl_rt - else: - return "%s.%r" % (dname, type_) - elif impl_rt: - return impl_rt - elif mod.startswith("sqlalchemy."): - if type(type_) is sqltypes.Variant: - return _render_Variant_type(type_, autogen_context) - if "_render_%s_type" % type_.__visit_name__ in globals(): - fn = globals()["_render_%s_type" % type_.__visit_name__] - return fn(type_, autogen_context) - else: - prefix = _sqlalchemy_autogenerate_prefix(autogen_context) - return "%s%r" % (prefix, type_) - else: - prefix = _user_autogenerate_prefix(autogen_context, type_) - return "%s%r" % (prefix, type_) - - -def _render_ARRAY_type(type_, autogen_context): - return _render_type_w_subtype( - type_, autogen_context, "item_type", r"(.+?\()" - ) - - -def _render_Variant_type(type_, autogen_context): - base = _repr_type(type_.impl, autogen_context) - for dialect in sorted(type_.mapping): - typ = type_.mapping[dialect] - base += ".with_variant(%s, %r)" % ( - _repr_type(typ, autogen_context), - dialect, - ) - return base - - -def _render_type_w_subtype( - type_, autogen_context, attrname, regexp, prefix=None -): - outer_repr = repr(type_) - inner_type = getattr(type_, attrname, None) - if inner_type is None: - return False - - inner_repr = repr(inner_type) - - inner_repr = re.sub(r"([\(\)])", r"\\\1", inner_repr) - sub_type = _repr_type(getattr(type_, attrname), autogen_context) - outer_type = re.sub(regexp + inner_repr, r"\1%s" % sub_type, outer_repr) - - if prefix: - return "%s%s" % (prefix, outer_type) - - mod = type(type_).__module__ - if mod.startswith("sqlalchemy.dialects"): - dname = re.match(r"sqlalchemy\.dialects\.(\w+)", mod).group(1) - return "%s.%s" % (dname, outer_type) - elif mod.startswith("sqlalchemy"): - prefix = _sqlalchemy_autogenerate_prefix(autogen_context) - return "%s%s" % (prefix, outer_type) - else: - return None - - -_constraint_renderers = util.Dispatcher() - - -def _render_constraint(constraint, autogen_context): - try: - renderer = _constraint_renderers.dispatch(constraint) - except ValueError: - util.warn("No renderer is established for object %r" % constraint) - return "[Unknown Python object %r]" % constraint - else: - return renderer(constraint, autogen_context) - - -@_constraint_renderers.dispatch_for(sa_schema.PrimaryKeyConstraint) -def _render_primary_key(constraint, autogen_context): - rendered = _user_defined_render("primary_key", constraint, autogen_context) - if rendered is not False: - return rendered - - if not constraint.columns: - return None - - opts = [] - if constraint.name: - opts.append( - ("name", repr(_render_gen_name(autogen_context, constraint.name))) - ) - return "%(prefix)sPrimaryKeyConstraint(%(args)s)" % { - "prefix": _sqlalchemy_autogenerate_prefix(autogen_context), - "args": ", ".join( - [repr(c.name) for c in constraint.columns] - + ["%s=%s" % (kwname, val) for kwname, val in opts] - ), - } - - -def _fk_colspec(fk, metadata_schema): - """Implement a 'safe' version of ForeignKey._get_colspec() that - won't fail if the remote table can't be resolved. - - """ - colspec = fk._get_colspec() - tokens = colspec.split(".") - tname, colname = tokens[-2:] - - if metadata_schema is not None and len(tokens) == 2: - table_fullname = "%s.%s" % (metadata_schema, tname) - else: - table_fullname = ".".join(tokens[0:-1]) - - if ( - not fk.link_to_name - and fk.parent is not None - and fk.parent.table is not None - ): - # try to resolve the remote table in order to adjust for column.key. - # the FK constraint needs to be rendered in terms of the column - # name. - parent_metadata = fk.parent.table.metadata - if table_fullname in parent_metadata.tables: - col = parent_metadata.tables[table_fullname].c.get(colname) - if col is not None: - colname = _ident(col.name) - - colspec = "%s.%s" % (table_fullname, colname) - - return colspec - - -def _populate_render_fk_opts(constraint, opts): - - if constraint.onupdate: - opts.append(("onupdate", repr(constraint.onupdate))) - if constraint.ondelete: - opts.append(("ondelete", repr(constraint.ondelete))) - if constraint.initially: - opts.append(("initially", repr(constraint.initially))) - if constraint.deferrable: - opts.append(("deferrable", repr(constraint.deferrable))) - if constraint.use_alter: - opts.append(("use_alter", repr(constraint.use_alter))) - - -@_constraint_renderers.dispatch_for(sa_schema.ForeignKeyConstraint) -def _render_foreign_key(constraint, autogen_context): - rendered = _user_defined_render("foreign_key", constraint, autogen_context) - if rendered is not False: - return rendered - - opts = [] - if constraint.name: - opts.append( - ("name", repr(_render_gen_name(autogen_context, constraint.name))) - ) - - _populate_render_fk_opts(constraint, opts) - - apply_metadata_schema = constraint.parent.metadata.schema - return ( - "%(prefix)sForeignKeyConstraint([%(cols)s], " - "[%(refcols)s], %(args)s)" - % { - "prefix": _sqlalchemy_autogenerate_prefix(autogen_context), - "cols": ", ".join( - "%r" % _ident(f.parent.name) for f in constraint.elements - ), - "refcols": ", ".join( - repr(_fk_colspec(f, apply_metadata_schema)) - for f in constraint.elements - ), - "args": ", ".join( - ["%s=%s" % (kwname, val) for kwname, val in opts] - ), - } - ) - - -@_constraint_renderers.dispatch_for(sa_schema.UniqueConstraint) -def _render_unique_constraint(constraint, autogen_context): - rendered = _user_defined_render("unique", constraint, autogen_context) - if rendered is not False: - return rendered - - return _uq_constraint(constraint, autogen_context, False) - - -@_constraint_renderers.dispatch_for(sa_schema.CheckConstraint) -def _render_check_constraint(constraint, autogen_context): - rendered = _user_defined_render("check", constraint, autogen_context) - if rendered is not False: - return rendered - - # detect the constraint being part of - # a parent type which is probably in the Table already. - # ideally SQLAlchemy would give us more of a first class - # way to detect this. - if ( - constraint._create_rule - and hasattr(constraint._create_rule, "target") - and isinstance(constraint._create_rule.target, sqltypes.TypeEngine) - ): - return None - opts = [] - if constraint.name: - opts.append( - ("name", repr(_render_gen_name(autogen_context, constraint.name))) - ) - return "%(prefix)sCheckConstraint(%(sqltext)s%(opts)s)" % { - "prefix": _sqlalchemy_autogenerate_prefix(autogen_context), - "opts": ", " + (", ".join("%s=%s" % (k, v) for k, v in opts)) - if opts - else "", - "sqltext": _render_potential_expr( - constraint.sqltext, autogen_context, wrap_in_text=False - ), - } - - -@renderers.dispatch_for(ops.ExecuteSQLOp) -def _execute_sql(autogen_context, op): - if not isinstance(op.sqltext, string_types): - raise NotImplementedError( - "Autogenerate rendering of SQL Expression language constructs " - "not supported here; please use a plain SQL string" - ) - return "op.execute(%r)" % op.sqltext - - -renderers = default_renderers.branch() diff --git a/venv/lib/python3.7/site-packages/alembic/autogenerate/rewriter.py b/venv/lib/python3.7/site-packages/alembic/autogenerate/rewriter.py deleted file mode 100644 index 90a931f..0000000 --- a/venv/lib/python3.7/site-packages/alembic/autogenerate/rewriter.py +++ /dev/null @@ -1,158 +0,0 @@ -from alembic import util -from alembic.operations import ops - - -class Rewriter(object): - """A helper object that allows easy 'rewriting' of ops streams. - - The :class:`.Rewriter` object is intended to be passed along - to the - :paramref:`.EnvironmentContext.configure.process_revision_directives` - parameter in an ``env.py`` script. Once constructed, any number - of "rewrites" functions can be associated with it, which will be given - the opportunity to modify the structure without having to have explicit - knowledge of the overall structure. - - The function is passed the :class:`.MigrationContext` object and - ``revision`` tuple that are passed to the :paramref:`.Environment - Context.configure.process_revision_directives` function normally, - and the third argument is an individual directive of the type - noted in the decorator. The function has the choice of returning - a single op directive, which normally can be the directive that - was actually passed, or a new directive to replace it, or a list - of zero or more directives to replace it. - - .. seealso:: - - :ref:`autogen_rewriter` - usage example - - .. versionadded:: 0.8 - - """ - - _traverse = util.Dispatcher() - - _chained = None - - def __init__(self): - self.dispatch = util.Dispatcher() - - def chain(self, other): - """Produce a "chain" of this :class:`.Rewriter` to another. - - This allows two rewriters to operate serially on a stream, - e.g.:: - - writer1 = autogenerate.Rewriter() - writer2 = autogenerate.Rewriter() - - @writer1.rewrites(ops.AddColumnOp) - def add_column_nullable(context, revision, op): - op.column.nullable = True - return op - - @writer2.rewrites(ops.AddColumnOp) - def add_column_idx(context, revision, op): - idx_op = ops.CreateIndexOp( - 'ixc', op.table_name, [op.column.name]) - return [ - op, - idx_op - ] - - writer = writer1.chain(writer2) - - :param other: a :class:`.Rewriter` instance - :return: a new :class:`.Rewriter` that will run the operations - of this writer, then the "other" writer, in succession. - - """ - wr = self.__class__.__new__(self.__class__) - wr.__dict__.update(self.__dict__) - wr._chained = other - return wr - - def rewrites(self, operator): - """Register a function as rewriter for a given type. - - The function should receive three arguments, which are - the :class:`.MigrationContext`, a ``revision`` tuple, and - an op directive of the type indicated. E.g.:: - - @writer1.rewrites(ops.AddColumnOp) - def add_column_nullable(context, revision, op): - op.column.nullable = True - return op - - """ - return self.dispatch.dispatch_for(operator) - - def _rewrite(self, context, revision, directive): - try: - _rewriter = self.dispatch.dispatch(directive) - except ValueError: - _rewriter = None - yield directive - else: - if self in directive._mutations: - yield directive - else: - for r_directive in util.to_list( - _rewriter(context, revision, directive) - ): - r_directive._mutations = r_directive._mutations.union( - [self] - ) - yield r_directive - - def __call__(self, context, revision, directives): - self.process_revision_directives(context, revision, directives) - if self._chained: - self._chained(context, revision, directives) - - @_traverse.dispatch_for(ops.MigrationScript) - def _traverse_script(self, context, revision, directive): - upgrade_ops_list = [] - for upgrade_ops in directive.upgrade_ops_list: - ret = self._traverse_for(context, revision, upgrade_ops) - if len(ret) != 1: - raise ValueError( - "Can only return single object for UpgradeOps traverse" - ) - upgrade_ops_list.append(ret[0]) - directive.upgrade_ops = upgrade_ops_list - - downgrade_ops_list = [] - for downgrade_ops in directive.downgrade_ops_list: - ret = self._traverse_for(context, revision, downgrade_ops) - if len(ret) != 1: - raise ValueError( - "Can only return single object for DowngradeOps traverse" - ) - downgrade_ops_list.append(ret[0]) - directive.downgrade_ops = downgrade_ops_list - - @_traverse.dispatch_for(ops.OpContainer) - def _traverse_op_container(self, context, revision, directive): - self._traverse_list(context, revision, directive.ops) - - @_traverse.dispatch_for(ops.MigrateOperation) - def _traverse_any_directive(self, context, revision, directive): - pass - - def _traverse_for(self, context, revision, directive): - directives = list(self._rewrite(context, revision, directive)) - for directive in directives: - traverser = self._traverse.dispatch(directive) - traverser(self, context, revision, directive) - return directives - - def _traverse_list(self, context, revision, directives): - dest = [] - for directive in directives: - dest.extend(self._traverse_for(context, revision, directive)) - - directives[:] = dest - - def process_revision_directives(self, context, revision, directives): - self._traverse_list(context, revision, directives) diff --git a/venv/lib/python3.7/site-packages/alembic/command.py b/venv/lib/python3.7/site-packages/alembic/command.py deleted file mode 100644 index 7d19e3c..0000000 --- a/venv/lib/python3.7/site-packages/alembic/command.py +++ /dev/null @@ -1,611 +0,0 @@ -import os - -from . import autogenerate as autogen -from . import util -from .runtime.environment import EnvironmentContext -from .script import ScriptDirectory - - -def list_templates(config): - """List available templates. - - :param config: a :class:`.Config` object. - - """ - - config.print_stdout("Available templates:\n") - for tempname in os.listdir(config.get_template_directory()): - with open( - os.path.join(config.get_template_directory(), tempname, "README") - ) as readme: - synopsis = next(readme) - config.print_stdout("%s - %s", tempname, synopsis) - - config.print_stdout("\nTemplates are used via the 'init' command, e.g.:") - config.print_stdout("\n alembic init --template generic ./scripts") - - -def init(config, directory, template="generic", package=False): - """Initialize a new scripts directory. - - :param config: a :class:`.Config` object. - - :param directory: string path of the target directory - - :param template: string name of the migration environment template to - use. - - :param package: when True, write ``__init__.py`` files into the - environment location as well as the versions/ location. - - .. versionadded:: 1.2 - - - """ - - if os.access(directory, os.F_OK) and os.listdir(directory): - raise util.CommandError( - "Directory %s already exists and is not empty" % directory - ) - - template_dir = os.path.join(config.get_template_directory(), template) - if not os.access(template_dir, os.F_OK): - raise util.CommandError("No such template %r" % template) - - if not os.access(directory, os.F_OK): - util.status( - "Creating directory %s" % os.path.abspath(directory), - os.makedirs, - directory, - ) - - versions = os.path.join(directory, "versions") - util.status( - "Creating directory %s" % os.path.abspath(versions), - os.makedirs, - versions, - ) - - script = ScriptDirectory(directory) - - for file_ in os.listdir(template_dir): - file_path = os.path.join(template_dir, file_) - if file_ == "alembic.ini.mako": - config_file = os.path.abspath(config.config_file_name) - if os.access(config_file, os.F_OK): - util.msg("File %s already exists, skipping" % config_file) - else: - script._generate_template( - file_path, config_file, script_location=directory - ) - elif os.path.isfile(file_path): - output_file = os.path.join(directory, file_) - script._copy_file(file_path, output_file) - - if package: - for path in [ - os.path.join(os.path.abspath(directory), "__init__.py"), - os.path.join(os.path.abspath(versions), "__init__.py"), - ]: - file_ = util.status("Adding %s" % path, open, path, "w") - file_.close() - - util.msg( - "Please edit configuration/connection/logging " - "settings in %r before proceeding." % config_file - ) - - -def revision( - config, - message=None, - autogenerate=False, - sql=False, - head="head", - splice=False, - branch_label=None, - version_path=None, - rev_id=None, - depends_on=None, - process_revision_directives=None, -): - """Create a new revision file. - - :param config: a :class:`.Config` object. - - :param message: string message to apply to the revision; this is the - ``-m`` option to ``alembic revision``. - - :param autogenerate: whether or not to autogenerate the script from - the database; this is the ``--autogenerate`` option to - ``alembic revision``. - - :param sql: whether to dump the script out as a SQL string; when specified, - the script is dumped to stdout. This is the ``--sql`` option to - ``alembic revision``. - - :param head: head revision to build the new revision upon as a parent; - this is the ``--head`` option to ``alembic revision``. - - :param splice: whether or not the new revision should be made into a - new head of its own; is required when the given ``head`` is not itself - a head. This is the ``--splice`` option to ``alembic revision``. - - :param branch_label: string label to apply to the branch; this is the - ``--branch-label`` option to ``alembic revision``. - - :param version_path: string symbol identifying a specific version path - from the configuration; this is the ``--version-path`` option to - ``alembic revision``. - - :param rev_id: optional revision identifier to use instead of having - one generated; this is the ``--rev-id`` option to ``alembic revision``. - - :param depends_on: optional list of "depends on" identifiers; this is the - ``--depends-on`` option to ``alembic revision``. - - :param process_revision_directives: this is a callable that takes the - same form as the callable described at - :paramref:`.EnvironmentContext.configure.process_revision_directives`; - will be applied to the structure generated by the revision process - where it can be altered programmatically. Note that unlike all - the other parameters, this option is only available via programmatic - use of :func:`.command.revision` - - .. versionadded:: 0.9.0 - - """ - - script_directory = ScriptDirectory.from_config(config) - - command_args = dict( - message=message, - autogenerate=autogenerate, - sql=sql, - head=head, - splice=splice, - branch_label=branch_label, - version_path=version_path, - rev_id=rev_id, - depends_on=depends_on, - ) - revision_context = autogen.RevisionContext( - config, - script_directory, - command_args, - process_revision_directives=process_revision_directives, - ) - - environment = util.asbool(config.get_main_option("revision_environment")) - - if autogenerate: - environment = True - - if sql: - raise util.CommandError( - "Using --sql with --autogenerate does not make any sense" - ) - - def retrieve_migrations(rev, context): - revision_context.run_autogenerate(rev, context) - return [] - - elif environment: - - def retrieve_migrations(rev, context): - revision_context.run_no_autogenerate(rev, context) - return [] - - elif sql: - raise util.CommandError( - "Using --sql with the revision command when " - "revision_environment is not configured does not make any sense" - ) - - if environment: - with EnvironmentContext( - config, - script_directory, - fn=retrieve_migrations, - as_sql=sql, - template_args=revision_context.template_args, - revision_context=revision_context, - ): - script_directory.run_env() - - # the revision_context now has MigrationScript structure(s) present. - # these could theoretically be further processed / rewritten *here*, - # in addition to the hooks present within each run_migrations() call, - # or at the end of env.py run_migrations_online(). - - scripts = [script for script in revision_context.generate_scripts()] - if len(scripts) == 1: - return scripts[0] - else: - return scripts - - -def merge(config, revisions, message=None, branch_label=None, rev_id=None): - """Merge two revisions together. Creates a new migration file. - - .. versionadded:: 0.7.0 - - :param config: a :class:`.Config` instance - - :param message: string message to apply to the revision - - :param branch_label: string label name to apply to the new revision - - :param rev_id: hardcoded revision identifier instead of generating a new - one. - - .. seealso:: - - :ref:`branches` - - """ - - script = ScriptDirectory.from_config(config) - template_args = { - "config": config # Let templates use config for - # e.g. multiple databases - } - return script.generate_revision( - rev_id or util.rev_id(), - message, - refresh=True, - head=revisions, - branch_labels=branch_label, - **template_args - ) - - -def upgrade(config, revision, sql=False, tag=None): - """Upgrade to a later version. - - :param config: a :class:`.Config` instance. - - :param revision: string revision target or range for --sql mode - - :param sql: if True, use ``--sql`` mode - - :param tag: an arbitrary "tag" that can be intercepted by custom - ``env.py`` scripts via the :meth:`.EnvironmentContext.get_tag_argument` - method. - - """ - - script = ScriptDirectory.from_config(config) - - starting_rev = None - if ":" in revision: - if not sql: - raise util.CommandError("Range revision not allowed") - starting_rev, revision = revision.split(":", 2) - - def upgrade(rev, context): - return script._upgrade_revs(revision, rev) - - with EnvironmentContext( - config, - script, - fn=upgrade, - as_sql=sql, - starting_rev=starting_rev, - destination_rev=revision, - tag=tag, - ): - script.run_env() - - -def downgrade(config, revision, sql=False, tag=None): - """Revert to a previous version. - - :param config: a :class:`.Config` instance. - - :param revision: string revision target or range for --sql mode - - :param sql: if True, use ``--sql`` mode - - :param tag: an arbitrary "tag" that can be intercepted by custom - ``env.py`` scripts via the :meth:`.EnvironmentContext.get_tag_argument` - method. - - """ - - script = ScriptDirectory.from_config(config) - starting_rev = None - if ":" in revision: - if not sql: - raise util.CommandError("Range revision not allowed") - starting_rev, revision = revision.split(":", 2) - elif sql: - raise util.CommandError( - "downgrade with --sql requires :" - ) - - def downgrade(rev, context): - return script._downgrade_revs(revision, rev) - - with EnvironmentContext( - config, - script, - fn=downgrade, - as_sql=sql, - starting_rev=starting_rev, - destination_rev=revision, - tag=tag, - ): - script.run_env() - - -def show(config, rev): - """Show the revision(s) denoted by the given symbol. - - :param config: a :class:`.Config` instance. - - :param revision: string revision target - - """ - - script = ScriptDirectory.from_config(config) - - if rev == "current": - - def show_current(rev, context): - for sc in script.get_revisions(rev): - config.print_stdout(sc.log_entry) - return [] - - with EnvironmentContext(config, script, fn=show_current): - script.run_env() - else: - for sc in script.get_revisions(rev): - config.print_stdout(sc.log_entry) - - -def history(config, rev_range=None, verbose=False, indicate_current=False): - """List changeset scripts in chronological order. - - :param config: a :class:`.Config` instance. - - :param rev_range: string revision range - - :param verbose: output in verbose mode. - - :param indicate_current: indicate current revision. - - ..versionadded:: 0.9.9 - - """ - - script = ScriptDirectory.from_config(config) - if rev_range is not None: - if ":" not in rev_range: - raise util.CommandError( - "History range requires [start]:[end], " "[start]:, or :[end]" - ) - base, head = rev_range.strip().split(":") - else: - base = head = None - - environment = ( - util.asbool(config.get_main_option("revision_environment")) - or indicate_current - ) - - def _display_history(config, script, base, head, currents=()): - for sc in script.walk_revisions( - base=base or "base", head=head or "heads" - ): - - if indicate_current: - sc._db_current_indicator = sc.revision in currents - - config.print_stdout( - sc.cmd_format( - verbose=verbose, - include_branches=True, - include_doc=True, - include_parents=True, - ) - ) - - def _display_history_w_current(config, script, base, head): - def _display_current_history(rev, context): - if head == "current": - _display_history(config, script, base, rev, rev) - elif base == "current": - _display_history(config, script, rev, head, rev) - else: - _display_history(config, script, base, head, rev) - return [] - - with EnvironmentContext(config, script, fn=_display_current_history): - script.run_env() - - if base == "current" or head == "current" or environment: - _display_history_w_current(config, script, base, head) - else: - _display_history(config, script, base, head) - - -def heads(config, verbose=False, resolve_dependencies=False): - """Show current available heads in the script directory. - - :param config: a :class:`.Config` instance. - - :param verbose: output in verbose mode. - - :param resolve_dependencies: treat dependency version as down revisions. - - """ - - script = ScriptDirectory.from_config(config) - if resolve_dependencies: - heads = script.get_revisions("heads") - else: - heads = script.get_revisions(script.get_heads()) - - for rev in heads: - config.print_stdout( - rev.cmd_format( - verbose, include_branches=True, tree_indicators=False - ) - ) - - -def branches(config, verbose=False): - """Show current branch points. - - :param config: a :class:`.Config` instance. - - :param verbose: output in verbose mode. - - """ - script = ScriptDirectory.from_config(config) - for sc in script.walk_revisions(): - if sc.is_branch_point: - config.print_stdout( - "%s\n%s\n", - sc.cmd_format(verbose, include_branches=True), - "\n".join( - "%s -> %s" - % ( - " " * len(str(sc.revision)), - rev_obj.cmd_format( - False, include_branches=True, include_doc=verbose - ), - ) - for rev_obj in ( - script.get_revision(rev) for rev in sc.nextrev - ) - ), - ) - - -def current(config, verbose=False, head_only=False): - """Display the current revision for a database. - - :param config: a :class:`.Config` instance. - - :param verbose: output in verbose mode. - - :param head_only: deprecated; use ``verbose`` for additional output. - - """ - - script = ScriptDirectory.from_config(config) - - if head_only: - util.warn("--head-only is deprecated", stacklevel=3) - - def display_version(rev, context): - if verbose: - config.print_stdout( - "Current revision(s) for %s:", - util.obfuscate_url_pw(context.connection.engine.url), - ) - for rev in script.get_all_current(rev): - config.print_stdout(rev.cmd_format(verbose)) - - return [] - - with EnvironmentContext(config, script, fn=display_version): - script.run_env() - - -def stamp(config, revision, sql=False, tag=None, purge=False): - """'stamp' the revision table with the given revision; don't - run any migrations. - - :param config: a :class:`.Config` instance. - - :param revision: target revision or list of revisions. May be a list - to indicate stamping of multiple branch heads. - - .. note:: this parameter is called "revisions" in the command line - interface. - - .. versionchanged:: 1.2 The revision may be a single revision or - list of revisions when stamping multiple branch heads. - - :param sql: use ``--sql`` mode - - :param tag: an arbitrary "tag" that can be intercepted by custom - ``env.py`` scripts via the :class:`.EnvironmentContext.get_tag_argument` - method. - - :param purge: delete all entries in the version table before stamping. - - .. versionadded:: 1.2 - - """ - - script = ScriptDirectory.from_config(config) - - if sql: - destination_revs = [] - starting_rev = None - for _revision in util.to_list(revision): - if ":" in _revision: - srev, _revision = _revision.split(":", 2) - - if starting_rev != srev: - if starting_rev is None: - starting_rev = srev - else: - raise util.CommandError( - "Stamp operation with --sql only supports a " - "single starting revision at a time" - ) - destination_revs.append(_revision) - else: - destination_revs = util.to_list(revision) - - def do_stamp(rev, context): - return script._stamp_revs(util.to_tuple(destination_revs), rev) - - with EnvironmentContext( - config, - script, - fn=do_stamp, - as_sql=sql, - starting_rev=starting_rev if sql else None, - destination_rev=util.to_tuple(destination_revs), - tag=tag, - purge=purge, - ): - script.run_env() - - -def edit(config, rev): - """Edit revision script(s) using $EDITOR. - - :param config: a :class:`.Config` instance. - - :param rev: target revision. - - """ - - script = ScriptDirectory.from_config(config) - - if rev == "current": - - def edit_current(rev, context): - if not rev: - raise util.CommandError("No current revisions") - for sc in script.get_revisions(rev): - util.edit(sc.path) - return [] - - with EnvironmentContext(config, script, fn=edit_current): - script.run_env() - else: - revs = script.get_revisions(rev) - if not revs: - raise util.CommandError( - "No revision files indicated by symbol '%s'" % rev - ) - for sc in revs: - util.edit(sc.path) diff --git a/venv/lib/python3.7/site-packages/alembic/config.py b/venv/lib/python3.7/site-packages/alembic/config.py deleted file mode 100644 index f2c6ef9..0000000 --- a/venv/lib/python3.7/site-packages/alembic/config.py +++ /dev/null @@ -1,581 +0,0 @@ -from argparse import ArgumentParser -import inspect -import os -import sys - -from . import command -from . import util -from .util import compat -from .util.compat import SafeConfigParser - - -class Config(object): - - r"""Represent an Alembic configuration. - - Within an ``env.py`` script, this is available - via the :attr:`.EnvironmentContext.config` attribute, - which in turn is available at ``alembic.context``:: - - from alembic import context - - some_param = context.config.get_main_option("my option") - - When invoking Alembic programatically, a new - :class:`.Config` can be created by passing - the name of an .ini file to the constructor:: - - from alembic.config import Config - alembic_cfg = Config("/path/to/yourapp/alembic.ini") - - With a :class:`.Config` object, you can then - run Alembic commands programmatically using the directives - in :mod:`alembic.command`. - - The :class:`.Config` object can also be constructed without - a filename. Values can be set programmatically, and - new sections will be created as needed:: - - from alembic.config import Config - alembic_cfg = Config() - alembic_cfg.set_main_option("script_location", "myapp:migrations") - alembic_cfg.set_main_option("sqlalchemy.url", "postgresql://foo/bar") - alembic_cfg.set_section_option("mysection", "foo", "bar") - - .. warning:: - - When using programmatic configuration, make sure the - ``env.py`` file in use is compatible with the target configuration; - including that the call to Python ``logging.fileConfig()`` is - omitted if the programmatic configuration doesn't actually include - logging directives. - - For passing non-string values to environments, such as connections and - engines, use the :attr:`.Config.attributes` dictionary:: - - with engine.begin() as connection: - alembic_cfg.attributes['connection'] = connection - command.upgrade(alembic_cfg, "head") - - :param file\_: name of the .ini file to open. - :param ini_section: name of the main Alembic section within the - .ini file - :param output_buffer: optional file-like input buffer which - will be passed to the :class:`.MigrationContext` - used to redirect - the output of "offline generation" when using Alembic programmatically. - :param stdout: buffer where the "print" output of commands will be sent. - Defaults to ``sys.stdout``. - - .. versionadded:: 0.4 - - :param config_args: A dictionary of keys and values that will be used - for substitution in the alembic config file. The dictionary as given - is **copied** to a new one, stored locally as the attribute - ``.config_args``. When the :attr:`.Config.file_config` attribute is - first invoked, the replacement variable ``here`` will be added to this - dictionary before the dictionary is passed to ``SafeConfigParser()`` - to parse the .ini file. - - .. versionadded:: 0.7.0 - - :param attributes: optional dictionary of arbitrary Python keys/values, - which will be populated into the :attr:`.Config.attributes` dictionary. - - .. versionadded:: 0.7.5 - - .. seealso:: - - :ref:`connection_sharing` - - """ - - def __init__( - self, - file_=None, - ini_section="alembic", - output_buffer=None, - stdout=sys.stdout, - cmd_opts=None, - config_args=util.immutabledict(), - attributes=None, - ): - """Construct a new :class:`.Config` - - """ - self.config_file_name = file_ - self.config_ini_section = ini_section - self.output_buffer = output_buffer - self.stdout = stdout - self.cmd_opts = cmd_opts - self.config_args = dict(config_args) - if attributes: - self.attributes.update(attributes) - - cmd_opts = None - """The command-line options passed to the ``alembic`` script. - - Within an ``env.py`` script this can be accessed via the - :attr:`.EnvironmentContext.config` attribute. - - .. versionadded:: 0.6.0 - - .. seealso:: - - :meth:`.EnvironmentContext.get_x_argument` - - """ - - config_file_name = None - """Filesystem path to the .ini file in use.""" - - config_ini_section = None - """Name of the config file section to read basic configuration - from. Defaults to ``alembic``, that is the ``[alembic]`` section - of the .ini file. This value is modified using the ``-n/--name`` - option to the Alembic runnier. - - """ - - @util.memoized_property - def attributes(self): - """A Python dictionary for storage of additional state. - - - This is a utility dictionary which can include not just strings but - engines, connections, schema objects, or anything else. - Use this to pass objects into an env.py script, such as passing - a :class:`sqlalchemy.engine.base.Connection` when calling - commands from :mod:`alembic.command` programmatically. - - .. versionadded:: 0.7.5 - - .. seealso:: - - :ref:`connection_sharing` - - :paramref:`.Config.attributes` - - """ - return {} - - def print_stdout(self, text, *arg): - """Render a message to standard out. - - When :meth:`.Config.print_stdout` is called with additional args - those arguments will formatted against the provided text, - otherwise we simply output the provided text verbatim. - - e.g.:: - - >>> config.print_stdout('Some text %s', 'arg') - Some Text arg - - """ - - if arg: - output = compat.text_type(text) % arg - else: - output = compat.text_type(text) - - util.write_outstream(self.stdout, output, "\n") - - @util.memoized_property - def file_config(self): - """Return the underlying ``ConfigParser`` object. - - Direct access to the .ini file is available here, - though the :meth:`.Config.get_section` and - :meth:`.Config.get_main_option` - methods provide a possibly simpler interface. - - """ - - if self.config_file_name: - here = os.path.abspath(os.path.dirname(self.config_file_name)) - else: - here = "" - self.config_args["here"] = here - file_config = SafeConfigParser(self.config_args) - if self.config_file_name: - file_config.read([self.config_file_name]) - else: - file_config.add_section(self.config_ini_section) - return file_config - - def get_template_directory(self): - """Return the directory where Alembic setup templates are found. - - This method is used by the alembic ``init`` and ``list_templates`` - commands. - - """ - import alembic - - package_dir = os.path.abspath(os.path.dirname(alembic.__file__)) - return os.path.join(package_dir, "templates") - - def get_section(self, name, default=None): - """Return all the configuration options from a given .ini file section - as a dictionary. - - """ - if not self.file_config.has_section(name): - return default - - return dict(self.file_config.items(name)) - - def set_main_option(self, name, value): - """Set an option programmatically within the 'main' section. - - This overrides whatever was in the .ini file. - - :param name: name of the value - - :param value: the value. Note that this value is passed to - ``ConfigParser.set``, which supports variable interpolation using - pyformat (e.g. ``%(some_value)s``). A raw percent sign not part of - an interpolation symbol must therefore be escaped, e.g. ``%%``. - The given value may refer to another value already in the file - using the interpolation format. - - """ - self.set_section_option(self.config_ini_section, name, value) - - def remove_main_option(self, name): - self.file_config.remove_option(self.config_ini_section, name) - - def set_section_option(self, section, name, value): - """Set an option programmatically within the given section. - - The section is created if it doesn't exist already. - The value here will override whatever was in the .ini - file. - - :param section: name of the section - - :param name: name of the value - - :param value: the value. Note that this value is passed to - ``ConfigParser.set``, which supports variable interpolation using - pyformat (e.g. ``%(some_value)s``). A raw percent sign not part of - an interpolation symbol must therefore be escaped, e.g. ``%%``. - The given value may refer to another value already in the file - using the interpolation format. - - """ - - if not self.file_config.has_section(section): - self.file_config.add_section(section) - self.file_config.set(section, name, value) - - def get_section_option(self, section, name, default=None): - """Return an option from the given section of the .ini file. - - """ - if not self.file_config.has_section(section): - raise util.CommandError( - "No config file %r found, or file has no " - "'[%s]' section" % (self.config_file_name, section) - ) - if self.file_config.has_option(section, name): - return self.file_config.get(section, name) - else: - return default - - def get_main_option(self, name, default=None): - """Return an option from the 'main' section of the .ini file. - - This defaults to being a key from the ``[alembic]`` - section, unless the ``-n/--name`` flag were used to - indicate a different section. - - """ - return self.get_section_option(self.config_ini_section, name, default) - - -class CommandLine(object): - def __init__(self, prog=None): - self._generate_args(prog) - - def _generate_args(self, prog): - def add_options(fn, parser, positional, kwargs): - kwargs_opts = { - "template": ( - "-t", - "--template", - dict( - default="generic", - type=str, - help="Setup template for use with 'init'", - ), - ), - "message": ( - "-m", - "--message", - dict( - type=str, help="Message string to use with 'revision'" - ), - ), - "sql": ( - "--sql", - dict( - action="store_true", - help="Don't emit SQL to database - dump to " - "standard output/file instead. See docs on " - "offline mode.", - ), - ), - "tag": ( - "--tag", - dict( - type=str, - help="Arbitrary 'tag' name - can be used by " - "custom env.py scripts.", - ), - ), - "head": ( - "--head", - dict( - type=str, - help="Specify head revision or @head " - "to base new revision on.", - ), - ), - "splice": ( - "--splice", - dict( - action="store_true", - help="Allow a non-head revision as the " - "'head' to splice onto", - ), - ), - "depends_on": ( - "--depends-on", - dict( - action="append", - help="Specify one or more revision identifiers " - "which this revision should depend on.", - ), - ), - "rev_id": ( - "--rev-id", - dict( - type=str, - help="Specify a hardcoded revision id instead of " - "generating one", - ), - ), - "version_path": ( - "--version-path", - dict( - type=str, - help="Specify specific path from config for " - "version file", - ), - ), - "branch_label": ( - "--branch-label", - dict( - type=str, - help="Specify a branch label to apply to the " - "new revision", - ), - ), - "verbose": ( - "-v", - "--verbose", - dict(action="store_true", help="Use more verbose output"), - ), - "resolve_dependencies": ( - "--resolve-dependencies", - dict( - action="store_true", - help="Treat dependency versions as down revisions", - ), - ), - "autogenerate": ( - "--autogenerate", - dict( - action="store_true", - help="Populate revision script with candidate " - "migration operations, based on comparison " - "of database to model.", - ), - ), - "head_only": ( - "--head-only", - dict( - action="store_true", - help="Deprecated. Use --verbose for " - "additional output", - ), - ), - "rev_range": ( - "-r", - "--rev-range", - dict( - action="store", - help="Specify a revision range; " - "format is [start]:[end]", - ), - ), - "indicate_current": ( - "-i", - "--indicate-current", - dict( - action="store_true", - help="Indicate the current revision", - ), - ), - "purge": ( - "--purge", - dict( - action="store_true", - help="Unconditionally erase the version table " - "before stamping", - ), - ), - "package": ( - "--package", - dict( - action="store_true", - help="Write empty __init__.py files to the " - "environment and version locations", - ), - ), - } - positional_help = { - "directory": "location of scripts directory", - "revision": "revision identifier", - "revisions": "one or more revisions, or 'heads' for all heads", - } - for arg in kwargs: - if arg in kwargs_opts: - args = kwargs_opts[arg] - args, kw = args[0:-1], args[-1] - parser.add_argument(*args, **kw) - - for arg in positional: - if ( - arg == "revisions" - or fn in positional_translations - and positional_translations[fn][arg] == "revisions" - ): - subparser.add_argument( - "revisions", - nargs="+", - help=positional_help.get("revisions"), - ) - else: - subparser.add_argument(arg, help=positional_help.get(arg)) - - parser = ArgumentParser(prog=prog) - - parser.add_argument( - "-c", - "--config", - type=str, - default=os.environ.get("ALEMBIC_CONFIG", "alembic.ini"), - help="Alternate config file; defaults to value of " - 'ALEMBIC_CONFIG environment variable, or "alembic.ini"', - ) - parser.add_argument( - "-n", - "--name", - type=str, - default="alembic", - help="Name of section in .ini file to " "use for Alembic config", - ) - parser.add_argument( - "-x", - action="append", - help="Additional arguments consumed by " - "custom env.py scripts, e.g. -x " - "setting1=somesetting -x setting2=somesetting", - ) - parser.add_argument( - "--raiseerr", - action="store_true", - help="Raise a full stack trace on error", - ) - subparsers = parser.add_subparsers() - - positional_translations = {command.stamp: {"revision": "revisions"}} - - for fn in [getattr(command, n) for n in dir(command)]: - if ( - inspect.isfunction(fn) - and fn.__name__[0] != "_" - and fn.__module__ == "alembic.command" - ): - - spec = compat.inspect_getargspec(fn) - if spec[3]: - positional = spec[0][1 : -len(spec[3])] - kwarg = spec[0][-len(spec[3]) :] - else: - positional = spec[0][1:] - kwarg = [] - - if fn in positional_translations: - positional = [ - positional_translations[fn].get(name, name) - for name in positional - ] - - # parse first line(s) of helptext without a line break - help_ = fn.__doc__ - if help_: - help_text = [] - for line in help_.split("\n"): - if not line.strip(): - break - else: - help_text.append(line.strip()) - else: - help_text = "" - subparser = subparsers.add_parser( - fn.__name__, help=" ".join(help_text) - ) - add_options(fn, subparser, positional, kwarg) - subparser.set_defaults(cmd=(fn, positional, kwarg)) - self.parser = parser - - def run_cmd(self, config, options): - fn, positional, kwarg = options.cmd - - try: - fn( - config, - *[getattr(options, k, None) for k in positional], - **dict((k, getattr(options, k, None)) for k in kwarg) - ) - except util.CommandError as e: - if options.raiseerr: - raise - else: - util.err(str(e)) - - def main(self, argv=None): - options = self.parser.parse_args(argv) - if not hasattr(options, "cmd"): - # see http://bugs.python.org/issue9253, argparse - # behavior changed incompatibly in py3.3 - self.parser.error("too few arguments") - else: - cfg = Config( - file_=options.config, - ini_section=options.name, - cmd_opts=options, - ) - self.run_cmd(cfg, options) - - -def main(argv=None, prog=None, **kwargs): - """The console runner function for Alembic.""" - - CommandLine(prog=prog).main(argv=argv) - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.7/site-packages/alembic/context.py b/venv/lib/python3.7/site-packages/alembic/context.py deleted file mode 100644 index 758fca8..0000000 --- a/venv/lib/python3.7/site-packages/alembic/context.py +++ /dev/null @@ -1,5 +0,0 @@ -from .runtime.environment import EnvironmentContext - -# create proxy functions for -# each method on the EnvironmentContext class. -EnvironmentContext.create_module_class_proxy(globals(), locals()) diff --git a/venv/lib/python3.7/site-packages/alembic/ddl/__init__.py b/venv/lib/python3.7/site-packages/alembic/ddl/__init__.py deleted file mode 100644 index 7d50ba0..0000000 --- a/venv/lib/python3.7/site-packages/alembic/ddl/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from . import mssql # noqa -from . import mysql # noqa -from . import oracle # noqa -from . import postgresql # noqa -from . import sqlite # noqa -from .impl import DefaultImpl # noqa diff --git a/venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 95ed311abc2617a5b550f7ffb65ecad0dfd896b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 333 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 B>EHkW diff --git a/venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/mssql.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/mssql.cpython-37.pyc deleted file mode 100644 index 407a60be65c9b1d87ea15948c2f3350cb7c8fdc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7497 zcmcIpOK%*<5uVr1KKWX{C0QOzq{y`?O15JoFswv0A2wrY6_ZqKPvT6L+q2@5vk&zQ zEs0qsKq$ZokQm6x7sC*5@hSfxFmlOn$lQX!2cL5HDPPshJ|#tgkqj}t)zy!wuKK#F zy7|`7P)5P?^=DuG{Eu^r@=vO?p9F~Oc>S+bMG=ZnJ*B4Fno6|h={3VPnAW{S&9qIX z4bVwD$#lX?)zWsFX%lqD&VWvel$WjL>>Sf+&_nhR(;3ji_At{~&?EK;(>c(i_9)Xs zpvUYnriVf2?L5;XpvUcTrbj_f*b_{Tfu6J{na+crvZt6H2R&_1GdoT&Em;GAcUC0<~T1x}7R7sN&8yddVp{6odQfR-_Cxg-|2S6k zyu(@@-0Z4!OM$yt7w&yjhgQAPq3^DHZq2O+U}Vt?)T2?8 zG1qtH$N0ABOgM@X?Ei8Wn975yV#5C| z2v@OHq1c*GZCz-#A#^+8n)^v%h{T>&QKuC<`H50dg(;E`Q+A5!lt_b4i;T#^`Wfcs z#1ME{F~hY{G4?QR=R{tNqsI{QCd4Fq42xN=O^Ipr82Lmo6nhjlJ`<*IZg0PLgJcgA zHQ&GM?bzDex9sFkR<>5(S=q8v#h5CS?dZ|*8hA(W`im$6B~V++iMFq`)Ry+CswypI zUw>o>aQ73ZT1#;fLc!OxqCLsqaCS>UdC&3PW=WQUhAfz2!ar=fQqEw$Fy%PadNpty zJ6CSh1NVO5G@5}Q>UZ2A92p#|hlcNZl~6CqJE3-P4@OTrPT4E@zTwZx3yvtV`ulcTDsb47pq`TE}=T`{t3JbX0d?3$4l;>%UCJIH(tEPIC?`Uhe zEn}HXP7irM(hck7dmwuCQh{c^&|3PZ>ajuEkylX~R6a@&bxK+@pd+BcDSI z(c0NsDQ>TTlFQ3v}Lg25q|vz|}Ha$yTbB5!&a8R`#=KE5f;8#xGiF`t|o)2G9H} z(m`O-NMW>+Cour|YhU!wj5*L#+H+I&y ztkqjLZr?0g4Qy|~79h3mRf9dNc>Bf;t0Ar8t(}OL?%l(xbgf{|wcPtvKd9F4I23xQ zSIMfo_bjS8)~;(cvAJEbTu6kedhGe5Fy(}%U*2&SBBN@mfj9ay)s&u6M|(I_r#|!-(MMBVX!nNijx!`*K|6u{#TJN`y3fcJ z%Bj{I722_Of2pOdDId)p>p-r$ukGsxNjXE*BO^$(^Z)_zL?hpFcjkTaH>n`qQcr;W z7-@Pj9E!q8wO;lPh0A`VkO|F$d+Y(v;k$qZ#pzHj+e4*h(}n+u^ejolFa@v5=?wxM zfJ8|HTTPNTFBp-P5>?7=HEnDZQjuqzgS25%R1r$cfjwRoNcyUk zDw3+Er10)aJJ(L1$PnEv5@vS~y#pu>7!G1p%kN`4+mMZWQT%!w#y>=dU*h%iC=|qG z0&ZTL;@=6q*XQ<3UnULHL*6!tmo@!+5G{k^n9xqO<3uYV=Sb%PCo%%KZ2Lv@F}RP} zGUYoxeSp)RJ|_1`wvuw6`vBK1_~jFwFdGo6$!hF%E1F2Q^s3r2B0tU6NEPjTglGYG z(N0UB?x^h1p5AbK<%6S1@@Y)=dNg~grz6baR`1lE1NQ;@ltMDpn~i3KdvX!sWXEM~ zyxVnJy{2RNqKyP3Py!+;0222JG?&4 ztY8xvY~NwMpP~)cYwpyqR`7^$y-R!O-)6acOfMUa)WqHrkA zOUth3IZoG&v=wlXdQu8ZuTNPMoHYGuqgu|)nJGP&MlRFyH~eZUlN;tSWpwX6lrmk% z%eh+jxFIwg40NF*(KIBPx=enK9{Qz0?6Apk0=kN$0KST&!a*yJ)TFaMs<3y76alWIE-u?KUG(wB{6HQNxfJUe;XHj%QH@Qc0lkej7 zNzoLH@Nyu+uU;{JW*qCs#&P1eVjyd|xVOR~IIl8djr_Ie?MqZ|TBU;8!dr-ZMMtcq;ZtocRSdj&sp zZ_mX<6k_T)AMWmBm{S$jHLF7}F3c}R*`OmDLBYpRnyBC}6f!u7SO6|dusAr$QhVCS zn_=1l=EZC=)GSya7Dql$Q|J$?Yz=juwLq2SRquGLue*6 zXhmJHgt^{%!c5N+5>XP^MG$W+3WaduNvMwQTsrqOQd($v;*fsOg|mFjblU#2Cv^N7 zGw|k6boNB*Xu6#!W>oneT06j@e2>7xzV;eB9^Z~|b1E%r6 z08EAgVo%8Pt;&J5->BBDfrdCQr1o;AQOD162T9k!Tkcx23%3}B)I12H{}zeA=!4>u zW?CYV+VlT^At`?ZyGgPjyj2%wH;G$}xa_pLO$sR(O88l53JNYhcFfW=6g10mFa9dYEOPIN{Wu2pa<#woa>F`~5MQ384G zypQ;l#URdDSkf@gqe`N4Iw1dE&t3GZjy2JjCQIX@;G<8^&JE-?bP2q#3 zCbe;H54q`b=u_nOaFdYHTv=NqAys<@_gyh69lz<8kyn@b2o1ql)g)x3?|#ALHX8nc zm%Y5Aa=lLu+N&%F9crGYy%P-?E4h911Zlv2QZ5UPoO&hNp+@m2%lf3#!n|)AbfiB@ zwGZ^j3;VSkr9`jcgL0e-I?D1v_nCU0jPx8szkPuJ8snpr7Arf0WKiA)@5u|Lr0l<0 zXhm-uVg}11Tdb{btlYlAXQGW;TV$H#;L64@IZi>*HL@HL8_#Zx1eA<$a0WR`VNTN^lu2-6V+$3xdxZr*(*u&7h)4el#<_hwC zCg6eiH(H;IvLR-%uxMv+6H@Z%?(Bioz>{yFu&2A+W!%Ff2J(M^q$C$?kM*=hSqk5( z@a2g;+uL~8!*JXP_&$zPlDvN+k3r5~4pA{o#RwI=r)Zl+Dq#mg z_t2qH#s4lOoys_D@vR)6hd9}f@>@z%ID)W4W^c%zf;Sc;P?8-b=^{$S`~7K{dNVpQ r{s790ZqVquJpR)3sU%mrBqD diff --git a/venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/mysql.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/mysql.cpython-37.pyc deleted file mode 100644 index 67f709bc90f00c4c292000390babab36935c0779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8226 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 ZX;yR9^VRGd$b4?5I8&XOMr?WFe*waMtQi0R diff --git a/venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/oracle.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/oracle.cpython-37.pyc deleted file mode 100644 index 6fd64078fc1881a309ad3536b40eeb6565b9654b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3990 zcmb7HOLH5?5#BczPl6C%qAVM>r6foqQgQ4gPC2PSAfzB6!731PDs%AGa%Ukey}N*C z7qSVHC#cG&=$czfI_6*ackD5#9Q+r2N_X$##S*PDP&?@9*_r9**Nq3|azTR6|Ni;y zXaA{4(tmL>`)EM?37+UvS(3QKWnT(pCd)`Gz7nWR1zP2ruLU~OiPnKOm_f7wbdKeS z&H-&QlV}s@Jj)ZE2fDxtL>GWAvLew%pi8VobP4D(D-&G?y22_%SAbq)YecUBU1e3G ztNwaWV>MZNB=L1#doJ;sTbruvhAX=|zcE$#2H$)xO=Y$LoC0yS_%?Aifm0;T4!=p9 zE#Tydv&(N0XB#*sao*y$iL(Qo9C6;}?-1uEaH_u%5W=Kr`>`vm*go}Ln3mIp z)-VX%FkUbY+<`szkx@wB=-L6kU&&@;-_K6S*86ZHtk(uZ5!kWi(0x{z?%K?_kt?3T z<$QkldbU8~%-$}}nCX$lo{Puyv-^sfXq{l>JE;EbV`fA&0K%1+%q6C9nWEi-N1bk;BL`qjRwXvfM^34HzW3CL8kP#=_2f zGbtSf*WshXgXSUAdI03;9w*1Bv@EYB;{sk$Q!O)4)t}w_%8F*qs_f zx7@E>hZ%NcK}LyPSYTz)Bla9?IF3i-xS@+%$jyVXqF9WbIMKiskwD=SL%0#8ka!!< zdGz%01=CEzK_ow;|id(!UL`@LrO zq}l3sj=S|aed#i7A6H{$<=jy6BFtNJkb^mrmW4shP%%_AR;kmlEMN|6C-k-x`CY(Y|b-W zPK*?v8)}ksAr%4o=Osi?^e&X5m`$qBya)niam0NTkn&Sey!VIK!f&a3Kers~Z$XWM=UZ>C8~Iu>N{Yv8PCnF9v-3eUe@ORmH^`OTPu$1*+D zB|Rq!I4^faH}NYtRD6H~B3q(UXg1!Y%=(HlxTgubR~7jPI4g>vRY?)F?DdLd;ipfP zObMksxe3ndwY$xucD;3c`1q&`eyjJ7F&wXYOO)Vr(un0k_e*LIew;eE` z&Wbv7zkKq8>R|M7>GQn!5Ikg%hd{M0>6&Pq6b{-Cn~x9spxdN0qbV-0_g#|9`W;aQ zS>EWqjTP@@TTf79>b28IRCZ;7(K*){F=LJ!zlRBzF99jeq?d#nq~k6k2xz9n&?LN) zUMWxy)ibPt20Xb7Xp;V+LLG$s`xw!?-R;+*lw>~rdI2eydtc8o1-x-t@0`?uK^^3! z*o4bLNlH)*-6WSSHB455LJAN>t*T%f!VNjJgT4nC4A}h4_Q$UH81@K+!NfR;g%>_a zjI;-ML|vBSzxrxZHhw7)8ajt zT$dJHnyL#VUR$I?ngl5(FCa@`4QCaI|FjKH``$ODK`o67uo>1raz+T}EMxE=U_O@~ zD>=4{^R9uUhgyR1O-e{_7%dH8osRGBifp%6qS8s2dQBMFS2;f-mJK=b)+Xe+#p zAOuSvHKA}Dc3&^#*^Nf?;DD}UJJ3?j{v|{s*YO6P1Fh9CgxDdNz6XcA4yy&$lL+-BPlT(*z3?tBkA*S%Ss36z&rmR7NyqX^SZZTL%qd6Ob9qK3e(OyqIEgcC&^ z2(~bN$#;at0s|<~JZSu>aY&0fmO-i#0ufdqE>WUVWC?Uo3hF5Il7SZiYkrb;HGjme dFT&%XJ5;bkeC=1Q-maOoJbjC`YRxpY{{t3(c5nay diff --git a/venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/postgresql.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/postgresql.cpython-37.pyc deleted file mode 100644 index 78026ae2cf57721bbfd2cee0c9e38801ebc5fe30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13958 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 diff --git a/venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/sqlite.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/ddl/__pycache__/sqlite.cpython-37.pyc deleted file mode 100644 index 955ed7590b391483c92ea5a53bb2acee832ce619..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3316 zcmd5;PjB4D6`vuw617@MmhHNB(590>fwge7N&y#fji60k$3=laX(OQpSVauQnU%&O zIrPlXvWU&4HjrDdxfRx_=(p(S;I-(%U!j-wy&-qC65K;CMF*I_9L~IX@AuyCJz81m z6Da@q?r#VC*9rMMPNpS*!KYBoeP}r0G$Rq=9``evdyz*84|p&0^B@W+`4!;{eDM|G zi^6;9M?Fq=$uN8af0CUy6xtzemLH38Qf2nnd6~WO+O?pvGD~sWwBWT^%gf@fE%beV?y?OU9J1@oTS^qUCQ% zK%xN%cD?EE{`PZe1&R_am}eP`pQI=g7Qd^%gx+jI^WyypeM%mauWo+hO+c7Cpof!1 z9ddt{JPUshn%E`02L~_I|N2tcN*8QTSAxkgv&VuR$>*YA57R6$=Hb_)M~O|3zbJ)H ztW*RwP1aZ<2^^Eg#mmBUaA zR%&5HVdrkr&e(p`zt|ZKTDfCcaPb0+qE*?B_nzzkE_#QkkfGlMMr7kCbkkUsji<`L z5{(G`=f~SNFSkosZpp$}c*@pC>L*5+aj~6bB0rSrtmi!2ZY?@0&zg6%cveXeGoGps zu8!RmYiQmO8nQH?0~&hu2N$Rq{pbH?I6=H1Rvb<~gaM+2lao;2w3O4A^pCW-Iiat~ zgq%~oX}#9~;&Td~LjWuOPW|T{#Y|O}N?SHon*HMQz0ba6Y7EAOSL#F-)}Vzu`)~+A{`Mv*1JSf$^JhRbQm;)xC5E4 zGSS@FQ7+7g9MCEFXId+*dtjj^I8Agh^fcPN>9u-BggKb$Wn5itp*yv}yRc>k&=9{* zJsJjm8qoUA98@mvzXT72h=a#17|h^teF_f;1n>VI2%xVOkYBGt)9FrM!-XrFTXU{` z0p4xcV-}zx6jfKhGpDpGTT`?S7VNP)tv!Ol#0QsJ(i@h%2B+fQ#6S1H@!bsEshv#% zx98z(HGnv#+dhW38z5yu!VnPG_p!F4`n@?tzWwh@C`3+m`ur3I6KX=FXQwM~LeD*Y zdp7sod~-Gr-24H~k>L0OXmc?E!Y7Y~6*`xNW4VO2va?QhCJlrY5R!=($PvZ`2@Puw z9LXih*aMakj!vvnEKiCv21F^eV@HT?iN#aE5?3xU$ctK45Vx$B<&3B#2d9@Q@*O*s z_E=Sxp?(XXGlPP04pGb~b_zjKW*IKD8%#@&vY4F(_Bdk*138u{OCj!>IkJ0FFCF~h zqphFrkG|Td7Y^=@?%my}LqOW-9^hIZY!_^%F4r>PhA=(P?qnEy=3Yj8v7e&ie& zOmCp$VIDN5x6nc9CsR&q7CQ*k!R7~M2pYHz2Q>bXu*0BrtfiSpG(DH!M9XbT0n7}n zawVqRN-C?4MA7*i(D)ch@DNUILksxDs&~mF-u_4G!!KAcy5JKr*qaB?SYqjfy!4)e zH$b*XC!VAe|2ywb6k>>{@5A%`NdV8j56=$p$rxK4g*WS9rOSTXJv?Z7K$${o)MRs` z4F@qKCo>~D&2-U5e;;<~AL3T;5x7dt~6mB7fCMSxar3+WDUTXFdoG5vnt8jFVS)wcL_%vN9&Li6eda0 zCzA}Hp^*~xIyM-j^!KnqTk9WSg90`yo#?5^vZ?rJ-XYcR;U@PK)XySRhi8ayUeF8I z!u2o=Z-+O+(CKfu&^l6pS%yYKHpKC{`#J|12Oh`b;V138eufFDLrUmDn& - when issuing DDL for this constraint. - :param schema: Optional schema name to operate within. - - .. versionadded:: 0.9.0 - - """ - op = cls(constraint_name, table_name, elements, **kw) - return operations.invoke(op) - - @classmethod - def batch_create_exclude_constraint( - cls, operations, constraint_name, *elements, **kw - ): - """Issue a "create exclude constraint" instruction using the - current batch migration context. - - .. note:: This method is Postgresql specific, and additionally - requires at least SQLAlchemy 1.0. - - .. versionadded:: 0.9.0 - - .. seealso:: - - :meth:`.Operations.create_exclude_constraint` - - """ - kw["schema"] = operations.impl.schema - op = cls(constraint_name, operations.impl.table_name, elements, **kw) - return operations.invoke(op) - - -@render.renderers.dispatch_for(CreateExcludeConstraintOp) -def _add_exclude_constraint(autogen_context, op): - return _exclude_constraint(op.to_constraint(), autogen_context, alter=True) - - -@render._constraint_renderers.dispatch_for(ExcludeConstraint) -def _render_inline_exclude_constraint(constraint, autogen_context): - rendered = render._user_defined_render( - "exclude", constraint, autogen_context - ) - if rendered is not False: - return rendered - - return _exclude_constraint(constraint, autogen_context, False) - - -def _postgresql_autogenerate_prefix(autogen_context): - - imports = autogen_context.imports - if imports is not None: - imports.add("from sqlalchemy.dialects import postgresql") - return "postgresql." - - -def _exclude_constraint(constraint, autogen_context, alter): - opts = [] - - has_batch = autogen_context._has_batch - - if constraint.deferrable: - opts.append(("deferrable", str(constraint.deferrable))) - if constraint.initially: - opts.append(("initially", str(constraint.initially))) - if constraint.using: - opts.append(("using", str(constraint.using))) - if not has_batch and alter and constraint.table.schema: - opts.append(("schema", render._ident(constraint.table.schema))) - if not alter and constraint.name: - opts.append( - ("name", render._render_gen_name(autogen_context, constraint.name)) - ) - - if alter: - args = [ - repr(render._render_gen_name(autogen_context, constraint.name)) - ] - if not has_batch: - args += [repr(render._ident(constraint.table.name))] - args.extend( - [ - "(%s, %r)" - % ( - _render_potential_column(sqltext, autogen_context), - opstring, - ) - for sqltext, name, opstring in constraint._render_exprs - ] - ) - if constraint.where is not None: - args.append( - "where=%s" - % render._render_potential_expr( - constraint.where, autogen_context - ) - ) - args.extend(["%s=%r" % (k, v) for k, v in opts]) - return "%(prefix)screate_exclude_constraint(%(args)s)" % { - "prefix": render._alembic_autogenerate_prefix(autogen_context), - "args": ", ".join(args), - } - else: - args = [ - "(%s, %r)" - % (_render_potential_column(sqltext, autogen_context), opstring) - for sqltext, name, opstring in constraint._render_exprs - ] - if constraint.where is not None: - args.append( - "where=%s" - % render._render_potential_expr( - constraint.where, autogen_context - ) - ) - args.extend(["%s=%r" % (k, v) for k, v in opts]) - return "%(prefix)sExcludeConstraint(%(args)s)" % { - "prefix": _postgresql_autogenerate_prefix(autogen_context), - "args": ", ".join(args), - } - - -def _render_potential_column(value, autogen_context): - if isinstance(value, ColumnClause): - template = "%(prefix)scolumn(%(name)r)" - - return template % { - "prefix": render._sqlalchemy_autogenerate_prefix(autogen_context), - "name": value.name, - } - - else: - return render._render_potential_expr( - value, autogen_context, wrap_in_text=False - ) diff --git a/venv/lib/python3.7/site-packages/alembic/ddl/sqlite.py b/venv/lib/python3.7/site-packages/alembic/ddl/sqlite.py deleted file mode 100644 index 84e9dd8..0000000 --- a/venv/lib/python3.7/site-packages/alembic/ddl/sqlite.py +++ /dev/null @@ -1,136 +0,0 @@ -import re - -from .impl import DefaultImpl -from .. import util - - -class SQLiteImpl(DefaultImpl): - __dialect__ = "sqlite" - - transactional_ddl = False - """SQLite supports transactional DDL, but pysqlite does not: - see: http://bugs.python.org/issue10740 - """ - - def requires_recreate_in_batch(self, batch_op): - """Return True if the given :class:`.BatchOperationsImpl` - would need the table to be recreated and copied in order to - proceed. - - Normally, only returns True on SQLite when operations other - than add_column are present. - - """ - for op in batch_op.batch: - if op[0] not in ("add_column", "create_index", "drop_index"): - return True - else: - return False - - def add_constraint(self, const): - # attempt to distinguish between an - # auto-gen constraint and an explicit one - if const._create_rule is None: - raise NotImplementedError( - "No support for ALTER of constraints in SQLite dialect" - "Please refer to the batch mode feature which allows for " - "SQLite migrations using a copy-and-move strategy." - ) - elif const._create_rule(self): - util.warn( - "Skipping unsupported ALTER for " - "creation of implicit constraint" - "Please refer to the batch mode feature which allows for " - "SQLite migrations using a copy-and-move strategy." - ) - - def drop_constraint(self, const): - if const._create_rule is None: - raise NotImplementedError( - "No support for ALTER of constraints in SQLite dialect" - "Please refer to the batch mode feature which allows for " - "SQLite migrations using a copy-and-move strategy." - ) - - def compare_server_default( - self, - inspector_column, - metadata_column, - rendered_metadata_default, - rendered_inspector_default, - ): - - if rendered_metadata_default is not None: - rendered_metadata_default = re.sub( - r"^\((.+)\)$", r"\1", rendered_metadata_default - ) - - rendered_metadata_default = re.sub( - r"^\"?'(.+)'\"?$", r"\1", rendered_metadata_default - ) - - if rendered_inspector_default is not None: - rendered_inspector_default = re.sub( - r"^\"?'(.+)'\"?$", r"\1", rendered_inspector_default - ) - - return rendered_inspector_default != rendered_metadata_default - - def _guess_if_default_is_unparenthesized_sql_expr(self, expr): - """Determine if a server default is a SQL expression or a constant. - - There are too many assertions that expect server defaults to round-trip - identically without parenthesis added so we will add parens only in - very specific cases. - - """ - if not expr: - return False - elif re.match(r"^[0-9\.]$", expr): - return False - elif re.match(r"^'.+'$", expr): - return False - elif re.match(r"^\(.+\)$", expr): - return False - else: - return True - - def autogen_column_reflect(self, inspector, table, column_info): - # SQLite expression defaults require parenthesis when sent - # as DDL - if self._guess_if_default_is_unparenthesized_sql_expr( - column_info.get("default", None) - ): - column_info["default"] = "(%s)" % (column_info["default"],) - - def render_ddl_sql_expr(self, expr, is_server_default=False, **kw): - # SQLite expression defaults require parenthesis when sent - # as DDL - str_expr = super(SQLiteImpl, self).render_ddl_sql_expr( - expr, is_server_default=is_server_default, **kw - ) - - if ( - is_server_default - and self._guess_if_default_is_unparenthesized_sql_expr(str_expr) - ): - str_expr = "(%s)" % (str_expr,) - return str_expr - - -# @compiles(AddColumn, 'sqlite') -# def visit_add_column(element, compiler, **kw): -# return "%s %s" % ( -# alter_table(compiler, element.table_name, element.schema), -# add_column(compiler, element.column, **kw) -# ) - - -# def add_column(compiler, column, **kw): -# text = "ADD COLUMN %s" % compiler.get_column_specification(column, **kw) -# need to modify SQLAlchemy so that the CHECK associated with a Boolean -# or Enum gets placed as part of the column constraints, not the Table -# see ticket 98 -# for const in column.constraints: -# text += compiler.process(AddConstraint(const)) -# return text diff --git a/venv/lib/python3.7/site-packages/alembic/op.py b/venv/lib/python3.7/site-packages/alembic/op.py deleted file mode 100644 index f3f5fac..0000000 --- a/venv/lib/python3.7/site-packages/alembic/op.py +++ /dev/null @@ -1,5 +0,0 @@ -from .operations.base import Operations - -# create proxy functions for -# each method on the Operations class. -Operations.create_module_class_proxy(globals(), locals()) diff --git a/venv/lib/python3.7/site-packages/alembic/operations/__init__.py b/venv/lib/python3.7/site-packages/alembic/operations/__init__.py deleted file mode 100644 index dc2d3a4..0000000 --- a/venv/lib/python3.7/site-packages/alembic/operations/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from . import toimpl # noqa -from .base import BatchOperations -from .base import Operations -from .ops import MigrateOperation - - -__all__ = ["Operations", "BatchOperations", "MigrateOperation"] diff --git a/venv/lib/python3.7/site-packages/alembic/operations/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/operations/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 11685c527c8f141468546bcad81da7449e0c4773..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 339 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 diff --git a/venv/lib/python3.7/site-packages/alembic/operations/__pycache__/batch.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/operations/__pycache__/batch.cpython-37.pyc deleted file mode 100644 index 7ea2f4721aac5ae77583854307999ebab8cb83e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14147 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 diff --git a/venv/lib/python3.7/site-packages/alembic/operations/__pycache__/ops.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/operations/__pycache__/ops.cpython-37.pyc deleted file mode 100644 index c10f8091fca1dd5f4453791acae93041285d7c55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75705 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�u 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 Yk=$L8>jvJ`@cri0;i;*qho%nxe;SYUi2wiq diff --git a/venv/lib/python3.7/site-packages/alembic/operations/__pycache__/schemaobj.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/operations/__pycache__/schemaobj.cpython-37.pyc deleted file mode 100644 index 6a3d3ea3d0316aa74ab51ec13a46464f008f3fc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6087 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 diff --git a/venv/lib/python3.7/site-packages/alembic/operations/__pycache__/toimpl.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/operations/__pycache__/toimpl.cpython-37.pyc deleted file mode 100644 index f3c667611111306217efd623125b9618bfb35a24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4609 zcmb_fNsrvd6=soalFeqX)1z55l17WiX(!S+8?rzUVviHRh%!!M2Lc!*jh-e)Ce2<{ zNN4h{?hfiFJv+?-4D7ktRC;5EoWe<7!QuZm>%bd<3Wq#N}}ezkq|-m6!y z-mKSc1;2lO_T_KiyP_!nppW9G;pImt@k6F4p5n1c88KI7il=&7q>Xe}7w>vh85ypD z_ljpk=E!m_rufFZ>g%C>&OFnzK2n}Bx0YiLu&QSZte#^HU^UMXSTo03!0KK@VC@|1 z0Bd?Jfvx3O7g*ct2y8vat^ix}x&qtCu}xs>-W7pu<=8f`4R2FmS95F!*p{~~uxmMX z9oSWGM_@N{Y!}!y@4CQl=GZM@H@sbe-OjN)z;1fC1onz|`(34X=Q-)P$1)=xzVD9) z&!J%Y)F#sy5Br^|&j(2`8OP66SyPLjM1%ftGMWyOAz}1uqtsEzQ1NRRBUM5rWOG$M zJ>^{eqmr^vo2iicOoObd`hGaJ&G)gbFL2eL7%|6Vy} z9`n?XtXU&f`CrotiV`-%R%#~gc_%ee^;}IYPy1M#HBWD)&2a54PV_LutebMyPuLUV5nLH2s2mPS>GY!~sc;P?-i1g&En%VhOm&pW zbqt_6$`sGJ_6Oyhp))(|>6snG!8lF^B6+00Sm`5R4Po z=?}R-Nc=uOiF`8gu&l$EMTQL`pZ`Vq*Mt3JG~J&D)4O8yD7yRlL zhUIfoy2*Yr2}aZC-t;VM!%I%a31l((4y{XvP*{Wg?$tq*_#D;I$!L7ux^8XQG_)`)%nAv$~h@!%v%GJQN4`B^17n_^+qI;;DqL7W8R$9)2` zjq-D)XS=K@2REUFkv~qdR#}%Ly{$~AsJ1Upt}2h<8ESUC*0dO6)=?n#CN= zU@!cuPQ^lv%4}w-4zpNGr7s<2^=~j+jG{8MLtC4PdCF)<{#8LaK#7T@*x4+V@lHEu z6j#LFrtQhM&?2*iiiIIEE1C4=TYD5dmhqKzn)s(lPvx(mJ>Mfi%auYb_G|e335wi8 zpw9^@X;I{$%_V5Pju#LjYM_I#tAuJuVOLMpW7PxMuo93oWKa`y)kC?{Ot%V((kT2j zj3n1k%iV-*wPeOyXwcJ^Xy2wDE8M>h>}M#k0ii&tU{BZu_Ot@Qo_u7L{aiy>UskNp zV=(so(@R4%5jdpdkYa!*Mx<+b=y5y0PH0LcbL;IXf=JGAi3{7re483HgK-p${StLM#cO|%Bs@4e zNql!b_qhBZEUa5wimKw=Tv@}b#Efj1RRlBFc^V||7vsxQbY*{k2dz^SkzXp1R6h~x%(c$KH2%G1 E14SeaSpWb4 diff --git a/venv/lib/python3.7/site-packages/alembic/operations/base.py b/venv/lib/python3.7/site-packages/alembic/operations/base.py deleted file mode 100644 index 602b7c7..0000000 --- a/venv/lib/python3.7/site-packages/alembic/operations/base.py +++ /dev/null @@ -1,502 +0,0 @@ -from contextlib import contextmanager -import textwrap - -from . import batch -from . import schemaobj -from .. import util -from ..util import sqla_compat -from ..util.compat import exec_ -from ..util.compat import inspect_formatargspec -from ..util.compat import inspect_getargspec - -__all__ = ("Operations", "BatchOperations") - -try: - from sqlalchemy.sql.naming import conv -except: - conv = None - - -class Operations(util.ModuleClsProxy): - - """Define high level migration operations. - - Each operation corresponds to some schema migration operation, - executed against a particular :class:`.MigrationContext` - which in turn represents connectivity to a database, - or a file output stream. - - While :class:`.Operations` is normally configured as - part of the :meth:`.EnvironmentContext.run_migrations` - method called from an ``env.py`` script, a standalone - :class:`.Operations` instance can be - made for use cases external to regular Alembic - migrations by passing in a :class:`.MigrationContext`:: - - from alembic.migration import MigrationContext - from alembic.operations import Operations - - conn = myengine.connect() - ctx = MigrationContext.configure(conn) - op = Operations(ctx) - - op.alter_column("t", "c", nullable=True) - - Note that as of 0.8, most of the methods on this class are produced - dynamically using the :meth:`.Operations.register_operation` - method. - - """ - - _to_impl = util.Dispatcher() - - def __init__(self, migration_context, impl=None): - """Construct a new :class:`.Operations` - - :param migration_context: a :class:`.MigrationContext` - instance. - - """ - self.migration_context = migration_context - if impl is None: - self.impl = migration_context.impl - else: - self.impl = impl - - self.schema_obj = schemaobj.SchemaObjects(migration_context) - - @classmethod - def register_operation(cls, name, sourcename=None): - """Register a new operation for this class. - - This method is normally used to add new operations - to the :class:`.Operations` class, and possibly the - :class:`.BatchOperations` class as well. All Alembic migration - operations are implemented via this system, however the system - is also available as a public API to facilitate adding custom - operations. - - .. versionadded:: 0.8.0 - - .. seealso:: - - :ref:`operation_plugins` - - - """ - - def register(op_cls): - if sourcename is None: - fn = getattr(op_cls, name) - source_name = fn.__name__ - else: - fn = getattr(op_cls, sourcename) - source_name = fn.__name__ - - spec = inspect_getargspec(fn) - - name_args = spec[0] - assert name_args[0:2] == ["cls", "operations"] - - name_args[0:2] = ["self"] - - args = inspect_formatargspec(*spec) - num_defaults = len(spec[3]) if spec[3] else 0 - if num_defaults: - defaulted_vals = name_args[0 - num_defaults :] - else: - defaulted_vals = () - - apply_kw = inspect_formatargspec( - name_args, - spec[1], - spec[2], - defaulted_vals, - formatvalue=lambda x: "=" + x, - ) - - func_text = textwrap.dedent( - """\ - def %(name)s%(args)s: - %(doc)r - return op_cls.%(source_name)s%(apply_kw)s - """ - % { - "name": name, - "source_name": source_name, - "args": args, - "apply_kw": apply_kw, - "doc": fn.__doc__, - "meth": fn.__name__, - } - ) - globals_ = {"op_cls": op_cls} - lcl = {} - exec_(func_text, globals_, lcl) - setattr(cls, name, lcl[name]) - fn.__func__.__doc__ = ( - "This method is proxied on " - "the :class:`.%s` class, via the :meth:`.%s.%s` method." - % (cls.__name__, cls.__name__, name) - ) - if hasattr(fn, "_legacy_translations"): - lcl[name]._legacy_translations = fn._legacy_translations - return op_cls - - return register - - @classmethod - def implementation_for(cls, op_cls): - """Register an implementation for a given :class:`.MigrateOperation`. - - This is part of the operation extensibility API. - - .. seealso:: - - :ref:`operation_plugins` - example of use - - """ - - def decorate(fn): - cls._to_impl.dispatch_for(op_cls)(fn) - return fn - - return decorate - - @classmethod - @contextmanager - def context(cls, migration_context): - op = Operations(migration_context) - op._install_proxy() - yield op - op._remove_proxy() - - @contextmanager - def batch_alter_table( - self, - table_name, - schema=None, - recreate="auto", - partial_reordering=None, - copy_from=None, - table_args=(), - table_kwargs=util.immutabledict(), - reflect_args=(), - reflect_kwargs=util.immutabledict(), - naming_convention=None, - ): - """Invoke a series of per-table migrations in batch. - - Batch mode allows a series of operations specific to a table - to be syntactically grouped together, and allows for alternate - modes of table migration, in particular the "recreate" style of - migration required by SQLite. - - "recreate" style is as follows: - - 1. A new table is created with the new specification, based on the - migration directives within the batch, using a temporary name. - - 2. the data copied from the existing table to the new table. - - 3. the existing table is dropped. - - 4. the new table is renamed to the existing table name. - - The directive by default will only use "recreate" style on the - SQLite backend, and only if directives are present which require - this form, e.g. anything other than ``add_column()``. The batch - operation on other backends will proceed using standard ALTER TABLE - operations. - - The method is used as a context manager, which returns an instance - of :class:`.BatchOperations`; this object is the same as - :class:`.Operations` except that table names and schema names - are omitted. E.g.:: - - with op.batch_alter_table("some_table") as batch_op: - batch_op.add_column(Column('foo', Integer)) - batch_op.drop_column('bar') - - The operations within the context manager are invoked at once - when the context is ended. When run against SQLite, if the - migrations include operations not supported by SQLite's ALTER TABLE, - the entire table will be copied to a new one with the new - specification, moving all data across as well. - - The copy operation by default uses reflection to retrieve the current - structure of the table, and therefore :meth:`.batch_alter_table` - in this mode requires that the migration is run in "online" mode. - The ``copy_from`` parameter may be passed which refers to an existing - :class:`.Table` object, which will bypass this reflection step. - - .. note:: The table copy operation will currently not copy - CHECK constraints, and may not copy UNIQUE constraints that are - unnamed, as is possible on SQLite. See the section - :ref:`sqlite_batch_constraints` for workarounds. - - :param table_name: name of table - :param schema: optional schema name. - :param recreate: under what circumstances the table should be - recreated. At its default of ``"auto"``, the SQLite dialect will - recreate the table if any operations other than ``add_column()``, - ``create_index()``, or ``drop_index()`` are - present. Other options include ``"always"`` and ``"never"``. - :param copy_from: optional :class:`~sqlalchemy.schema.Table` object - that will act as the structure of the table being copied. If omitted, - table reflection is used to retrieve the structure of the table. - - .. versionadded:: 0.7.6 Fully implemented the - :paramref:`~.Operations.batch_alter_table.copy_from` - parameter. - - .. seealso:: - - :ref:`batch_offline_mode` - - :paramref:`~.Operations.batch_alter_table.reflect_args` - - :paramref:`~.Operations.batch_alter_table.reflect_kwargs` - - :param reflect_args: a sequence of additional positional arguments that - will be applied to the table structure being reflected / copied; - this may be used to pass column and constraint overrides to the - table that will be reflected, in lieu of passing the whole - :class:`~sqlalchemy.schema.Table` using - :paramref:`~.Operations.batch_alter_table.copy_from`. - - .. versionadded:: 0.7.1 - - :param reflect_kwargs: a dictionary of additional keyword arguments - that will be applied to the table structure being copied; this may be - used to pass additional table and reflection options to the table that - will be reflected, in lieu of passing the whole - :class:`~sqlalchemy.schema.Table` using - :paramref:`~.Operations.batch_alter_table.copy_from`. - - .. versionadded:: 0.7.1 - - :param table_args: a sequence of additional positional arguments that - will be applied to the new :class:`~sqlalchemy.schema.Table` when - created, in addition to those copied from the source table. - This may be used to provide additional constraints such as CHECK - constraints that may not be reflected. - :param table_kwargs: a dictionary of additional keyword arguments - that will be applied to the new :class:`~sqlalchemy.schema.Table` - when created, in addition to those copied from the source table. - This may be used to provide for additional table options that may - not be reflected. - - .. versionadded:: 0.7.0 - - :param naming_convention: a naming convention dictionary of the form - described at :ref:`autogen_naming_conventions` which will be applied - to the :class:`~sqlalchemy.schema.MetaData` during the reflection - process. This is typically required if one wants to drop SQLite - constraints, as these constraints will not have names when - reflected on this backend. Requires SQLAlchemy **0.9.4** or greater. - - .. seealso:: - - :ref:`dropping_sqlite_foreign_keys` - - .. versionadded:: 0.7.1 - - :param partial_reordering: a list of tuples, each suggesting a desired - ordering of two or more columns in the newly created table. Requires - that :paramref:`.batch_alter_table.recreate` is set to ``"always"``. - Examples, given a table with columns "a", "b", "c", and "d": - - Specify the order of all columns:: - - with op.batch_alter_table( - "some_table", recreate="always", - partial_reordering=[("c", "d", "a", "b")] - ) as batch_op: - pass - - Ensure "d" appears before "c", and "b", appears before "a":: - - with op.batch_alter_table( - "some_table", recreate="always", - partial_reordering=[("d", "c"), ("b", "a")] - ) as batch_op: - pass - - The ordering of columns not included in the partial_reordering - set is undefined. Therefore it is best to specify the complete - ordering of all columns for best results. - - .. versionadded:: 1.4.0 - - .. note:: batch mode requires SQLAlchemy 0.8 or above. - - .. seealso:: - - :ref:`batch_migrations` - - """ - impl = batch.BatchOperationsImpl( - self, - table_name, - schema, - recreate, - copy_from, - table_args, - table_kwargs, - reflect_args, - reflect_kwargs, - naming_convention, - partial_reordering, - ) - batch_op = BatchOperations(self.migration_context, impl=impl) - yield batch_op - impl.flush() - - def get_context(self): - """Return the :class:`.MigrationContext` object that's - currently in use. - - """ - - return self.migration_context - - def invoke(self, operation): - """Given a :class:`.MigrateOperation`, invoke it in terms of - this :class:`.Operations` instance. - - .. versionadded:: 0.8.0 - - """ - fn = self._to_impl.dispatch( - operation, self.migration_context.impl.__dialect__ - ) - return fn(self, operation) - - def f(self, name): - """Indicate a string name that has already had a naming convention - applied to it. - - This feature combines with the SQLAlchemy ``naming_convention`` feature - to disambiguate constraint names that have already had naming - conventions applied to them, versus those that have not. This is - necessary in the case that the ``"%(constraint_name)s"`` token - is used within a naming convention, so that it can be identified - that this particular name should remain fixed. - - If the :meth:`.Operations.f` is used on a constraint, the naming - convention will not take effect:: - - op.add_column('t', 'x', Boolean(name=op.f('ck_bool_t_x'))) - - Above, the CHECK constraint generated will have the name - ``ck_bool_t_x`` regardless of whether or not a naming convention is - in use. - - Alternatively, if a naming convention is in use, and 'f' is not used, - names will be converted along conventions. If the ``target_metadata`` - contains the naming convention - ``{"ck": "ck_bool_%(table_name)s_%(constraint_name)s"}``, then the - output of the following: - - op.add_column('t', 'x', Boolean(name='x')) - - will be:: - - CONSTRAINT ck_bool_t_x CHECK (x in (1, 0))) - - The function is rendered in the output of autogenerate when - a particular constraint name is already converted, for SQLAlchemy - version **0.9.4 and greater only**. Even though ``naming_convention`` - was introduced in 0.9.2, the string disambiguation service is new - as of 0.9.4. - - .. versionadded:: 0.6.4 - - """ - if conv: - return conv(name) - else: - raise NotImplementedError( - "op.f() feature requires SQLAlchemy 0.9.4 or greater." - ) - - def inline_literal(self, value, type_=None): - r"""Produce an 'inline literal' expression, suitable for - using in an INSERT, UPDATE, or DELETE statement. - - When using Alembic in "offline" mode, CRUD operations - aren't compatible with SQLAlchemy's default behavior surrounding - literal values, - which is that they are converted into bound values and passed - separately into the ``execute()`` method of the DBAPI cursor. - An offline SQL - script needs to have these rendered inline. While it should - always be noted that inline literal values are an **enormous** - security hole in an application that handles untrusted input, - a schema migration is not run in this context, so - literals are safe to render inline, with the caveat that - advanced types like dates may not be supported directly - by SQLAlchemy. - - See :meth:`.execute` for an example usage of - :meth:`.inline_literal`. - - The environment can also be configured to attempt to render - "literal" values inline automatically, for those simple types - that are supported by the dialect; see - :paramref:`.EnvironmentContext.configure.literal_binds` for this - more recently added feature. - - :param value: The value to render. Strings, integers, and simple - numerics should be supported. Other types like boolean, - dates, etc. may or may not be supported yet by various - backends. - :param type\_: optional - a :class:`sqlalchemy.types.TypeEngine` - subclass stating the type of this value. In SQLAlchemy - expressions, this is usually derived automatically - from the Python type of the value itself, as well as - based on the context in which the value is used. - - .. seealso:: - - :paramref:`.EnvironmentContext.configure.literal_binds` - - """ - return sqla_compat._literal_bindparam(None, value, type_=type_) - - def get_bind(self): - """Return the current 'bind'. - - Under normal circumstances, this is the - :class:`~sqlalchemy.engine.Connection` currently being used - to emit SQL to the database. - - In a SQL script context, this value is ``None``. [TODO: verify this] - - """ - return self.migration_context.impl.bind - - -class BatchOperations(Operations): - """Modifies the interface :class:`.Operations` for batch mode. - - This basically omits the ``table_name`` and ``schema`` parameters - from associated methods, as these are a given when running under batch - mode. - - .. seealso:: - - :meth:`.Operations.batch_alter_table` - - Note that as of 0.8, most of the methods on this class are produced - dynamically using the :meth:`.Operations.register_operation` - method. - - """ - - def _noop(self, operation): - raise NotImplementedError( - "The %s method does not apply to a batch table alter operation." - % operation - ) diff --git a/venv/lib/python3.7/site-packages/alembic/operations/batch.py b/venv/lib/python3.7/site-packages/alembic/operations/batch.py deleted file mode 100644 index 6ca6f90..0000000 --- a/venv/lib/python3.7/site-packages/alembic/operations/batch.py +++ /dev/null @@ -1,532 +0,0 @@ -from sqlalchemy import cast -from sqlalchemy import CheckConstraint -from sqlalchemy import Column -from sqlalchemy import ForeignKeyConstraint -from sqlalchemy import Index -from sqlalchemy import MetaData -from sqlalchemy import PrimaryKeyConstraint -from sqlalchemy import schema as sql_schema -from sqlalchemy import select -from sqlalchemy import Table -from sqlalchemy import types as sqltypes -from sqlalchemy.events import SchemaEventTarget -from sqlalchemy.util import OrderedDict -from sqlalchemy.util import topological - -from ..util import exc -from ..util.sqla_compat import _columns_for_constraint -from ..util.sqla_compat import _fk_is_self_referential -from ..util.sqla_compat import _is_type_bound -from ..util.sqla_compat import _remove_column_from_collection - - -class BatchOperationsImpl(object): - def __init__( - self, - operations, - table_name, - schema, - recreate, - copy_from, - table_args, - table_kwargs, - reflect_args, - reflect_kwargs, - naming_convention, - partial_reordering, - ): - self.operations = operations - self.table_name = table_name - self.schema = schema - if recreate not in ("auto", "always", "never"): - raise ValueError( - "recreate may be one of 'auto', 'always', or 'never'." - ) - self.recreate = recreate - self.copy_from = copy_from - self.table_args = table_args - self.table_kwargs = dict(table_kwargs) - self.reflect_args = reflect_args - self.reflect_kwargs = dict(reflect_kwargs) - self.reflect_kwargs.setdefault( - "listeners", list(self.reflect_kwargs.get("listeners", ())) - ) - self.reflect_kwargs["listeners"].append( - ("column_reflect", operations.impl.autogen_column_reflect) - ) - self.naming_convention = naming_convention - self.partial_reordering = partial_reordering - self.batch = [] - - @property - def dialect(self): - return self.operations.impl.dialect - - @property - def impl(self): - return self.operations.impl - - def _should_recreate(self): - if self.recreate == "auto": - return self.operations.impl.requires_recreate_in_batch(self) - elif self.recreate == "always": - return True - else: - return False - - def flush(self): - should_recreate = self._should_recreate() - - if not should_recreate: - for opname, arg, kw in self.batch: - fn = getattr(self.operations.impl, opname) - fn(*arg, **kw) - else: - if self.naming_convention: - m1 = MetaData(naming_convention=self.naming_convention) - else: - m1 = MetaData() - - if self.copy_from is not None: - existing_table = self.copy_from - reflected = False - else: - existing_table = Table( - self.table_name, - m1, - schema=self.schema, - autoload=True, - autoload_with=self.operations.get_bind(), - *self.reflect_args, - **self.reflect_kwargs - ) - reflected = True - - batch_impl = ApplyBatchImpl( - existing_table, - self.table_args, - self.table_kwargs, - reflected, - partial_reordering=self.partial_reordering, - ) - for opname, arg, kw in self.batch: - fn = getattr(batch_impl, opname) - fn(*arg, **kw) - - batch_impl._create(self.impl) - - def alter_column(self, *arg, **kw): - self.batch.append(("alter_column", arg, kw)) - - def add_column(self, *arg, **kw): - if ( - "insert_before" in kw or "insert_after" in kw - ) and not self._should_recreate(): - raise exc.CommandError( - "Can't specify insert_before or insert_after when using " - "ALTER; please specify recreate='always'" - ) - self.batch.append(("add_column", arg, kw)) - - def drop_column(self, *arg, **kw): - self.batch.append(("drop_column", arg, kw)) - - def add_constraint(self, const): - self.batch.append(("add_constraint", (const,), {})) - - def drop_constraint(self, const): - self.batch.append(("drop_constraint", (const,), {})) - - def rename_table(self, *arg, **kw): - self.batch.append(("rename_table", arg, kw)) - - def create_index(self, idx): - self.batch.append(("create_index", (idx,), {})) - - def drop_index(self, idx): - self.batch.append(("drop_index", (idx,), {})) - - def create_table(self, table): - raise NotImplementedError("Can't create table in batch mode") - - def drop_table(self, table): - raise NotImplementedError("Can't drop table in batch mode") - - -class ApplyBatchImpl(object): - def __init__( - self, table, table_args, table_kwargs, reflected, partial_reordering=() - ): - self.table = table # this is a Table object - self.table_args = table_args - self.table_kwargs = table_kwargs - self.temp_table_name = self._calc_temp_name(table.name) - self.new_table = None - - self.partial_reordering = partial_reordering # tuple of tuples - self.add_col_ordering = () # tuple of tuples - - self.column_transfers = OrderedDict( - (c.name, {"expr": c}) for c in self.table.c - ) - self.existing_ordering = list(self.column_transfers) - - self.reflected = reflected - self._grab_table_elements() - - @classmethod - def _calc_temp_name(cls, tablename): - return ("_alembic_tmp_%s" % tablename)[0:50] - - def _grab_table_elements(self): - schema = self.table.schema - self.columns = OrderedDict() - for c in self.table.c: - c_copy = c.copy(schema=schema) - c_copy.unique = c_copy.index = False - # ensure that the type object was copied, - # as we may need to modify it in-place - if isinstance(c.type, SchemaEventTarget): - assert c_copy.type is not c.type - self.columns[c.name] = c_copy - self.named_constraints = {} - self.unnamed_constraints = [] - self.indexes = {} - self.new_indexes = {} - for const in self.table.constraints: - if _is_type_bound(const): - continue - elif self.reflected and isinstance(const, CheckConstraint): - # TODO: we are skipping reflected CheckConstraint because - # we have no way to determine _is_type_bound() for these. - pass - elif const.name: - self.named_constraints[const.name] = const - else: - self.unnamed_constraints.append(const) - - for idx in self.table.indexes: - self.indexes[idx.name] = idx - - for k in self.table.kwargs: - self.table_kwargs.setdefault(k, self.table.kwargs[k]) - - def _adjust_self_columns_for_partial_reordering(self): - pairs = set() - - col_by_idx = list(self.columns) - - if self.partial_reordering: - for tuple_ in self.partial_reordering: - for index, elem in enumerate(tuple_): - if index > 0: - pairs.add((tuple_[index - 1], elem)) - else: - for index, elem in enumerate(self.existing_ordering): - if index > 0: - pairs.add((col_by_idx[index - 1], elem)) - - pairs.update(self.add_col_ordering) - - # this can happen if some columns were dropped and not removed - # from existing_ordering. this should be prevented already, but - # conservatively making sure this didn't happen - pairs = [p for p in pairs if p[0] != p[1]] - - sorted_ = list( - topological.sort(pairs, col_by_idx, deterministic_order=True) - ) - self.columns = OrderedDict((k, self.columns[k]) for k in sorted_) - self.column_transfers = OrderedDict( - (k, self.column_transfers[k]) for k in sorted_ - ) - - def _transfer_elements_to_new_table(self): - assert self.new_table is None, "Can only create new table once" - - m = MetaData() - schema = self.table.schema - - if self.partial_reordering or self.add_col_ordering: - self._adjust_self_columns_for_partial_reordering() - - self.new_table = new_table = Table( - self.temp_table_name, - m, - *(list(self.columns.values()) + list(self.table_args)), - schema=schema, - **self.table_kwargs - ) - - for const in ( - list(self.named_constraints.values()) + self.unnamed_constraints - ): - - const_columns = set( - [c.key for c in _columns_for_constraint(const)] - ) - - if not const_columns.issubset(self.column_transfers): - continue - - if isinstance(const, ForeignKeyConstraint): - if _fk_is_self_referential(const): - # for self-referential constraint, refer to the - # *original* table name, and not _alembic_batch_temp. - # This is consistent with how we're handling - # FK constraints from other tables; we assume SQLite - # no foreign keys just keeps the names unchanged, so - # when we rename back, they match again. - const_copy = const.copy( - schema=schema, target_table=self.table - ) - else: - # "target_table" for ForeignKeyConstraint.copy() is - # only used if the FK is detected as being - # self-referential, which we are handling above. - const_copy = const.copy(schema=schema) - else: - const_copy = const.copy(schema=schema, target_table=new_table) - if isinstance(const, ForeignKeyConstraint): - self._setup_referent(m, const) - new_table.append_constraint(const_copy) - - def _gather_indexes_from_both_tables(self): - idx = [] - idx.extend(self.indexes.values()) - for index in self.new_indexes.values(): - idx.append( - Index( - index.name, - unique=index.unique, - *[self.new_table.c[col] for col in index.columns.keys()], - **index.kwargs - ) - ) - return idx - - def _setup_referent(self, metadata, constraint): - spec = constraint.elements[0]._get_colspec() - parts = spec.split(".") - tname = parts[-2] - if len(parts) == 3: - referent_schema = parts[0] - else: - referent_schema = None - - if tname != self.temp_table_name: - key = sql_schema._get_table_key(tname, referent_schema) - if key in metadata.tables: - t = metadata.tables[key] - for elem in constraint.elements: - colname = elem._get_colspec().split(".")[-1] - if not t.c.contains_column(colname): - t.append_column(Column(colname, sqltypes.NULLTYPE)) - else: - Table( - tname, - metadata, - *[ - Column(n, sqltypes.NULLTYPE) - for n in [ - elem._get_colspec().split(".")[-1] - for elem in constraint.elements - ] - ], - schema=referent_schema - ) - - def _create(self, op_impl): - self._transfer_elements_to_new_table() - - op_impl.prep_table_for_batch(self.table) - op_impl.create_table(self.new_table) - - try: - op_impl._exec( - self.new_table.insert(inline=True).from_select( - list( - k - for k, transfer in self.column_transfers.items() - if "expr" in transfer - ), - select( - [ - transfer["expr"] - for transfer in self.column_transfers.values() - if "expr" in transfer - ] - ), - ) - ) - op_impl.drop_table(self.table) - except: - op_impl.drop_table(self.new_table) - raise - else: - op_impl.rename_table( - self.temp_table_name, self.table.name, schema=self.table.schema - ) - self.new_table.name = self.table.name - try: - for idx in self._gather_indexes_from_both_tables(): - op_impl.create_index(idx) - finally: - self.new_table.name = self.temp_table_name - - def alter_column( - self, - table_name, - column_name, - nullable=None, - server_default=False, - name=None, - type_=None, - autoincrement=None, - **kw - ): - existing = self.columns[column_name] - existing_transfer = self.column_transfers[column_name] - if name is not None and name != column_name: - # note that we don't change '.key' - we keep referring - # to the renamed column by its old key in _create(). neat! - existing.name = name - existing_transfer["name"] = name - - if type_ is not None: - type_ = sqltypes.to_instance(type_) - # old type is being discarded so turn off eventing - # rules. Alternatively we can - # erase the events set up by this type, but this is simpler. - # we also ignore the drop_constraint that will come here from - # Operations.implementation_for(alter_column) - if isinstance(existing.type, SchemaEventTarget): - existing.type._create_events = ( - existing.type.create_constraint - ) = False - - if existing.type._type_affinity is not type_._type_affinity: - existing_transfer["expr"] = cast( - existing_transfer["expr"], type_ - ) - - existing.type = type_ - - # we *dont* however set events for the new type, because - # alter_column is invoked from - # Operations.implementation_for(alter_column) which already - # will emit an add_constraint() - - if nullable is not None: - existing.nullable = nullable - if server_default is not False: - if server_default is None: - existing.server_default = None - else: - sql_schema.DefaultClause(server_default)._set_parent(existing) - if autoincrement is not None: - existing.autoincrement = bool(autoincrement) - - def _setup_dependencies_for_add_column( - self, colname, insert_before, insert_after - ): - index_cols = self.existing_ordering - col_indexes = {name: i for i, name in enumerate(index_cols)} - - if not self.partial_reordering: - if insert_after: - if not insert_before: - if insert_after in col_indexes: - # insert after an existing column - idx = col_indexes[insert_after] + 1 - if idx < len(index_cols): - insert_before = index_cols[idx] - else: - # insert after a column that is also new - insert_before = dict(self.add_col_ordering)[ - insert_after - ] - if insert_before: - if not insert_after: - if insert_before in col_indexes: - # insert before an existing column - idx = col_indexes[insert_before] - 1 - if idx >= 0: - insert_after = index_cols[idx] - else: - # insert before a column that is also new - insert_after = dict( - (b, a) for a, b in self.add_col_ordering - )[insert_before] - - if insert_before: - self.add_col_ordering += ((colname, insert_before),) - if insert_after: - self.add_col_ordering += ((insert_after, colname),) - - if ( - not self.partial_reordering - and not insert_before - and not insert_after - and col_indexes - ): - self.add_col_ordering += ((index_cols[-1], colname),) - - def add_column( - self, table_name, column, insert_before=None, insert_after=None, **kw - ): - self._setup_dependencies_for_add_column( - column.name, insert_before, insert_after - ) - # we copy the column because operations.add_column() - # gives us a Column that is part of a Table already. - self.columns[column.name] = column.copy(schema=self.table.schema) - self.column_transfers[column.name] = {} - - def drop_column(self, table_name, column, **kw): - if column.name in self.table.primary_key.columns: - _remove_column_from_collection( - self.table.primary_key.columns, column - ) - del self.columns[column.name] - del self.column_transfers[column.name] - self.existing_ordering.remove(column.name) - - def add_constraint(self, const): - if not const.name: - raise ValueError("Constraint must have a name") - if isinstance(const, sql_schema.PrimaryKeyConstraint): - if self.table.primary_key in self.unnamed_constraints: - self.unnamed_constraints.remove(self.table.primary_key) - - self.named_constraints[const.name] = const - - def drop_constraint(self, const): - if not const.name: - raise ValueError("Constraint must have a name") - try: - const = self.named_constraints.pop(const.name) - except KeyError: - if _is_type_bound(const): - # type-bound constraints are only included in the new - # table via their type object in any case, so ignore the - # drop_constraint() that comes here via the - # Operations.implementation_for(alter_column) - return - raise ValueError("No such constraint: '%s'" % const.name) - else: - if isinstance(const, PrimaryKeyConstraint): - for col in const.columns: - self.columns[col.name].primary_key = False - - def create_index(self, idx): - self.new_indexes[idx.name] = idx - - def drop_index(self, idx): - try: - del self.indexes[idx.name] - except KeyError: - raise ValueError("No such index: '%s'" % idx.name) - - def rename_table(self, *arg, **kw): - raise NotImplementedError("TODO") diff --git a/venv/lib/python3.7/site-packages/alembic/operations/ops.py b/venv/lib/python3.7/site-packages/alembic/operations/ops.py deleted file mode 100644 index 7129472..0000000 --- a/venv/lib/python3.7/site-packages/alembic/operations/ops.py +++ /dev/null @@ -1,2472 +0,0 @@ -import re - -from sqlalchemy.types import NULLTYPE - -from . import schemaobj -from .base import BatchOperations -from .base import Operations -from .. import util -from ..util import sqla_compat - - -class MigrateOperation(object): - """base class for migration command and organization objects. - - This system is part of the operation extensibility API. - - .. versionadded:: 0.8.0 - - .. seealso:: - - :ref:`operation_objects` - - :ref:`operation_plugins` - - :ref:`customizing_revision` - - """ - - @util.memoized_property - def info(self): - """A dictionary that may be used to store arbitrary information - along with this :class:`.MigrateOperation` object. - - """ - return {} - - _mutations = frozenset() - - -class AddConstraintOp(MigrateOperation): - """Represent an add constraint operation.""" - - add_constraint_ops = util.Dispatcher() - - @property - def constraint_type(self): - raise NotImplementedError() - - @classmethod - def register_add_constraint(cls, type_): - def go(klass): - cls.add_constraint_ops.dispatch_for(type_)(klass.from_constraint) - return klass - - return go - - @classmethod - def from_constraint(cls, constraint): - return cls.add_constraint_ops.dispatch(constraint.__visit_name__)( - constraint - ) - - def reverse(self): - return DropConstraintOp.from_constraint(self.to_constraint()) - - def to_diff_tuple(self): - return ("add_constraint", self.to_constraint()) - - -@Operations.register_operation("drop_constraint") -@BatchOperations.register_operation("drop_constraint", "batch_drop_constraint") -class DropConstraintOp(MigrateOperation): - """Represent a drop constraint operation.""" - - def __init__( - self, - constraint_name, - table_name, - type_=None, - schema=None, - _orig_constraint=None, - ): - self.constraint_name = constraint_name - self.table_name = table_name - self.constraint_type = type_ - self.schema = schema - self._orig_constraint = _orig_constraint - - def reverse(self): - if self._orig_constraint is None: - raise ValueError( - "operation is not reversible; " - "original constraint is not present" - ) - return AddConstraintOp.from_constraint(self._orig_constraint) - - def to_diff_tuple(self): - if self.constraint_type == "foreignkey": - return ("remove_fk", self.to_constraint()) - else: - return ("remove_constraint", self.to_constraint()) - - @classmethod - def from_constraint(cls, constraint): - types = { - "unique_constraint": "unique", - "foreign_key_constraint": "foreignkey", - "primary_key_constraint": "primary", - "check_constraint": "check", - "column_check_constraint": "check", - "table_or_column_check_constraint": "check", - } - - constraint_table = sqla_compat._table_for_constraint(constraint) - return cls( - constraint.name, - constraint_table.name, - schema=constraint_table.schema, - type_=types[constraint.__visit_name__], - _orig_constraint=constraint, - ) - - def to_constraint(self): - if self._orig_constraint is not None: - return self._orig_constraint - else: - raise ValueError( - "constraint cannot be produced; " - "original constraint is not present" - ) - - @classmethod - @util._with_legacy_names([("type", "type_"), ("name", "constraint_name")]) - def drop_constraint( - cls, operations, constraint_name, table_name, type_=None, schema=None - ): - r"""Drop a constraint of the given name, typically via DROP CONSTRAINT. - - :param constraint_name: name of the constraint. - :param table_name: table name. - :param type\_: optional, required on MySQL. can be - 'foreignkey', 'primary', 'unique', or 'check'. - :param schema: Optional schema name to operate within. To control - quoting of the schema outside of the default behavior, use - the SQLAlchemy construct - :class:`~sqlalchemy.sql.elements.quoted_name`. - - .. versionadded:: 0.7.0 'schema' can now accept a - :class:`~sqlalchemy.sql.elements.quoted_name` construct. - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> constraint_name - - """ - - op = cls(constraint_name, table_name, type_=type_, schema=schema) - return operations.invoke(op) - - @classmethod - def batch_drop_constraint(cls, operations, constraint_name, type_=None): - """Issue a "drop constraint" instruction using the - current batch migration context. - - The batch form of this call omits the ``table_name`` and ``schema`` - arguments from the call. - - .. seealso:: - - :meth:`.Operations.drop_constraint` - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> constraint_name - - """ - op = cls( - constraint_name, - operations.impl.table_name, - type_=type_, - schema=operations.impl.schema, - ) - return operations.invoke(op) - - -@Operations.register_operation("create_primary_key") -@BatchOperations.register_operation( - "create_primary_key", "batch_create_primary_key" -) -@AddConstraintOp.register_add_constraint("primary_key_constraint") -class CreatePrimaryKeyOp(AddConstraintOp): - """Represent a create primary key operation.""" - - constraint_type = "primarykey" - - def __init__( - self, - constraint_name, - table_name, - columns, - schema=None, - _orig_constraint=None, - **kw - ): - self.constraint_name = constraint_name - self.table_name = table_name - self.columns = columns - self.schema = schema - self._orig_constraint = _orig_constraint - self.kw = kw - - @classmethod - def from_constraint(cls, constraint): - constraint_table = sqla_compat._table_for_constraint(constraint) - - return cls( - constraint.name, - constraint_table.name, - constraint.columns, - schema=constraint_table.schema, - _orig_constraint=constraint, - ) - - def to_constraint(self, migration_context=None): - if self._orig_constraint is not None: - return self._orig_constraint - - schema_obj = schemaobj.SchemaObjects(migration_context) - return schema_obj.primary_key_constraint( - self.constraint_name, - self.table_name, - self.columns, - schema=self.schema, - ) - - @classmethod - @util._with_legacy_names( - [("name", "constraint_name"), ("cols", "columns")] - ) - def create_primary_key( - cls, operations, constraint_name, table_name, columns, schema=None - ): - """Issue a "create primary key" instruction using the current - migration context. - - e.g.:: - - from alembic import op - op.create_primary_key( - "pk_my_table", "my_table", - ["id", "version"] - ) - - This internally generates a :class:`~sqlalchemy.schema.Table` object - containing the necessary columns, then generates a new - :class:`~sqlalchemy.schema.PrimaryKeyConstraint` - object which it then associates with the - :class:`~sqlalchemy.schema.Table`. - Any event listeners associated with this action will be fired - off normally. The :class:`~sqlalchemy.schema.AddConstraint` - construct is ultimately used to generate the ALTER statement. - - :param name: Name of the primary key constraint. The name is necessary - so that an ALTER statement can be emitted. For setups that - use an automated naming scheme such as that described at - :ref:`sqla:constraint_naming_conventions` - ``name`` here can be ``None``, as the event listener will - apply the name to the constraint object when it is associated - with the table. - :param table_name: String name of the target table. - :param columns: a list of string column names to be applied to the - primary key constraint. - :param schema: Optional schema name to operate within. To control - quoting of the schema outside of the default behavior, use - the SQLAlchemy construct - :class:`~sqlalchemy.sql.elements.quoted_name`. - - .. versionadded:: 0.7.0 'schema' can now accept a - :class:`~sqlalchemy.sql.elements.quoted_name` construct. - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> constraint_name - * cols -> columns - - """ - op = cls(constraint_name, table_name, columns, schema) - return operations.invoke(op) - - @classmethod - def batch_create_primary_key(cls, operations, constraint_name, columns): - """Issue a "create primary key" instruction using the - current batch migration context. - - The batch form of this call omits the ``table_name`` and ``schema`` - arguments from the call. - - .. seealso:: - - :meth:`.Operations.create_primary_key` - - """ - op = cls( - constraint_name, - operations.impl.table_name, - columns, - schema=operations.impl.schema, - ) - return operations.invoke(op) - - -@Operations.register_operation("create_unique_constraint") -@BatchOperations.register_operation( - "create_unique_constraint", "batch_create_unique_constraint" -) -@AddConstraintOp.register_add_constraint("unique_constraint") -class CreateUniqueConstraintOp(AddConstraintOp): - """Represent a create unique constraint operation.""" - - constraint_type = "unique" - - def __init__( - self, - constraint_name, - table_name, - columns, - schema=None, - _orig_constraint=None, - **kw - ): - self.constraint_name = constraint_name - self.table_name = table_name - self.columns = columns - self.schema = schema - self._orig_constraint = _orig_constraint - self.kw = kw - - @classmethod - def from_constraint(cls, constraint): - constraint_table = sqla_compat._table_for_constraint(constraint) - - kw = {} - if constraint.deferrable: - kw["deferrable"] = constraint.deferrable - if constraint.initially: - kw["initially"] = constraint.initially - - return cls( - constraint.name, - constraint_table.name, - [c.name for c in constraint.columns], - schema=constraint_table.schema, - _orig_constraint=constraint, - **kw - ) - - def to_constraint(self, migration_context=None): - if self._orig_constraint is not None: - return self._orig_constraint - - schema_obj = schemaobj.SchemaObjects(migration_context) - return schema_obj.unique_constraint( - self.constraint_name, - self.table_name, - self.columns, - schema=self.schema, - **self.kw - ) - - @classmethod - @util._with_legacy_names( - [ - ("name", "constraint_name"), - ("source", "table_name"), - ("local_cols", "columns"), - ] - ) - def create_unique_constraint( - cls, - operations, - constraint_name, - table_name, - columns, - schema=None, - **kw - ): - """Issue a "create unique constraint" instruction using the - current migration context. - - e.g.:: - - from alembic import op - op.create_unique_constraint("uq_user_name", "user", ["name"]) - - This internally generates a :class:`~sqlalchemy.schema.Table` object - containing the necessary columns, then generates a new - :class:`~sqlalchemy.schema.UniqueConstraint` - object which it then associates with the - :class:`~sqlalchemy.schema.Table`. - Any event listeners associated with this action will be fired - off normally. The :class:`~sqlalchemy.schema.AddConstraint` - construct is ultimately used to generate the ALTER statement. - - :param name: Name of the unique constraint. The name is necessary - so that an ALTER statement can be emitted. For setups that - use an automated naming scheme such as that described at - :ref:`sqla:constraint_naming_conventions`, - ``name`` here can be ``None``, as the event listener will - apply the name to the constraint object when it is associated - with the table. - :param table_name: String name of the source table. - :param columns: a list of string column names in the - source table. - :param deferrable: optional bool. If set, emit DEFERRABLE or - NOT DEFERRABLE when issuing DDL for this constraint. - :param initially: optional string. If set, emit INITIALLY - when issuing DDL for this constraint. - :param schema: Optional schema name to operate within. To control - quoting of the schema outside of the default behavior, use - the SQLAlchemy construct - :class:`~sqlalchemy.sql.elements.quoted_name`. - - .. versionadded:: 0.7.0 'schema' can now accept a - :class:`~sqlalchemy.sql.elements.quoted_name` construct. - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> constraint_name - * source -> table_name - * local_cols -> columns - - """ - - op = cls(constraint_name, table_name, columns, schema=schema, **kw) - return operations.invoke(op) - - @classmethod - @util._with_legacy_names([("name", "constraint_name")]) - def batch_create_unique_constraint( - cls, operations, constraint_name, columns, **kw - ): - """Issue a "create unique constraint" instruction using the - current batch migration context. - - The batch form of this call omits the ``source`` and ``schema`` - arguments from the call. - - .. seealso:: - - :meth:`.Operations.create_unique_constraint` - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> constraint_name - - """ - kw["schema"] = operations.impl.schema - op = cls(constraint_name, operations.impl.table_name, columns, **kw) - return operations.invoke(op) - - -@Operations.register_operation("create_foreign_key") -@BatchOperations.register_operation( - "create_foreign_key", "batch_create_foreign_key" -) -@AddConstraintOp.register_add_constraint("foreign_key_constraint") -class CreateForeignKeyOp(AddConstraintOp): - """Represent a create foreign key constraint operation.""" - - constraint_type = "foreignkey" - - def __init__( - self, - constraint_name, - source_table, - referent_table, - local_cols, - remote_cols, - _orig_constraint=None, - **kw - ): - self.constraint_name = constraint_name - self.source_table = source_table - self.referent_table = referent_table - self.local_cols = local_cols - self.remote_cols = remote_cols - self._orig_constraint = _orig_constraint - self.kw = kw - - def to_diff_tuple(self): - return ("add_fk", self.to_constraint()) - - @classmethod - def from_constraint(cls, constraint): - kw = {} - if constraint.onupdate: - kw["onupdate"] = constraint.onupdate - if constraint.ondelete: - kw["ondelete"] = constraint.ondelete - if constraint.initially: - kw["initially"] = constraint.initially - if constraint.deferrable: - kw["deferrable"] = constraint.deferrable - if constraint.use_alter: - kw["use_alter"] = constraint.use_alter - - ( - source_schema, - source_table, - source_columns, - target_schema, - target_table, - target_columns, - onupdate, - ondelete, - deferrable, - initially, - ) = sqla_compat._fk_spec(constraint) - - kw["source_schema"] = source_schema - kw["referent_schema"] = target_schema - - return cls( - constraint.name, - source_table, - target_table, - source_columns, - target_columns, - _orig_constraint=constraint, - **kw - ) - - def to_constraint(self, migration_context=None): - if self._orig_constraint is not None: - return self._orig_constraint - schema_obj = schemaobj.SchemaObjects(migration_context) - return schema_obj.foreign_key_constraint( - self.constraint_name, - self.source_table, - self.referent_table, - self.local_cols, - self.remote_cols, - **self.kw - ) - - @classmethod - @util._with_legacy_names( - [ - ("name", "constraint_name"), - ("source", "source_table"), - ("referent", "referent_table"), - ] - ) - def create_foreign_key( - cls, - operations, - constraint_name, - source_table, - referent_table, - local_cols, - remote_cols, - onupdate=None, - ondelete=None, - deferrable=None, - initially=None, - match=None, - source_schema=None, - referent_schema=None, - **dialect_kw - ): - """Issue a "create foreign key" instruction using the - current migration context. - - e.g.:: - - from alembic import op - op.create_foreign_key( - "fk_user_address", "address", - "user", ["user_id"], ["id"]) - - This internally generates a :class:`~sqlalchemy.schema.Table` object - containing the necessary columns, then generates a new - :class:`~sqlalchemy.schema.ForeignKeyConstraint` - object which it then associates with the - :class:`~sqlalchemy.schema.Table`. - Any event listeners associated with this action will be fired - off normally. The :class:`~sqlalchemy.schema.AddConstraint` - construct is ultimately used to generate the ALTER statement. - - :param name: Name of the foreign key constraint. The name is necessary - so that an ALTER statement can be emitted. For setups that - use an automated naming scheme such as that described at - :ref:`sqla:constraint_naming_conventions`, - ``name`` here can be ``None``, as the event listener will - apply the name to the constraint object when it is associated - with the table. - :param source_table: String name of the source table. - :param referent_table: String name of the destination table. - :param local_cols: a list of string column names in the - source table. - :param remote_cols: a list of string column names in the - remote table. - :param onupdate: Optional string. If set, emit ON UPDATE when - issuing DDL for this constraint. Typical values include CASCADE, - DELETE and RESTRICT. - :param ondelete: Optional string. If set, emit ON DELETE when - issuing DDL for this constraint. Typical values include CASCADE, - DELETE and RESTRICT. - :param deferrable: optional bool. If set, emit DEFERRABLE or NOT - DEFERRABLE when issuing DDL for this constraint. - :param source_schema: Optional schema name of the source table. - :param referent_schema: Optional schema name of the destination table. - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> constraint_name - * source -> source_table - * referent -> referent_table - - """ - - op = cls( - constraint_name, - source_table, - referent_table, - local_cols, - remote_cols, - onupdate=onupdate, - ondelete=ondelete, - deferrable=deferrable, - source_schema=source_schema, - referent_schema=referent_schema, - initially=initially, - match=match, - **dialect_kw - ) - return operations.invoke(op) - - @classmethod - @util._with_legacy_names( - [("name", "constraint_name"), ("referent", "referent_table")] - ) - def batch_create_foreign_key( - cls, - operations, - constraint_name, - referent_table, - local_cols, - remote_cols, - referent_schema=None, - onupdate=None, - ondelete=None, - deferrable=None, - initially=None, - match=None, - **dialect_kw - ): - """Issue a "create foreign key" instruction using the - current batch migration context. - - The batch form of this call omits the ``source`` and ``source_schema`` - arguments from the call. - - e.g.:: - - with batch_alter_table("address") as batch_op: - batch_op.create_foreign_key( - "fk_user_address", - "user", ["user_id"], ["id"]) - - .. seealso:: - - :meth:`.Operations.create_foreign_key` - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> constraint_name - * referent -> referent_table - - """ - op = cls( - constraint_name, - operations.impl.table_name, - referent_table, - local_cols, - remote_cols, - onupdate=onupdate, - ondelete=ondelete, - deferrable=deferrable, - source_schema=operations.impl.schema, - referent_schema=referent_schema, - initially=initially, - match=match, - **dialect_kw - ) - return operations.invoke(op) - - -@Operations.register_operation("create_check_constraint") -@BatchOperations.register_operation( - "create_check_constraint", "batch_create_check_constraint" -) -@AddConstraintOp.register_add_constraint("check_constraint") -@AddConstraintOp.register_add_constraint("table_or_column_check_constraint") -@AddConstraintOp.register_add_constraint("column_check_constraint") -class CreateCheckConstraintOp(AddConstraintOp): - """Represent a create check constraint operation.""" - - constraint_type = "check" - - def __init__( - self, - constraint_name, - table_name, - condition, - schema=None, - _orig_constraint=None, - **kw - ): - self.constraint_name = constraint_name - self.table_name = table_name - self.condition = condition - self.schema = schema - self._orig_constraint = _orig_constraint - self.kw = kw - - @classmethod - def from_constraint(cls, constraint): - constraint_table = sqla_compat._table_for_constraint(constraint) - - return cls( - constraint.name, - constraint_table.name, - constraint.sqltext, - schema=constraint_table.schema, - _orig_constraint=constraint, - ) - - def to_constraint(self, migration_context=None): - if self._orig_constraint is not None: - return self._orig_constraint - schema_obj = schemaobj.SchemaObjects(migration_context) - return schema_obj.check_constraint( - self.constraint_name, - self.table_name, - self.condition, - schema=self.schema, - **self.kw - ) - - @classmethod - @util._with_legacy_names( - [("name", "constraint_name"), ("source", "table_name")] - ) - def create_check_constraint( - cls, - operations, - constraint_name, - table_name, - condition, - schema=None, - **kw - ): - """Issue a "create check constraint" instruction using the - current migration context. - - e.g.:: - - from alembic import op - from sqlalchemy.sql import column, func - - op.create_check_constraint( - "ck_user_name_len", - "user", - func.len(column('name')) > 5 - ) - - CHECK constraints are usually against a SQL expression, so ad-hoc - table metadata is usually needed. The function will convert the given - arguments into a :class:`sqlalchemy.schema.CheckConstraint` bound - to an anonymous table in order to emit the CREATE statement. - - :param name: Name of the check constraint. The name is necessary - so that an ALTER statement can be emitted. For setups that - use an automated naming scheme such as that described at - :ref:`sqla:constraint_naming_conventions`, - ``name`` here can be ``None``, as the event listener will - apply the name to the constraint object when it is associated - with the table. - :param table_name: String name of the source table. - :param condition: SQL expression that's the condition of the - constraint. Can be a string or SQLAlchemy expression language - structure. - :param deferrable: optional bool. If set, emit DEFERRABLE or - NOT DEFERRABLE when issuing DDL for this constraint. - :param initially: optional string. If set, emit INITIALLY - when issuing DDL for this constraint. - :param schema: Optional schema name to operate within. To control - quoting of the schema outside of the default behavior, use - the SQLAlchemy construct - :class:`~sqlalchemy.sql.elements.quoted_name`. - - .. versionadded:: 0.7.0 'schema' can now accept a - :class:`~sqlalchemy.sql.elements.quoted_name` construct. - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> constraint_name - * source -> table_name - - """ - op = cls(constraint_name, table_name, condition, schema=schema, **kw) - return operations.invoke(op) - - @classmethod - @util._with_legacy_names([("name", "constraint_name")]) - def batch_create_check_constraint( - cls, operations, constraint_name, condition, **kw - ): - """Issue a "create check constraint" instruction using the - current batch migration context. - - The batch form of this call omits the ``source`` and ``schema`` - arguments from the call. - - .. seealso:: - - :meth:`.Operations.create_check_constraint` - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> constraint_name - - """ - op = cls( - constraint_name, - operations.impl.table_name, - condition, - schema=operations.impl.schema, - **kw - ) - return operations.invoke(op) - - -@Operations.register_operation("create_index") -@BatchOperations.register_operation("create_index", "batch_create_index") -class CreateIndexOp(MigrateOperation): - """Represent a create index operation.""" - - def __init__( - self, - index_name, - table_name, - columns, - schema=None, - unique=False, - _orig_index=None, - **kw - ): - self.index_name = index_name - self.table_name = table_name - self.columns = columns - self.schema = schema - self.unique = unique - self.kw = kw - self._orig_index = _orig_index - - def reverse(self): - return DropIndexOp.from_index(self.to_index()) - - def to_diff_tuple(self): - return ("add_index", self.to_index()) - - @classmethod - def from_index(cls, index): - return cls( - index.name, - index.table.name, - sqla_compat._get_index_expressions(index), - schema=index.table.schema, - unique=index.unique, - _orig_index=index, - **index.kwargs - ) - - def to_index(self, migration_context=None): - if self._orig_index: - return self._orig_index - schema_obj = schemaobj.SchemaObjects(migration_context) - return schema_obj.index( - self.index_name, - self.table_name, - self.columns, - schema=self.schema, - unique=self.unique, - **self.kw - ) - - @classmethod - @util._with_legacy_names([("name", "index_name")]) - def create_index( - cls, - operations, - index_name, - table_name, - columns, - schema=None, - unique=False, - **kw - ): - r"""Issue a "create index" instruction using the current - migration context. - - e.g.:: - - from alembic import op - op.create_index('ik_test', 't1', ['foo', 'bar']) - - Functional indexes can be produced by using the - :func:`sqlalchemy.sql.expression.text` construct:: - - from alembic import op - from sqlalchemy import text - op.create_index('ik_test', 't1', [text('lower(foo)')]) - - .. versionadded:: 0.6.7 support for making use of the - :func:`~sqlalchemy.sql.expression.text` construct in - conjunction with - :meth:`.Operations.create_index` in - order to produce functional expressions within CREATE INDEX. - - :param index_name: name of the index. - :param table_name: name of the owning table. - :param columns: a list consisting of string column names and/or - :func:`~sqlalchemy.sql.expression.text` constructs. - :param schema: Optional schema name to operate within. To control - quoting of the schema outside of the default behavior, use - the SQLAlchemy construct - :class:`~sqlalchemy.sql.elements.quoted_name`. - - .. versionadded:: 0.7.0 'schema' can now accept a - :class:`~sqlalchemy.sql.elements.quoted_name` construct. - - :param unique: If True, create a unique index. - - :param quote: - Force quoting of this column's name on or off, corresponding - to ``True`` or ``False``. When left at its default - of ``None``, the column identifier will be quoted according to - whether the name is case sensitive (identifiers with at least one - upper case character are treated as case sensitive), or if it's a - reserved word. This flag is only needed to force quoting of a - reserved word which is not known by the SQLAlchemy dialect. - - :param \**kw: Additional keyword arguments not mentioned above are - dialect specific, and passed in the form - ``_``. - See the documentation regarding an individual dialect at - :ref:`dialect_toplevel` for detail on documented arguments. - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> index_name - - """ - op = cls( - index_name, table_name, columns, schema=schema, unique=unique, **kw - ) - return operations.invoke(op) - - @classmethod - def batch_create_index(cls, operations, index_name, columns, **kw): - """Issue a "create index" instruction using the - current batch migration context. - - .. seealso:: - - :meth:`.Operations.create_index` - - """ - - op = cls( - index_name, - operations.impl.table_name, - columns, - schema=operations.impl.schema, - **kw - ) - return operations.invoke(op) - - -@Operations.register_operation("drop_index") -@BatchOperations.register_operation("drop_index", "batch_drop_index") -class DropIndexOp(MigrateOperation): - """Represent a drop index operation.""" - - def __init__( - self, index_name, table_name=None, schema=None, _orig_index=None, **kw - ): - self.index_name = index_name - self.table_name = table_name - self.schema = schema - self._orig_index = _orig_index - self.kw = kw - - def to_diff_tuple(self): - return ("remove_index", self.to_index()) - - def reverse(self): - if self._orig_index is None: - raise ValueError( - "operation is not reversible; " "original index is not present" - ) - return CreateIndexOp.from_index(self._orig_index) - - @classmethod - def from_index(cls, index): - return cls( - index.name, - index.table.name, - schema=index.table.schema, - _orig_index=index, - **index.kwargs - ) - - def to_index(self, migration_context=None): - if self._orig_index is not None: - return self._orig_index - - schema_obj = schemaobj.SchemaObjects(migration_context) - - # need a dummy column name here since SQLAlchemy - # 0.7.6 and further raises on Index with no columns - return schema_obj.index( - self.index_name, - self.table_name, - ["x"], - schema=self.schema, - **self.kw - ) - - @classmethod - @util._with_legacy_names( - [("name", "index_name"), ("tablename", "table_name")] - ) - def drop_index( - cls, operations, index_name, table_name=None, schema=None, **kw - ): - r"""Issue a "drop index" instruction using the current - migration context. - - e.g.:: - - drop_index("accounts") - - :param index_name: name of the index. - :param table_name: name of the owning table. Some - backends such as Microsoft SQL Server require this. - :param schema: Optional schema name to operate within. To control - quoting of the schema outside of the default behavior, use - the SQLAlchemy construct - :class:`~sqlalchemy.sql.elements.quoted_name`. - - .. versionadded:: 0.7.0 'schema' can now accept a - :class:`~sqlalchemy.sql.elements.quoted_name` construct. - - :param \**kw: Additional keyword arguments not mentioned above are - dialect specific, and passed in the form - ``_``. - See the documentation regarding an individual dialect at - :ref:`dialect_toplevel` for detail on documented arguments. - - .. versionadded:: 0.9.5 Support for dialect-specific keyword - arguments for DROP INDEX - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> index_name - - """ - op = cls(index_name, table_name=table_name, schema=schema, **kw) - return operations.invoke(op) - - @classmethod - @util._with_legacy_names([("name", "index_name")]) - def batch_drop_index(cls, operations, index_name, **kw): - """Issue a "drop index" instruction using the - current batch migration context. - - .. seealso:: - - :meth:`.Operations.drop_index` - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> index_name - - """ - - op = cls( - index_name, - table_name=operations.impl.table_name, - schema=operations.impl.schema, - **kw - ) - return operations.invoke(op) - - -@Operations.register_operation("create_table") -class CreateTableOp(MigrateOperation): - """Represent a create table operation.""" - - def __init__( - self, table_name, columns, schema=None, _orig_table=None, **kw - ): - self.table_name = table_name - self.columns = columns - self.schema = schema - self.kw = kw - self._orig_table = _orig_table - - def reverse(self): - return DropTableOp.from_table(self.to_table()) - - def to_diff_tuple(self): - return ("add_table", self.to_table()) - - @classmethod - def from_table(cls, table): - return cls( - table.name, - list(table.c) + list(table.constraints), - schema=table.schema, - _orig_table=table, - **table.kwargs - ) - - def to_table(self, migration_context=None): - if self._orig_table is not None: - return self._orig_table - schema_obj = schemaobj.SchemaObjects(migration_context) - - return schema_obj.table( - self.table_name, *self.columns, schema=self.schema, **self.kw - ) - - @classmethod - @util._with_legacy_names([("name", "table_name")]) - def create_table(cls, operations, table_name, *columns, **kw): - r"""Issue a "create table" instruction using the current migration - context. - - This directive receives an argument list similar to that of the - traditional :class:`sqlalchemy.schema.Table` construct, but without the - metadata:: - - from sqlalchemy import INTEGER, VARCHAR, NVARCHAR, Column - from alembic import op - - op.create_table( - 'account', - Column('id', INTEGER, primary_key=True), - Column('name', VARCHAR(50), nullable=False), - Column('description', NVARCHAR(200)), - Column('timestamp', TIMESTAMP, server_default=func.now()) - ) - - Note that :meth:`.create_table` accepts - :class:`~sqlalchemy.schema.Column` - constructs directly from the SQLAlchemy library. In particular, - default values to be created on the database side are - specified using the ``server_default`` parameter, and not - ``default`` which only specifies Python-side defaults:: - - from alembic import op - from sqlalchemy import Column, TIMESTAMP, func - - # specify "DEFAULT NOW" along with the "timestamp" column - op.create_table('account', - Column('id', INTEGER, primary_key=True), - Column('timestamp', TIMESTAMP, server_default=func.now()) - ) - - The function also returns a newly created - :class:`~sqlalchemy.schema.Table` object, corresponding to the table - specification given, which is suitable for - immediate SQL operations, in particular - :meth:`.Operations.bulk_insert`:: - - from sqlalchemy import INTEGER, VARCHAR, NVARCHAR, Column - from alembic import op - - account_table = op.create_table( - 'account', - Column('id', INTEGER, primary_key=True), - Column('name', VARCHAR(50), nullable=False), - Column('description', NVARCHAR(200)), - Column('timestamp', TIMESTAMP, server_default=func.now()) - ) - - op.bulk_insert( - account_table, - [ - {"name": "A1", "description": "account 1"}, - {"name": "A2", "description": "account 2"}, - ] - ) - - .. versionadded:: 0.7.0 - - :param table_name: Name of the table - :param \*columns: collection of :class:`~sqlalchemy.schema.Column` - objects within - the table, as well as optional :class:`~sqlalchemy.schema.Constraint` - objects - and :class:`~.sqlalchemy.schema.Index` objects. - :param schema: Optional schema name to operate within. To control - quoting of the schema outside of the default behavior, use - the SQLAlchemy construct - :class:`~sqlalchemy.sql.elements.quoted_name`. - - .. versionadded:: 0.7.0 'schema' can now accept a - :class:`~sqlalchemy.sql.elements.quoted_name` construct. - :param \**kw: Other keyword arguments are passed to the underlying - :class:`sqlalchemy.schema.Table` object created for the command. - - :return: the :class:`~sqlalchemy.schema.Table` object corresponding - to the parameters given. - - .. versionadded:: 0.7.0 - the :class:`~sqlalchemy.schema.Table` - object is returned. - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> table_name - - """ - op = cls(table_name, columns, **kw) - return operations.invoke(op) - - -@Operations.register_operation("drop_table") -class DropTableOp(MigrateOperation): - """Represent a drop table operation.""" - - def __init__( - self, table_name, schema=None, table_kw=None, _orig_table=None - ): - self.table_name = table_name - self.schema = schema - self.table_kw = table_kw or {} - self._orig_table = _orig_table - - def to_diff_tuple(self): - return ("remove_table", self.to_table()) - - def reverse(self): - if self._orig_table is None: - raise ValueError( - "operation is not reversible; " "original table is not present" - ) - return CreateTableOp.from_table(self._orig_table) - - @classmethod - def from_table(cls, table): - return cls(table.name, schema=table.schema, _orig_table=table) - - def to_table(self, migration_context=None): - if self._orig_table is not None: - return self._orig_table - schema_obj = schemaobj.SchemaObjects(migration_context) - return schema_obj.table( - self.table_name, schema=self.schema, **self.table_kw - ) - - @classmethod - @util._with_legacy_names([("name", "table_name")]) - def drop_table(cls, operations, table_name, schema=None, **kw): - r"""Issue a "drop table" instruction using the current - migration context. - - - e.g.:: - - drop_table("accounts") - - :param table_name: Name of the table - :param schema: Optional schema name to operate within. To control - quoting of the schema outside of the default behavior, use - the SQLAlchemy construct - :class:`~sqlalchemy.sql.elements.quoted_name`. - - .. versionadded:: 0.7.0 'schema' can now accept a - :class:`~sqlalchemy.sql.elements.quoted_name` construct. - - :param \**kw: Other keyword arguments are passed to the underlying - :class:`sqlalchemy.schema.Table` object created for the command. - - .. versionchanged:: 0.8.0 The following positional argument names - have been changed: - - * name -> table_name - - """ - op = cls(table_name, schema=schema, table_kw=kw) - operations.invoke(op) - - -class AlterTableOp(MigrateOperation): - """Represent an alter table operation.""" - - def __init__(self, table_name, schema=None): - self.table_name = table_name - self.schema = schema - - -@Operations.register_operation("rename_table") -class RenameTableOp(AlterTableOp): - """Represent a rename table operation.""" - - def __init__(self, old_table_name, new_table_name, schema=None): - super(RenameTableOp, self).__init__(old_table_name, schema=schema) - self.new_table_name = new_table_name - - @classmethod - def rename_table( - cls, operations, old_table_name, new_table_name, schema=None - ): - """Emit an ALTER TABLE to rename a table. - - :param old_table_name: old name. - :param new_table_name: new name. - :param schema: Optional schema name to operate within. To control - quoting of the schema outside of the default behavior, use - the SQLAlchemy construct - :class:`~sqlalchemy.sql.elements.quoted_name`. - - .. versionadded:: 0.7.0 'schema' can now accept a - :class:`~sqlalchemy.sql.elements.quoted_name` construct. - - """ - op = cls(old_table_name, new_table_name, schema=schema) - return operations.invoke(op) - - -@Operations.register_operation("create_table_comment") -class CreateTableCommentOp(AlterTableOp): - """Represent a COMMENT ON `table` operation. - """ - - def __init__( - self, table_name, comment, schema=None, existing_comment=None - ): - self.table_name = table_name - self.comment = comment - self.existing_comment = existing_comment - self.schema = schema - - @classmethod - def create_table_comment( - cls, - operations, - table_name, - comment, - existing_comment=None, - schema=None, - ): - """Emit a COMMENT ON operation to set the comment for a table. - - .. versionadded:: 1.0.6 - - :param table_name: string name of the target table. - :param comment: string value of the comment being registered against - the specified table. - :param existing_comment: String value of a comment - already registered on the specified table, used within autogenerate - so that the operation is reversible, but not required for direct - use. - - .. seealso:: - - :meth:`.Operations.drop_table_comment` - - :paramref:`.Operations.alter_column.comment` - - """ - - op = cls( - table_name, - comment, - existing_comment=existing_comment, - schema=schema, - ) - return operations.invoke(op) - - def reverse(self): - """Reverses the COMMENT ON operation against a table. - """ - if self.existing_comment is None: - return DropTableCommentOp( - self.table_name, - existing_comment=self.comment, - schema=self.schema, - ) - else: - return CreateTableCommentOp( - self.table_name, - self.existing_comment, - existing_comment=self.comment, - schema=self.schema, - ) - - def to_table(self, migration_context=None): - schema_obj = schemaobj.SchemaObjects(migration_context) - - return schema_obj.table( - self.table_name, schema=self.schema, comment=self.comment - ) - - def to_diff_tuple(self): - return ("add_table_comment", self.to_table(), self.existing_comment) - - -@Operations.register_operation("drop_table_comment") -class DropTableCommentOp(AlterTableOp): - """Represent an operation to remove the comment from a table. - """ - - def __init__(self, table_name, schema=None, existing_comment=None): - self.table_name = table_name - self.existing_comment = existing_comment - self.schema = schema - - @classmethod - def drop_table_comment( - cls, operations, table_name, existing_comment=None, schema=None - ): - """Issue a "drop table comment" operation to - remove an existing comment set on a table. - - .. versionadded:: 1.0.6 - - :param table_name: string name of the target table. - :param existing_comment: An optional string value of a comment already - registered on the specified table. - - .. seealso:: - - :meth:`.Operations.create_table_comment` - - :paramref:`.Operations.alter_column.comment` - - """ - - op = cls(table_name, existing_comment=existing_comment, schema=schema) - return operations.invoke(op) - - def reverse(self): - """Reverses the COMMENT ON operation against a table. - """ - return CreateTableCommentOp( - self.table_name, self.existing_comment, schema=self.schema - ) - - def to_table(self, migration_context=None): - schema_obj = schemaobj.SchemaObjects(migration_context) - - return schema_obj.table(self.table_name, schema=self.schema) - - def to_diff_tuple(self): - return ("remove_table_comment", self.to_table()) - - -@Operations.register_operation("alter_column") -@BatchOperations.register_operation("alter_column", "batch_alter_column") -class AlterColumnOp(AlterTableOp): - """Represent an alter column operation.""" - - def __init__( - self, - table_name, - column_name, - schema=None, - existing_type=None, - existing_server_default=False, - existing_nullable=None, - existing_comment=None, - modify_nullable=None, - modify_comment=False, - modify_server_default=False, - modify_name=None, - modify_type=None, - **kw - ): - super(AlterColumnOp, self).__init__(table_name, schema=schema) - self.column_name = column_name - self.existing_type = existing_type - self.existing_server_default = existing_server_default - self.existing_nullable = existing_nullable - self.existing_comment = existing_comment - self.modify_nullable = modify_nullable - self.modify_comment = modify_comment - self.modify_server_default = modify_server_default - self.modify_name = modify_name - self.modify_type = modify_type - self.kw = kw - - def to_diff_tuple(self): - col_diff = [] - schema, tname, cname = self.schema, self.table_name, self.column_name - - if self.modify_type is not None: - col_diff.append( - ( - "modify_type", - schema, - tname, - cname, - { - "existing_nullable": self.existing_nullable, - "existing_server_default": ( - self.existing_server_default - ), - "existing_comment": self.existing_comment, - }, - self.existing_type, - self.modify_type, - ) - ) - - if self.modify_nullable is not None: - col_diff.append( - ( - "modify_nullable", - schema, - tname, - cname, - { - "existing_type": self.existing_type, - "existing_server_default": ( - self.existing_server_default - ), - "existing_comment": self.existing_comment, - }, - self.existing_nullable, - self.modify_nullable, - ) - ) - - if self.modify_server_default is not False: - col_diff.append( - ( - "modify_default", - schema, - tname, - cname, - { - "existing_nullable": self.existing_nullable, - "existing_type": self.existing_type, - "existing_comment": self.existing_comment, - }, - self.existing_server_default, - self.modify_server_default, - ) - ) - - if self.modify_comment is not False: - col_diff.append( - ( - "modify_comment", - schema, - tname, - cname, - { - "existing_nullable": self.existing_nullable, - "existing_type": self.existing_type, - "existing_server_default": ( - self.existing_server_default - ), - }, - self.existing_comment, - self.modify_comment, - ) - ) - - return col_diff - - def has_changes(self): - hc1 = ( - self.modify_nullable is not None - or self.modify_server_default is not False - or self.modify_type is not None - or self.modify_comment is not False - ) - if hc1: - return True - for kw in self.kw: - if kw.startswith("modify_"): - return True - else: - return False - - def reverse(self): - - kw = self.kw.copy() - kw["existing_type"] = self.existing_type - kw["existing_nullable"] = self.existing_nullable - kw["existing_server_default"] = self.existing_server_default - kw["existing_comment"] = self.existing_comment - if self.modify_type is not None: - kw["modify_type"] = self.modify_type - if self.modify_nullable is not None: - kw["modify_nullable"] = self.modify_nullable - if self.modify_server_default is not False: - kw["modify_server_default"] = self.modify_server_default - if self.modify_comment is not False: - kw["modify_comment"] = self.modify_comment - - # TODO: make this a little simpler - all_keys = set( - m.group(1) - for m in [re.match(r"^(?:existing_|modify_)(.+)$", k) for k in kw] - if m - ) - - for k in all_keys: - if "modify_%s" % k in kw: - swap = kw["existing_%s" % k] - kw["existing_%s" % k] = kw["modify_%s" % k] - kw["modify_%s" % k] = swap - - return self.__class__( - self.table_name, self.column_name, schema=self.schema, **kw - ) - - @classmethod - @util._with_legacy_names([("name", "new_column_name")]) - def alter_column( - cls, - operations, - table_name, - column_name, - nullable=None, - comment=False, - server_default=False, - new_column_name=None, - type_=None, - existing_type=None, - existing_server_default=False, - existing_nullable=None, - existing_comment=None, - schema=None, - **kw - ): - r"""Issue an "alter column" instruction using the - current migration context. - - Generally, only that aspect of the column which - is being changed, i.e. name, type, nullability, - default, needs to be specified. Multiple changes - can also be specified at once and the backend should - "do the right thing", emitting each change either - separately or together as the backend allows. - - MySQL has special requirements here, since MySQL - cannot ALTER a column without a full specification. - When producing MySQL-compatible migration files, - it is recommended that the ``existing_type``, - ``existing_server_default``, and ``existing_nullable`` - parameters be present, if not being altered. - - Type changes which are against the SQLAlchemy - "schema" types :class:`~sqlalchemy.types.Boolean` - and :class:`~sqlalchemy.types.Enum` may also - add or drop constraints which accompany those - types on backends that don't support them natively. - The ``existing_type`` argument is - used in this case to identify and remove a previous - constraint that was bound to the type object. - - :param table_name: string name of the target table. - :param column_name: string name of the target column, - as it exists before the operation begins. - :param nullable: Optional; specify ``True`` or ``False`` - to alter the column's nullability. - :param server_default: Optional; specify a string - SQL expression, :func:`~sqlalchemy.sql.expression.text`, - or :class:`~sqlalchemy.schema.DefaultClause` to indicate - an alteration to the column's default value. - Set to ``None`` to have the default removed. - :param comment: optional string text of a new comment to add to the - column. - - .. versionadded:: 1.0.6 - - :param new_column_name: Optional; specify a string name here to - indicate the new name within a column rename operation. - :param type\_: Optional; a :class:`~sqlalchemy.types.TypeEngine` - type object to specify a change to the column's type. - For SQLAlchemy types that also indicate a constraint (i.e. - :class:`~sqlalchemy.types.Boolean`, :class:`~sqlalchemy.types.Enum`), - the constraint is also generated. - :param autoincrement: set the ``AUTO_INCREMENT`` flag of the column; - currently understood by the MySQL dialect. - :param existing_type: Optional; a - :class:`~sqlalchemy.types.TypeEngine` - type object to specify the previous type. This - is required for all MySQL column alter operations that - don't otherwise specify a new type, as well as for - when nullability is being changed on a SQL Server - column. It is also used if the type is a so-called - SQLlchemy "schema" type which may define a constraint (i.e. - :class:`~sqlalchemy.types.Boolean`, - :class:`~sqlalchemy.types.Enum`), - so that the constraint can be dropped. - :param existing_server_default: Optional; The existing - default value of the column. Required on MySQL if - an existing default is not being changed; else MySQL - removes the default. - :param existing_nullable: Optional; the existing nullability - of the column. Required on MySQL if the existing nullability - is not being changed; else MySQL sets this to NULL. - :param existing_autoincrement: Optional; the existing autoincrement - of the column. Used for MySQL's system of altering a column - that specifies ``AUTO_INCREMENT``. - :param existing_comment: string text of the existing comment on the - column to be maintained. Required on MySQL if the existing comment - on the column is not being changed. - - .. versionadded:: 1.0.6 - - :param schema: Optional schema name to operate within. To control - quoting of the schema outside of the default behavior, use - the SQLAlchemy construct - :class:`~sqlalchemy.sql.elements.quoted_name`. - - .. versionadded:: 0.7.0 'schema' can now accept a - :class:`~sqlalchemy.sql.elements.quoted_name` construct. - - :param postgresql_using: String argument which will indicate a - SQL expression to render within the Postgresql-specific USING clause - within ALTER COLUMN. This string is taken directly as raw SQL which - must explicitly include any necessary quoting or escaping of tokens - within the expression. - - .. versionadded:: 0.8.8 - - """ - - alt = cls( - table_name, - column_name, - schema=schema, - existing_type=existing_type, - existing_server_default=existing_server_default, - existing_nullable=existing_nullable, - existing_comment=existing_comment, - modify_name=new_column_name, - modify_type=type_, - modify_server_default=server_default, - modify_nullable=nullable, - modify_comment=comment, - **kw - ) - - return operations.invoke(alt) - - @classmethod - def batch_alter_column( - cls, - operations, - column_name, - nullable=None, - comment=False, - server_default=False, - new_column_name=None, - type_=None, - existing_type=None, - existing_server_default=False, - existing_nullable=None, - existing_comment=None, - insert_before=None, - insert_after=None, - **kw - ): - """Issue an "alter column" instruction using the current - batch migration context. - - Parameters are the same as that of :meth:`.Operations.alter_column`, - as well as the following option(s): - - :param insert_before: String name of an existing column which this - column should be placed before, when creating the new table. - - .. versionadded:: 1.4.0 - - :param insert_before: String name of an existing column which this - column should be placed after, when creating the new table. If - both :paramref:`.BatchOperations.alter_column.insert_before` - and :paramref:`.BatchOperations.alter_column.insert_after` are - omitted, the column is inserted after the last existing column - in the table. - - .. versionadded:: 1.4.0 - - .. seealso:: - - :meth:`.Operations.alter_column` - - - """ - alt = cls( - operations.impl.table_name, - column_name, - schema=operations.impl.schema, - existing_type=existing_type, - existing_server_default=existing_server_default, - existing_nullable=existing_nullable, - existing_comment=existing_comment, - modify_name=new_column_name, - modify_type=type_, - modify_server_default=server_default, - modify_nullable=nullable, - modify_comment=comment, - **kw - ) - - return operations.invoke(alt) - - -@Operations.register_operation("add_column") -@BatchOperations.register_operation("add_column", "batch_add_column") -class AddColumnOp(AlterTableOp): - """Represent an add column operation.""" - - def __init__(self, table_name, column, schema=None, **kw): - super(AddColumnOp, self).__init__(table_name, schema=schema) - self.column = column - self.kw = kw - - def reverse(self): - return DropColumnOp.from_column_and_tablename( - self.schema, self.table_name, self.column - ) - - def to_diff_tuple(self): - return ("add_column", self.schema, self.table_name, self.column) - - def to_column(self): - return self.column - - @classmethod - def from_column(cls, col): - return cls(col.table.name, col, schema=col.table.schema) - - @classmethod - def from_column_and_tablename(cls, schema, tname, col): - return cls(tname, col, schema=schema) - - @classmethod - def add_column(cls, operations, table_name, column, schema=None): - """Issue an "add column" instruction using the current - migration context. - - e.g.:: - - from alembic import op - from sqlalchemy import Column, String - - op.add_column('organization', - Column('name', String()) - ) - - The provided :class:`~sqlalchemy.schema.Column` object can also - specify a :class:`~sqlalchemy.schema.ForeignKey`, referencing - a remote table name. Alembic will automatically generate a stub - "referenced" table and emit a second ALTER statement in order - to add the constraint separately:: - - from alembic import op - from sqlalchemy import Column, INTEGER, ForeignKey - - op.add_column('organization', - Column('account_id', INTEGER, ForeignKey('accounts.id')) - ) - - Note that this statement uses the :class:`~sqlalchemy.schema.Column` - construct as is from the SQLAlchemy library. In particular, - default values to be created on the database side are - specified using the ``server_default`` parameter, and not - ``default`` which only specifies Python-side defaults:: - - from alembic import op - from sqlalchemy import Column, TIMESTAMP, func - - # specify "DEFAULT NOW" along with the column add - op.add_column('account', - Column('timestamp', TIMESTAMP, server_default=func.now()) - ) - - :param table_name: String name of the parent table. - :param column: a :class:`sqlalchemy.schema.Column` object - representing the new column. - :param schema: Optional schema name to operate within. To control - quoting of the schema outside of the default behavior, use - the SQLAlchemy construct - :class:`~sqlalchemy.sql.elements.quoted_name`. - - .. versionadded:: 0.7.0 'schema' can now accept a - :class:`~sqlalchemy.sql.elements.quoted_name` construct. - - - """ - - op = cls(table_name, column, schema=schema) - return operations.invoke(op) - - @classmethod - def batch_add_column( - cls, operations, column, insert_before=None, insert_after=None - ): - """Issue an "add column" instruction using the current - batch migration context. - - .. seealso:: - - :meth:`.Operations.add_column` - - """ - - kw = {} - if insert_before: - kw["insert_before"] = insert_before - if insert_after: - kw["insert_after"] = insert_after - - op = cls( - operations.impl.table_name, - column, - schema=operations.impl.schema, - **kw - ) - return operations.invoke(op) - - -@Operations.register_operation("drop_column") -@BatchOperations.register_operation("drop_column", "batch_drop_column") -class DropColumnOp(AlterTableOp): - """Represent a drop column operation.""" - - def __init__( - self, table_name, column_name, schema=None, _orig_column=None, **kw - ): - super(DropColumnOp, self).__init__(table_name, schema=schema) - self.column_name = column_name - self.kw = kw - self._orig_column = _orig_column - - def to_diff_tuple(self): - return ( - "remove_column", - self.schema, - self.table_name, - self.to_column(), - ) - - def reverse(self): - if self._orig_column is None: - raise ValueError( - "operation is not reversible; " - "original column is not present" - ) - - return AddColumnOp.from_column_and_tablename( - self.schema, self.table_name, self._orig_column - ) - - @classmethod - def from_column_and_tablename(cls, schema, tname, col): - return cls(tname, col.name, schema=schema, _orig_column=col) - - def to_column(self, migration_context=None): - if self._orig_column is not None: - return self._orig_column - schema_obj = schemaobj.SchemaObjects(migration_context) - return schema_obj.column(self.column_name, NULLTYPE) - - @classmethod - def drop_column( - cls, operations, table_name, column_name, schema=None, **kw - ): - """Issue a "drop column" instruction using the current - migration context. - - e.g.:: - - drop_column('organization', 'account_id') - - :param table_name: name of table - :param column_name: name of column - :param schema: Optional schema name to operate within. To control - quoting of the schema outside of the default behavior, use - the SQLAlchemy construct - :class:`~sqlalchemy.sql.elements.quoted_name`. - - .. versionadded:: 0.7.0 'schema' can now accept a - :class:`~sqlalchemy.sql.elements.quoted_name` construct. - - :param mssql_drop_check: Optional boolean. When ``True``, on - Microsoft SQL Server only, first - drop the CHECK constraint on the column using a - SQL-script-compatible - block that selects into a @variable from sys.check_constraints, - then exec's a separate DROP CONSTRAINT for that constraint. - :param mssql_drop_default: Optional boolean. When ``True``, on - Microsoft SQL Server only, first - drop the DEFAULT constraint on the column using a - SQL-script-compatible - block that selects into a @variable from sys.default_constraints, - then exec's a separate DROP CONSTRAINT for that default. - :param mssql_drop_foreign_key: Optional boolean. When ``True``, on - Microsoft SQL Server only, first - drop a single FOREIGN KEY constraint on the column using a - SQL-script-compatible - block that selects into a @variable from - sys.foreign_keys/sys.foreign_key_columns, - then exec's a separate DROP CONSTRAINT for that default. Only - works if the column has exactly one FK constraint which refers to - it, at the moment. - - .. versionadded:: 0.6.2 - - """ - - op = cls(table_name, column_name, schema=schema, **kw) - return operations.invoke(op) - - @classmethod - def batch_drop_column(cls, operations, column_name, **kw): - """Issue a "drop column" instruction using the current - batch migration context. - - .. seealso:: - - :meth:`.Operations.drop_column` - - """ - op = cls( - operations.impl.table_name, - column_name, - schema=operations.impl.schema, - **kw - ) - return operations.invoke(op) - - -@Operations.register_operation("bulk_insert") -class BulkInsertOp(MigrateOperation): - """Represent a bulk insert operation.""" - - def __init__(self, table, rows, multiinsert=True): - self.table = table - self.rows = rows - self.multiinsert = multiinsert - - @classmethod - def bulk_insert(cls, operations, table, rows, multiinsert=True): - """Issue a "bulk insert" operation using the current - migration context. - - This provides a means of representing an INSERT of multiple rows - which works equally well in the context of executing on a live - connection as well as that of generating a SQL script. In the - case of a SQL script, the values are rendered inline into the - statement. - - e.g.:: - - from alembic import op - from datetime import date - from sqlalchemy.sql import table, column - from sqlalchemy import String, Integer, Date - - # Create an ad-hoc table to use for the insert statement. - accounts_table = table('account', - column('id', Integer), - column('name', String), - column('create_date', Date) - ) - - op.bulk_insert(accounts_table, - [ - {'id':1, 'name':'John Smith', - 'create_date':date(2010, 10, 5)}, - {'id':2, 'name':'Ed Williams', - 'create_date':date(2007, 5, 27)}, - {'id':3, 'name':'Wendy Jones', - 'create_date':date(2008, 8, 15)}, - ] - ) - - When using --sql mode, some datatypes may not render inline - automatically, such as dates and other special types. When this - issue is present, :meth:`.Operations.inline_literal` may be used:: - - op.bulk_insert(accounts_table, - [ - {'id':1, 'name':'John Smith', - 'create_date':op.inline_literal("2010-10-05")}, - {'id':2, 'name':'Ed Williams', - 'create_date':op.inline_literal("2007-05-27")}, - {'id':3, 'name':'Wendy Jones', - 'create_date':op.inline_literal("2008-08-15")}, - ], - multiinsert=False - ) - - When using :meth:`.Operations.inline_literal` in conjunction with - :meth:`.Operations.bulk_insert`, in order for the statement to work - in "online" (e.g. non --sql) mode, the - :paramref:`~.Operations.bulk_insert.multiinsert` - flag should be set to ``False``, which will have the effect of - individual INSERT statements being emitted to the database, each - with a distinct VALUES clause, so that the "inline" values can - still be rendered, rather than attempting to pass the values - as bound parameters. - - .. versionadded:: 0.6.4 :meth:`.Operations.inline_literal` can now - be used with :meth:`.Operations.bulk_insert`, and the - :paramref:`~.Operations.bulk_insert.multiinsert` flag has - been added to assist in this usage when running in "online" - mode. - - :param table: a table object which represents the target of the INSERT. - - :param rows: a list of dictionaries indicating rows. - - :param multiinsert: when at its default of True and --sql mode is not - enabled, the INSERT statement will be executed using - "executemany()" style, where all elements in the list of - dictionaries are passed as bound parameters in a single - list. Setting this to False results in individual INSERT - statements being emitted per parameter set, and is needed - in those cases where non-literal values are present in the - parameter sets. - - .. versionadded:: 0.6.4 - - """ - - op = cls(table, rows, multiinsert=multiinsert) - operations.invoke(op) - - -@Operations.register_operation("execute") -class ExecuteSQLOp(MigrateOperation): - """Represent an execute SQL operation.""" - - def __init__(self, sqltext, execution_options=None): - self.sqltext = sqltext - self.execution_options = execution_options - - @classmethod - def execute(cls, operations, sqltext, execution_options=None): - r"""Execute the given SQL using the current migration context. - - The given SQL can be a plain string, e.g.:: - - op.execute("INSERT INTO table (foo) VALUES ('some value')") - - Or it can be any kind of Core SQL Expression construct, such as - below where we use an update construct:: - - from sqlalchemy.sql import table, column - from sqlalchemy import String - from alembic import op - - account = table('account', - column('name', String) - ) - op.execute( - account.update().\\ - where(account.c.name==op.inline_literal('account 1')).\\ - values({'name':op.inline_literal('account 2')}) - ) - - Above, we made use of the SQLAlchemy - :func:`sqlalchemy.sql.expression.table` and - :func:`sqlalchemy.sql.expression.column` constructs to make a brief, - ad-hoc table construct just for our UPDATE statement. A full - :class:`~sqlalchemy.schema.Table` construct of course works perfectly - fine as well, though note it's a recommended practice to at least - ensure the definition of a table is self-contained within the migration - script, rather than imported from a module that may break compatibility - with older migrations. - - In a SQL script context, the statement is emitted directly to the - output stream. There is *no* return result, however, as this - function is oriented towards generating a change script - that can run in "offline" mode. Additionally, parameterized - statements are discouraged here, as they *will not work* in offline - mode. Above, we use :meth:`.inline_literal` where parameters are - to be used. - - For full interaction with a connected database where parameters can - also be used normally, use the "bind" available from the context:: - - from alembic import op - connection = op.get_bind() - - connection.execute( - account.update().where(account.c.name=='account 1'). - values({"name": "account 2"}) - ) - - Additionally, when passing the statement as a plain string, it is first - coerceed into a :func:`sqlalchemy.sql.expression.text` construct - before being passed along. In the less likely case that the - literal SQL string contains a colon, it must be escaped with a - backslash, as:: - - op.execute("INSERT INTO table (foo) VALUES ('\:colon_value')") - - - :param sql: Any legal SQLAlchemy expression, including: - - * a string - * a :func:`sqlalchemy.sql.expression.text` construct. - * a :func:`sqlalchemy.sql.expression.insert` construct. - * a :func:`sqlalchemy.sql.expression.update`, - :func:`sqlalchemy.sql.expression.insert`, - or :func:`sqlalchemy.sql.expression.delete` construct. - * Pretty much anything that's "executable" as described - in :ref:`sqlexpression_toplevel`. - - .. note:: when passing a plain string, the statement is coerced into - a :func:`sqlalchemy.sql.expression.text` construct. This construct - considers symbols with colons, e.g. ``:foo`` to be bound parameters. - To avoid this, ensure that colon symbols are escaped, e.g. - ``\:foo``. - - :param execution_options: Optional dictionary of - execution options, will be passed to - :meth:`sqlalchemy.engine.Connection.execution_options`. - """ - op = cls(sqltext, execution_options=execution_options) - return operations.invoke(op) - - -class OpContainer(MigrateOperation): - """Represent a sequence of operations operation.""" - - def __init__(self, ops=()): - self.ops = ops - - def is_empty(self): - return not self.ops - - def as_diffs(self): - return list(OpContainer._ops_as_diffs(self)) - - @classmethod - def _ops_as_diffs(cls, migrations): - for op in migrations.ops: - if hasattr(op, "ops"): - for sub_op in cls._ops_as_diffs(op): - yield sub_op - else: - yield op.to_diff_tuple() - - -class ModifyTableOps(OpContainer): - """Contains a sequence of operations that all apply to a single Table.""" - - def __init__(self, table_name, ops, schema=None): - super(ModifyTableOps, self).__init__(ops) - self.table_name = table_name - self.schema = schema - - def reverse(self): - return ModifyTableOps( - self.table_name, - ops=list(reversed([op.reverse() for op in self.ops])), - schema=self.schema, - ) - - -class UpgradeOps(OpContainer): - """contains a sequence of operations that would apply to the - 'upgrade' stream of a script. - - .. seealso:: - - :ref:`customizing_revision` - - """ - - def __init__(self, ops=(), upgrade_token="upgrades"): - super(UpgradeOps, self).__init__(ops=ops) - self.upgrade_token = upgrade_token - - def reverse_into(self, downgrade_ops): - downgrade_ops.ops[:] = list( - reversed([op.reverse() for op in self.ops]) - ) - return downgrade_ops - - def reverse(self): - return self.reverse_into(DowngradeOps(ops=[])) - - -class DowngradeOps(OpContainer): - """contains a sequence of operations that would apply to the - 'downgrade' stream of a script. - - .. seealso:: - - :ref:`customizing_revision` - - """ - - def __init__(self, ops=(), downgrade_token="downgrades"): - super(DowngradeOps, self).__init__(ops=ops) - self.downgrade_token = downgrade_token - - def reverse(self): - return UpgradeOps( - ops=list(reversed([op.reverse() for op in self.ops])) - ) - - -class MigrationScript(MigrateOperation): - """represents a migration script. - - E.g. when autogenerate encounters this object, this corresponds to the - production of an actual script file. - - A normal :class:`.MigrationScript` object would contain a single - :class:`.UpgradeOps` and a single :class:`.DowngradeOps` directive. - These are accessible via the ``.upgrade_ops`` and ``.downgrade_ops`` - attributes. - - In the case of an autogenerate operation that runs multiple times, - such as the multiple database example in the "multidb" template, - the ``.upgrade_ops`` and ``.downgrade_ops`` attributes are disabled, - and instead these objects should be accessed via the ``.upgrade_ops_list`` - and ``.downgrade_ops_list`` list-based attributes. These latter - attributes are always available at the very least as single-element lists. - - .. versionchanged:: 0.8.1 the ``.upgrade_ops`` and ``.downgrade_ops`` - attributes should be accessed via the ``.upgrade_ops_list`` - and ``.downgrade_ops_list`` attributes if multiple autogenerate - passes proceed on the same :class:`.MigrationScript` object. - - .. seealso:: - - :ref:`customizing_revision` - - """ - - def __init__( - self, - rev_id, - upgrade_ops, - downgrade_ops, - message=None, - imports=set(), - head=None, - splice=None, - branch_label=None, - version_path=None, - depends_on=None, - ): - self.rev_id = rev_id - self.message = message - self.imports = imports - self.head = head - self.splice = splice - self.branch_label = branch_label - self.version_path = version_path - self.depends_on = depends_on - self.upgrade_ops = upgrade_ops - self.downgrade_ops = downgrade_ops - - @property - def upgrade_ops(self): - """An instance of :class:`.UpgradeOps`. - - .. seealso:: - - :attr:`.MigrationScript.upgrade_ops_list` - """ - if len(self._upgrade_ops) > 1: - raise ValueError( - "This MigrationScript instance has a multiple-entry " - "list for UpgradeOps; please use the " - "upgrade_ops_list attribute." - ) - elif not self._upgrade_ops: - return None - else: - return self._upgrade_ops[0] - - @upgrade_ops.setter - def upgrade_ops(self, upgrade_ops): - self._upgrade_ops = util.to_list(upgrade_ops) - for elem in self._upgrade_ops: - assert isinstance(elem, UpgradeOps) - - @property - def downgrade_ops(self): - """An instance of :class:`.DowngradeOps`. - - .. seealso:: - - :attr:`.MigrationScript.downgrade_ops_list` - """ - if len(self._downgrade_ops) > 1: - raise ValueError( - "This MigrationScript instance has a multiple-entry " - "list for DowngradeOps; please use the " - "downgrade_ops_list attribute." - ) - elif not self._downgrade_ops: - return None - else: - return self._downgrade_ops[0] - - @downgrade_ops.setter - def downgrade_ops(self, downgrade_ops): - self._downgrade_ops = util.to_list(downgrade_ops) - for elem in self._downgrade_ops: - assert isinstance(elem, DowngradeOps) - - @property - def upgrade_ops_list(self): - """A list of :class:`.UpgradeOps` instances. - - This is used in place of the :attr:`.MigrationScript.upgrade_ops` - attribute when dealing with a revision operation that does - multiple autogenerate passes. - - .. versionadded:: 0.8.1 - - """ - return self._upgrade_ops - - @property - def downgrade_ops_list(self): - """A list of :class:`.DowngradeOps` instances. - - This is used in place of the :attr:`.MigrationScript.downgrade_ops` - attribute when dealing with a revision operation that does - multiple autogenerate passes. - - .. versionadded:: 0.8.1 - - """ - return self._downgrade_ops diff --git a/venv/lib/python3.7/site-packages/alembic/operations/schemaobj.py b/venv/lib/python3.7/site-packages/alembic/operations/schemaobj.py deleted file mode 100644 index d90b5e6..0000000 --- a/venv/lib/python3.7/site-packages/alembic/operations/schemaobj.py +++ /dev/null @@ -1,181 +0,0 @@ -from sqlalchemy import schema as sa_schema -from sqlalchemy.types import Integer -from sqlalchemy.types import NULLTYPE - -from .. import util -from ..util.compat import string_types - - -class SchemaObjects(object): - def __init__(self, migration_context=None): - self.migration_context = migration_context - - def primary_key_constraint(self, name, table_name, cols, schema=None): - m = self.metadata() - columns = [sa_schema.Column(n, NULLTYPE) for n in cols] - t = sa_schema.Table(table_name, m, *columns, schema=schema) - p = sa_schema.PrimaryKeyConstraint(*[t.c[n] for n in cols], name=name) - t.append_constraint(p) - return p - - def foreign_key_constraint( - self, - name, - source, - referent, - local_cols, - remote_cols, - onupdate=None, - ondelete=None, - deferrable=None, - source_schema=None, - referent_schema=None, - initially=None, - match=None, - **dialect_kw - ): - m = self.metadata() - if source == referent and source_schema == referent_schema: - t1_cols = local_cols + remote_cols - else: - t1_cols = local_cols - sa_schema.Table( - referent, - m, - *[sa_schema.Column(n, NULLTYPE) for n in remote_cols], - schema=referent_schema - ) - - t1 = sa_schema.Table( - source, - m, - *[sa_schema.Column(n, NULLTYPE) for n in t1_cols], - schema=source_schema - ) - - tname = ( - "%s.%s" % (referent_schema, referent) - if referent_schema - else referent - ) - - dialect_kw["match"] = match - - f = sa_schema.ForeignKeyConstraint( - local_cols, - ["%s.%s" % (tname, n) for n in remote_cols], - name=name, - onupdate=onupdate, - ondelete=ondelete, - deferrable=deferrable, - initially=initially, - **dialect_kw - ) - t1.append_constraint(f) - - return f - - def unique_constraint(self, name, source, local_cols, schema=None, **kw): - t = sa_schema.Table( - source, - self.metadata(), - *[sa_schema.Column(n, NULLTYPE) for n in local_cols], - schema=schema - ) - kw["name"] = name - uq = sa_schema.UniqueConstraint(*[t.c[n] for n in local_cols], **kw) - # TODO: need event tests to ensure the event - # is fired off here - t.append_constraint(uq) - return uq - - def check_constraint(self, name, source, condition, schema=None, **kw): - t = sa_schema.Table( - source, - self.metadata(), - sa_schema.Column("x", Integer), - schema=schema, - ) - ck = sa_schema.CheckConstraint(condition, name=name, **kw) - t.append_constraint(ck) - return ck - - def generic_constraint(self, name, table_name, type_, schema=None, **kw): - t = self.table(table_name, schema=schema) - types = { - "foreignkey": lambda name: sa_schema.ForeignKeyConstraint( - [], [], name=name - ), - "primary": sa_schema.PrimaryKeyConstraint, - "unique": sa_schema.UniqueConstraint, - "check": lambda name: sa_schema.CheckConstraint("", name=name), - None: sa_schema.Constraint, - } - try: - const = types[type_] - except KeyError: - raise TypeError( - "'type' can be one of %s" - % ", ".join(sorted(repr(x) for x in types)) - ) - else: - const = const(name=name) - t.append_constraint(const) - return const - - def metadata(self): - kw = {} - if ( - self.migration_context is not None - and "target_metadata" in self.migration_context.opts - ): - mt = self.migration_context.opts["target_metadata"] - if hasattr(mt, "naming_convention"): - kw["naming_convention"] = mt.naming_convention - return sa_schema.MetaData(**kw) - - def table(self, name, *columns, **kw): - m = self.metadata() - t = sa_schema.Table(name, m, *columns, **kw) - for f in t.foreign_keys: - self._ensure_table_for_fk(m, f) - return t - - def column(self, name, type_, **kw): - return sa_schema.Column(name, type_, **kw) - - def index(self, name, tablename, columns, schema=None, **kw): - t = sa_schema.Table( - tablename or "no_table", self.metadata(), schema=schema - ) - idx = sa_schema.Index( - name, - *[util.sqla_compat._textual_index_column(t, n) for n in columns], - **kw - ) - return idx - - def _parse_table_key(self, table_key): - if "." in table_key: - tokens = table_key.split(".") - sname = ".".join(tokens[0:-1]) - tname = tokens[-1] - else: - tname = table_key - sname = None - return (sname, tname) - - def _ensure_table_for_fk(self, metadata, fk): - """create a placeholder Table object for the referent of a - ForeignKey. - - """ - if isinstance(fk._colspec, string_types): - table_key, cname = fk._colspec.rsplit(".", 1) - sname, tname = self._parse_table_key(table_key) - if table_key not in metadata.tables: - rel_t = sa_schema.Table(tname, metadata, schema=sname) - else: - rel_t = metadata.tables[table_key] - if cname not in rel_t.c: - rel_t.append_column(sa_schema.Column(cname, NULLTYPE)) diff --git a/venv/lib/python3.7/site-packages/alembic/operations/toimpl.py b/venv/lib/python3.7/site-packages/alembic/operations/toimpl.py deleted file mode 100644 index 3114a66..0000000 --- a/venv/lib/python3.7/site-packages/alembic/operations/toimpl.py +++ /dev/null @@ -1,179 +0,0 @@ -from sqlalchemy import schema as sa_schema - -from . import ops -from .base import Operations -from ..util import sqla_compat - - -@Operations.implementation_for(ops.AlterColumnOp) -def alter_column(operations, operation): - - compiler = operations.impl.dialect.statement_compiler( - operations.impl.dialect, None - ) - - existing_type = operation.existing_type - existing_nullable = operation.existing_nullable - existing_server_default = operation.existing_server_default - type_ = operation.modify_type - column_name = operation.column_name - table_name = operation.table_name - schema = operation.schema - server_default = operation.modify_server_default - new_column_name = operation.modify_name - nullable = operation.modify_nullable - comment = operation.modify_comment - existing_comment = operation.existing_comment - - def _count_constraint(constraint): - return not isinstance(constraint, sa_schema.PrimaryKeyConstraint) and ( - not constraint._create_rule or constraint._create_rule(compiler) - ) - - if existing_type and type_: - t = operations.schema_obj.table( - table_name, - sa_schema.Column(column_name, existing_type), - schema=schema, - ) - for constraint in t.constraints: - if _count_constraint(constraint): - operations.impl.drop_constraint(constraint) - - operations.impl.alter_column( - table_name, - column_name, - nullable=nullable, - server_default=server_default, - name=new_column_name, - type_=type_, - schema=schema, - existing_type=existing_type, - existing_server_default=existing_server_default, - existing_nullable=existing_nullable, - comment=comment, - existing_comment=existing_comment, - **operation.kw - ) - - if type_: - t = operations.schema_obj.table( - table_name, - operations.schema_obj.column(column_name, type_), - schema=schema, - ) - for constraint in t.constraints: - if _count_constraint(constraint): - operations.impl.add_constraint(constraint) - - -@Operations.implementation_for(ops.DropTableOp) -def drop_table(operations, operation): - operations.impl.drop_table( - operation.to_table(operations.migration_context) - ) - - -@Operations.implementation_for(ops.DropColumnOp) -def drop_column(operations, operation): - column = operation.to_column(operations.migration_context) - operations.impl.drop_column( - operation.table_name, column, schema=operation.schema, **operation.kw - ) - - -@Operations.implementation_for(ops.CreateIndexOp) -def create_index(operations, operation): - idx = operation.to_index(operations.migration_context) - operations.impl.create_index(idx) - - -@Operations.implementation_for(ops.DropIndexOp) -def drop_index(operations, operation): - operations.impl.drop_index( - operation.to_index(operations.migration_context) - ) - - -@Operations.implementation_for(ops.CreateTableOp) -def create_table(operations, operation): - table = operation.to_table(operations.migration_context) - operations.impl.create_table(table) - return table - - -@Operations.implementation_for(ops.RenameTableOp) -def rename_table(operations, operation): - operations.impl.rename_table( - operation.table_name, operation.new_table_name, schema=operation.schema - ) - - -@Operations.implementation_for(ops.CreateTableCommentOp) -def create_table_comment(operations, operation): - table = operation.to_table(operations.migration_context) - operations.impl.create_table_comment(table) - - -@Operations.implementation_for(ops.DropTableCommentOp) -def drop_table_comment(operations, operation): - table = operation.to_table(operations.migration_context) - operations.impl.drop_table_comment(table) - - -@Operations.implementation_for(ops.AddColumnOp) -def add_column(operations, operation): - table_name = operation.table_name - column = operation.column - schema = operation.schema - kw = operation.kw - - t = operations.schema_obj.table(table_name, column, schema=schema) - operations.impl.add_column(table_name, column, schema=schema, **kw) - - for constraint in t.constraints: - if not isinstance(constraint, sa_schema.PrimaryKeyConstraint): - operations.impl.add_constraint(constraint) - for index in t.indexes: - operations.impl.create_index(index) - - with_comment = ( - sqla_compat._dialect_supports_comments(operations.impl.dialect) - and not operations.impl.dialect.inline_comments - ) - comment = sqla_compat._comment_attribute(column) - if comment and with_comment: - operations.impl.create_column_comment(column) - - -@Operations.implementation_for(ops.AddConstraintOp) -def create_constraint(operations, operation): - operations.impl.add_constraint( - operation.to_constraint(operations.migration_context) - ) - - -@Operations.implementation_for(ops.DropConstraintOp) -def drop_constraint(operations, operation): - operations.impl.drop_constraint( - operations.schema_obj.generic_constraint( - operation.constraint_name, - operation.table_name, - operation.constraint_type, - schema=operation.schema, - ) - ) - - -@Operations.implementation_for(ops.BulkInsertOp) -def bulk_insert(operations, operation): - operations.impl.bulk_insert( - operation.table, operation.rows, multiinsert=operation.multiinsert - ) - - -@Operations.implementation_for(ops.ExecuteSQLOp) -def execute_sql(operations, operation): - operations.migration_context.impl.execute( - operation.sqltext, execution_options=operation.execution_options - ) diff --git a/venv/lib/python3.7/site-packages/alembic/runtime/__init__.py b/venv/lib/python3.7/site-packages/alembic/runtime/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.7/site-packages/alembic/runtime/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/runtime/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index bd9c975b02e304e2058839f0ec930f71f47c0f2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 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 V`47R4s5AUAod%H)3}i0O{(n3^njruH diff --git a/venv/lib/python3.7/site-packages/alembic/runtime/__pycache__/migration.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/runtime/__pycache__/migration.cpython-37.pyc deleted file mode 100644 index ebcba25ce17638050c937f15d1cb9ba75aaf2529..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35535 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

|&C*mxJ|Vto{WM!(}ZH)*m7g8r^|X$+a60)G4c1 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 m0Vn>l?AfBl!^9ajfAf!fzZ{ 1: - raise util.CommandError( - "Version table '%s' has more than one head present; " - "please use get_current_heads()" % self.version_table - ) - else: - return heads[0] - - def get_current_heads(self): - """Return a tuple of the current 'head versions' that are represented - in the target database. - - For a migration stream without branches, this will be a single - value, synonymous with that of - :meth:`.MigrationContext.get_current_revision`. However when multiple - unmerged branches exist within the target database, the returned tuple - will contain a value for each head. - - If this :class:`.MigrationContext` was configured in "offline" - mode, that is with ``as_sql=True``, the ``starting_rev`` - parameter is returned in a one-length tuple. - - If no version table is present, or if there are no revisions - present, an empty tuple is returned. - - .. versionadded:: 0.7.0 - - """ - if self.as_sql: - start_from_rev = self._start_from_rev - if start_from_rev == "base": - start_from_rev = None - elif start_from_rev is not None and self.script: - - start_from_rev = [ - self.script.get_revision(sfr).revision - for sfr in util.to_list(start_from_rev) - if sfr not in (None, "base") - ] - return util.to_tuple(start_from_rev, default=()) - else: - if self._start_from_rev: - raise util.CommandError( - "Can't specify current_rev to context " - "when using a database connection" - ) - if not self._has_version_table(): - return () - return tuple( - row[0] for row in self.connection.execute(self._version.select()) - ) - - def _ensure_version_table(self, purge=False): - self._version.create(self.connection, checkfirst=True) - if purge: - self.connection.execute(self._version.delete()) - - def _has_version_table(self): - return sqla_compat._connectable_has_table( - self.connection, self.version_table, self.version_table_schema - ) - - def stamp(self, script_directory, revision): - """Stamp the version table with a specific revision. - - This method calculates those branches to which the given revision - can apply, and updates those branches as though they were migrated - towards that revision (either up or down). If no current branches - include the revision, it is added as a new branch head. - - .. versionadded:: 0.7.0 - - """ - heads = self.get_current_heads() - if not self.as_sql and not heads: - self._ensure_version_table() - head_maintainer = HeadMaintainer(self, heads) - for step in script_directory._stamp_revs(revision, heads): - head_maintainer.update_to_step(step) - - def run_migrations(self, **kw): - r"""Run the migration scripts established for this - :class:`.MigrationContext`, if any. - - The commands in :mod:`alembic.command` will set up a function - that is ultimately passed to the :class:`.MigrationContext` - as the ``fn`` argument. This function represents the "work" - that will be done when :meth:`.MigrationContext.run_migrations` - is called, typically from within the ``env.py`` script of the - migration environment. The "work function" then provides an iterable - of version callables and other version information which - in the case of the ``upgrade`` or ``downgrade`` commands are the - list of version scripts to invoke. Other commands yield nothing, - in the case that a command wants to run some other operation - against the database such as the ``current`` or ``stamp`` commands. - - :param \**kw: keyword arguments here will be passed to each - migration callable, that is the ``upgrade()`` or ``downgrade()`` - method within revision scripts. - - """ - self.impl.start_migrations() - - if self.purge: - if self.as_sql: - raise util.CommandError("Can't use --purge with --sql mode") - self._ensure_version_table(purge=True) - heads = () - else: - heads = self.get_current_heads() - - if not self.as_sql and not heads: - self._ensure_version_table() - - head_maintainer = HeadMaintainer(self, heads) - - starting_in_transaction = ( - not self.as_sql and self._in_connection_transaction() - ) - - for step in self._migrations_fn(heads, self): - with self.begin_transaction(_per_migration=True): - if self.as_sql and not head_maintainer.heads: - # for offline mode, include a CREATE TABLE from - # the base - self._version.create(self.connection) - log.info("Running %s", step) - if self.as_sql: - self.impl.static_output( - "-- Running %s" % (step.short_log,) - ) - step.migration_fn(**kw) - - # previously, we wouldn't stamp per migration - # if we were in a transaction, however given the more - # complex model that involves any number of inserts - # and row-targeted updates and deletes, it's simpler for now - # just to run the operations on every version - head_maintainer.update_to_step(step) - for callback in self.on_version_apply_callbacks: - callback( - ctx=self, - step=step.info, - heads=set(head_maintainer.heads), - run_args=kw, - ) - - if ( - not starting_in_transaction - and not self.as_sql - and not self.impl.transactional_ddl - and self._in_connection_transaction() - ): - raise util.CommandError( - 'Migration "%s" has left an uncommitted ' - "transaction opened; transactional_ddl is False so " - "Alembic is not committing transactions" % step - ) - - if self.as_sql and not head_maintainer.heads: - self._version.drop(self.connection) - - def _in_connection_transaction(self): - try: - meth = self.connection.in_transaction - except AttributeError: - return False - else: - return meth() - - def execute(self, sql, execution_options=None): - """Execute a SQL construct or string statement. - - The underlying execution mechanics are used, that is - if this is "offline mode" the SQL is written to the - output buffer, otherwise the SQL is emitted on - the current SQLAlchemy connection. - - """ - self.impl._exec(sql, execution_options) - - def _stdout_connection(self, connection): - def dump(construct, *multiparams, **params): - self.impl._exec(construct) - - return MockEngineStrategy.MockConnection(self.dialect, dump) - - @property - def bind(self): - """Return the current "bind". - - In online mode, this is an instance of - :class:`sqlalchemy.engine.Connection`, and is suitable - for ad-hoc execution of any kind of usage described - in :ref:`sqlexpression_toplevel` as well as - for usage with the :meth:`sqlalchemy.schema.Table.create` - and :meth:`sqlalchemy.schema.MetaData.create_all` methods - of :class:`~sqlalchemy.schema.Table`, - :class:`~sqlalchemy.schema.MetaData`. - - Note that when "standard output" mode is enabled, - this bind will be a "mock" connection handler that cannot - return results and is only appropriate for a very limited - subset of commands. - - """ - return self.connection - - @property - def config(self): - """Return the :class:`.Config` used by the current environment, if any. - - .. versionadded:: 0.6.6 - - """ - if self.environment_context: - return self.environment_context.config - else: - return None - - def _compare_type(self, inspector_column, metadata_column): - if self._user_compare_type is False: - return False - - if callable(self._user_compare_type): - user_value = self._user_compare_type( - self, - inspector_column, - metadata_column, - inspector_column.type, - metadata_column.type, - ) - if user_value is not None: - return user_value - - return self.impl.compare_type(inspector_column, metadata_column) - - def _compare_server_default( - self, - inspector_column, - metadata_column, - rendered_metadata_default, - rendered_column_default, - ): - - if self._user_compare_server_default is False: - return False - - if callable(self._user_compare_server_default): - user_value = self._user_compare_server_default( - self, - inspector_column, - metadata_column, - rendered_column_default, - metadata_column.server_default, - rendered_metadata_default, - ) - if user_value is not None: - return user_value - - return self.impl.compare_server_default( - inspector_column, - metadata_column, - rendered_metadata_default, - rendered_column_default, - ) - - -class HeadMaintainer(object): - def __init__(self, context, heads): - self.context = context - self.heads = set(heads) - - def _insert_version(self, version): - assert version not in self.heads - self.heads.add(version) - - self.context.impl._exec( - self.context._version.insert().values( - version_num=literal_column("'%s'" % version) - ) - ) - - def _delete_version(self, version): - self.heads.remove(version) - - ret = self.context.impl._exec( - self.context._version.delete().where( - self.context._version.c.version_num - == literal_column("'%s'" % version) - ) - ) - if ( - not self.context.as_sql - and self.context.dialect.supports_sane_rowcount - and ret.rowcount != 1 - ): - raise util.CommandError( - "Online migration expected to match one " - "row when deleting '%s' in '%s'; " - "%d found" - % (version, self.context.version_table, ret.rowcount) - ) - - def _update_version(self, from_, to_): - assert to_ not in self.heads - self.heads.remove(from_) - self.heads.add(to_) - - ret = self.context.impl._exec( - self.context._version.update() - .values(version_num=literal_column("'%s'" % to_)) - .where( - self.context._version.c.version_num - == literal_column("'%s'" % from_) - ) - ) - if ( - not self.context.as_sql - and self.context.dialect.supports_sane_rowcount - and ret.rowcount != 1 - ): - raise util.CommandError( - "Online migration expected to match one " - "row when updating '%s' to '%s' in '%s'; " - "%d found" - % (from_, to_, self.context.version_table, ret.rowcount) - ) - - def update_to_step(self, step): - if step.should_delete_branch(self.heads): - vers = step.delete_version_num - log.debug("branch delete %s", vers) - self._delete_version(vers) - elif step.should_create_branch(self.heads): - vers = step.insert_version_num - log.debug("new branch insert %s", vers) - self._insert_version(vers) - elif step.should_merge_branches(self.heads): - # delete revs, update from rev, update to rev - ( - delete_revs, - update_from_rev, - update_to_rev, - ) = step.merge_branch_idents(self.heads) - log.debug( - "merge, delete %s, update %s to %s", - delete_revs, - update_from_rev, - update_to_rev, - ) - for delrev in delete_revs: - self._delete_version(delrev) - self._update_version(update_from_rev, update_to_rev) - elif step.should_unmerge_branches(self.heads): - ( - update_from_rev, - update_to_rev, - insert_revs, - ) = step.unmerge_branch_idents(self.heads) - log.debug( - "unmerge, insert %s, update %s to %s", - insert_revs, - update_from_rev, - update_to_rev, - ) - for insrev in insert_revs: - self._insert_version(insrev) - self._update_version(update_from_rev, update_to_rev) - else: - from_, to_ = step.update_version_num(self.heads) - log.debug("update %s to %s", from_, to_) - self._update_version(from_, to_) - - -class MigrationInfo(object): - """Exposes information about a migration step to a callback listener. - - The :class:`.MigrationInfo` object is available exclusively for the - benefit of the :paramref:`.EnvironmentContext.on_version_apply` - callback hook. - - .. versionadded:: 0.9.3 - - """ - - is_upgrade = None - """True/False: indicates whether this operation ascends or descends the - version tree.""" - - is_stamp = None - """True/False: indicates whether this operation is a stamp (i.e. whether - it results in any actual database operations).""" - - up_revision_id = None - """Version string corresponding to :attr:`.Revision.revision`. - - In the case of a stamp operation, it is advised to use the - :attr:`.MigrationInfo.up_revision_ids` tuple as a stamp operation can - make a single movement from one or more branches down to a single - branchpoint, in which case there will be multiple "up" revisions. - - .. seealso:: - - :attr:`.MigrationInfo.up_revision_ids` - - """ - - up_revision_ids = None - """Tuple of version strings corresponding to :attr:`.Revision.revision`. - - In the majority of cases, this tuple will be a single value, synonomous - with the scalar value of :attr:`.MigrationInfo.up_revision_id`. - It can be multiple revision identifiers only in the case of an - ``alembic stamp`` operation which is moving downwards from multiple - branches down to their common branch point. - - .. versionadded:: 0.9.4 - - """ - - down_revision_ids = None - """Tuple of strings representing the base revisions of this migration step. - - If empty, this represents a root revision; otherwise, the first item - corresponds to :attr:`.Revision.down_revision`, and the rest are inferred - from dependencies. - """ - - revision_map = None - """The revision map inside of which this operation occurs.""" - - def __init__( - self, revision_map, is_upgrade, is_stamp, up_revisions, down_revisions - ): - self.revision_map = revision_map - self.is_upgrade = is_upgrade - self.is_stamp = is_stamp - self.up_revision_ids = util.to_tuple(up_revisions, default=()) - if self.up_revision_ids: - self.up_revision_id = self.up_revision_ids[0] - else: - # this should never be the case with - # "upgrade", "downgrade", or "stamp" as we are always - # measuring movement in terms of at least one upgrade version - self.up_revision_id = None - self.down_revision_ids = util.to_tuple(down_revisions, default=()) - - @property - def is_migration(self): - """True/False: indicates whether this operation is a migration. - - At present this is true if and only the migration is not a stamp. - If other operation types are added in the future, both this attribute - and :attr:`~.MigrationInfo.is_stamp` will be false. - """ - return not self.is_stamp - - @property - def source_revision_ids(self): - """Active revisions before this migration step is applied.""" - return ( - self.down_revision_ids if self.is_upgrade else self.up_revision_ids - ) - - @property - def destination_revision_ids(self): - """Active revisions after this migration step is applied.""" - return ( - self.up_revision_ids if self.is_upgrade else self.down_revision_ids - ) - - @property - def up_revision(self): - """Get :attr:`~.MigrationInfo.up_revision_id` as - a :class:`.Revision`. - - """ - return self.revision_map.get_revision(self.up_revision_id) - - @property - def up_revisions(self): - """Get :attr:`~.MigrationInfo.up_revision_ids` as a :class:`.Revision`. - - .. versionadded:: 0.9.4 - - """ - return self.revision_map.get_revisions(self.up_revision_ids) - - @property - def down_revisions(self): - """Get :attr:`~.MigrationInfo.down_revision_ids` as a tuple of - :class:`Revisions <.Revision>`.""" - return self.revision_map.get_revisions(self.down_revision_ids) - - @property - def source_revisions(self): - """Get :attr:`~MigrationInfo.source_revision_ids` as a tuple of - :class:`Revisions <.Revision>`.""" - return self.revision_map.get_revisions(self.source_revision_ids) - - @property - def destination_revisions(self): - """Get :attr:`~MigrationInfo.destination_revision_ids` as a tuple of - :class:`Revisions <.Revision>`.""" - return self.revision_map.get_revisions(self.destination_revision_ids) - - -class MigrationStep(object): - @property - def name(self): - return self.migration_fn.__name__ - - @classmethod - def upgrade_from_script(cls, revision_map, script): - return RevisionStep(revision_map, script, True) - - @classmethod - def downgrade_from_script(cls, revision_map, script): - return RevisionStep(revision_map, script, False) - - @property - def is_downgrade(self): - return not self.is_upgrade - - @property - def short_log(self): - return "%s %s -> %s" % ( - self.name, - util.format_as_comma(self.from_revisions_no_deps), - util.format_as_comma(self.to_revisions_no_deps), - ) - - def __str__(self): - if self.doc: - return "%s %s -> %s, %s" % ( - self.name, - util.format_as_comma(self.from_revisions_no_deps), - util.format_as_comma(self.to_revisions_no_deps), - self.doc, - ) - else: - return self.short_log - - -class RevisionStep(MigrationStep): - def __init__(self, revision_map, revision, is_upgrade): - self.revision_map = revision_map - self.revision = revision - self.is_upgrade = is_upgrade - if is_upgrade: - self.migration_fn = revision.module.upgrade - else: - self.migration_fn = revision.module.downgrade - - def __repr__(self): - return "RevisionStep(%r, is_upgrade=%r)" % ( - self.revision.revision, - self.is_upgrade, - ) - - def __eq__(self, other): - return ( - isinstance(other, RevisionStep) - and other.revision == self.revision - and self.is_upgrade == other.is_upgrade - ) - - @property - def doc(self): - return self.revision.doc - - @property - def from_revisions(self): - if self.is_upgrade: - return self.revision._all_down_revisions - else: - return (self.revision.revision,) - - @property - def from_revisions_no_deps(self): - if self.is_upgrade: - return self.revision._versioned_down_revisions - else: - return (self.revision.revision,) - - @property - def to_revisions(self): - if self.is_upgrade: - return (self.revision.revision,) - else: - return self.revision._all_down_revisions - - @property - def to_revisions_no_deps(self): - if self.is_upgrade: - return (self.revision.revision,) - else: - return self.revision._versioned_down_revisions - - @property - def _has_scalar_down_revision(self): - return len(self.revision._all_down_revisions) == 1 - - def should_delete_branch(self, heads): - """A delete is when we are a. in a downgrade and b. - we are going to the "base" or we are going to a version that - is implied as a dependency on another version that is remaining. - - """ - if not self.is_downgrade: - return False - - if self.revision.revision not in heads: - return False - - downrevs = self.revision._all_down_revisions - - if not downrevs: - # is a base - return True - else: - # determine what the ultimate "to_revisions" for an - # unmerge would be. If there are none, then we're a delete. - to_revisions = self._unmerge_to_revisions(heads) - return not to_revisions - - def merge_branch_idents(self, heads): - other_heads = set(heads).difference(self.from_revisions) - - if other_heads: - ancestors = set( - r.revision - for r in self.revision_map._get_ancestor_nodes( - self.revision_map.get_revisions(other_heads), check=False - ) - ) - from_revisions = list( - set(self.from_revisions).difference(ancestors) - ) - else: - from_revisions = list(self.from_revisions) - - return ( - # delete revs, update from rev, update to rev - list(from_revisions[0:-1]), - from_revisions[-1], - self.to_revisions[0], - ) - - def _unmerge_to_revisions(self, heads): - other_heads = set(heads).difference([self.revision.revision]) - if other_heads: - ancestors = set( - r.revision - for r in self.revision_map._get_ancestor_nodes( - self.revision_map.get_revisions(other_heads), check=False - ) - ) - return list(set(self.to_revisions).difference(ancestors)) - else: - return self.to_revisions - - def unmerge_branch_idents(self, heads): - to_revisions = self._unmerge_to_revisions(heads) - - return ( - # update from rev, update to rev, insert revs - self.from_revisions[0], - to_revisions[-1], - to_revisions[0:-1], - ) - - def should_create_branch(self, heads): - if not self.is_upgrade: - return False - - downrevs = self.revision._all_down_revisions - - if not downrevs: - # is a base - return True - else: - # none of our downrevs are present, so... - # we have to insert our version. This is true whether - # or not there is only one downrev, or multiple (in the latter - # case, we're a merge point.) - if not heads.intersection(downrevs): - return True - else: - return False - - def should_merge_branches(self, heads): - if not self.is_upgrade: - return False - - downrevs = self.revision._all_down_revisions - - if len(downrevs) > 1 and len(heads.intersection(downrevs)) > 1: - return True - - return False - - def should_unmerge_branches(self, heads): - if not self.is_downgrade: - return False - - downrevs = self.revision._all_down_revisions - - if self.revision.revision in heads and len(downrevs) > 1: - return True - - return False - - def update_version_num(self, heads): - if not self._has_scalar_down_revision: - downrev = heads.intersection(self.revision._all_down_revisions) - assert ( - len(downrev) == 1 - ), "Can't do an UPDATE because downrevision is ambiguous" - down_revision = list(downrev)[0] - else: - down_revision = self.revision._all_down_revisions[0] - - if self.is_upgrade: - return down_revision, self.revision.revision - else: - return self.revision.revision, down_revision - - @property - def delete_version_num(self): - return self.revision.revision - - @property - def insert_version_num(self): - return self.revision.revision - - @property - def info(self): - return MigrationInfo( - revision_map=self.revision_map, - up_revisions=self.revision.revision, - down_revisions=self.revision._all_down_revisions, - is_upgrade=self.is_upgrade, - is_stamp=False, - ) - - -class StampStep(MigrationStep): - def __init__(self, from_, to_, is_upgrade, branch_move, revision_map=None): - self.from_ = util.to_tuple(from_, default=()) - self.to_ = util.to_tuple(to_, default=()) - self.is_upgrade = is_upgrade - self.branch_move = branch_move - self.migration_fn = self.stamp_revision - self.revision_map = revision_map - - doc = None - - def stamp_revision(self, **kw): - return None - - def __eq__(self, other): - return ( - isinstance(other, StampStep) - and other.from_revisions == self.revisions - and other.to_revisions == self.to_revisions - and other.branch_move == self.branch_move - and self.is_upgrade == other.is_upgrade - ) - - @property - def from_revisions(self): - return self.from_ - - @property - def to_revisions(self): - return self.to_ - - @property - def from_revisions_no_deps(self): - return self.from_ - - @property - def to_revisions_no_deps(self): - return self.to_ - - @property - def delete_version_num(self): - assert len(self.from_) == 1 - return self.from_[0] - - @property - def insert_version_num(self): - assert len(self.to_) == 1 - return self.to_[0] - - def update_version_num(self, heads): - assert len(self.from_) == 1 - assert len(self.to_) == 1 - return self.from_[0], self.to_[0] - - def merge_branch_idents(self, heads): - return ( - # delete revs, update from rev, update to rev - list(self.from_[0:-1]), - self.from_[-1], - self.to_[0], - ) - - def unmerge_branch_idents(self, heads): - return ( - # update from rev, update to rev, insert revs - self.from_[0], - self.to_[-1], - list(self.to_[0:-1]), - ) - - def should_delete_branch(self, heads): - # TODO: we probably need to look for self.to_ inside of heads, - # in a similar manner as should_create_branch, however we have - # no tests for this yet (stamp downgrades w/ branches) - return self.is_downgrade and self.branch_move - - def should_create_branch(self, heads): - return ( - self.is_upgrade - and (self.branch_move or set(self.from_).difference(heads)) - and set(self.to_).difference(heads) - ) - - def should_merge_branches(self, heads): - return len(self.from_) > 1 - - def should_unmerge_branches(self, heads): - return len(self.to_) > 1 - - @property - def info(self): - up, down = ( - (self.to_, self.from_) - if self.is_upgrade - else (self.from_, self.to_) - ) - return MigrationInfo( - revision_map=self.revision_map, - up_revisions=up, - down_revisions=down, - is_upgrade=self.is_upgrade, - is_stamp=True, - ) diff --git a/venv/lib/python3.7/site-packages/alembic/script/__init__.py b/venv/lib/python3.7/site-packages/alembic/script/__init__.py deleted file mode 100644 index 540d627..0000000 --- a/venv/lib/python3.7/site-packages/alembic/script/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .base import Script # noqa -from .base import ScriptDirectory # noqa - -__all__ = ["ScriptDirectory", "Script"] diff --git a/venv/lib/python3.7/site-packages/alembic/script/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/script/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 2a86a45f5ac686d3cd49b3d5bfaf2d93f3224914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 zcmZ?b<>g`kf~V6D#FYT)#~=<2Faa43KwPW>BvKes7;_kM8KW2(L2M=TZlX-=vg$Z5qaK!S&nhY0`@d_86W diff --git a/venv/lib/python3.7/site-packages/alembic/script/__pycache__/base.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/script/__pycache__/base.cpython-37.pyc deleted file mode 100644 index 2399e1e632cd2610407fcd621fbe9e186bf4a597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23500 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 XyQsN#!)dtqS8n`_G5WWGtH%EZc$ElT diff --git a/venv/lib/python3.7/site-packages/alembic/script/__pycache__/write_hooks.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/script/__pycache__/write_hooks.cpython-37.pyc deleted file mode 100644 index 385ba1c9e16293936a92c4a1d325d49953d168c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2737 zcma)8O^@5g8J;02iA!nMPU6^bV5EfWO`^u8oxni>b>TL(3$!S@hd4l70jZYD8OikW zYiCAYub{oeF03AU>Y-OHP!#CD=uhaG=&k6%e<7zn?@+s1xF}E(d}lZxFW-;neTF~Z z+zc45fB*UKzxxMz|Du<(%SGpBc=Qtp!359Puxa^_3rDz_lef*{28SW0Y_p(vASE(;S|wOLvmND=PKtULk0| zd=ckWCRh8SD10uJh7GY0QVa&+XVK@;y+$b}wUlwD%fX--p-&Bz91r%YQk#)AV?<`? zQ8Lx0%=dz3;dvw|A{2%9C=xx0IWug*c90rGf$t)C8>7Zmb&MBhTu@w#IG2B8-~aTk z$*a3nTHQ$tZQ?AubFchDOFb^`#+l6b)8xF>iApPT_ku}LbzJ+a$ja;VeM$@Cvk%Tf z8|`Fe0{>+Hn+h83T9%e_D$>M+ zNePgqMOsY4gQHkYbXY+jtT!cn-)<$e=}IQ)IBnc&e2p5tDo%lf!MPu? zEM(DX;~|LANA+JJh)pt<^Am@&xwCW@Z0QPDc&E-OKXG4tH+LVgZ)bnt3$CNXTd&z` zK6WhC`3v?4gm&UB_}mkn9bgl!4{Wx8&D+4H2W)<~!e(pPHl3v}HWtt{cGmbjy!C{c z&NGnZf?s7On78H(db*EK)0oz9GH< z0lYubRhF7jS)daqas-0So_Wa5}$+g8IF4o&Cu<^r*0E9w}0>+jr^!M5Bx*fYfd#3k*5Yz1lsH$LMy+0$5Xw zfqTmm#2AXw`F*fM(59o{!2`ToZfH9WpM5w|)1u+YHRY@q*MXfIQ90J0Ij-a^0{Fsh z9nnjeYJ}-W)IyYbbuu*LND+|6x$^J@gOQ^+G62XeRHt-bvi@Vx>P z>y{03?M|do#LgD$YLj||G_^&G+K7mmY75AIyY_I>Jykboy3s*)>)Hd;ncZKde?9bnfIxi+HR?ws=$AuXg_t>alG&v+uS#Wrr=Q^Yq_3`FrvFa8 zSshGp_Udw~5~=@p{@=mRh8kI0M%F$gyO1x8`XTh7UZ(q%DxpEwE^uDE`dHV2d?Aym ziT5*Eck@zAk*@~d&){L*!l|XSx=Dt#)i#>O=1 1: - raise util.CommandError("Multiple version_locations present") - else: - return loc[0] - - @util.memoized_property - def _version_locations(self): - if self.version_locations: - return [ - os.path.abspath(util.coerce_resource_to_filename(location)) - for location in self.version_locations - ] - else: - return (os.path.abspath(os.path.join(self.dir, "versions")),) - - def _load_revisions(self): - if self.version_locations: - paths = [ - vers - for vers in self._version_locations - if os.path.exists(vers) - ] - else: - paths = [self.versions] - - dupes = set() - for vers in paths: - for file_ in Script._list_py_dir(self, vers): - path = os.path.realpath(os.path.join(vers, file_)) - if path in dupes: - util.warn( - "File %s loaded twice! ignoring. Please ensure " - "version_locations is unique." % path - ) - continue - dupes.add(path) - script = Script._from_filename(self, vers, file_) - if script is None: - continue - yield script - - @classmethod - def from_config(cls, config): - """Produce a new :class:`.ScriptDirectory` given a :class:`.Config` - instance. - - The :class:`.Config` need only have the ``script_location`` key - present. - - """ - script_location = config.get_main_option("script_location") - if script_location is None: - raise util.CommandError( - "No 'script_location' key " "found in configuration." - ) - truncate_slug_length = config.get_main_option("truncate_slug_length") - if truncate_slug_length is not None: - truncate_slug_length = int(truncate_slug_length) - - version_locations = config.get_main_option("version_locations") - if version_locations: - version_locations = _split_on_space_comma.split(version_locations) - - return ScriptDirectory( - util.coerce_resource_to_filename(script_location), - file_template=config.get_main_option( - "file_template", _default_file_template - ), - truncate_slug_length=truncate_slug_length, - sourceless=config.get_main_option("sourceless") == "true", - output_encoding=config.get_main_option("output_encoding", "utf-8"), - version_locations=version_locations, - timezone=config.get_main_option("timezone"), - hook_config=config.get_section("post_write_hooks", {}), - ) - - @contextmanager - def _catch_revision_errors( - self, - ancestor=None, - multiple_heads=None, - start=None, - end=None, - resolution=None, - ): - try: - yield - except revision.RangeNotAncestorError as rna: - if start is None: - start = rna.lower - if end is None: - end = rna.upper - if not ancestor: - ancestor = ( - "Requested range %(start)s:%(end)s does not refer to " - "ancestor/descendant revisions along the same branch" - ) - ancestor = ancestor % {"start": start, "end": end} - compat.raise_from_cause(util.CommandError(ancestor)) - except revision.MultipleHeads as mh: - if not multiple_heads: - multiple_heads = ( - "Multiple head revisions are present for given " - "argument '%(head_arg)s'; please " - "specify a specific target revision, " - "'@%(head_arg)s' to " - "narrow to a specific head, or 'heads' for all heads" - ) - multiple_heads = multiple_heads % { - "head_arg": end or mh.argument, - "heads": util.format_as_comma(mh.heads), - } - compat.raise_from_cause(util.CommandError(multiple_heads)) - except revision.ResolutionError as re: - if resolution is None: - resolution = "Can't locate revision identified by '%s'" % ( - re.argument - ) - compat.raise_from_cause(util.CommandError(resolution)) - except revision.RevisionError as err: - compat.raise_from_cause(util.CommandError(err.args[0])) - - def walk_revisions(self, base="base", head="heads"): - """Iterate through all revisions. - - :param base: the base revision, or "base" to start from the - empty revision. - - :param head: the head revision; defaults to "heads" to indicate - all head revisions. May also be "head" to indicate a single - head revision. - - .. versionchanged:: 0.7.0 the "head" identifier now refers to - the head of a non-branched repository only; use "heads" to - refer to the set of all head branches simultaneously. - - """ - with self._catch_revision_errors(start=base, end=head): - for rev in self.revision_map.iterate_revisions( - head, base, inclusive=True, assert_relative_length=False - ): - yield rev - - def get_revisions(self, id_): - """Return the :class:`.Script` instance with the given rev identifier, - symbolic name, or sequence of identifiers. - - .. versionadded:: 0.7.0 - - """ - with self._catch_revision_errors(): - return self.revision_map.get_revisions(id_) - - def get_all_current(self, id_): - with self._catch_revision_errors(): - top_revs = set(self.revision_map.get_revisions(id_)) - top_revs.update( - self.revision_map._get_ancestor_nodes( - list(top_revs), include_dependencies=True - ) - ) - top_revs = self.revision_map._filter_into_branch_heads(top_revs) - return top_revs - - def get_revision(self, id_): - """Return the :class:`.Script` instance with the given rev id. - - .. seealso:: - - :meth:`.ScriptDirectory.get_revisions` - - """ - - with self._catch_revision_errors(): - return self.revision_map.get_revision(id_) - - def as_revision_number(self, id_): - """Convert a symbolic revision, i.e. 'head' or 'base', into - an actual revision number.""" - - with self._catch_revision_errors(): - rev, branch_name = self.revision_map._resolve_revision_number(id_) - - if not rev: - # convert () to None - return None - elif id_ == "heads": - return rev - else: - return rev[0] - - def iterate_revisions(self, upper, lower): - """Iterate through script revisions, starting at the given - upper revision identifier and ending at the lower. - - The traversal uses strictly the `down_revision` - marker inside each migration script, so - it is a requirement that upper >= lower, - else you'll get nothing back. - - The iterator yields :class:`.Script` objects. - - .. seealso:: - - :meth:`.RevisionMap.iterate_revisions` - - """ - return self.revision_map.iterate_revisions(upper, lower) - - def get_current_head(self): - """Return the current head revision. - - If the script directory has multiple heads - due to branching, an error is raised; - :meth:`.ScriptDirectory.get_heads` should be - preferred. - - :return: a string revision number. - - .. seealso:: - - :meth:`.ScriptDirectory.get_heads` - - """ - with self._catch_revision_errors( - multiple_heads=( - "The script directory has multiple heads (due to branching)." - "Please use get_heads(), or merge the branches using " - "alembic merge." - ) - ): - return self.revision_map.get_current_head() - - def get_heads(self): - """Return all "versioned head" revisions as strings. - - This is normally a list of length one, - unless branches are present. The - :meth:`.ScriptDirectory.get_current_head()` method - can be used normally when a script directory - has only one head. - - :return: a tuple of string revision numbers. - """ - return list(self.revision_map.heads) - - def get_base(self): - """Return the "base" revision as a string. - - This is the revision number of the script that - has a ``down_revision`` of None. - - If the script directory has multiple bases, an error is raised; - :meth:`.ScriptDirectory.get_bases` should be - preferred. - - """ - bases = self.get_bases() - if len(bases) > 1: - raise util.CommandError( - "The script directory has multiple bases. " - "Please use get_bases()." - ) - elif bases: - return bases[0] - else: - return None - - def get_bases(self): - """return all "base" revisions as strings. - - This is the revision number of all scripts that - have a ``down_revision`` of None. - - .. versionadded:: 0.7.0 - - """ - return list(self.revision_map.bases) - - def _upgrade_revs(self, destination, current_rev): - with self._catch_revision_errors( - ancestor="Destination %(end)s is not a valid upgrade " - "target from current head(s)", - end=destination, - ): - revs = self.revision_map.iterate_revisions( - destination, current_rev, implicit_base=True - ) - revs = list(revs) - return [ - migration.MigrationStep.upgrade_from_script( - self.revision_map, script - ) - for script in reversed(list(revs)) - ] - - def _downgrade_revs(self, destination, current_rev): - with self._catch_revision_errors( - ancestor="Destination %(end)s is not a valid downgrade " - "target from current head(s)", - end=destination, - ): - revs = self.revision_map.iterate_revisions( - current_rev, destination, select_for_downgrade=True - ) - return [ - migration.MigrationStep.downgrade_from_script( - self.revision_map, script - ) - for script in revs - ] - - def _stamp_revs(self, revision, heads): - with self._catch_revision_errors( - multiple_heads="Multiple heads are present; please specify a " - "single target revision" - ): - - heads = self.get_revisions(heads) - - steps = [] - - if not revision: - revision = "base" - - filtered_heads = [] - for rev in util.to_tuple(revision): - if rev: - filtered_heads.extend( - self.revision_map.filter_for_lineage( - heads, rev, include_dependencies=True - ) - ) - filtered_heads = util.unique_list(filtered_heads) - - dests = self.get_revisions(revision) or [None] - - for dest in dests: - - if dest is None: - # dest is 'base'. Return a "delete branch" migration - # for all applicable heads. - steps.extend( - [ - migration.StampStep( - head.revision, - None, - False, - True, - self.revision_map, - ) - for head in filtered_heads - ] - ) - continue - elif dest in filtered_heads: - # the dest is already in the version table, do nothing. - continue - - # figure out if the dest is a descendant or an - # ancestor of the selected nodes - descendants = set( - self.revision_map._get_descendant_nodes([dest]) - ) - ancestors = set(self.revision_map._get_ancestor_nodes([dest])) - - if descendants.intersection(filtered_heads): - # heads are above the target, so this is a downgrade. - # we can treat them as a "merge", single step. - assert not ancestors.intersection(filtered_heads) - todo_heads = [head.revision for head in filtered_heads] - step = migration.StampStep( - todo_heads, - dest.revision, - False, - False, - self.revision_map, - ) - steps.append(step) - continue - elif ancestors.intersection(filtered_heads): - # heads are below the target, so this is an upgrade. - # we can treat them as a "merge", single step. - todo_heads = [head.revision for head in filtered_heads] - step = migration.StampStep( - todo_heads, - dest.revision, - True, - False, - self.revision_map, - ) - steps.append(step) - continue - else: - # destination is in a branch not represented, - # treat it as new branch - step = migration.StampStep( - (), dest.revision, True, True, self.revision_map - ) - steps.append(step) - continue - - return steps - - def run_env(self): - """Run the script environment. - - This basically runs the ``env.py`` script present - in the migration environment. It is called exclusively - by the command functions in :mod:`alembic.command`. - - - """ - util.load_python_file(self.dir, "env.py") - - @property - def env_py_location(self): - return os.path.abspath(os.path.join(self.dir, "env.py")) - - def _generate_template(self, src, dest, **kw): - util.status( - "Generating %s" % os.path.abspath(dest), - util.template_to_file, - src, - dest, - self.output_encoding, - **kw - ) - - def _copy_file(self, src, dest): - util.status( - "Generating %s" % os.path.abspath(dest), shutil.copy, src, dest - ) - - def _ensure_directory(self, path): - path = os.path.abspath(path) - if not os.path.exists(path): - util.status("Creating directory %s" % path, os.makedirs, path) - - def _generate_create_date(self): - if self.timezone is not None: - # First, assume correct capitalization - tzinfo = tz.gettz(self.timezone) - if tzinfo is None: - # Fall back to uppercase - tzinfo = tz.gettz(self.timezone.upper()) - if tzinfo is None: - raise util.CommandError( - "Can't locate timezone: %s" % self.timezone - ) - create_date = ( - datetime.datetime.utcnow() - .replace(tzinfo=tz.tzutc()) - .astimezone(tzinfo) - ) - else: - create_date = datetime.datetime.now() - return create_date - - def generate_revision( - self, - revid, - message, - head=None, - refresh=False, - splice=False, - branch_labels=None, - version_path=None, - depends_on=None, - **kw - ): - """Generate a new revision file. - - This runs the ``script.py.mako`` template, given - template arguments, and creates a new file. - - :param revid: String revision id. Typically this - comes from ``alembic.util.rev_id()``. - :param message: the revision message, the one passed - by the -m argument to the ``revision`` command. - :param head: the head revision to generate against. Defaults - to the current "head" if no branches are present, else raises - an exception. - - .. versionadded:: 0.7.0 - - :param splice: if True, allow the "head" version to not be an - actual head; otherwise, the selected head must be a head - (e.g. endpoint) revision. - :param refresh: deprecated. - - """ - if head is None: - head = "head" - - try: - Script.verify_rev_id(revid) - except revision.RevisionError as err: - compat.raise_from_cause(util.CommandError(err.args[0])) - - with self._catch_revision_errors( - multiple_heads=( - "Multiple heads are present; please specify the head " - "revision on which the new revision should be based, " - "or perform a merge." - ) - ): - heads = self.revision_map.get_revisions(head) - - if len(set(heads)) != len(heads): - raise util.CommandError("Duplicate head revisions specified") - - create_date = self._generate_create_date() - - if version_path is None: - if len(self._version_locations) > 1: - for head in heads: - if head is not None: - version_path = os.path.dirname(head.path) - break - else: - raise util.CommandError( - "Multiple version locations present, " - "please specify --version-path" - ) - else: - version_path = self.versions - - norm_path = os.path.normpath(os.path.abspath(version_path)) - for vers_path in self._version_locations: - if os.path.normpath(vers_path) == norm_path: - break - else: - raise util.CommandError( - "Path %s is not represented in current " - "version locations" % version_path - ) - - if self.version_locations: - self._ensure_directory(version_path) - - path = self._rev_path(version_path, revid, message, create_date) - - if not splice: - for head in heads: - if head is not None and not head.is_head: - raise util.CommandError( - "Revision %s is not a head revision; please specify " - "--splice to create a new branch from this revision" - % head.revision - ) - - if depends_on: - with self._catch_revision_errors(): - depends_on = [ - dep - if dep in rev.branch_labels # maintain branch labels - else rev.revision # resolve partial revision identifiers - for rev, dep in [ - (self.revision_map.get_revision(dep), dep) - for dep in util.to_list(depends_on) - ] - ] - - self._generate_template( - os.path.join(self.dir, "script.py.mako"), - path, - up_revision=str(revid), - down_revision=revision.tuple_rev_as_scalar( - tuple(h.revision if h is not None else None for h in heads) - ), - branch_labels=util.to_tuple(branch_labels), - depends_on=revision.tuple_rev_as_scalar(depends_on), - create_date=create_date, - comma=util.format_as_comma, - message=message if message is not None else ("empty message"), - **kw - ) - - post_write_hooks = self.hook_config - if post_write_hooks: - write_hooks._run_hooks(path, post_write_hooks) - - try: - script = Script._from_path(self, path) - except revision.RevisionError as err: - compat.raise_from_cause(util.CommandError(err.args[0])) - if branch_labels and not script.branch_labels: - raise util.CommandError( - "Version %s specified branch_labels %s, however the " - "migration file %s does not have them; have you upgraded " - "your script.py.mako to include the " - "'branch_labels' section?" - % (script.revision, branch_labels, script.path) - ) - - self.revision_map.add_revision(script) - return script - - def _rev_path(self, path, rev_id, message, create_date): - slug = "_".join(_slug_re.findall(message or "")).lower() - if len(slug) > self.truncate_slug_length: - slug = slug[: self.truncate_slug_length].rsplit("_", 1)[0] + "_" - filename = "%s.py" % ( - self.file_template - % { - "rev": rev_id, - "slug": slug, - "year": create_date.year, - "month": create_date.month, - "day": create_date.day, - "hour": create_date.hour, - "minute": create_date.minute, - "second": create_date.second, - } - ) - return os.path.join(path, filename) - - -class Script(revision.Revision): - - """Represent a single revision file in a ``versions/`` directory. - - The :class:`.Script` instance is returned by methods - such as :meth:`.ScriptDirectory.iterate_revisions`. - - """ - - def __init__(self, module, rev_id, path): - self.module = module - self.path = path - super(Script, self).__init__( - rev_id, - module.down_revision, - branch_labels=util.to_tuple( - getattr(module, "branch_labels", None), default=() - ), - dependencies=util.to_tuple( - getattr(module, "depends_on", None), default=() - ), - ) - - module = None - """The Python module representing the actual script itself.""" - - path = None - """Filesystem path of the script.""" - - _db_current_indicator = None - """Utility variable which when set will cause string output to indicate - this is a "current" version in some database""" - - @property - def doc(self): - """Return the docstring given in the script.""" - - return re.split("\n\n", self.longdoc)[0] - - @property - def longdoc(self): - """Return the docstring given in the script.""" - - doc = self.module.__doc__ - if doc: - if hasattr(self.module, "_alembic_source_encoding"): - doc = doc.decode(self.module._alembic_source_encoding) - return doc.strip() - else: - return "" - - @property - def log_entry(self): - entry = "Rev: %s%s%s%s%s\n" % ( - self.revision, - " (head)" if self.is_head else "", - " (branchpoint)" if self.is_branch_point else "", - " (mergepoint)" if self.is_merge_point else "", - " (current)" if self._db_current_indicator else "", - ) - if self.is_merge_point: - entry += "Merges: %s\n" % (self._format_down_revision(),) - else: - entry += "Parent: %s\n" % (self._format_down_revision(),) - - if self.dependencies: - entry += "Also depends on: %s\n" % ( - util.format_as_comma(self.dependencies) - ) - - if self.is_branch_point: - entry += "Branches into: %s\n" % ( - util.format_as_comma(self.nextrev) - ) - - if self.branch_labels: - entry += "Branch names: %s\n" % ( - util.format_as_comma(self.branch_labels), - ) - - entry += "Path: %s\n" % (self.path,) - - entry += "\n%s\n" % ( - "\n".join(" %s" % para for para in self.longdoc.splitlines()) - ) - return entry - - def __str__(self): - return "%s -> %s%s%s%s, %s" % ( - self._format_down_revision(), - self.revision, - " (head)" if self.is_head else "", - " (branchpoint)" if self.is_branch_point else "", - " (mergepoint)" if self.is_merge_point else "", - self.doc, - ) - - def _head_only( - self, - include_branches=False, - include_doc=False, - include_parents=False, - tree_indicators=True, - head_indicators=True, - ): - text = self.revision - if include_parents: - if self.dependencies: - text = "%s (%s) -> %s" % ( - self._format_down_revision(), - util.format_as_comma(self.dependencies), - text, - ) - else: - text = "%s -> %s" % (self._format_down_revision(), text) - if include_branches and self.branch_labels: - text += " (%s)" % util.format_as_comma(self.branch_labels) - if head_indicators or tree_indicators: - text += "%s%s%s" % ( - " (head)" if self._is_real_head else "", - " (effective head)" - if self.is_head and not self._is_real_head - else "", - " (current)" if self._db_current_indicator else "", - ) - if tree_indicators: - text += "%s%s" % ( - " (branchpoint)" if self.is_branch_point else "", - " (mergepoint)" if self.is_merge_point else "", - ) - if include_doc: - text += ", %s" % self.doc - return text - - def cmd_format( - self, - verbose, - include_branches=False, - include_doc=False, - include_parents=False, - tree_indicators=True, - ): - if verbose: - return self.log_entry - else: - return self._head_only( - include_branches, include_doc, include_parents, tree_indicators - ) - - def _format_down_revision(self): - if not self.down_revision: - return "" - else: - return util.format_as_comma(self._versioned_down_revisions) - - @classmethod - def _from_path(cls, scriptdir, path): - dir_, filename = os.path.split(path) - return cls._from_filename(scriptdir, dir_, filename) - - @classmethod - def _list_py_dir(cls, scriptdir, path): - if scriptdir.sourceless: - # read files in version path, e.g. pyc or pyo files - # in the immediate path - paths = os.listdir(path) - - names = set(fname.split(".")[0] for fname in paths) - - # look for __pycache__ - if os.path.exists(os.path.join(path, "__pycache__")): - # add all files from __pycache__ whose filename is not - # already in the names we got from the version directory. - # add as relative paths including __pycache__ token - paths.extend( - os.path.join("__pycache__", pyc) - for pyc in os.listdir(os.path.join(path, "__pycache__")) - if pyc.split(".")[0] not in names - ) - return paths - else: - return os.listdir(path) - - @classmethod - def _from_filename(cls, scriptdir, dir_, filename): - if scriptdir.sourceless: - py_match = _sourceless_rev_file.match(filename) - else: - py_match = _only_source_rev_file.match(filename) - - if not py_match: - return None - - py_filename = py_match.group(1) - - if scriptdir.sourceless: - is_c = py_match.group(2) == "c" - is_o = py_match.group(2) == "o" - else: - is_c = is_o = False - - if is_o or is_c: - py_exists = os.path.exists(os.path.join(dir_, py_filename)) - pyc_exists = os.path.exists(os.path.join(dir_, py_filename + "c")) - - # prefer .py over .pyc because we'd like to get the - # source encoding; prefer .pyc over .pyo because we'd like to - # have the docstrings which a -OO file would not have - if py_exists or is_o and pyc_exists: - return None - - module = util.load_python_file(dir_, filename) - - if not hasattr(module, "revision"): - # attempt to get the revision id from the script name, - # this for legacy only - m = _legacy_rev.match(filename) - if not m: - raise util.CommandError( - "Could not determine revision id from filename %s. " - "Be sure the 'revision' variable is " - "declared inside the script (please see 'Upgrading " - "from Alembic 0.1 to 0.2' in the documentation)." - % filename - ) - else: - revision = m.group(1) - else: - revision = module.revision - return Script(module, revision, os.path.join(dir_, filename)) diff --git a/venv/lib/python3.7/site-packages/alembic/script/revision.py b/venv/lib/python3.7/site-packages/alembic/script/revision.py deleted file mode 100644 index 22481a0..0000000 --- a/venv/lib/python3.7/site-packages/alembic/script/revision.py +++ /dev/null @@ -1,1063 +0,0 @@ -import collections -import re - -from sqlalchemy import util as sqlautil - -from .. import util -from ..util import compat - -_relative_destination = re.compile(r"(?:(.+?)@)?(\w+)?((?:\+|-)\d+)") -_revision_illegal_chars = ["@", "-", "+"] - - -class RevisionError(Exception): - pass - - -class RangeNotAncestorError(RevisionError): - def __init__(self, lower, upper): - self.lower = lower - self.upper = upper - super(RangeNotAncestorError, self).__init__( - "Revision %s is not an ancestor of revision %s" - % (lower or "base", upper or "base") - ) - - -class MultipleHeads(RevisionError): - def __init__(self, heads, argument): - self.heads = heads - self.argument = argument - super(MultipleHeads, self).__init__( - "Multiple heads are present for given argument '%s'; " - "%s" % (argument, ", ".join(heads)) - ) - - -class ResolutionError(RevisionError): - def __init__(self, message, argument): - super(ResolutionError, self).__init__(message) - self.argument = argument - - -class RevisionMap(object): - """Maintains a map of :class:`.Revision` objects. - - :class:`.RevisionMap` is used by :class:`.ScriptDirectory` to maintain - and traverse the collection of :class:`.Script` objects, which are - themselves instances of :class:`.Revision`. - - """ - - def __init__(self, generator): - """Construct a new :class:`.RevisionMap`. - - :param generator: a zero-arg callable that will generate an iterable - of :class:`.Revision` instances to be used. These are typically - :class:`.Script` subclasses within regular Alembic use. - - """ - self._generator = generator - - @util.memoized_property - def heads(self): - """All "head" revisions as strings. - - This is normally a tuple of length one, - unless unmerged branches are present. - - :return: a tuple of string revision numbers. - - """ - self._revision_map - return self.heads - - @util.memoized_property - def bases(self): - """All "base" revisions as strings. - - These are revisions that have a ``down_revision`` of None, - or empty tuple. - - :return: a tuple of string revision numbers. - - """ - self._revision_map - return self.bases - - @util.memoized_property - def _real_heads(self): - """All "real" head revisions as strings. - - :return: a tuple of string revision numbers. - - """ - self._revision_map - return self._real_heads - - @util.memoized_property - def _real_bases(self): - """All "real" base revisions as strings. - - :return: a tuple of string revision numbers. - - """ - self._revision_map - return self._real_bases - - @util.memoized_property - def _revision_map(self): - """memoized attribute, initializes the revision map from the - initial collection. - - """ - map_ = {} - - heads = sqlautil.OrderedSet() - _real_heads = sqlautil.OrderedSet() - self.bases = () - self._real_bases = () - - has_branch_labels = set() - has_depends_on = set() - for revision in self._generator(): - - if revision.revision in map_: - util.warn( - "Revision %s is present more than once" % revision.revision - ) - map_[revision.revision] = revision - if revision.branch_labels: - has_branch_labels.add(revision) - if revision.dependencies: - has_depends_on.add(revision) - heads.add(revision.revision) - _real_heads.add(revision.revision) - if revision.is_base: - self.bases += (revision.revision,) - if revision._is_real_base: - self._real_bases += (revision.revision,) - - # add the branch_labels to the map_. We'll need these - # to resolve the dependencies. - for revision in has_branch_labels: - self._map_branch_labels(revision, map_) - - for revision in has_depends_on: - self._add_depends_on(revision, map_) - - for rev in map_.values(): - for downrev in rev._all_down_revisions: - if downrev not in map_: - util.warn( - "Revision %s referenced from %s is not present" - % (downrev, rev) - ) - down_revision = map_[downrev] - down_revision.add_nextrev(rev) - if downrev in rev._versioned_down_revisions: - heads.discard(downrev) - _real_heads.discard(downrev) - - map_[None] = map_[()] = None - self.heads = tuple(heads) - self._real_heads = tuple(_real_heads) - - for revision in has_branch_labels: - self._add_branches(revision, map_, map_branch_labels=False) - return map_ - - def _map_branch_labels(self, revision, map_): - if revision.branch_labels: - for branch_label in revision._orig_branch_labels: - if branch_label in map_: - raise RevisionError( - "Branch name '%s' in revision %s already " - "used by revision %s" - % ( - branch_label, - revision.revision, - map_[branch_label].revision, - ) - ) - map_[branch_label] = revision - - def _add_branches(self, revision, map_, map_branch_labels=True): - if map_branch_labels: - self._map_branch_labels(revision, map_) - - if revision.branch_labels: - revision.branch_labels.update(revision.branch_labels) - for node in self._get_descendant_nodes( - [revision], map_, include_dependencies=False - ): - node.branch_labels.update(revision.branch_labels) - - parent = node - while ( - parent - and not parent._is_real_branch_point - and not parent.is_merge_point - ): - - parent.branch_labels.update(revision.branch_labels) - if parent.down_revision: - parent = map_[parent.down_revision] - else: - break - - def _add_depends_on(self, revision, map_): - if revision.dependencies: - deps = [map_[dep] for dep in util.to_tuple(revision.dependencies)] - revision._resolved_dependencies = tuple([d.revision for d in deps]) - - def add_revision(self, revision, _replace=False): - """add a single revision to an existing map. - - This method is for single-revision use cases, it's not - appropriate for fully populating an entire revision map. - - """ - map_ = self._revision_map - if not _replace and revision.revision in map_: - util.warn( - "Revision %s is present more than once" % revision.revision - ) - elif _replace and revision.revision not in map_: - raise Exception("revision %s not in map" % revision.revision) - - map_[revision.revision] = revision - self._add_branches(revision, map_) - self._add_depends_on(revision, map_) - - if revision.is_base: - self.bases += (revision.revision,) - if revision._is_real_base: - self._real_bases += (revision.revision,) - for downrev in revision._all_down_revisions: - if downrev not in map_: - util.warn( - "Revision %s referenced from %s is not present" - % (downrev, revision) - ) - map_[downrev].add_nextrev(revision) - if revision._is_real_head: - self._real_heads = tuple( - head - for head in self._real_heads - if head - not in set(revision._all_down_revisions).union( - [revision.revision] - ) - ) + (revision.revision,) - if revision.is_head: - self.heads = tuple( - head - for head in self.heads - if head - not in set(revision._versioned_down_revisions).union( - [revision.revision] - ) - ) + (revision.revision,) - - def get_current_head(self, branch_label=None): - """Return the current head revision. - - If the script directory has multiple heads - due to branching, an error is raised; - :meth:`.ScriptDirectory.get_heads` should be - preferred. - - :param branch_label: optional branch name which will limit the - heads considered to those which include that branch_label. - - :return: a string revision number. - - .. seealso:: - - :meth:`.ScriptDirectory.get_heads` - - """ - current_heads = self.heads - if branch_label: - current_heads = self.filter_for_lineage( - current_heads, branch_label - ) - if len(current_heads) > 1: - raise MultipleHeads( - current_heads, - "%s@head" % branch_label if branch_label else "head", - ) - - if current_heads: - return current_heads[0] - else: - return None - - def _get_base_revisions(self, identifier): - return self.filter_for_lineage(self.bases, identifier) - - def get_revisions(self, id_): - """Return the :class:`.Revision` instances with the given rev id - or identifiers. - - May be given a single identifier, a sequence of identifiers, or the - special symbols "head" or "base". The result is a tuple of one - or more identifiers, or an empty tuple in the case of "base". - - In the cases where 'head', 'heads' is requested and the - revision map is empty, returns an empty tuple. - - Supports partial identifiers, where the given identifier - is matched against all identifiers that start with the given - characters; if there is exactly one match, that determines the - full revision. - - """ - - if isinstance(id_, (list, tuple, set, frozenset)): - return sum([self.get_revisions(id_elem) for id_elem in id_], ()) - else: - resolved_id, branch_label = self._resolve_revision_number(id_) - return tuple( - self._revision_for_ident(rev_id, branch_label) - for rev_id in resolved_id - ) - - def get_revision(self, id_): - """Return the :class:`.Revision` instance with the given rev id. - - If a symbolic name such as "head" or "base" is given, resolves - the identifier into the current head or base revision. If the symbolic - name refers to multiples, :class:`.MultipleHeads` is raised. - - Supports partial identifiers, where the given identifier - is matched against all identifiers that start with the given - characters; if there is exactly one match, that determines the - full revision. - - """ - - resolved_id, branch_label = self._resolve_revision_number(id_) - if len(resolved_id) > 1: - raise MultipleHeads(resolved_id, id_) - elif resolved_id: - resolved_id = resolved_id[0] - - return self._revision_for_ident(resolved_id, branch_label) - - def _resolve_branch(self, branch_label): - try: - branch_rev = self._revision_map[branch_label] - except KeyError: - try: - nonbranch_rev = self._revision_for_ident(branch_label) - except ResolutionError: - raise ResolutionError( - "No such branch: '%s'" % branch_label, branch_label - ) - else: - return nonbranch_rev - else: - return branch_rev - - def _revision_for_ident(self, resolved_id, check_branch=None): - if check_branch: - branch_rev = self._resolve_branch(check_branch) - else: - branch_rev = None - - try: - revision = self._revision_map[resolved_id] - except KeyError: - # break out to avoid misleading py3k stack traces - revision = False - if revision is False: - # do a partial lookup - revs = [ - x - for x in self._revision_map - if x and len(x) > 3 and x.startswith(resolved_id) - ] - - if branch_rev: - revs = self.filter_for_lineage(revs, check_branch) - if not revs: - raise ResolutionError( - "No such revision or branch '%s'%s" - % ( - resolved_id, - ( - "; please ensure at least four characters are " - "present for partial revision identifier matches" - if len(resolved_id) < 4 - else "" - ), - ), - resolved_id, - ) - elif len(revs) > 1: - raise ResolutionError( - "Multiple revisions start " - "with '%s': %s..." - % (resolved_id, ", ".join("'%s'" % r for r in revs[0:3])), - resolved_id, - ) - else: - revision = self._revision_map[revs[0]] - - if check_branch and revision is not None: - if not self._shares_lineage( - revision.revision, branch_rev.revision - ): - raise ResolutionError( - "Revision %s is not a member of branch '%s'" - % (revision.revision, check_branch), - resolved_id, - ) - return revision - - def _filter_into_branch_heads(self, targets): - targets = set(targets) - - for rev in list(targets): - if targets.intersection( - self._get_descendant_nodes([rev], include_dependencies=False) - ).difference([rev]): - targets.discard(rev) - return targets - - def filter_for_lineage( - self, targets, check_against, include_dependencies=False - ): - id_, branch_label = self._resolve_revision_number(check_against) - - shares = [] - if branch_label: - shares.append(branch_label) - if id_: - shares.extend(id_) - - return [ - tg - for tg in targets - if self._shares_lineage( - tg, shares, include_dependencies=include_dependencies - ) - ] - - def _shares_lineage( - self, target, test_against_revs, include_dependencies=False - ): - if not test_against_revs: - return True - if not isinstance(target, Revision): - target = self._revision_for_ident(target) - - test_against_revs = [ - self._revision_for_ident(test_against_rev) - if not isinstance(test_against_rev, Revision) - else test_against_rev - for test_against_rev in util.to_tuple( - test_against_revs, default=() - ) - ] - - return bool( - set( - self._get_descendant_nodes( - [target], include_dependencies=include_dependencies - ) - ) - .union( - self._get_ancestor_nodes( - [target], include_dependencies=include_dependencies - ) - ) - .intersection(test_against_revs) - ) - - def _resolve_revision_number(self, id_): - if isinstance(id_, compat.string_types) and "@" in id_: - branch_label, id_ = id_.split("@", 1) - - elif id_ is not None and ( - ( - isinstance(id_, tuple) - and id_ - and not isinstance(id_[0], compat.string_types) - ) - or not isinstance(id_, compat.string_types + (tuple,)) - ): - raise RevisionError( - "revision identifier %r is not a string; ensure database " - "driver settings are correct" % (id_,) - ) - - else: - branch_label = None - - # ensure map is loaded - self._revision_map - if id_ == "heads": - if branch_label: - return ( - self.filter_for_lineage(self.heads, branch_label), - branch_label, - ) - else: - return self._real_heads, branch_label - elif id_ == "head": - current_head = self.get_current_head(branch_label) - if current_head: - return (current_head,), branch_label - else: - return (), branch_label - elif id_ == "base" or id_ is None: - return (), branch_label - else: - return util.to_tuple(id_, default=None), branch_label - - def _relative_iterate( - self, - destination, - source, - is_upwards, - implicit_base, - inclusive, - assert_relative_length, - ): - if isinstance(destination, compat.string_types): - match = _relative_destination.match(destination) - if not match: - return None - else: - return None - - relative = int(match.group(3)) - symbol = match.group(2) - branch_label = match.group(1) - - reldelta = 1 if inclusive and not symbol else 0 - - if is_upwards: - if branch_label: - from_ = "%s@head" % branch_label - elif symbol: - if symbol.startswith("head"): - from_ = symbol - else: - from_ = "%s@head" % symbol - else: - from_ = "head" - to_ = source - else: - if branch_label: - to_ = "%s@base" % branch_label - elif symbol: - to_ = "%s@base" % symbol - else: - to_ = "base" - from_ = source - - revs = list( - self._iterate_revisions( - from_, to_, inclusive=inclusive, implicit_base=implicit_base - ) - ) - - if symbol: - if branch_label: - symbol_rev = self.get_revision( - "%s@%s" % (branch_label, symbol) - ) - else: - symbol_rev = self.get_revision(symbol) - if symbol.startswith("head"): - index = 0 - elif symbol == "base": - index = len(revs) - 1 - else: - range_ = compat.range(len(revs) - 1, 0, -1) - for index in range_: - if symbol_rev.revision == revs[index].revision: - break - else: - index = 0 - else: - index = 0 - if is_upwards: - revs = revs[index - relative - reldelta :] - if ( - not index - and assert_relative_length - and len(revs) < abs(relative - reldelta) - ): - raise RevisionError( - "Relative revision %s didn't " - "produce %d migrations" % (destination, abs(relative)) - ) - else: - revs = revs[0 : index - relative + reldelta] - if ( - not index - and assert_relative_length - and len(revs) != abs(relative) + reldelta - ): - raise RevisionError( - "Relative revision %s didn't " - "produce %d migrations" % (destination, abs(relative)) - ) - - return iter(revs) - - def iterate_revisions( - self, - upper, - lower, - implicit_base=False, - inclusive=False, - assert_relative_length=True, - select_for_downgrade=False, - ): - """Iterate through script revisions, starting at the given - upper revision identifier and ending at the lower. - - The traversal uses strictly the `down_revision` - marker inside each migration script, so - it is a requirement that upper >= lower, - else you'll get nothing back. - - The iterator yields :class:`.Revision` objects. - - """ - - relative_upper = self._relative_iterate( - upper, - lower, - True, - implicit_base, - inclusive, - assert_relative_length, - ) - if relative_upper: - return relative_upper - - relative_lower = self._relative_iterate( - lower, - upper, - False, - implicit_base, - inclusive, - assert_relative_length, - ) - if relative_lower: - return relative_lower - - return self._iterate_revisions( - upper, - lower, - inclusive=inclusive, - implicit_base=implicit_base, - select_for_downgrade=select_for_downgrade, - ) - - def _get_descendant_nodes( - self, - targets, - map_=None, - check=False, - omit_immediate_dependencies=False, - include_dependencies=True, - ): - - if omit_immediate_dependencies: - - def fn(rev): - if rev not in targets: - return rev._all_nextrev - else: - return rev.nextrev - - elif include_dependencies: - - def fn(rev): - return rev._all_nextrev - - else: - - def fn(rev): - return rev.nextrev - - return self._iterate_related_revisions( - fn, targets, map_=map_, check=check - ) - - def _get_ancestor_nodes( - self, targets, map_=None, check=False, include_dependencies=True - ): - - if include_dependencies: - - def fn(rev): - return rev._all_down_revisions - - else: - - def fn(rev): - return rev._versioned_down_revisions - - return self._iterate_related_revisions( - fn, targets, map_=map_, check=check - ) - - def _iterate_related_revisions(self, fn, targets, map_, check=False): - if map_ is None: - map_ = self._revision_map - - seen = set() - todo = collections.deque() - for target in targets: - - todo.append(target) - if check: - per_target = set() - - while todo: - rev = todo.pop() - if check: - per_target.add(rev) - - if rev in seen: - continue - seen.add(rev) - todo.extend(map_[rev_id] for rev_id in fn(rev)) - yield rev - if check: - overlaps = per_target.intersection(targets).difference( - [target] - ) - if overlaps: - raise RevisionError( - "Requested revision %s overlaps with " - "other requested revisions %s" - % ( - target.revision, - ", ".join(r.revision for r in overlaps), - ) - ) - - def _iterate_revisions( - self, - upper, - lower, - inclusive=True, - implicit_base=False, - select_for_downgrade=False, - ): - """iterate revisions from upper to lower. - - The traversal is depth-first within branches, and breadth-first - across branches as a whole. - - """ - - requested_lowers = self.get_revisions(lower) - - # some complexity to accommodate an iteration where some - # branches are starting from nothing, and others are starting - # from a given point. Additionally, if the bottom branch - # is specified using a branch identifier, then we limit operations - # to just that branch. - - limit_to_lower_branch = isinstance( - lower, compat.string_types - ) and lower.endswith("@base") - - uppers = util.dedupe_tuple(self.get_revisions(upper)) - - if not uppers and not requested_lowers: - return - - upper_ancestors = set(self._get_ancestor_nodes(uppers, check=True)) - - if limit_to_lower_branch: - lowers = self.get_revisions(self._get_base_revisions(lower)) - elif implicit_base and requested_lowers: - lower_ancestors = set(self._get_ancestor_nodes(requested_lowers)) - lower_descendants = set( - self._get_descendant_nodes(requested_lowers) - ) - base_lowers = set() - candidate_lowers = upper_ancestors.difference( - lower_ancestors - ).difference(lower_descendants) - for rev in candidate_lowers: - for downrev in rev._all_down_revisions: - if self._revision_map[downrev] in candidate_lowers: - break - else: - base_lowers.add(rev) - lowers = base_lowers.union(requested_lowers) - elif implicit_base: - base_lowers = set(self.get_revisions(self._real_bases)) - lowers = base_lowers.union(requested_lowers) - elif not requested_lowers: - lowers = set(self.get_revisions(self._real_bases)) - else: - lowers = requested_lowers - - # represents all nodes we will produce - total_space = set( - rev.revision for rev in upper_ancestors - ).intersection( - rev.revision - for rev in self._get_descendant_nodes( - lowers, - check=True, - omit_immediate_dependencies=( - select_for_downgrade and requested_lowers - ), - ) - ) - - if not total_space: - # no nodes. determine if this is an invalid range - # or not. - start_from = set(requested_lowers) - start_from.update( - self._get_ancestor_nodes( - list(start_from), include_dependencies=True - ) - ) - - # determine all the current branch points represented - # by requested_lowers - start_from = self._filter_into_branch_heads(start_from) - - # if the requested start is one of those branch points, - # then just return empty set - if start_from.intersection(upper_ancestors): - return - else: - # otherwise, they requested nodes out of - # order - raise RangeNotAncestorError(lower, upper) - - # organize branch points to be consumed separately from - # member nodes - branch_todo = set( - rev - for rev in (self._revision_map[rev] for rev in total_space) - if rev._is_real_branch_point - and len(total_space.intersection(rev._all_nextrev)) > 1 - ) - - # it's not possible for any "uppers" to be in branch_todo, - # because the ._all_nextrev of those nodes is not in total_space - # assert not branch_todo.intersection(uppers) - - todo = collections.deque( - r for r in uppers if r.revision in total_space - ) - - # iterate for total_space being emptied out - total_space_modified = True - while total_space: - - if not total_space_modified: - raise RevisionError( - "Dependency resolution failed; iteration can't proceed" - ) - total_space_modified = False - # when everything non-branch pending is consumed, - # add to the todo any branch nodes that have no - # descendants left in the queue - if not todo: - todo.extendleft( - sorted( - ( - rev - for rev in branch_todo - if not rev._all_nextrev.intersection(total_space) - ), - # favor "revisioned" branch points before - # dependent ones - key=lambda rev: 0 if rev.is_branch_point else 1, - ) - ) - branch_todo.difference_update(todo) - # iterate nodes that are in the immediate todo - while todo: - rev = todo.popleft() - total_space.remove(rev.revision) - total_space_modified = True - - # do depth first for elements within branches, - # don't consume any actual branch nodes - todo.extendleft( - [ - self._revision_map[downrev] - for downrev in reversed(rev._all_down_revisions) - if self._revision_map[downrev] not in branch_todo - and downrev in total_space - ] - ) - - if not inclusive and rev in requested_lowers: - continue - yield rev - - assert not branch_todo - - -class Revision(object): - """Base class for revisioned objects. - - The :class:`.Revision` class is the base of the more public-facing - :class:`.Script` object, which represents a migration script. - The mechanics of revision management and traversal are encapsulated - within :class:`.Revision`, while :class:`.Script` applies this logic - to Python files in a version directory. - - """ - - nextrev = frozenset() - """following revisions, based on down_revision only.""" - - _all_nextrev = frozenset() - - revision = None - """The string revision number.""" - - down_revision = None - """The ``down_revision`` identifier(s) within the migration script. - - Note that the total set of "down" revisions is - down_revision + dependencies. - - """ - - dependencies = None - """Additional revisions which this revision is dependent on. - - From a migration standpoint, these dependencies are added to the - down_revision to form the full iteration. However, the separation - of down_revision from "dependencies" is to assist in navigating - a history that contains many branches, typically a multi-root scenario. - - """ - - branch_labels = None - """Optional string/tuple of symbolic names to apply to this - revision's branch""" - - @classmethod - def verify_rev_id(cls, revision): - illegal_chars = set(revision).intersection(_revision_illegal_chars) - if illegal_chars: - raise RevisionError( - "Character(s) '%s' not allowed in revision identifier '%s'" - % (", ".join(sorted(illegal_chars)), revision) - ) - - def __init__( - self, revision, down_revision, dependencies=None, branch_labels=None - ): - self.verify_rev_id(revision) - self.revision = revision - self.down_revision = tuple_rev_as_scalar(down_revision) - self.dependencies = tuple_rev_as_scalar(dependencies) - self._resolved_dependencies = () - self._orig_branch_labels = util.to_tuple(branch_labels, default=()) - self.branch_labels = set(self._orig_branch_labels) - - def __repr__(self): - args = [repr(self.revision), repr(self.down_revision)] - if self.dependencies: - args.append("dependencies=%r" % (self.dependencies,)) - if self.branch_labels: - args.append("branch_labels=%r" % (self.branch_labels,)) - return "%s(%s)" % (self.__class__.__name__, ", ".join(args)) - - def add_nextrev(self, revision): - self._all_nextrev = self._all_nextrev.union([revision.revision]) - if self.revision in revision._versioned_down_revisions: - self.nextrev = self.nextrev.union([revision.revision]) - - @property - def _all_down_revisions(self): - return ( - util.to_tuple(self.down_revision, default=()) - + self._resolved_dependencies - ) - - @property - def _versioned_down_revisions(self): - return util.to_tuple(self.down_revision, default=()) - - @property - def is_head(self): - """Return True if this :class:`.Revision` is a 'head' revision. - - This is determined based on whether any other :class:`.Script` - within the :class:`.ScriptDirectory` refers to this - :class:`.Script`. Multiple heads can be present. - - """ - return not bool(self.nextrev) - - @property - def _is_real_head(self): - return not bool(self._all_nextrev) - - @property - def is_base(self): - """Return True if this :class:`.Revision` is a 'base' revision.""" - - return self.down_revision is None - - @property - def _is_real_base(self): - """Return True if this :class:`.Revision` is a "real" base revision, - e.g. that it has no dependencies either.""" - - # we use self.dependencies here because this is called up - # in initialization where _real_dependencies isn't set up - # yet - return self.down_revision is None and self.dependencies is None - - @property - def is_branch_point(self): - """Return True if this :class:`.Script` is a branch point. - - A branchpoint is defined as a :class:`.Script` which is referred - to by more than one succeeding :class:`.Script`, that is more - than one :class:`.Script` has a `down_revision` identifier pointing - here. - - """ - return len(self.nextrev) > 1 - - @property - def _is_real_branch_point(self): - """Return True if this :class:`.Script` is a 'real' branch point, - taking into account dependencies as well. - - """ - return len(self._all_nextrev) > 1 - - @property - def is_merge_point(self): - """Return True if this :class:`.Script` is a merge point.""" - - return len(self._versioned_down_revisions) > 1 - - -def tuple_rev_as_scalar(rev): - if not rev: - return None - elif len(rev) == 1: - return rev[0] - else: - return rev diff --git a/venv/lib/python3.7/site-packages/alembic/script/write_hooks.py b/venv/lib/python3.7/site-packages/alembic/script/write_hooks.py deleted file mode 100644 index 61a6a27..0000000 --- a/venv/lib/python3.7/site-packages/alembic/script/write_hooks.py +++ /dev/null @@ -1,113 +0,0 @@ -import subprocess -import sys - -from .. import util -from ..util import compat - - -_registry = {} - - -def register(name): - """A function decorator that will register that function as a write hook. - - See the documentation linked below for an example. - - .. versionadded:: 1.2.0 - - .. seealso:: - - :ref:`post_write_hooks_custom` - - - """ - - def decorate(fn): - _registry[name] = fn - - return decorate - - -def _invoke(name, revision, options): - """Invokes the formatter registered for the given name. - - :param name: The name of a formatter in the registry - :param revision: A :class:`.MigrationRevision` instance - :param options: A dict containing kwargs passed to the - specified formatter. - :raises: :class:`alembic.util.CommandError` - """ - try: - hook = _registry[name] - except KeyError: - compat.raise_from_cause( - util.CommandError("No formatter with name '%s' registered" % name) - ) - else: - return hook(revision, options) - - -def _run_hooks(path, hook_config): - """Invoke hooks for a generated revision. - - """ - - from .base import _split_on_space_comma - - names = _split_on_space_comma.split(hook_config.get("hooks", "")) - - for name in names: - if not name: - continue - opts = { - key[len(name) + 1 :]: hook_config[key] - for key in hook_config - if key.startswith(name + ".") - } - opts["_hook_name"] = name - try: - type_ = opts["type"] - except KeyError: - compat.raise_from_cause( - util.CommandError( - "Key %s.type is required for post write hook %r" - % (name, name) - ) - ) - else: - util.status( - 'Running post write hook "%s"' % name, - _invoke, - type_, - path, - opts, - newline=True, - ) - - -@register("console_scripts") -def console_scripts(path, options): - import pkg_resources - - try: - entrypoint_name = options["entrypoint"] - except KeyError: - compat.raise_from_cause( - util.CommandError( - "Key %s.entrypoint is required for post write hook %r" - % (options["_hook_name"], options["_hook_name"]) - ) - ) - iter_ = pkg_resources.iter_entry_points("console_scripts", entrypoint_name) - impl = next(iter_) - options = options.get("options", "") - subprocess.run( - [ - sys.executable, - "-c", - "import %s; %s()" - % (impl.module_name, ".".join((impl.module_name,) + impl.attrs)), - path, - ] - + options.split() - ) diff --git a/venv/lib/python3.7/site-packages/alembic/templates/generic/README b/venv/lib/python3.7/site-packages/alembic/templates/generic/README deleted file mode 100644 index 98e4f9c..0000000 --- a/venv/lib/python3.7/site-packages/alembic/templates/generic/README +++ /dev/null @@ -1 +0,0 @@ -Generic single-database configuration. \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/alembic/templates/generic/__pycache__/env.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/templates/generic/__pycache__/env.cpython-37.pyc deleted file mode 100644 index 2c56202c58fa345f38822147ec9f48a5610aaced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1617 zcmZvcPj4eN6u|AtWG0!U?QRhj2M)fKNNl*=s_HPGI1B(fx{yvOmx#8PQcXl?sk3J(V*Y?Sh_34U?&< z%1N=&#&uOGoJ~>V;KCgjez7kUYaiU)2YJH_E}j87-t#7 z@^UUMYr|{|Smx&7hdxGjF5R3h8tWKmU!Qyt{^wdSU7<#^&%#FE$0b!Wo8M~~TI59m zwd1D>!m2qKVBE5EP-@KB;U%-*%et0&796&gSYaSU8E_k$sk+ox0 zIh2><#;BKhR&&Ek>n;_nx|)|DM)9hHQ>z`v%?#Y61jhw;Jl|5% zf#GU$Dz&irP)M$zaFeQb_IQ-8lJ?y5ov?~a?PoAsri&P?`gd6|JwJYY3JBK38Llla z{C}%$)9A^4l1J3w1tGr>vxVJXhX<~#4{BLIk=i;uohMJL4=vcKKEOE2Q(4^g4$4|_ z2likF8Vt^WJ{#AUtG$1En5+?c7wy|e*pOjHV;Y5T*vY8bLERnO{(Ab$8`#cKaKzDN zXllu=eOLjd|=RJST0ljneAve`h?$;UK?oG>!bDd{5v}FSE>!& zqZAzEJJN2*oA|fuLEK>nA^6@$IMpcl*uSWD51U~$q*&u5&XTy-d#AV8qrK>F$}PNx diff --git a/venv/lib/python3.7/site-packages/alembic/templates/generic/alembic.ini.mako b/venv/lib/python3.7/site-packages/alembic/templates/generic/alembic.ini.mako deleted file mode 100644 index 281794f..0000000 --- a/venv/lib/python3.7/site-packages/alembic/templates/generic/alembic.ini.mako +++ /dev/null @@ -1,85 +0,0 @@ -# A generic, single database configuration. - -[alembic] -# path to migration scripts -script_location = ${script_location} - -# template used to generate migration files -# file_template = %%(rev)s_%%(slug)s - -# timezone to use when rendering the date -# within the migration file as well as the filename. -# string value is passed to dateutil.tz.gettz() -# leave blank for localtime -# timezone = - -# max length of characters to apply to the -# "slug" field -# truncate_slug_length = 40 - -# set to 'true' to run the environment during -# the 'revision' command, regardless of autogenerate -# revision_environment = false - -# set to 'true' to allow .pyc and .pyo files without -# a source .py file to be detected as revisions in the -# versions/ directory -# sourceless = false - -# version location specification; this defaults -# to ${script_location}/versions. When using multiple version -# directories, initial revisions must be specified with --version-path -# version_locations = %(here)s/bar %(here)s/bat ${script_location}/versions - -# the output encoding used when revision files -# are written from script.py.mako -# output_encoding = utf-8 - -sqlalchemy.url = driver://user:pass@localhost/dbname - - -[post_write_hooks] -# post_write_hooks defines scripts or Python functions that are run -# on newly generated revision scripts. See the documentation for further -# detail and examples - -# format using "black" - use the console_scripts runner, against the "black" entrypoint -# hooks=black -# black.type=console_scripts -# black.entrypoint=black -# black.options=-l 79 - -# Logging configuration -[loggers] -keys = root,sqlalchemy,alembic - -[handlers] -keys = console - -[formatters] -keys = generic - -[logger_root] -level = WARN -handlers = console -qualname = - -[logger_sqlalchemy] -level = WARN -handlers = -qualname = sqlalchemy.engine - -[logger_alembic] -level = INFO -handlers = -qualname = alembic - -[handler_console] -class = StreamHandler -args = (sys.stderr,) -level = NOTSET -formatter = generic - -[formatter_generic] -format = %(levelname)-5.5s [%(name)s] %(message)s -datefmt = %H:%M:%S diff --git a/venv/lib/python3.7/site-packages/alembic/templates/generic/env.py b/venv/lib/python3.7/site-packages/alembic/templates/generic/env.py deleted file mode 100644 index 70518a2..0000000 --- a/venv/lib/python3.7/site-packages/alembic/templates/generic/env.py +++ /dev/null @@ -1,77 +0,0 @@ -from logging.config import fileConfig - -from sqlalchemy import engine_from_config -from sqlalchemy import pool - -from alembic import context - -# this is the Alembic Config object, which provides -# access to the values within the .ini file in use. -config = context.config - -# Interpret the config file for Python logging. -# This line sets up loggers basically. -fileConfig(config.config_file_name) - -# add your model's MetaData object here -# for 'autogenerate' support -# from myapp import mymodel -# target_metadata = mymodel.Base.metadata -target_metadata = None - -# other values from the config, defined by the needs of env.py, -# can be acquired: -# my_important_option = config.get_main_option("my_important_option") -# ... etc. - - -def run_migrations_offline(): - """Run migrations in 'offline' mode. - - This configures the context with just a URL - and not an Engine, though an Engine is acceptable - here as well. By skipping the Engine creation - we don't even need a DBAPI to be available. - - Calls to context.execute() here emit the given string to the - script output. - - """ - url = config.get_main_option("sqlalchemy.url") - context.configure( - url=url, - target_metadata=target_metadata, - literal_binds=True, - dialect_opts={"paramstyle": "named"}, - ) - - with context.begin_transaction(): - context.run_migrations() - - -def run_migrations_online(): - """Run migrations in 'online' mode. - - In this scenario we need to create an Engine - and associate a connection with the context. - - """ - connectable = engine_from_config( - config.get_section(config.config_ini_section), - prefix="sqlalchemy.", - poolclass=pool.NullPool, - ) - - with connectable.connect() as connection: - context.configure( - connection=connection, target_metadata=target_metadata - ) - - with context.begin_transaction(): - context.run_migrations() - - -if context.is_offline_mode(): - run_migrations_offline() -else: - run_migrations_online() diff --git a/venv/lib/python3.7/site-packages/alembic/templates/generic/script.py.mako b/venv/lib/python3.7/site-packages/alembic/templates/generic/script.py.mako deleted file mode 100644 index 2c01563..0000000 --- a/venv/lib/python3.7/site-packages/alembic/templates/generic/script.py.mako +++ /dev/null @@ -1,24 +0,0 @@ -"""${message} - -Revision ID: ${up_revision} -Revises: ${down_revision | comma,n} -Create Date: ${create_date} - -""" -from alembic import op -import sqlalchemy as sa -${imports if imports else ""} - -# revision identifiers, used by Alembic. -revision = ${repr(up_revision)} -down_revision = ${repr(down_revision)} -branch_labels = ${repr(branch_labels)} -depends_on = ${repr(depends_on)} - - -def upgrade(): - ${upgrades if upgrades else "pass"} - - -def downgrade(): - ${downgrades if downgrades else "pass"} diff --git a/venv/lib/python3.7/site-packages/alembic/templates/multidb/README b/venv/lib/python3.7/site-packages/alembic/templates/multidb/README deleted file mode 100644 index 5db219f..0000000 --- a/venv/lib/python3.7/site-packages/alembic/templates/multidb/README +++ /dev/null @@ -1 +0,0 @@ -Rudimentary multi-database configuration. \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/alembic/templates/multidb/__pycache__/env.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/templates/multidb/__pycache__/env.cpython-37.pyc deleted file mode 100644 index 90bb37a1774c2cf51aebd030f4f3a0f027bee7fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2659 zcmZ{m&5zqe6u@U}$8nsG-A%XKt|(wtR3%lLMM#KCRnaZ2T2x9u6|f4ClbK|l`fFz< z-Q6h5fg&U%s`dmI4#|=Kg1-Q9_7!p9AK<`=_r}@nwgpFio_TNP&GVaiKWDREcL`j7 z{`Bito6Cg!ft`cPgvLj3%O627!e~T%d>Rpr4d0-J&h$;tnUNKj{F2sL(6)VBw@Xnu zc67R%7Kk_3PZ7HJAgfrI7f`tis%HiNC_CtOm~}cV@@t zMEt;4o)AhBn>X>v=snV^{{^v;TP>QqgD~P((qs@0q1WWeFid!NAkw(oKhRoPnnqwP zgGTXPb!}1&A|Cg`ew!zc{R#_I&`GI5{pd9lwKtJhB8OitTd$ztW$%T7s+T~j} ziLFrsBB(tD&mF?*cgS7x`H|N4CTbynjo=z3BKt!P@bDKYS>vtC?{{r}zr$LY< zi#BPEt{F|*pbp$MYEhdS&^BnzaH)6`M!kd#d|{1@@1VLgGA_P^jPtJ|Ls_HJ%+@6h zU>G^fd}>0mTMKx60`RD4cw8#rfwpzP#nha+bA*qY?bfyE=7d>IwhBdBN@xt$3<2zUJoex~{nxXkUM6ms{4 zPrrJkdj1bA)ibg?&VcBQ%SjzNEZs?pZp#uL98bT#uyJc^w3pLKIaTMK#7ZFR))t_8UN?v<#?`rpc=d;__FWx`Bc zNGsBgXex5QT+HukLTX}GU^i}RBI`{0OSn660N^dKU2LJwDxynA27kTe0sFf6(La(P tWUbIyaxQ{t9PvxQH6lF_4&cx+YVe9R!?JA4rEbZsTaNRN^PvNle*r;N*F*pS diff --git a/venv/lib/python3.7/site-packages/alembic/templates/multidb/alembic.ini.mako b/venv/lib/python3.7/site-packages/alembic/templates/multidb/alembic.ini.mako deleted file mode 100644 index 0b0919e..0000000 --- a/venv/lib/python3.7/site-packages/alembic/templates/multidb/alembic.ini.mako +++ /dev/null @@ -1,90 +0,0 @@ -# a multi-database configuration. - -[alembic] -# path to migration scripts -script_location = ${script_location} - -# template used to generate migration files -# file_template = %%(rev)s_%%(slug)s - -# timezone to use when rendering the date -# within the migration file as well as the filename. -# string value is passed to dateutil.tz.gettz() -# leave blank for localtime -# timezone = - -# max length of characters to apply to the -# "slug" field -# truncate_slug_length = 40 - -# set to 'true' to run the environment during -# the 'revision' command, regardless of autogenerate -# revision_environment = false - -# set to 'true' to allow .pyc and .pyo files without -# a source .py file to be detected as revisions in the -# versions/ directory -# sourceless = false - -# version location specification; this defaults -# to ${script_location}/versions. When using multiple version -# directories, initial revisions must be specified with --version-path -# version_locations = %(here)s/bar %(here)s/bat ${script_location}/versions - -# the output encoding used when revision files -# are written from script.py.mako -# output_encoding = utf-8 - -databases = engine1, engine2 - -[engine1] -sqlalchemy.url = driver://user:pass@localhost/dbname - -[engine2] -sqlalchemy.url = driver://user:pass@localhost/dbname2 - -[post_write_hooks] -# post_write_hooks defines scripts or Python functions that are run -# on newly generated revision scripts. See the documentation for further -# detail and examples - -# format using "black" - use the console_scripts runner, against the "black" entrypoint -# hooks=black -# black.type=console_scripts -# black.entrypoint=black -# black.options=-l 79 - -# Logging configuration -[loggers] -keys = root,sqlalchemy,alembic - -[handlers] -keys = console - -[formatters] -keys = generic - -[logger_root] -level = WARN -handlers = console -qualname = - -[logger_sqlalchemy] -level = WARN -handlers = -qualname = sqlalchemy.engine - -[logger_alembic] -level = INFO -handlers = -qualname = alembic - -[handler_console] -class = StreamHandler -args = (sys.stderr,) -level = NOTSET -formatter = generic - -[formatter_generic] -format = %(levelname)-5.5s [%(name)s] %(message)s -datefmt = %H:%M:%S diff --git a/venv/lib/python3.7/site-packages/alembic/templates/multidb/env.py b/venv/lib/python3.7/site-packages/alembic/templates/multidb/env.py deleted file mode 100644 index f1a9a9a..0000000 --- a/venv/lib/python3.7/site-packages/alembic/templates/multidb/env.py +++ /dev/null @@ -1,139 +0,0 @@ -import logging -from logging.config import fileConfig -import re - -from sqlalchemy import engine_from_config -from sqlalchemy import pool - -from alembic import context - -USE_TWOPHASE = False - -# this is the Alembic Config object, which provides -# access to the values within the .ini file in use. -config = context.config - -# Interpret the config file for Python logging. -# This line sets up loggers basically. -fileConfig(config.config_file_name) -logger = logging.getLogger("alembic.env") - -# gather section names referring to different -# databases. These are named "engine1", "engine2" -# in the sample .ini file. -db_names = config.get_main_option("databases") - -# add your model's MetaData objects here -# for 'autogenerate' support. These must be set -# up to hold just those tables targeting a -# particular database. table.tometadata() may be -# helpful here in case a "copy" of -# a MetaData is needed. -# from myapp import mymodel -# target_metadata = { -# 'engine1':mymodel.metadata1, -# 'engine2':mymodel.metadata2 -# } -target_metadata = {} - -# other values from the config, defined by the needs of env.py, -# can be acquired: -# my_important_option = config.get_main_option("my_important_option") -# ... etc. - - -def run_migrations_offline(): - """Run migrations in 'offline' mode. - - This configures the context with just a URL - and not an Engine, though an Engine is acceptable - here as well. By skipping the Engine creation - we don't even need a DBAPI to be available. - - Calls to context.execute() here emit the given string to the - script output. - - """ - # for the --sql use case, run migrations for each URL into - # individual files. - - engines = {} - for name in re.split(r",\s*", db_names): - engines[name] = rec = {} - rec["url"] = context.config.get_section_option(name, "sqlalchemy.url") - - for name, rec in engines.items(): - logger.info("Migrating database %s" % name) - file_ = "%s.sql" % name - logger.info("Writing output to %s" % file_) - with open(file_, "w") as buffer: - context.configure( - url=rec["url"], - output_buffer=buffer, - target_metadata=target_metadata.get(name), - literal_binds=True, - dialect_opts={"paramstyle": "named"}, - ) - with context.begin_transaction(): - context.run_migrations(engine_name=name) - - -def run_migrations_online(): - """Run migrations in 'online' mode. - - In this scenario we need to create an Engine - and associate a connection with the context. - - """ - - # for the direct-to-DB use case, start a transaction on all - # engines, then run all migrations, then commit all transactions. - - engines = {} - for name in re.split(r",\s*", db_names): - engines[name] = rec = {} - rec["engine"] = engine_from_config( - context.config.get_section(name), - prefix="sqlalchemy.", - poolclass=pool.NullPool, - ) - - for name, rec in engines.items(): - engine = rec["engine"] - rec["connection"] = conn = engine.connect() - - if USE_TWOPHASE: - rec["transaction"] = conn.begin_twophase() - else: - rec["transaction"] = conn.begin() - - try: - for name, rec in engines.items(): - logger.info("Migrating database %s" % name) - context.configure( - connection=rec["connection"], - upgrade_token="%s_upgrades" % name, - downgrade_token="%s_downgrades" % name, - target_metadata=target_metadata.get(name), - ) - context.run_migrations(engine_name=name) - - if USE_TWOPHASE: - for rec in engines.values(): - rec["transaction"].prepare() - - for rec in engines.values(): - rec["transaction"].commit() - except: - for rec in engines.values(): - rec["transaction"].rollback() - raise - finally: - for rec in engines.values(): - rec["connection"].close() - - -if context.is_offline_mode(): - run_migrations_offline() -else: - run_migrations_online() diff --git a/venv/lib/python3.7/site-packages/alembic/templates/multidb/script.py.mako b/venv/lib/python3.7/site-packages/alembic/templates/multidb/script.py.mako deleted file mode 100644 index c3970a5..0000000 --- a/venv/lib/python3.7/site-packages/alembic/templates/multidb/script.py.mako +++ /dev/null @@ -1,45 +0,0 @@ -<%! -import re - -%>"""${message} - -Revision ID: ${up_revision} -Revises: ${down_revision | comma,n} -Create Date: ${create_date} - -""" -from alembic import op -import sqlalchemy as sa -${imports if imports else ""} - -# revision identifiers, used by Alembic. -revision = ${repr(up_revision)} -down_revision = ${repr(down_revision)} -branch_labels = ${repr(branch_labels)} -depends_on = ${repr(depends_on)} - - -def upgrade(engine_name): - globals()["upgrade_%s" % engine_name]() - - -def downgrade(engine_name): - globals()["downgrade_%s" % engine_name]() - -<% - db_names = config.get_main_option("databases") -%> - -## generate an "upgrade_() / downgrade_()" function -## for each database name in the ini file. - -% for db_name in re.split(r',\s*', db_names): - -def upgrade_${db_name}(): - ${context.get("%s_upgrades" % db_name, "pass")} - - -def downgrade_${db_name}(): - ${context.get("%s_downgrades" % db_name, "pass")} - -% endfor diff --git a/venv/lib/python3.7/site-packages/alembic/templates/pylons/README b/venv/lib/python3.7/site-packages/alembic/templates/pylons/README deleted file mode 100644 index ed3c28e..0000000 --- a/venv/lib/python3.7/site-packages/alembic/templates/pylons/README +++ /dev/null @@ -1 +0,0 @@ -Configuration that reads from a Pylons project environment. \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/alembic/templates/pylons/__pycache__/env.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/templates/pylons/__pycache__/env.cpython-37.pyc deleted file mode 100644 index abafec977659c1e847e7aaf9732635532e45bc2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1898 zcmZvczmFU>6vsWYv$J!1`{RCbBAuIXSt;2|0ZoJ=k`SaI6deJSFa;yu`0buI9(!ba z@3N=Ra5NMVCGA~FM@>b;KQS$$;9sEP*}Hckgc*&;`8fvA_+O|V8AVOk8+;IK<5$N|MH9Y@4jsI3 z*iDzdo2&@#iz458JE+sO<*Yl`Z4-@0D53$0aU4V8^lAUP9aoxz99Q7j>0r5jT(j~y zo5JJLM{{|tVdnup_6|0V%pw=hTC>EpeWrO!L_B$g`E}$xy&yjhLa%dyx;`bm{W*C; zp5Yr6PT40BAy4LtR$^*`Bo>vUdwMdFLZOU4BGiK7_2rSUbh(4M0UNYjDS$e|(I%DICZBO2U8C0y_}#oQ>0zp_ao z=xBWUjX(d*<{_Z61s)A$S?Q5(24=2`*XjJ3m<>POH-F#TcU8S#i~5#O)}acwZtD*$ z*ooR-9hIxMgQ`Y2!R{|X+{cqQt{2Vjo92rZDL2r(9biLxNt8x0-o3aRnJpZ-LKj&h zF+Ks^PqE{$9GykqMJ_sz5!Bn?5{DSSBnWc+3X7F%T>;!WzXZ6o1Q=0X^>_us8=XC z-gyATtm9BvWW4fbh|MT6+rEF5bF+z`%{%|iTF~V#{<1x6$XbTUN}_HHQ?`rWqn)Nx z6kL}@(F~-XV))ZBMvC>-_zdQ~npp>94z<(^)AB=|6+$7lJY8aA+WuGnjbfM&!&zVm zF7ob~U0<3GwKLC7>{Jw3Vw-MJh^p4cVHE998;y^4xn)mQh&3Mydx>G;XZ>sQL583} r_96b7OSqfjI{O|r2@;BTEA}lio8soPXg7(YolerqcC(!<%Hn?jzHJ&4 diff --git a/venv/lib/python3.7/site-packages/alembic/templates/pylons/alembic.ini.mako b/venv/lib/python3.7/site-packages/alembic/templates/pylons/alembic.ini.mako deleted file mode 100644 index 70fead0..0000000 --- a/venv/lib/python3.7/site-packages/alembic/templates/pylons/alembic.ini.mako +++ /dev/null @@ -1,51 +0,0 @@ -# a Pylons configuration. - -[alembic] -# path to migration scripts -script_location = ${script_location} - -# template used to generate migration files -# file_template = %%(rev)s_%%(slug)s - -# timezone to use when rendering the date -# within the migration file as well as the filename. -# string value is passed to dateutil.tz.gettz() -# leave blank for localtime -# timezone = - -# max length of characters to apply to the -# "slug" field -# truncate_slug_length = 40 - -# set to 'true' to run the environment during -# the 'revision' command, regardless of autogenerate -# revision_environment = false - -# set to 'true' to allow .pyc and .pyo files without -# a source .py file to be detected as revisions in the -# versions/ directory -# sourceless = false - -# version location specification; this defaults -# to ${script_location}/versions. When using multiple version -# directories, initial revisions must be specified with --version-path -# version_locations = %(here)s/bar %(here)s/bat ${script_location}/versions - -# the output encoding used when revision files -# are written from script.py.mako -# output_encoding = utf-8 - -[post_write_hooks] -# post_write_hooks defines scripts or Python functions that are run -# on newly generated revision scripts. See the documentation for further -# detail and examples - -# format using "black" - use the console_scripts runner, against the "black" entrypoint -# hooks=black -# black.type=console_scripts -# black.entrypoint=black -# black.options=-l 79 - -pylons_config_file = ./development.ini - -# that's it ! \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/alembic/templates/pylons/env.py b/venv/lib/python3.7/site-packages/alembic/templates/pylons/env.py deleted file mode 100644 index b2d610d..0000000 --- a/venv/lib/python3.7/site-packages/alembic/templates/pylons/env.py +++ /dev/null @@ -1,85 +0,0 @@ -"""Pylons bootstrap environment. - -Place 'pylons_config_file' into alembic.ini, and the application will -be loaded from there. - -""" -from logging.config import fileConfig - -from paste.deploy import loadapp - -from alembic import context - - -try: - # if pylons app already in, don't create a new app - from pylons import config as pylons_config - - pylons_config["__file__"] -except: - config = context.config - # can use config['__file__'] here, i.e. the Pylons - # ini file, instead of alembic.ini - config_file = config.get_main_option("pylons_config_file") - fileConfig(config_file) - wsgi_app = loadapp("config:%s" % config_file, relative_to=".") - - -# customize this section for non-standard engine configurations. -meta = __import__( - "%s.model.meta" % wsgi_app.config["pylons.package"] -).model.meta - -# add your model's MetaData object here -# for 'autogenerate' support -# from myapp import mymodel -# target_metadata = mymodel.Base.metadata -target_metadata = None - - -def run_migrations_offline(): - """Run migrations in 'offline' mode. - - This configures the context with just a URL - and not an Engine, though an Engine is acceptable - here as well. By skipping the Engine creation - we don't even need a DBAPI to be available. - - Calls to context.execute() here emit the given string to the - script output. - - """ - context.configure( - url=meta.engine.url, - target_metadata=target_metadata, - literal_binds=True, - dialect_opts={"paramstyle": "named"}, - ) - with context.begin_transaction(): - context.run_migrations() - - -def run_migrations_online(): - """Run migrations in 'online' mode. - - In this scenario we need to create an Engine - and associate a connection with the context. - - """ - # specify here how the engine is acquired - # engine = meta.engine - raise NotImplementedError("Please specify engine connectivity here") - - with engine.connect() as connection: # noqa - context.configure( - connection=connection, target_metadata=target_metadata - ) - - with context.begin_transaction(): - context.run_migrations() - - -if context.is_offline_mode(): - run_migrations_offline() -else: - run_migrations_online() diff --git a/venv/lib/python3.7/site-packages/alembic/templates/pylons/script.py.mako b/venv/lib/python3.7/site-packages/alembic/templates/pylons/script.py.mako deleted file mode 100644 index 2c01563..0000000 --- a/venv/lib/python3.7/site-packages/alembic/templates/pylons/script.py.mako +++ /dev/null @@ -1,24 +0,0 @@ -"""${message} - -Revision ID: ${up_revision} -Revises: ${down_revision | comma,n} -Create Date: ${create_date} - -""" -from alembic import op -import sqlalchemy as sa -${imports if imports else ""} - -# revision identifiers, used by Alembic. -revision = ${repr(up_revision)} -down_revision = ${repr(down_revision)} -branch_labels = ${repr(branch_labels)} -depends_on = ${repr(depends_on)} - - -def upgrade(): - ${upgrades if upgrades else "pass"} - - -def downgrade(): - ${downgrades if downgrades else "pass"} diff --git a/venv/lib/python3.7/site-packages/alembic/testing/__init__.py b/venv/lib/python3.7/site-packages/alembic/testing/__init__.py deleted file mode 100644 index f009da9..0000000 --- a/venv/lib/python3.7/site-packages/alembic/testing/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -from sqlalchemy.testing import config # noqa -from sqlalchemy.testing import emits_warning # noqa -from sqlalchemy.testing import engines # noqa -from sqlalchemy.testing import mock # noqa -from sqlalchemy.testing import provide_metadata # noqa -from sqlalchemy.testing import uses_deprecated # noqa -from sqlalchemy.testing.config import requirements as requires # noqa - -from alembic import util # noqa -from . import exclusions # noqa -from .assertions import assert_raises # noqa -from .assertions import assert_raises_message # noqa -from .assertions import emits_python_deprecation_warning # noqa -from .assertions import eq_ # noqa -from .assertions import eq_ignore_whitespace # noqa -from .assertions import is_ # noqa -from .assertions import is_false # noqa -from .assertions import is_not_ # noqa -from .assertions import is_true # noqa -from .assertions import ne_ # noqa -from .fixture_functions import combinations # noqa -from .fixture_functions import fixture # noqa -from .fixtures import TestBase # noqa -from .util import resolve_lambda # noqa diff --git a/venv/lib/python3.7/site-packages/alembic/testing/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/testing/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index e6e265f75b4a22649a937e8e273889c6577f5743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1036 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 diff --git a/venv/lib/python3.7/site-packages/alembic/testing/__pycache__/fixture_functions.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/testing/__pycache__/fixture_functions.cpython-37.pyc deleted file mode 100644 index 0c47af48eb7ca82559561aff1bd716d98f55dad5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3244 zcmcInJ(Jut7`Ase$t5HdF!Y*j*kv|8C}?*0$OOntD2{@wj=-MQl6RG}Wk-^8Stb=j zK}AbTO8y1EV_SwlK?Bb#`RgusLlw`hZQ1hkKJW8>NcZsGy*m+(zkmDlhhN@`qQ7X+ z9wXd5z|YQb646N{VlnzTI*G+tOmH2E8{#IeV{uCy;5re}x6%CeQHtsQAb>G`-{5EO z;^d;I@yqCC{A-MfG5_~=6n!ak^;{ZO)VWhtE*S<^mD;j0W1Kl@9b0oN1uHeHN~;`R z@|>k*u~wSX$R>C0FdWBQWf}fB%XrF#WF-MtJHki`ZqAa58(v6f)Q=M1_>Y$U8GG^p z0WKLgo4SzNUBoABX(irD=4!CC%x$@2=PJ+HTC$2;F!Xo>j`@zc5)&m8GA#{va3ZU9 zN}LAmKyF(`^S8oF?PfsL70cRx3aPUfBiPmgf@U2Q(rz3|A*Y&`(H%3}DJJ zUc0hDNK>9eJC!kAI#vM{TK#&kyq9_AerVK=G^`g|7TA624cD_~c9%G?w%8iiXV!V`ivKqunK}A_q zIU)>$eHvOw3a;%tFMY5qq)m-lgA9}+LTswUlx3v}!Z(SE^tIA4yDjTnP@)N$DJ{i< z#Nm3E1hiwygSuE_I&vW0BFj^UGU^i`kZXaUG2A1o-B$sqNdo%rn)rW3Y0+5#pG$rO zoIbtCe?mn#Lo#-1`#NeF!L=>dA}80lMg1CF0@nFff+;*RJ{^!Ih>Ox`UL!1*QEgL- zZC1BgPpA!?M9IPg1iTu`m1h#&r>2&J@=c9ISiM*Xb11QZbRkAfez3I?r( z=kA39pgt0M2ALRiCC|(vi5_RI5$Y_9OW_!Rks7WxND62HFy5A^N1e@CxqgZ=Sp>L( zSCvmm#9ro-I-PH{lnWiz5E&w7N>QhHqZxefx-bt|eHJ|Dd5r=N0k&vlT@yrwqx6~= zm#QHYGAswUtjzQBoXFX93uen@XwcNz6}#`%+@MkDo+w=BtSvI?$9Mp@ecvRHC}29@ zEtn|v`%MQSI2@$DZ#jVI5qpdJYKwg(HsM3k5={S`3rb6f*EtppdIfikT3Z`{WVNF1 zy;?Eupv}5=vL|5PFaaYgGn@DJ>>IX+Fb&Odn47g3H@_;ly`)!4jin*vO(QQlNL#WS zsbyGgLlQJj%4Cxalj;Gji-<)ss3tqR06HrxLMlxnpDox_KAX;)LTaq`6STwxEw7)j zahR}i*H6f4LjKwWC03tKHJ^6G=G`4u1HVC9wKQk6d@ZnvpuV^8dxQD1n@*fb%b>?G zmHZl8q~Y2eR%A+2tgu~vo}SX?i^L2oW+9uk#zXs+BJ>QZ21EffP4Glb{f*cUY604Epy9>1d9ble$v4;!6TT4Ud)-HLqj z&0}DO+%Vo2A$(0x-l^EoI3=cZ(3J>!TW{lrY`u(L#XrS<|K3?VdDot)DwvWlQt5Z5 z^LRfl>}Ft=Ebec2Q;#rg?b5#%^BZ0xFRXXkvoZ8)0Mc>aAAC|^(aGg!#M5gr86P}6 Im>f+00}~j;m;e9( diff --git a/venv/lib/python3.7/site-packages/alembic/testing/__pycache__/fixtures.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/testing/__pycache__/fixtures.cpython-37.pyc deleted file mode 100644 index e4f084afb9d210d3cbc898ef78adf33dce0f983e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7875 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 QW|@tJ#tHZt{jc5rACN9zApigX diff --git a/venv/lib/python3.7/site-packages/alembic/testing/__pycache__/requirements.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/testing/__pycache__/requirements.cpython-37.pyc deleted file mode 100644 index 63b0828aaad6fbf84d867af44e3671897d3aac80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6746 zcmcIp&2QVt6(=c5qGj2!9mo0DY|MN*+I1Ama-3Z>4b~eZZGeq8tzGPvhb3su*rrX9 z^bD0+f`bCh76p1KiXQgROMKk_qJIakMGram)>Gdbeps?7*)b9de0&_v$D7~0kC~^h z$Hqz$T>ts$Uq9TPkfeX(OLD2ed<8fE1_+Ue>_`Sa6-RC=h9V=Mb8=19PzA3#`DVc= z2tMx=o0_4?(yt^^AjKagQl!e8oH0V=HL0S#gC3>TiX4`IOZQqfqfP1t9NyJdU_0yl%Nf-?m;+-E(P4k1yA1QlifV zlm}*1bFNxZ7;00fdOme=nK^Yff0oz?6#j4Je$e#q`?i12c6neq&bB_R zxnVcbCw6MPTlZO))>Qp=Sd2v)#Yy4pqq1EZN{pV8B9u5$ z$?qjs`5ycNh*Ml;sF0u%MOb{FHiEF=F{|Ow^-$h_R?&VcL3hBbQ1X;9kA)-aZJ);M)BOhZak(nFumCML z?Jd!_p`sAS*GVTHwHT9NPCzG-j5yHK`^AkOibTpc##C7cCXsibIAo$C9^ zn<~{1_p%y`%8D??0GpWH^cc0bTyvMU%_eyJ?J9~TOj_yO>=&x9{%IuXycp`}#2V{e z8kPDsba=2To=#mDxIy&*^fK{o!{#*`=}lLk<{!+s6V%ehbe8!}t$&s$v_8$8Q}oM2 z(2o_6oBpneCdR)^<;q0Aul|RUm~)a71cn<(a)tx$aX~R~MolXrWGd!}1~E=&;(lZ!xRMgSG>;f^7@Jr032BdK`;% zJLnk>4MBL;D8}x{Wf5a>8PM^Dn%L9S78k%0W}x7>t!j@PtGPj}$4}wof8mxoU-nP> z$T>m?;ot}B50@5>oJZ0}=f>J^zFCR9s9vis>M)%xMlA^FiTot7PV@rUxq7(rMc0w8MlsQ|2J0NAUL^$&qw{pI_iSO4hf zEe%1>I4ychC!)9XA<$d;?)}hP`grKY=3A>h7=oXb;#VJTB+yL;g1rV@tJWTz5yW%d z1`K2Ua16%lCrbD6fQ(~IZ9t3>Zg4xraq$F6v*OCF9zR&CE}Rj?@g5Wx=rIuWlSE4~ z#GPUqOQzwa_Y9Oo`=fY*4e&;9#_s?Lq#ZZ`9mqt6v(FTP%>nSa-8{R7XB&Jc7|HXi z74;nkqIVe1#VN*6HfrmY9Gk;Z?DHLNHJ(9W&BN2ko3AM2@P^?&RPp6_(9esFo(tbO zZqp>WplEQ4fLrM-55*vg{!2^s;6>G~m}>H1~w)K(i%C%w|O!!tFm9jqI!j{@l>b{EPjN|@tq z9+nYsI9i!D?%gr-&_%GZFo!=PqXX%D-jBE64z@ivE1c;s#V0);L$6o&_aQ5gZm!ZZ z!jRonG4B2VMvo6-fM7-%Bd(W?8J>~xydUZP@iRZd+lSa&CCdM-g6@jFDV&Kh)n<%t zTW}Phe!aHzaEL4ZGjuu_v#9xzRwjGWc)uAIJ=baD!8JQeQjEv{6QY8mOSw!;qG8U8 z2~JyhfCRoM{~_R$!O|lOzG4y^Qc?{_Y(+USj!8+8yJVBlLs*Qz4*~11P*2PQ)^@&M z#ghI8;>GZ&H~=dxY5f-*1kFf-ePrj#;9<^+7wVC~3vC^(4lE9Eiq1Cd8WawJ;P3D` z(wBw7l9_PuIui)x1O)8iZ!lDnJ-9Y}upTH-(Vk%2==7FkNYg{~kQ7GQa^P46is7`H z?mvc)-(B^+#>eO|KnW&b{(cMcUa<)Lr!E<8WMa@$y+;lVTmlD7C!$+{TM2SI>S2^l zgf-8L)UHrVW8!PibExIMWR%zqJYI^(S4KaQh&4d$>EwGNHZI>kQS?-gGxDKXjaDm{ zL(LTV3)2isrrGpJ%b~!RO>?hhIhfgiH_c~|j%GodVcM9DA-RkMQ+ezYBv+AqisU+y z8%S;!_Nf}@$gABsa)$bB6ytQdaPr2v_$_H5meBz1 j6)E>B{t+WqPYjeLd8j>#kbR8afa4rArL2@?_~rf&J%1}E diff --git a/venv/lib/python3.7/site-packages/alembic/testing/__pycache__/util.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/testing/__pycache__/util.cpython-37.pyc deleted file mode 100644 index 8857b39f06d701cbfe289f17253ead75705662ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2972 zcma)8O>g8x8m=lk9j7M~X84+A#iHUfX_Rz8z+utMh($0Q5D_0EKrMk)aaDJmskVEn z+{q;BoDyl011s%mFMCLi{EPh^mN>2Uz+adX&uh0kAu}VeTxGlJ{jT?YUVnV`YMbHu z|G)qH<8{3Kk3O0!z{^J%{w++JX>M7MX`zE7*5f+Vb9f59pyzdT#Cw6}->^>mSJ1MJ zgl4)(Mhjye!)r{MYhl@tA8^hJamY^CgBK_46ZXT>fjDNT!9<*4=l);5V?}t(4*3b2 z@a?&Wtj~3z!=s3354oPxt)fNy&$Am$&!5g8voo%v|A>E*6$|PL6#ql^RidW_lYF?DW~xZ@%&&B0?oyK#M$01KRZe@kndjE1tSxcfGkd$a(`%c`gF?B% zcnD(OZCAS=E1xFH+C4cinQ;mlq>@>h7-{qT9+b&cgFfx2#>rYnp2=d%G=hC4N5MR0 zeJ;Hzyc~}zibk2t)X+2AAVSCC;Mhj^{pDjzw@k;Of+=qG$~fB+TXi%2a3$9 z94YV99aDdHR-ZzA*Ny))?Ipp)`c%13pk0+trQX06h0JMG%x-F$4dbjFWuA=B)M zad>(NR+g7n_w+8JLEzTb%dixI0C{BcNB0J(X>Dl0r2}6zBUfthue9Ym2<^-WDV$v z7oi9NMZRGt&PVNYTW8+2#QvLq%Da-MC0CF5YDe?}Bw86YS=EWkXZ?MvY_esBd);YB z9hp}K0I0Gx9%(>b+48vqZkCG|Ypx8e$=nsPIdC`ds2InAwpK|jf^iB z?~JpA8sJ@gmQjq(p-mij!d@81{j3!Cc6-6VZuVN4*~LPgud}2rmtbXXcT8L>Cg||A z%NE)kXU3hxdl~hoT4rZPNksnyH2f;2=6~P>NI)IlieYdfIKby2e<=C^b^4>|fKRBe z&+otWrOS8FQsoz>P@kwm$$su|jH5kD(QQy(d+qb;bZM@2W=U-8hT2wqJwN zFJWSQ5w$3A&Wk}??7!EjjHdxU$5L&QoPLVVSEjN6XLCNuM}W89{FDvaI}q;P#sui7 z;Rbr$>$Je@&B~&vk^2>PJe>gJOIP<_`(r~op`$adg|k|+aFmB`jV4OrsqT7}bk|UI z?XvU=cB-5Y77>wa*W5aBbN4DeLiaMU5@1!eP;FkQqVrOUZq^uZo0dHFh$x8Ojh^`p Dv!d{y diff --git a/venv/lib/python3.7/site-packages/alembic/testing/assertions.py b/venv/lib/python3.7/site-packages/alembic/testing/assertions.py deleted file mode 100644 index a78e5e8..0000000 --- a/venv/lib/python3.7/site-packages/alembic/testing/assertions.py +++ /dev/null @@ -1,112 +0,0 @@ -from __future__ import absolute_import - -import re - -from sqlalchemy import util -from sqlalchemy.engine import default -from sqlalchemy.testing.assertions import _expect_warnings -from sqlalchemy.testing.assertions import eq_ # noqa -from sqlalchemy.testing.assertions import is_ # noqa -from sqlalchemy.testing.assertions import is_false # noqa -from sqlalchemy.testing.assertions import is_not_ # noqa -from sqlalchemy.testing.assertions import is_true # noqa -from sqlalchemy.testing.assertions import ne_ # noqa -from sqlalchemy.util import decorator - -from ..util.compat import py3k - - -def assert_raises(except_cls, callable_, *args, **kw): - try: - callable_(*args, **kw) - success = False - except except_cls: - success = True - - # assert outside the block so it works for AssertionError too ! - assert success, "Callable did not raise an exception" - - -def assert_raises_message(except_cls, msg, callable_, *args, **kwargs): - try: - callable_(*args, **kwargs) - assert False, "Callable did not raise an exception" - except except_cls as e: - assert re.search(msg, util.text_type(e), re.UNICODE), "%r !~ %s" % ( - msg, - e, - ) - print(util.text_type(e).encode("utf-8")) - - -def eq_ignore_whitespace(a, b, msg=None): - # sqlalchemy.testing.assertion has this function - # but not with the special "!U" detection part - - a = re.sub(r"^\s+?|\n", "", a) - a = re.sub(r" {2,}", " ", a) - b = re.sub(r"^\s+?|\n", "", b) - b = re.sub(r" {2,}", " ", b) - - # convert for unicode string rendering, - # using special escape character "!U" - if py3k: - b = re.sub(r"!U", "", b) - else: - b = re.sub(r"!U", "u", b) - - assert a == b, msg or "%r != %r" % (a, b) - - -_dialect_mods = {} - - -def _get_dialect(name): - if name is None or name == "default": - return default.DefaultDialect() - else: - try: - dialect_mod = _dialect_mods[name] - except KeyError: - dialect_mod = getattr( - __import__("sqlalchemy.dialects.%s" % name).dialects, name - ) - _dialect_mods[name] = dialect_mod - d = dialect_mod.dialect() - if name == "postgresql": - d.implicit_returning = True - elif name == "mssql": - d.legacy_schema_aliasing = False - return d - - -def expect_warnings(*messages, **kw): - """Context manager which expects one or more warnings. - - With no arguments, squelches all SAWarnings emitted via - sqlalchemy.util.warn and sqlalchemy.util.warn_limited. Otherwise - pass string expressions that will match selected warnings via regex; - all non-matching warnings are sent through. - - The expect version **asserts** that the warnings were in fact seen. - - Note that the test suite sets SAWarning warnings to raise exceptions. - - """ - return _expect_warnings(Warning, messages, **kw) - - -def emits_python_deprecation_warning(*messages): - """Decorator form of expect_warnings(). - - Note that emits_warning does **not** assert that the warnings - were in fact seen. - - """ - - @decorator - def decorate(fn, *args, **kw): - with _expect_warnings(DeprecationWarning, assert_=False, *messages): - return fn(*args, **kw) - - return decorate diff --git a/venv/lib/python3.7/site-packages/alembic/testing/env.py b/venv/lib/python3.7/site-packages/alembic/testing/env.py deleted file mode 100644 index 473c73e..0000000 --- a/venv/lib/python3.7/site-packages/alembic/testing/env.py +++ /dev/null @@ -1,506 +0,0 @@ -#!coding: utf-8 - -import os -import shutil -import textwrap - -from sqlalchemy.testing import engines -from sqlalchemy.testing import provision - -from .. import util -from ..script import Script -from ..script import ScriptDirectory -from ..util.compat import get_current_bytecode_suffixes -from ..util.compat import has_pep3147 -from ..util.compat import u - - -def _get_staging_directory(): - if provision.FOLLOWER_IDENT: - return "scratch_%s" % provision.FOLLOWER_IDENT - else: - return "scratch" - - -def staging_env(create=True, template="generic", sourceless=False): - from alembic import command, script - - cfg = _testing_config() - if create: - - path = os.path.join(_get_staging_directory(), "scripts") - assert not os.path.exists(path), ( - "staging directory %s already exists; poor cleanup?" % path - ) - - command.init(cfg, path, template=template) - if sourceless: - try: - # do an import so that a .pyc/.pyo is generated. - util.load_python_file(path, "env.py") - except AttributeError: - # we don't have the migration context set up yet - # so running the .env py throws this exception. - # theoretically we could be using py_compiler here to - # generate .pyc/.pyo without importing but not really - # worth it. - pass - assert sourceless in ( - "pep3147_envonly", - "simple", - "pep3147_everything", - ), sourceless - make_sourceless( - os.path.join(path, "env.py"), - "pep3147" if "pep3147" in sourceless else "simple", - ) - - sc = script.ScriptDirectory.from_config(cfg) - return sc - - -def clear_staging_env(): - from sqlalchemy.testing import engines - - engines.testing_reaper.close_all() - shutil.rmtree(_get_staging_directory(), True) - - -def script_file_fixture(txt): - dir_ = os.path.join(_get_staging_directory(), "scripts") - path = os.path.join(dir_, "script.py.mako") - with open(path, "w") as f: - f.write(txt) - - -def env_file_fixture(txt): - dir_ = os.path.join(_get_staging_directory(), "scripts") - txt = ( - """ -from alembic import context - -config = context.config -""" - + txt - ) - - path = os.path.join(dir_, "env.py") - pyc_path = util.pyc_file_from_path(path) - if pyc_path: - os.unlink(pyc_path) - - with open(path, "w") as f: - f.write(txt) - - -def _sqlite_file_db(tempname="foo.db"): - dir_ = os.path.join(_get_staging_directory(), "scripts") - url = "sqlite:///%s/%s" % (dir_, tempname) - return engines.testing_engine(url=url) - - -def _sqlite_testing_config(sourceless=False): - dir_ = os.path.join(_get_staging_directory(), "scripts") - url = "sqlite:///%s/foo.db" % dir_ - - return _write_config_file( - """ -[alembic] -script_location = %s -sqlalchemy.url = %s -sourceless = %s - -[loggers] -keys = root - -[handlers] -keys = console - -[logger_root] -level = WARN -handlers = console -qualname = - -[handler_console] -class = StreamHandler -args = (sys.stderr,) -level = NOTSET -formatter = generic - -[formatters] -keys = generic - -[formatter_generic] -format = %%(levelname)-5.5s [%%(name)s] %%(message)s -datefmt = %%H:%%M:%%S - """ - % (dir_, url, "true" if sourceless else "false") - ) - - -def _multi_dir_testing_config(sourceless=False, extra_version_location=""): - dir_ = os.path.join(_get_staging_directory(), "scripts") - url = "sqlite:///%s/foo.db" % dir_ - - return _write_config_file( - """ -[alembic] -script_location = %s -sqlalchemy.url = %s -sourceless = %s -version_locations = %%(here)s/model1/ %%(here)s/model2/ %%(here)s/model3/ %s - -[loggers] -keys = root - -[handlers] -keys = console - -[logger_root] -level = WARN -handlers = console -qualname = - -[handler_console] -class = StreamHandler -args = (sys.stderr,) -level = NOTSET -formatter = generic - -[formatters] -keys = generic - -[formatter_generic] -format = %%(levelname)-5.5s [%%(name)s] %%(message)s -datefmt = %%H:%%M:%%S - """ - % ( - dir_, - url, - "true" if sourceless else "false", - extra_version_location, - ) - ) - - -def _no_sql_testing_config(dialect="postgresql", directives=""): - """use a postgresql url with no host so that - connections guaranteed to fail""" - dir_ = os.path.join(_get_staging_directory(), "scripts") - return _write_config_file( - """ -[alembic] -script_location = %s -sqlalchemy.url = %s:// -%s - -[loggers] -keys = root - -[handlers] -keys = console - -[logger_root] -level = WARN -handlers = console -qualname = - -[handler_console] -class = StreamHandler -args = (sys.stderr,) -level = NOTSET -formatter = generic - -[formatters] -keys = generic - -[formatter_generic] -format = %%(levelname)-5.5s [%%(name)s] %%(message)s -datefmt = %%H:%%M:%%S - -""" - % (dir_, dialect, directives) - ) - - -def _write_config_file(text): - cfg = _testing_config() - with open(cfg.config_file_name, "w") as f: - f.write(text) - return cfg - - -def _testing_config(): - from alembic.config import Config - - if not os.access(_get_staging_directory(), os.F_OK): - os.mkdir(_get_staging_directory()) - return Config(os.path.join(_get_staging_directory(), "test_alembic.ini")) - - -def write_script( - scriptdir, rev_id, content, encoding="ascii", sourceless=False -): - old = scriptdir.revision_map.get_revision(rev_id) - path = old.path - - content = textwrap.dedent(content) - if encoding: - content = content.encode(encoding) - with open(path, "wb") as fp: - fp.write(content) - pyc_path = util.pyc_file_from_path(path) - if pyc_path: - os.unlink(pyc_path) - script = Script._from_path(scriptdir, path) - old = scriptdir.revision_map.get_revision(script.revision) - if old.down_revision != script.down_revision: - raise Exception( - "Can't change down_revision " "on a refresh operation." - ) - scriptdir.revision_map.add_revision(script, _replace=True) - - if sourceless: - make_sourceless( - path, "pep3147" if sourceless == "pep3147_everything" else "simple" - ) - - -def make_sourceless(path, style): - - import py_compile - - py_compile.compile(path) - - if style == "simple" and has_pep3147(): - pyc_path = util.pyc_file_from_path(path) - suffix = get_current_bytecode_suffixes()[0] - filepath, ext = os.path.splitext(path) - simple_pyc_path = filepath + suffix - shutil.move(pyc_path, simple_pyc_path) - pyc_path = simple_pyc_path - elif style == "pep3147" and not has_pep3147(): - raise NotImplementedError() - else: - assert style in ("pep3147", "simple") - pyc_path = util.pyc_file_from_path(path) - - assert os.access(pyc_path, os.F_OK) - - os.unlink(path) - - -def three_rev_fixture(cfg): - a = util.rev_id() - b = util.rev_id() - c = util.rev_id() - - script = ScriptDirectory.from_config(cfg) - script.generate_revision(a, "revision a", refresh=True, head="base") - write_script( - script, - a, - """\ -"Rev A" -revision = '%s' -down_revision = None - -from alembic import op - - -def upgrade(): - op.execute("CREATE STEP 1") - - -def downgrade(): - op.execute("DROP STEP 1") - -""" - % a, - ) - - script.generate_revision(b, "revision b", refresh=True, head=a) - write_script( - script, - b, - u( - """# coding: utf-8 -"Rev B, méil, %3" -revision = '{}' -down_revision = '{}' - -from alembic import op - - -def upgrade(): - op.execute("CREATE STEP 2") - - -def downgrade(): - op.execute("DROP STEP 2") - -""" - ).format(b, a), - encoding="utf-8", - ) - - script.generate_revision(c, "revision c", refresh=True, head=b) - write_script( - script, - c, - """\ -"Rev C" -revision = '%s' -down_revision = '%s' - -from alembic import op - - -def upgrade(): - op.execute("CREATE STEP 3") - - -def downgrade(): - op.execute("DROP STEP 3") - -""" - % (c, b), - ) - return a, b, c - - -def multi_heads_fixture(cfg, a, b, c): - """Create a multiple head fixture from the three-revs fixture""" - - # a->b->c - # -> d -> e - # -> f - d = util.rev_id() - e = util.rev_id() - f = util.rev_id() - - script = ScriptDirectory.from_config(cfg) - script.generate_revision( - d, "revision d from b", head=b, splice=True, refresh=True - ) - write_script( - script, - d, - """\ -"Rev D" -revision = '%s' -down_revision = '%s' - -from alembic import op - - -def upgrade(): - op.execute("CREATE STEP 4") - - -def downgrade(): - op.execute("DROP STEP 4") - -""" - % (d, b), - ) - - script.generate_revision( - e, "revision e from d", head=d, splice=True, refresh=True - ) - write_script( - script, - e, - """\ -"Rev E" -revision = '%s' -down_revision = '%s' - -from alembic import op - - -def upgrade(): - op.execute("CREATE STEP 5") - - -def downgrade(): - op.execute("DROP STEP 5") - -""" - % (e, d), - ) - - script.generate_revision( - f, "revision f from b", head=b, splice=True, refresh=True - ) - write_script( - script, - f, - """\ -"Rev F" -revision = '%s' -down_revision = '%s' - -from alembic import op - - -def upgrade(): - op.execute("CREATE STEP 6") - - -def downgrade(): - op.execute("DROP STEP 6") - -""" - % (f, b), - ) - - return d, e, f - - -def _multidb_testing_config(engines): - """alembic.ini fixture to work exactly with the 'multidb' template""" - - dir_ = os.path.join(_get_staging_directory(), "scripts") - - databases = ", ".join(engines.keys()) - engines = "\n\n".join( - "[%s]\n" "sqlalchemy.url = %s" % (key, value.url) - for key, value in engines.items() - ) - - return _write_config_file( - """ -[alembic] -script_location = %s -sourceless = false - -databases = %s - -%s -[loggers] -keys = root - -[handlers] -keys = console - -[logger_root] -level = WARN -handlers = console -qualname = - -[handler_console] -class = StreamHandler -args = (sys.stderr,) -level = NOTSET -formatter = generic - -[formatters] -keys = generic - -[formatter_generic] -format = %%(levelname)-5.5s [%%(name)s] %%(message)s -datefmt = %%H:%%M:%%S - """ - % (dir_, databases, engines) - ) diff --git a/venv/lib/python3.7/site-packages/alembic/testing/exclusions.py b/venv/lib/python3.7/site-packages/alembic/testing/exclusions.py deleted file mode 100644 index 91f2d5b..0000000 --- a/venv/lib/python3.7/site-packages/alembic/testing/exclusions.py +++ /dev/null @@ -1,484 +0,0 @@ -# testing/exclusions.py -# Copyright (C) 2005-2019 the SQLAlchemy authors and contributors -# -# -# This module is part of SQLAlchemy and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - - -import contextlib -import operator -import re - -from sqlalchemy import util as sqla_util -from sqlalchemy.util import decorator - -from . import config -from . import fixture_functions -from .. import util -from ..util.compat import inspect_getargspec - - -def skip_if(predicate, reason=None): - rule = compound() - pred = _as_predicate(predicate, reason) - rule.skips.add(pred) - return rule - - -def fails_if(predicate, reason=None): - rule = compound() - pred = _as_predicate(predicate, reason) - rule.fails.add(pred) - return rule - - -class compound(object): - def __init__(self): - self.fails = set() - self.skips = set() - self.tags = set() - self.combinations = {} - - def __add__(self, other): - return self.add(other) - - def with_combination(self, **kw): - copy = compound() - copy.fails.update(self.fails) - copy.skips.update(self.skips) - copy.tags.update(self.tags) - copy.combinations.update((f, kw) for f in copy.fails) - copy.combinations.update((s, kw) for s in copy.skips) - return copy - - def add(self, *others): - copy = compound() - copy.fails.update(self.fails) - copy.skips.update(self.skips) - copy.tags.update(self.tags) - for other in others: - copy.fails.update(other.fails) - copy.skips.update(other.skips) - copy.tags.update(other.tags) - return copy - - def not_(self): - copy = compound() - copy.fails.update(NotPredicate(fail) for fail in self.fails) - copy.skips.update(NotPredicate(skip) for skip in self.skips) - copy.tags.update(self.tags) - return copy - - @property - def enabled(self): - return self.enabled_for_config(config._current) - - def enabled_for_config(self, config): - for predicate in self.skips.union(self.fails): - if predicate(config): - return False - else: - return True - - def matching_config_reasons(self, config): - return [ - predicate._as_string(config) - for predicate in self.skips.union(self.fails) - if predicate(config) - ] - - def include_test(self, include_tags, exclude_tags): - return bool( - not self.tags.intersection(exclude_tags) - and (not include_tags or self.tags.intersection(include_tags)) - ) - - def _extend(self, other): - self.skips.update(other.skips) - self.fails.update(other.fails) - self.tags.update(other.tags) - self.combinations.update(other.combinations) - - def __call__(self, fn): - if hasattr(fn, "_sa_exclusion_extend"): - fn._sa_exclusion_extend._extend(self) - return fn - - @decorator - def decorate(fn, *args, **kw): - return self._do(config._current, fn, *args, **kw) - - decorated = decorate(fn) - decorated._sa_exclusion_extend = self - return decorated - - @contextlib.contextmanager - def fail_if(self): - all_fails = compound() - all_fails.fails.update(self.skips.union(self.fails)) - - try: - yield - except Exception as ex: - all_fails._expect_failure(config._current, ex, None) - else: - all_fails._expect_success(config._current, None) - - def _check_combinations(self, combination, predicate): - if predicate in self.combinations: - for k, v in combination: - if ( - k in self.combinations[predicate] - and self.combinations[predicate][k] != v - ): - return False - return True - - def _do(self, cfg, fn, *args, **kw): - if len(args) > 1: - insp = inspect_getargspec(fn) - combination = list(zip(insp.args[1:], args[1:])) - else: - combination = None - - for skip in self.skips: - if self._check_combinations(combination, skip) and skip(cfg): - msg = "'%s' : %s" % ( - fixture_functions.get_current_test_name(), - skip._as_string(cfg), - ) - config.skip_test(msg) - - try: - return_value = fn(*args, **kw) - except Exception as ex: - self._expect_failure(cfg, ex, combination, name=fn.__name__) - else: - self._expect_success(cfg, combination, name=fn.__name__) - return return_value - - def _expect_failure(self, config, ex, combination, name="block"): - for fail in self.fails: - if self._check_combinations(combination, fail) and fail(config): - if sqla_util.py2k: - str_ex = unicode(ex).encode( # noqa: F821 - "utf-8", errors="ignore" - ) - else: - str_ex = str(ex) - print( - ( - "%s failed as expected (%s): %s " - % (name, fail._as_string(config), str_ex) - ) - ) - break - else: - util.raise_from_cause(ex) - - def _expect_success(self, config, combination, name="block"): - if not self.fails: - return - - for fail in self.fails: - if self._check_combinations(combination, fail) and fail(config): - raise AssertionError( - "Unexpected success for '%s' (%s)" - % ( - name, - " and ".join( - fail._as_string(config) for fail in self.fails - ), - ) - ) - - -def requires_tag(tagname): - return tags([tagname]) - - -def tags(tagnames): - comp = compound() - comp.tags.update(tagnames) - return comp - - -def only_if(predicate, reason=None): - predicate = _as_predicate(predicate) - return skip_if(NotPredicate(predicate), reason) - - -def succeeds_if(predicate, reason=None): - predicate = _as_predicate(predicate) - return fails_if(NotPredicate(predicate), reason) - - -class Predicate(object): - @classmethod - def as_predicate(cls, predicate, description=None): - if isinstance(predicate, compound): - return cls.as_predicate(predicate.enabled_for_config, description) - elif isinstance(predicate, Predicate): - if description and predicate.description is None: - predicate.description = description - return predicate - elif isinstance(predicate, (list, set)): - return OrPredicate( - [cls.as_predicate(pred) for pred in predicate], description - ) - elif isinstance(predicate, tuple): - return SpecPredicate(*predicate) - elif isinstance(predicate, sqla_util.string_types): - tokens = re.match( - r"([\+\w]+)\s*(?:(>=|==|!=|<=|<|>)\s*([\d\.]+))?", predicate - ) - if not tokens: - raise ValueError( - "Couldn't locate DB name in predicate: %r" % predicate - ) - db = tokens.group(1) - op = tokens.group(2) - spec = ( - tuple(int(d) for d in tokens.group(3).split(".")) - if tokens.group(3) - else None - ) - - return SpecPredicate(db, op, spec, description=description) - elif callable(predicate): - return LambdaPredicate(predicate, description) - else: - assert False, "unknown predicate type: %s" % predicate - - def _format_description(self, config, negate=False): - bool_ = self(config) - if negate: - bool_ = not negate - return self.description % { - "driver": config.db.url.get_driver_name() - if config - else "", - "database": config.db.url.get_backend_name() - if config - else "", - "doesnt_support": "doesn't support" if bool_ else "does support", - "does_support": "does support" if bool_ else "doesn't support", - } - - def _as_string(self, config=None, negate=False): - raise NotImplementedError() - - -class BooleanPredicate(Predicate): - def __init__(self, value, description=None): - self.value = value - self.description = description or "boolean %s" % value - - def __call__(self, config): - return self.value - - def _as_string(self, config, negate=False): - return self._format_description(config, negate=negate) - - -class SpecPredicate(Predicate): - def __init__(self, db, op=None, spec=None, description=None): - self.db = db - self.op = op - self.spec = spec - self.description = description - - _ops = { - "<": operator.lt, - ">": operator.gt, - "==": operator.eq, - "!=": operator.ne, - "<=": operator.le, - ">=": operator.ge, - "in": operator.contains, - "between": lambda val, pair: val >= pair[0] and val <= pair[1], - } - - def __call__(self, config): - engine = config.db - - if "+" in self.db: - dialect, driver = self.db.split("+") - else: - dialect, driver = self.db, None - - if dialect and engine.name != dialect: - return False - if driver is not None and engine.driver != driver: - return False - - if self.op is not None: - assert driver is None, "DBAPI version specs not supported yet" - - version = _server_version(engine) - oper = ( - hasattr(self.op, "__call__") and self.op or self._ops[self.op] - ) - return oper(version, self.spec) - else: - return True - - def _as_string(self, config, negate=False): - if self.description is not None: - return self._format_description(config) - elif self.op is None: - if negate: - return "not %s" % self.db - else: - return "%s" % self.db - else: - if negate: - return "not %s %s %s" % (self.db, self.op, self.spec) - else: - return "%s %s %s" % (self.db, self.op, self.spec) - - -class LambdaPredicate(Predicate): - def __init__(self, lambda_, description=None, args=None, kw=None): - spec = inspect_getargspec(lambda_) - if not spec[0]: - self.lambda_ = lambda db: lambda_() - else: - self.lambda_ = lambda_ - self.args = args or () - self.kw = kw or {} - if description: - self.description = description - elif lambda_.__doc__: - self.description = lambda_.__doc__ - else: - self.description = "custom function" - - def __call__(self, config): - return self.lambda_(config) - - def _as_string(self, config, negate=False): - return self._format_description(config) - - -class NotPredicate(Predicate): - def __init__(self, predicate, description=None): - self.predicate = predicate - self.description = description - - def __call__(self, config): - return not self.predicate(config) - - def _as_string(self, config, negate=False): - if self.description: - return self._format_description(config, not negate) - else: - return self.predicate._as_string(config, not negate) - - -class OrPredicate(Predicate): - def __init__(self, predicates, description=None): - self.predicates = predicates - self.description = description - - def __call__(self, config): - for pred in self.predicates: - if pred(config): - return True - return False - - def _eval_str(self, config, negate=False): - if negate: - conjunction = " and " - else: - conjunction = " or " - return conjunction.join( - p._as_string(config, negate=negate) for p in self.predicates - ) - - def _negation_str(self, config): - if self.description is not None: - return "Not " + self._format_description(config) - else: - return self._eval_str(config, negate=True) - - def _as_string(self, config, negate=False): - if negate: - return self._negation_str(config) - else: - if self.description is not None: - return self._format_description(config) - else: - return self._eval_str(config) - - -_as_predicate = Predicate.as_predicate - - -def _is_excluded(db, op, spec): - return SpecPredicate(db, op, spec)(config._current) - - -def _server_version(engine): - """Return a server_version_info tuple.""" - - # force metadata to be retrieved - conn = engine.connect() - version = getattr(engine.dialect, "server_version_info", None) - if version is None: - version = () - conn.close() - return version - - -def db_spec(*dbs): - return OrPredicate([Predicate.as_predicate(db) for db in dbs]) - - -def open(): # noqa - return skip_if(BooleanPredicate(False, "mark as execute")) - - -def closed(): - return skip_if(BooleanPredicate(True, "marked as skip")) - - -def fails(reason=None): - return fails_if(BooleanPredicate(True, reason or "expected to fail")) - - -@decorator -def future(fn, *arg): - return fails_if(LambdaPredicate(fn), "Future feature") - - -def fails_on(db, reason=None): - return fails_if(db, reason) - - -def fails_on_everything_except(*dbs): - return succeeds_if(OrPredicate([Predicate.as_predicate(db) for db in dbs])) - - -def skip(db, reason=None): - return skip_if(db, reason) - - -def only_on(dbs, reason=None): - return only_if( - OrPredicate( - [Predicate.as_predicate(db, reason) for db in util.to_list(dbs)] - ) - ) - - -def exclude(db, op, spec, reason=None): - return skip_if(SpecPredicate(db, op, spec), reason) - - -def against(config, *queries): - assert queries, "no queries sent!" - return OrPredicate([Predicate.as_predicate(query) for query in queries])( - config - ) diff --git a/venv/lib/python3.7/site-packages/alembic/testing/fixture_functions.py b/venv/lib/python3.7/site-packages/alembic/testing/fixture_functions.py deleted file mode 100644 index 2640693..0000000 --- a/venv/lib/python3.7/site-packages/alembic/testing/fixture_functions.py +++ /dev/null @@ -1,79 +0,0 @@ -_fixture_functions = None # installed by plugin_base - - -def combinations(*comb, **kw): - r"""Deliver multiple versions of a test based on positional combinations. - - This is a facade over pytest.mark.parametrize. - - - :param \*comb: argument combinations. These are tuples that will be passed - positionally to the decorated function. - - :param argnames: optional list of argument names. These are the names - of the arguments in the test function that correspond to the entries - in each argument tuple. pytest.mark.parametrize requires this, however - the combinations function will derive it automatically if not present - by using ``inspect.getfullargspec(fn).args[1:]``. Note this assumes the - first argument is "self" which is discarded. - - :param id\_: optional id template. This is a string template that - describes how the "id" for each parameter set should be defined, if any. - The number of characters in the template should match the number of - entries in each argument tuple. Each character describes how the - corresponding entry in the argument tuple should be handled, as far as - whether or not it is included in the arguments passed to the function, as - well as if it is included in the tokens used to create the id of the - parameter set. - - If omitted, the argument combinations are passed to parametrize as is. If - passed, each argument combination is turned into a pytest.param() object, - mapping the elements of the argument tuple to produce an id based on a - character value in the same position within the string template using the - following scheme:: - - i - the given argument is a string that is part of the id only, don't - pass it as an argument - - n - the given argument should be passed and it should be added to the - id by calling the .__name__ attribute - - r - the given argument should be passed and it should be added to the - id by calling repr() - - s - the given argument should be passed and it should be added to the - id by calling str() - - a - (argument) the given argument should be passed and it should not - be used to generated the id - - e.g.:: - - @testing.combinations( - (operator.eq, "eq"), - (operator.ne, "ne"), - (operator.gt, "gt"), - (operator.lt, "lt"), - id_="na" - ) - def test_operator(self, opfunc, name): - pass - - The above combination will call ``.__name__`` on the first member of - each tuple and use that as the "id" to pytest.param(). - - - """ - return _fixture_functions.combinations(*comb, **kw) - - -def fixture(*arg, **kw): - return _fixture_functions.fixture(*arg, **kw) - - -def get_current_test_name(): - return _fixture_functions.get_current_test_name() - - -def skip_test(msg): - raise _fixture_functions.skip_test_exception(msg) diff --git a/venv/lib/python3.7/site-packages/alembic/testing/fixtures.py b/venv/lib/python3.7/site-packages/alembic/testing/fixtures.py deleted file mode 100644 index 2951455..0000000 --- a/venv/lib/python3.7/site-packages/alembic/testing/fixtures.py +++ /dev/null @@ -1,264 +0,0 @@ -# coding: utf-8 -from contextlib import contextmanager -import io -import re - -from sqlalchemy import Column -from sqlalchemy import inspect -from sqlalchemy import MetaData -from sqlalchemy import String -from sqlalchemy import Table -from sqlalchemy import text -from sqlalchemy.testing import config -from sqlalchemy.testing import mock -from sqlalchemy.testing.assertions import eq_ -from sqlalchemy.testing.fixtures import TestBase # noqa - -import alembic -from .assertions import _get_dialect -from ..environment import EnvironmentContext -from ..migration import MigrationContext -from ..operations import Operations -from ..util import compat -from ..util.compat import configparser -from ..util.compat import string_types -from ..util.compat import text_type -from ..util.sqla_compat import create_mock_engine - -testing_config = configparser.ConfigParser() -testing_config.read(["test.cfg"]) - - -def capture_db(dialect="postgresql://"): - buf = [] - - def dump(sql, *multiparams, **params): - buf.append(str(sql.compile(dialect=engine.dialect))) - - engine = create_mock_engine(dialect, dump) - return engine, buf - - -_engs = {} - - -@contextmanager -def capture_context_buffer(**kw): - if kw.pop("bytes_io", False): - buf = io.BytesIO() - else: - buf = io.StringIO() - - kw.update({"dialect_name": "sqlite", "output_buffer": buf}) - conf = EnvironmentContext.configure - - def configure(*arg, **opt): - opt.update(**kw) - return conf(*arg, **opt) - - with mock.patch.object(EnvironmentContext, "configure", configure): - yield buf - - -@contextmanager -def capture_engine_context_buffer(**kw): - from .env import _sqlite_file_db - from sqlalchemy import event - - buf = compat.StringIO() - - eng = _sqlite_file_db() - - conn = eng.connect() - - @event.listens_for(conn, "before_cursor_execute") - def bce(conn, cursor, statement, parameters, context, executemany): - buf.write(statement + "\n") - - kw.update({"connection": conn}) - conf = EnvironmentContext.configure - - def configure(*arg, **opt): - opt.update(**kw) - return conf(*arg, **opt) - - with mock.patch.object(EnvironmentContext, "configure", configure): - yield buf - - -def op_fixture( - dialect="default", - as_sql=False, - naming_convention=None, - literal_binds=False, - native_boolean=None, -): - - opts = {} - if naming_convention: - opts["target_metadata"] = MetaData(naming_convention=naming_convention) - - class buffer_(object): - def __init__(self): - self.lines = [] - - def write(self, msg): - msg = msg.strip() - msg = re.sub(r"[\n\t]", "", msg) - if as_sql: - # the impl produces soft tabs, - # so search for blocks of 4 spaces - msg = re.sub(r" ", "", msg) - msg = re.sub(r"\;\n*$", "", msg) - - self.lines.append(msg) - - def flush(self): - pass - - buf = buffer_() - - class ctx(MigrationContext): - def get_buf(self): - return buf - - def clear_assertions(self): - buf.lines[:] = [] - - def assert_(self, *sql): - # TODO: make this more flexible about - # whitespace and such - eq_(buf.lines, [re.sub(r"[\n\t]", "", s) for s in sql]) - - def assert_contains(self, sql): - for stmt in buf.lines: - if re.sub(r"[\n\t]", "", sql) in stmt: - return - else: - assert False, "Could not locate fragment %r in %r" % ( - sql, - buf.lines, - ) - - if as_sql: - opts["as_sql"] = as_sql - if literal_binds: - opts["literal_binds"] = literal_binds - if dialect == "mariadb": - ctx_dialect = _get_dialect("mysql") - ctx_dialect.server_version_info = (10, 0, 0, "MariaDB") - - else: - ctx_dialect = _get_dialect(dialect) - if native_boolean is not None: - ctx_dialect.supports_native_boolean = native_boolean - # this is new as of SQLAlchemy 1.2.7 and is used by SQL Server, - # which breaks assumptions in the alembic test suite - ctx_dialect.non_native_boolean_check_constraint = True - if not as_sql: - - def execute(stmt, *multiparam, **param): - if isinstance(stmt, string_types): - stmt = text(stmt) - assert stmt.supports_execution - sql = text_type(stmt.compile(dialect=ctx_dialect)) - - buf.write(sql) - - connection = mock.Mock(dialect=ctx_dialect, execute=execute) - else: - opts["output_buffer"] = buf - connection = None - context = ctx(ctx_dialect, connection, opts) - - alembic.op._proxy = Operations(context) - return context - - -class AlterColRoundTripFixture(object): - - # since these tests are about syntax, use more recent SQLAlchemy as some of - # the type / server default compare logic might not work on older - # SQLAlchemy versions as seems to be the case for SQLAlchemy 1.1 on Oracle - - __requires__ = ("alter_column", "sqlalchemy_12") - - def setUp(self): - self.conn = config.db.connect() - self.ctx = MigrationContext.configure(self.conn) - self.op = Operations(self.ctx) - self.metadata = MetaData() - - def _compare_type(self, t1, t2): - c1 = Column("q", t1) - c2 = Column("q", t2) - assert not self.ctx.impl.compare_type( - c1, c2 - ), "Type objects %r and %r didn't compare as equivalent" % (t1, t2) - - def _compare_server_default(self, t1, s1, t2, s2): - c1 = Column("q", t1, server_default=s1) - c2 = Column("q", t2, server_default=s2) - assert not self.ctx.impl.compare_server_default( - c1, c2, s2, s1 - ), "server defaults %r and %r didn't compare as equivalent" % (s1, s2) - - def tearDown(self): - self.metadata.drop_all(self.conn) - self.conn.close() - - def _run_alter_col(self, from_, to_, compare=None): - column = Column( - from_.get("name", "colname"), - from_.get("type", String(10)), - nullable=from_.get("nullable", True), - server_default=from_.get("server_default", None), - # comment=from_.get("comment", None) - ) - t = Table("x", self.metadata, column) - - t.create(self.conn) - insp = inspect(self.conn) - old_col = insp.get_columns("x")[0] - - # TODO: conditional comment support - self.op.alter_column( - "x", - column.name, - existing_type=column.type, - existing_server_default=column.server_default - if column.server_default is not None - else False, - existing_nullable=True if column.nullable else False, - # existing_comment=column.comment, - nullable=to_.get("nullable", None), - # modify_comment=False, - server_default=to_.get("server_default", False), - new_column_name=to_.get("name", None), - type_=to_.get("type", None), - ) - - insp = inspect(self.conn) - new_col = insp.get_columns("x")[0] - - if compare is None: - compare = to_ - - eq_( - new_col["name"], - compare["name"] if "name" in compare else column.name, - ) - self._compare_type( - new_col["type"], compare.get("type", old_col["type"]) - ) - eq_(new_col["nullable"], compare.get("nullable", column.nullable)) - self._compare_server_default( - new_col["type"], - new_col.get("default", None), - compare.get("type", old_col["type"]), - compare["server_default"].text - if "server_default" in compare - else column.server_default.arg.text - if column.server_default is not None - else None, - ) diff --git a/venv/lib/python3.7/site-packages/alembic/testing/plugin/__init__.py b/venv/lib/python3.7/site-packages/alembic/testing/plugin/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/venv/lib/python3.7/site-packages/alembic/testing/plugin/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/testing/plugin/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 92be5d2c220678c02d553340baa1b2765732f74c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmZ?b<>g`kf~V6D#DVC?AOZ#$feZ&AE@lA|DGb33nv8xc8Hzx{2;!HEeo1bDenDn| zZf0I_Nn%cpu0g(OacXf|o_=CZYHm_yGMp|+EiTE-OV=;RDNWDJ(~pnO%*!l^kJl@x Vyv1RYo1apelWGSt{WB0V007cmCw2e; diff --git a/venv/lib/python3.7/site-packages/alembic/testing/plugin/__pycache__/bootstrap.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/testing/plugin/__pycache__/bootstrap.cpython-37.pyc deleted file mode 100644 index 52879a958572933ca671cbf58007719903863717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 979 zcmYjQPjAyO6t|tEP1AOaZA^lbFFW+Gl?xX%As8B`X%ZSjA_t;0cGt9t9qe?YQ+r{2 z2RODzz6GDdSHxjoffLWkR@I8%^ZTRso_{~*q}vS;tiL~gfBxhk^v4a<;9MPNj4RX5Ku5V`Q^3N3^sx5mDzWDo zw`$O|BUL3F$W@QP{DssGsDG#ZGB5f?S{wqYWt?S)&*clv^-%QVjOT+iS!+v4DlYpq zE&Vm@aCfs?4Pq&YVtqf5t*^I0Ap8smxI=b`PdZrbfhTO#6o>5%_QP%cC5xj?PiONb zgpcd^#^bnoG8GdcuLWI?^O7FuUduG2h{+_1R0G;6`=6Oc_4;&$x2m|ZqnKumpEj-2 nuL&)bXQpSSr>E!Zp6=oO%}w9H z_n*K1^G{yaF#b)Q)#re?i=zI4iW{N9O>U)TW`&kXw4K_aty?E_&^l@B35~bXR_2DT z=5ax{Lr>Ff&>Nv|8p4@$xOdbFyP_*c!k%n~n|be3gKu#Eg~5HXb!LZ~yu-UMjIhl& z`4-v@zRi1Rw}s2E@cs+q%nWJG4&TL^U9pKZSGXPZ`Bi=md^_BJYz$sI{nxR`c_9T4 zrs?b;$=N7UA{fu|xJ-&%1!GxcL3t>GtWaejMJ)0%c>LAp_tN-KWb@!yNJWf8-@liN zY?Q=7DO9O~TtH@71ag)K1^!YlWWya4<8>kBVN?dZ$ZwW@jvbVWWRlK>;l;|#F-^`+PIb%noxN2j;??o9^o8UvM6=3Y|hTO&;y87>@du2A=n?#z)D^WyB`#C4%!ya z;;R1#krl^+f0n;{=V>H!oV#iXDGPbp8{T@D!?1oCoul$jYQd^U^eM>LKk@ZH<$(6mrEBUjI@v{Z34A zKO(v}OT|K;B-b}Z?r2R8BNdgUl)LB+Y;luHChK(=ja+4}EI&ikKXhKC&$pZQGAQltBH=Y^-a-wpMCoHrWambiQjXtTW?p zru?XMxlQyn@c#uK0LwVFWnhPE>_C(ZJ_)Q37*BBO5*9kWxf}|bq2PuJP9g+@q733x zL^)!@Y&vLHo`zhNab*=M+*vyGaOucHksnJsIIeC~9#*b+mLR57TlbU_k^t6*7}%8^ zr%L_|oSOYSel8|{gQ9d4H$D8iR?n0)9@A~0kK#BLjnW8&M#acXLIt#)8kzMR9$VTA zbAfArW~sNi^B7ou*WxXp^`Y)r6L->@%jOkyPU4*ptCV)qm+-E94}3ioAiU@)M2OaU~-75>I!RC<#i4K(#_B+1r8iZ+Jzn5dckUQ)l#>XQdfgb?AEsz zu|3HX+>?1WDpK_nG88$U0bII{yaOtx?&>2f?xLvAQLU#L!bRuv79|~Sb4T}F-D`1I z_u9IL*s6P8{Z_!MpaXB~R=r1cx_q=c)GIN9;>8!VGhGvk|H~V1QU=}GFG>VIWE^CE z!B-d0Q6e2zb|eof>*(aXPwc3pWSLtLvxRmux>`B~8P@4r=k*z0vf%&LQN9b&2&V6$ zsT`=JQ|Kv(EXW)R4a<1uoN~gNqzxEa8B2vZlmOFDS9b z_~UeV|A%yFk85|x*Y>}DVgDslvp2a3l?Sxy5?86sU}`g*$Nnm1jCdv`PF=sbbYyAv zH&1_YVgE~)><@gofn|~ukR7VSsb)A@Tx`mI^H z#b|;jf)4*W?rC84S+#zb*`)G5t{>2!&<6SegeMPDiC3o+(7uh-V)q>HP0#oGUB7qL GvHu4>yIVW} diff --git a/venv/lib/python3.7/site-packages/alembic/testing/plugin/__pycache__/pytestplugin.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/testing/plugin/__pycache__/pytestplugin.cpython-37.pyc deleted file mode 100644 index c978f06c3bbd11bd7a58b77c40766ea08d15e35d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7145 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 diff --git a/venv/lib/python3.7/site-packages/alembic/testing/plugin/bootstrap.py b/venv/lib/python3.7/site-packages/alembic/testing/plugin/bootstrap.py deleted file mode 100644 index 8200ec1..0000000 --- a/venv/lib/python3.7/site-packages/alembic/testing/plugin/bootstrap.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -Bootstrapper for test framework plugins. - -This is vendored from SQLAlchemy so that we can use local overrides -for plugin_base.py and pytestplugin.py. - -""" - - -import os -import sys - - -bootstrap_file = locals()["bootstrap_file"] -to_bootstrap = locals()["to_bootstrap"] - - -def load_file_as_module(name): - path = os.path.join(os.path.dirname(bootstrap_file), "%s.py" % name) - if sys.version_info >= (3, 3): - from importlib import machinery - - mod = machinery.SourceFileLoader(name, path).load_module() - else: - import imp - - mod = imp.load_source(name, path) - return mod - - -if to_bootstrap == "pytest": - sys.modules["sqla_plugin_base"] = load_file_as_module("plugin_base") - sys.modules["sqla_pytestplugin"] = load_file_as_module("pytestplugin") -else: - raise Exception("unknown bootstrap: %s" % to_bootstrap) # noqa diff --git a/venv/lib/python3.7/site-packages/alembic/testing/plugin/plugin_base.py b/venv/lib/python3.7/site-packages/alembic/testing/plugin/plugin_base.py deleted file mode 100644 index 2d5e95a..0000000 --- a/venv/lib/python3.7/site-packages/alembic/testing/plugin/plugin_base.py +++ /dev/null @@ -1,125 +0,0 @@ -"""vendored plugin_base functions from the most recent SQLAlchemy versions. - -Alembic tests need to run on older versions of SQLAlchemy that don't -necessarily have all the latest testing fixtures. - -""" -from __future__ import absolute_import - -import abc -import sys - -from sqlalchemy.testing.plugin.plugin_base import * # noqa -from sqlalchemy.testing.plugin.plugin_base import post -from sqlalchemy.testing.plugin.plugin_base import post_begin as sqla_post_begin -from sqlalchemy.testing.plugin.plugin_base import stop_test_class as sqla_stc - -py3k = sys.version_info >= (3, 0) - - -if py3k: - - ABC = abc.ABC -else: - - class ABC(object): - __metaclass__ = abc.ABCMeta - - -def post_begin(): - sqla_post_begin() - - import warnings - - try: - import pytest - except ImportError: - pass - else: - warnings.filterwarnings( - "once", category=pytest.PytestDeprecationWarning - ) - - from sqlalchemy import exc - - if hasattr(exc, "RemovedIn20Warning"): - warnings.filterwarnings( - "error", - category=exc.RemovedIn20Warning, - message=".*Engine.execute", - ) - warnings.filterwarnings( - "error", - category=exc.RemovedIn20Warning, - message=".*Passing a string", - ) - - -# override selected SQLAlchemy pytest hooks with vendored functionality -def stop_test_class(cls): - sqla_stc(cls) - import os - from alembic.testing.env import _get_staging_directory - - assert not os.path.exists(_get_staging_directory()), ( - "staging directory %s was not cleaned up" % _get_staging_directory() - ) - - -def want_class(name, cls): - from sqlalchemy.testing import config - from sqlalchemy.testing import fixtures - - if not issubclass(cls, fixtures.TestBase): - return False - elif name.startswith("_"): - return False - elif ( - config.options.backend_only - and not getattr(cls, "__backend__", False) - and not getattr(cls, "__sparse_backend__", False) - ): - return False - else: - return True - - -@post -def _init_symbols(options, file_config): - from sqlalchemy.testing import config - from alembic.testing import fixture_functions as alembic_config - - config._fixture_functions = ( - alembic_config._fixture_functions - ) = _fixture_fn_class() - - -class FixtureFunctions(ABC): - @abc.abstractmethod - def skip_test_exception(self, *arg, **kw): - raise NotImplementedError() - - @abc.abstractmethod - def combinations(self, *args, **kw): - raise NotImplementedError() - - @abc.abstractmethod - def param_ident(self, *args, **kw): - raise NotImplementedError() - - @abc.abstractmethod - def fixture(self, *arg, **kw): - raise NotImplementedError() - - def get_current_test_name(self): - raise NotImplementedError() - - -_fixture_fn_class = None - - -def set_fixture_functions(fixture_fn_class): - from sqlalchemy.testing.plugin import plugin_base - - global _fixture_fn_class - _fixture_fn_class = plugin_base._fixture_fn_class = fixture_fn_class diff --git a/venv/lib/python3.7/site-packages/alembic/testing/plugin/pytestplugin.py b/venv/lib/python3.7/site-packages/alembic/testing/plugin/pytestplugin.py deleted file mode 100644 index 1c8be05..0000000 --- a/venv/lib/python3.7/site-packages/alembic/testing/plugin/pytestplugin.py +++ /dev/null @@ -1,232 +0,0 @@ -"""vendored pytestplugin functions from the most recent SQLAlchemy versions. - -Alembic tests need to run on older versions of SQLAlchemy that don't -necessarily have all the latest testing fixtures. - -""" -try: - # installed by bootstrap.py - import sqla_plugin_base as plugin_base -except ImportError: - # assume we're a package, use traditional import - from . import plugin_base - -import inspect -import itertools -import operator -import os -import re -import sys - -import pytest -from sqlalchemy.testing.plugin.pytestplugin import * # noqa -from sqlalchemy.testing.plugin.pytestplugin import pytest_configure as spc - - -# override selected SQLAlchemy pytest hooks with vendored functionality -def pytest_configure(config): - spc(config) - - plugin_base.set_fixture_functions(PytestFixtureFunctions) - - -def pytest_pycollect_makeitem(collector, name, obj): - - if inspect.isclass(obj) and plugin_base.want_class(name, obj): - - # in pytest 5.4.0 - # return [ - # pytest.Class.from_parent(collector, - # name=parametrize_cls.__name__) - # for parametrize_cls in _parametrize_cls(collector.module, obj) - # ] - - return [ - pytest.Class(parametrize_cls.__name__, parent=collector) - for parametrize_cls in _parametrize_cls(collector.module, obj) - ] - elif ( - inspect.isfunction(obj) - and isinstance(collector, pytest.Instance) - and plugin_base.want_method(collector.cls, obj) - ): - # None means, fall back to default logic, which includes - # method-level parametrize - return None - else: - # empty list means skip this item - return [] - - -_current_class = None - - -def _parametrize_cls(module, cls): - """implement a class-based version of pytest parametrize.""" - - if "_sa_parametrize" not in cls.__dict__: - return [cls] - - _sa_parametrize = cls._sa_parametrize - classes = [] - for full_param_set in itertools.product( - *[params for argname, params in _sa_parametrize] - ): - cls_variables = {} - - for argname, param in zip( - [_sa_param[0] for _sa_param in _sa_parametrize], full_param_set - ): - if not argname: - raise TypeError("need argnames for class-based combinations") - argname_split = re.split(r",\s*", argname) - for arg, val in zip(argname_split, param.values): - cls_variables[arg] = val - parametrized_name = "_".join( - # token is a string, but in py2k py.test is giving us a unicode, - # so call str() on it. - str(re.sub(r"\W", "", token)) - for param in full_param_set - for token in param.id.split("-") - ) - name = "%s_%s" % (cls.__name__, parametrized_name) - newcls = type.__new__(type, name, (cls,), cls_variables) - setattr(module, name, newcls) - classes.append(newcls) - return classes - - -def getargspec(fn): - if sys.version_info.major == 3: - return inspect.getfullargspec(fn) - else: - return inspect.getargspec(fn) - - -class PytestFixtureFunctions(plugin_base.FixtureFunctions): - def skip_test_exception(self, *arg, **kw): - return pytest.skip.Exception(*arg, **kw) - - _combination_id_fns = { - "i": lambda obj: obj, - "r": repr, - "s": str, - "n": operator.attrgetter("__name__"), - } - - def combinations(self, *arg_sets, **kw): - """facade for pytest.mark.paramtrize. - - Automatically derives argument names from the callable which in our - case is always a method on a class with positional arguments. - - ids for parameter sets are derived using an optional template. - - """ - from alembic.testing import exclusions - - if sys.version_info.major == 3: - if len(arg_sets) == 1 and hasattr(arg_sets[0], "__next__"): - arg_sets = list(arg_sets[0]) - else: - if len(arg_sets) == 1 and hasattr(arg_sets[0], "next"): - arg_sets = list(arg_sets[0]) - - argnames = kw.pop("argnames", None) - - exclusion_combinations = [] - - def _filter_exclusions(args): - result = [] - gathered_exclusions = [] - for a in args: - if isinstance(a, exclusions.compound): - gathered_exclusions.append(a) - else: - result.append(a) - - exclusion_combinations.extend( - [(exclusion, result) for exclusion in gathered_exclusions] - ) - return result - - id_ = kw.pop("id_", None) - - if id_: - _combination_id_fns = self._combination_id_fns - - # because itemgetter is not consistent for one argument vs. - # multiple, make it multiple in all cases and use a slice - # to omit the first argument - _arg_getter = operator.itemgetter( - 0, - *[ - idx - for idx, char in enumerate(id_) - if char in ("n", "r", "s", "a") - ] - ) - fns = [ - (operator.itemgetter(idx), _combination_id_fns[char]) - for idx, char in enumerate(id_) - if char in _combination_id_fns - ] - arg_sets = [ - pytest.param( - *_arg_getter(_filter_exclusions(arg))[1:], - id="-".join( - comb_fn(getter(arg)) for getter, comb_fn in fns - ) - ) - for arg in [ - (arg,) if not isinstance(arg, tuple) else arg - for arg in arg_sets - ] - ] - else: - # ensure using pytest.param so that even a 1-arg paramset - # still needs to be a tuple. otherwise paramtrize tries to - # interpret a single arg differently than tuple arg - arg_sets = [ - pytest.param(*_filter_exclusions(arg)) - for arg in [ - (arg,) if not isinstance(arg, tuple) else arg - for arg in arg_sets - ] - ] - - def decorate(fn): - if inspect.isclass(fn): - if "_sa_parametrize" not in fn.__dict__: - fn._sa_parametrize = [] - fn._sa_parametrize.append((argnames, arg_sets)) - return fn - else: - if argnames is None: - _argnames = getargspec(fn).args[1:] - else: - _argnames = argnames - - if exclusion_combinations: - for exclusion, combination in exclusion_combinations: - combination_by_kw = { - argname: val - for argname, val in zip(_argnames, combination) - } - exclusion = exclusion.with_combination( - **combination_by_kw - ) - fn = exclusion(fn) - return pytest.mark.parametrize(_argnames, arg_sets)(fn) - - return decorate - - def param_ident(self, *parameters): - ident = parameters[0] - return pytest.param(*parameters[1:], id=ident) - - def fixture(self, *arg, **kw): - return pytest.fixture(*arg, **kw) - - def get_current_test_name(self): - return os.environ.get("PYTEST_CURRENT_TEST") diff --git a/venv/lib/python3.7/site-packages/alembic/testing/requirements.py b/venv/lib/python3.7/site-packages/alembic/testing/requirements.py deleted file mode 100644 index 4804646..0000000 --- a/venv/lib/python3.7/site-packages/alembic/testing/requirements.py +++ /dev/null @@ -1,159 +0,0 @@ -import sys - -from sqlalchemy.testing.requirements import Requirements - -from alembic import util -from alembic.testing import exclusions -from alembic.util import sqla_compat - - -class SuiteRequirements(Requirements): - @property - def schemas(self): - """Target database must support external schemas, and have one - named 'test_schema'.""" - - return exclusions.open() - - @property - def autocommit_isolation(self): - """target database should support 'AUTOCOMMIT' isolation level""" - - return exclusions.closed() - - @property - def unique_constraint_reflection(self): - def doesnt_have_check_uq_constraints(config): - from sqlalchemy import inspect - - # temporary - if config.db.name == "oracle": - return True - - insp = inspect(config.db) - try: - insp.get_unique_constraints("x") - except NotImplementedError: - return True - except TypeError: - return True - except Exception: - pass - return False - - return exclusions.skip_if(doesnt_have_check_uq_constraints) - - @property - def foreign_key_match(self): - return exclusions.open() - - @property - def check_constraints_w_enforcement(self): - """Target database must support check constraints - and also enforce them.""" - - return exclusions.open() - - @property - def reflects_pk_names(self): - return exclusions.closed() - - @property - def reflects_fk_options(self): - return exclusions.closed() - - @property - def sqlalchemy_issue_3740(self): - """Fixes percent sign escaping for paramstyles that don't require it""" - return exclusions.skip_if( - lambda config: not util.sqla_120, - "SQLAlchemy 1.2 or greater required", - ) - - @property - def sqlalchemy_12(self): - return exclusions.skip_if( - lambda config: not util.sqla_1216, - "SQLAlchemy 1.2.16 or greater required", - ) - - @property - def sqlalchemy_13(self): - return exclusions.skip_if( - lambda config: not util.sqla_13, - "SQLAlchemy 1.3 or greater required", - ) - - @property - def sqlalchemy_14(self): - return exclusions.skip_if( - lambda config: not util.sqla_14, - "SQLAlchemy 1.4 or greater required", - ) - - @property - def sqlalchemy_1115(self): - return exclusions.skip_if( - lambda config: not util.sqla_1115, - "SQLAlchemy 1.1.15 or greater required", - ) - - @property - def sqlalchemy_110(self): - return exclusions.skip_if( - lambda config: not util.sqla_110, - "SQLAlchemy 1.1.0 or greater required", - ) - - @property - def sqlalchemy_issue_4436(self): - def check(config): - vers = sqla_compat._vers - - if vers == (1, 3, 0, "b1"): - return True - elif vers >= (1, 2, 16): - return False - else: - return True - - return exclusions.skip_if( - check, "SQLAlchemy 1.2.16, 1.3.0b2 or greater required" - ) - - @property - def python3(self): - return exclusions.skip_if( - lambda: sys.version_info < (3,), "Python version 3.xx is required." - ) - - @property - def pep3147(self): - - return exclusions.only_if(lambda config: util.compat.has_pep3147()) - - @property - def comments(self): - return exclusions.only_if( - lambda config: sqla_compat._dialect_supports_comments( - config.db.dialect - ) - ) - - @property - def comments_api(self): - return exclusions.only_if(lambda config: util.sqla_120) - - @property - def alter_column(self): - return exclusions.open() - - @property - def computed_columns(self): - return exclusions.closed() - - @property - def computed_columns_api(self): - return exclusions.only_if( - exclusions.BooleanPredicate(sqla_compat.has_computed) - ) diff --git a/venv/lib/python3.7/site-packages/alembic/testing/util.py b/venv/lib/python3.7/site-packages/alembic/testing/util.py deleted file mode 100644 index 3e76645..0000000 --- a/venv/lib/python3.7/site-packages/alembic/testing/util.py +++ /dev/null @@ -1,97 +0,0 @@ -# testing/util.py -# Copyright (C) 2005-2019 the SQLAlchemy authors and contributors -# -# -# This module is part of SQLAlchemy and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import types - - -def flag_combinations(*combinations): - """A facade around @testing.combinations() oriented towards boolean - keyword-based arguments. - - Basically generates a nice looking identifier based on the keywords - and also sets up the argument names. - - E.g.:: - - @testing.flag_combinations( - dict(lazy=False, passive=False), - dict(lazy=True, passive=False), - dict(lazy=False, passive=True), - dict(lazy=False, passive=True, raiseload=True), - ) - - - would result in:: - - @testing.combinations( - ('', False, False, False), - ('lazy', True, False, False), - ('lazy_passive', True, True, False), - ('lazy_passive', True, True, True), - id_='iaaa', - argnames='lazy,passive,raiseload' - ) - - """ - from sqlalchemy.testing import config - - keys = set() - - for d in combinations: - keys.update(d) - - keys = sorted(keys) - - return config.combinations( - *[ - ("_".join(k for k in keys if d.get(k, False)),) - + tuple(d.get(k, False) for k in keys) - for d in combinations - ], - id_="i" + ("a" * len(keys)), - argnames=",".join(keys) - ) - - -def resolve_lambda(__fn, **kw): - """Given a no-arg lambda and a namespace, return a new lambda that - has all the values filled in. - - This is used so that we can have module-level fixtures that - refer to instance-level variables using lambdas. - - """ - - glb = dict(__fn.__globals__) - glb.update(kw) - new_fn = types.FunctionType(__fn.__code__, glb) - return new_fn() - - -def metadata_fixture(ddl="function"): - """Provide MetaData for a pytest fixture.""" - - from sqlalchemy.testing import config - from . import fixture_functions - - def decorate(fn): - def run_ddl(self): - from sqlalchemy import schema - - metadata = self.metadata = schema.MetaData() - try: - result = fn(self, metadata) - metadata.create_all(config.db) - # TODO: - # somehow get a per-function dml erase fixture here - yield result - finally: - metadata.drop_all(config.db) - - return fixture_functions.fixture(scope=ddl)(run_ddl) - - return decorate diff --git a/venv/lib/python3.7/site-packages/alembic/util/__init__.py b/venv/lib/python3.7/site-packages/alembic/util/__init__.py deleted file mode 100644 index cc86111..0000000 --- a/venv/lib/python3.7/site-packages/alembic/util/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -from .compat import raise_from_cause # noqa -from .exc import CommandError -from .langhelpers import _with_legacy_names # noqa -from .langhelpers import asbool # noqa -from .langhelpers import dedupe_tuple # noqa -from .langhelpers import Dispatcher # noqa -from .langhelpers import immutabledict # noqa -from .langhelpers import memoized_property # noqa -from .langhelpers import ModuleClsProxy # noqa -from .langhelpers import rev_id # noqa -from .langhelpers import to_list # noqa -from .langhelpers import to_tuple # noqa -from .langhelpers import unique_list # noqa -from .messaging import err # noqa -from .messaging import format_as_comma # noqa -from .messaging import msg # noqa -from .messaging import obfuscate_url_pw # noqa -from .messaging import status # noqa -from .messaging import warn # noqa -from .messaging import write_outstream # noqa -from .pyfiles import coerce_resource_to_filename # noqa -from .pyfiles import edit # noqa -from .pyfiles import load_python_file # noqa -from .pyfiles import pyc_file_from_path # noqa -from .pyfiles import template_to_file # noqa -from .sqla_compat import has_computed # noqa -from .sqla_compat import sqla_110 # noqa -from .sqla_compat import sqla_1115 # noqa -from .sqla_compat import sqla_120 # noqa -from .sqla_compat import sqla_1216 # noqa -from .sqla_compat import sqla_13 # noqa -from .sqla_compat import sqla_14 # noqa - - -if not sqla_110: - raise CommandError("SQLAlchemy 1.1.0 or greater is required. ") diff --git a/venv/lib/python3.7/site-packages/alembic/util/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/util/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index bdd7dd211758576d2dd5db5f8e5c5a0be6846ff2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1354 zcmbu<%WmXE6b4{BPTcov?&(~d%OGVjNqS&dAcSBBc7Pbo?kp%(?CS24s$5Q0nM}_T z_6V`z8F&kLjcgGMUV#iRmx6xhb26xas=mmGtedq`G&;u9*_tj93U=%z+k6|1 zhU4G^^a-2>iu-&a=<1%-y7v59i9+Tc3nMMGk#9x8Dr+iX{Su4)uS`)Z@lv^Ota(F~)Qazz zEKm(^n39gJZ6Y6U)2T~&Q;Wx@L|D4rU}mi5o^i)=8U~gU?dG@}n(JBZa_$AItzy+J z)>7xWuW2}|x7?PvAKY4rXPDYMZw1#_n&d{FvEs#GBkEDCj6&&KE-AS~pOg%6G6 zb6L*qfQmzk5yhBdonnJx69XF6k|x;MEh=qO>`?4d>|sDB4ECYF6Dsdh98erm98qKx z#~8mx_KZyN_eYmrSC^Hnp2`x}U#X{8=D8DYR$g)?^tH_Y-Pc~KOU7g=J!2Qu@~-)@ U4iD-l^!~UP7~S}PeUdc(2PMT?7XSbN diff --git a/venv/lib/python3.7/site-packages/alembic/util/__pycache__/compat.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/util/__pycache__/compat.cpython-37.pyc deleted file mode 100644 index 569487d79c40046d5ab8f3dd601734cdcea90532..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9303 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 diff --git a/venv/lib/python3.7/site-packages/alembic/util/__pycache__/pyfiles.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/util/__pycache__/pyfiles.cpython-37.pyc deleted file mode 100644 index f10fa89f28f661c5a9f204d2a9d2a4018d653e27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2746 zcmZ8jOOG4J5$^7JaQIj*wUQMivV+M(ai~bUvSlSm90Y-0fe=A{m6&xN-t|o zgD9}F54jz+t=xj#i8@veAa|p#mD`YeQP0YqY-ie!`jES__g5C}${pE9JCM6_fcBES zB=^wn$;?MRtXGS^z= zW^}kPDk-EImGkj9JyoR9J&w!KOwI1R@zyWU?PoC~Ch!r}m}F zlu^qE8%#rhD3wn0qi`HUO}-tLN`=?Ua9rpx4$T_-TZK*mx00dJaiR|6`87YE&v^lkQ z=^C26ympJ3%7^V}XEQmn+qzPfrrs^)W;Ta9or=rU;^akb&nCyI{bo9Hax<>IF>PA& z@xPgV6+3_Z%L6l=9n8|%tu!x9oMpFe7k5ilj`M>!Q`5sV*|u|&W(Ttcom}qE7WH6j zj47-=18i8*u8eoM;8(fN2i)a75r_f$g7=*s*Wbr{Lf%Xt-QGpHk5b-7W!Qu~iCysW zrsNen@%2seq0CwFicj2%oqLjB@Xy!^UI^CR<(H4ajh<;`z!_ObR}AAaRH->uM5Hx& zQNrFZE0UOkDQnmLAg zF2khAO`Kv1QdZRm0@R0-!oi?k|U`KOO`lOhR*WM z-=!ZbqG7f$$DpdA(h_yEL05rG6~c9sHOOm(yP9sKDbLmIlw#Cm>0#}X!`GLRI5}3M zu`Z^gX3N^a8Xc0#4@kvVr)g=*IJ zYW85ErLsAd*1ZL-lDK4^kB|yPA3@dOJ?^>#)F?tz_-r|H(4o{}IeG%Ya==!6(XaS9 z0;@@&`E8dOanjL`I9mzMmV3sLP9?^?Nxy`!6f5x;@c~0BMs3k{mp3+Oe+y_-f;IsTod(P| zaFH62B`-my-^9c_D5d>V-~VujQR5c&p*Sl&(T@IE&?xb!&2hCSkqXxOelU?=QuN&uczfI&kZ! z%kSQg^VbbFKwes}vzq~8fd>(OW$R+tt%X*#Q_c^+;mGc!NOOG?!04Y*)uM{Ls_s6v zQDGU>1miG>T$$>T#$PWMwb%bIQrXaSmlO|3(Qjs=fLxmH@Dg$L!2TO)Le~0x1hvM~ zoxbHTfPdo&;Q{Z99_kL)Z)45yN@MxY=`4DAB6k{}6wQ0OL*oACeX_4~?I*<)7TDly z0^Z(_Zev4VQ;b<}vrm*wdG_|!iR_u*Fy4l&O{BrEn>+r7(sfC%8`&Db)*hA3&k0@$ Jc7tm{_kUJ@$glta diff --git a/venv/lib/python3.7/site-packages/alembic/util/__pycache__/sqla_compat.cpython-37.pyc b/venv/lib/python3.7/site-packages/alembic/util/__pycache__/sqla_compat.cpython-37.pyc deleted file mode 100644 index f7884ac295bb1191cf804032da1fc2f4c3a99e03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8474 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 (2, 7) -py2k = sys.version_info.major < 3 -py3k = sys.version_info.major >= 3 -py35 = sys.version_info >= (3, 5) -py36 = sys.version_info >= (3, 6) - - -ArgSpec = collections.namedtuple( - "ArgSpec", ["args", "varargs", "keywords", "defaults"] -) - - -def inspect_getargspec(func): - """getargspec based on fully vendored getfullargspec from Python 3.3.""" - - if inspect.ismethod(func): - func = func.__func__ - if not inspect.isfunction(func): - raise TypeError("{!r} is not a Python function".format(func)) - - co = func.__code__ - if not inspect.iscode(co): - raise TypeError("{!r} is not a code object".format(co)) - - nargs = co.co_argcount - names = co.co_varnames - nkwargs = co.co_kwonlyargcount if py3k else 0 - args = list(names[:nargs]) - - nargs += nkwargs - varargs = None - if co.co_flags & inspect.CO_VARARGS: - varargs = co.co_varnames[nargs] - nargs = nargs + 1 - varkw = None - if co.co_flags & inspect.CO_VARKEYWORDS: - varkw = co.co_varnames[nargs] - - return ArgSpec(args, varargs, varkw, func.__defaults__) - - -if py3k: - from io import StringIO -else: - # accepts strings - from StringIO import StringIO # noqa - -if py3k: - import builtins as compat_builtins - - string_types = (str,) - binary_type = bytes - text_type = str - - def callable(fn): # noqa - return hasattr(fn, "__call__") - - def u(s): - return s - - def ue(s): - return s - - range = range # noqa -else: - import __builtin__ as compat_builtins - - string_types = (basestring,) # noqa - binary_type = str - text_type = unicode # noqa - callable = callable # noqa - - def u(s): - return unicode(s, "utf-8") # noqa - - def ue(s): - return unicode(s, "unicode_escape") # noqa - - range = xrange # noqa - -if py3k: - import collections.abc as collections_abc -else: - import collections as collections_abc # noqa - -if py35: - - def _formatannotation(annotation, base_module=None): - """vendored from python 3.7 - """ - - if getattr(annotation, "__module__", None) == "typing": - return repr(annotation).replace("typing.", "") - if isinstance(annotation, type): - if annotation.__module__ in ("builtins", base_module): - return annotation.__qualname__ - return annotation.__module__ + "." + annotation.__qualname__ - return repr(annotation) - - def inspect_formatargspec( - args, - varargs=None, - varkw=None, - defaults=None, - kwonlyargs=(), - kwonlydefaults={}, - annotations={}, - formatarg=str, - formatvarargs=lambda name: "*" + name, - formatvarkw=lambda name: "**" + name, - formatvalue=lambda value: "=" + repr(value), - formatreturns=lambda text: " -> " + text, - formatannotation=_formatannotation, - ): - """Copy formatargspec from python 3.7 standard library. - - Python 3 has deprecated formatargspec and requested that Signature - be used instead, however this requires a full reimplementation - of formatargspec() in terms of creating Parameter objects and such. - Instead of introducing all the object-creation overhead and having - to reinvent from scratch, just copy their compatibility routine. - - """ - - def formatargandannotation(arg): - result = formatarg(arg) - if arg in annotations: - result += ": " + formatannotation(annotations[arg]) - return result - - specs = [] - if defaults: - firstdefault = len(args) - len(defaults) - for i, arg in enumerate(args): - spec = formatargandannotation(arg) - if defaults and i >= firstdefault: - spec = spec + formatvalue(defaults[i - firstdefault]) - specs.append(spec) - if varargs is not None: - specs.append(formatvarargs(formatargandannotation(varargs))) - else: - if kwonlyargs: - specs.append("*") - if kwonlyargs: - for kwonlyarg in kwonlyargs: - spec = formatargandannotation(kwonlyarg) - if kwonlydefaults and kwonlyarg in kwonlydefaults: - spec += formatvalue(kwonlydefaults[kwonlyarg]) - specs.append(spec) - if varkw is not None: - specs.append(formatvarkw(formatargandannotation(varkw))) - result = "(" + ", ".join(specs) + ")" - if "return" in annotations: - result += formatreturns(formatannotation(annotations["return"])) - return result - - -else: - from inspect import formatargspec as inspect_formatargspec # noqa - - -if py3k: - from configparser import ConfigParser as SafeConfigParser - import configparser -else: - from ConfigParser import SafeConfigParser # noqa - import ConfigParser as configparser # noqa - -if py2k: - from mako.util import parse_encoding - -if py35: - import importlib.util - import importlib.machinery - - def load_module_py(module_id, path): - spec = importlib.util.spec_from_file_location(module_id, path) - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) - return module - - def load_module_pyc(module_id, path): - spec = importlib.util.spec_from_file_location(module_id, path) - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) - return module - - -elif py3k: - import importlib.machinery - - def load_module_py(module_id, path): - module = importlib.machinery.SourceFileLoader( - module_id, path - ).load_module(module_id) - del sys.modules[module_id] - return module - - def load_module_pyc(module_id, path): - module = importlib.machinery.SourcelessFileLoader( - module_id, path - ).load_module(module_id) - del sys.modules[module_id] - return module - - -if py3k: - - def get_bytecode_suffixes(): - try: - return importlib.machinery.BYTECODE_SUFFIXES - except AttributeError: - return importlib.machinery.DEBUG_BYTECODE_SUFFIXES - - def get_current_bytecode_suffixes(): - if py35: - suffixes = importlib.machinery.BYTECODE_SUFFIXES - else: - if sys.flags.optimize: - suffixes = importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES - else: - suffixes = importlib.machinery.BYTECODE_SUFFIXES - - return suffixes - - def has_pep3147(): - - if py35: - return True - else: - # TODO: not sure if we are supporting old versions of Python - # the import here emits a deprecation warning which the test - # suite only catches if imp wasn't imported alreadt - # http://www.python.org/dev/peps/pep-3147/#detecting-pep-3147-availability - import imp - - return hasattr(imp, "get_tag") - - -else: - import imp - - def load_module_py(module_id, path): # noqa - with open(path, "rb") as fp: - mod = imp.load_source(module_id, path, fp) - if py2k: - source_encoding = parse_encoding(fp) - if source_encoding: - mod._alembic_source_encoding = source_encoding - del sys.modules[module_id] - return mod - - def load_module_pyc(module_id, path): # noqa - with open(path, "rb") as fp: - mod = imp.load_compiled(module_id, path, fp) - # no source encoding here - del sys.modules[module_id] - return mod - - def get_current_bytecode_suffixes(): - if sys.flags.optimize: - return [".pyo"] # e.g. .pyo - else: - return [".pyc"] # e.g. .pyc - - def has_pep3147(): - return False - - -try: - exec_ = getattr(compat_builtins, "exec") -except AttributeError: - # Python 2 - def exec_(func_text, globals_, lcl): - exec("exec func_text in globals_, lcl") - - -################################################ -# cross-compatible metaclass implementation -# Copyright (c) 2010-2012 Benjamin Peterson - - -def with_metaclass(meta, base=object): - """Create a base class with a metaclass.""" - return meta("%sBase" % meta.__name__, (base,), {}) - - -################################################ - -if py3k: - - def reraise(tp, value, tb=None, cause=None): - if cause is not None: - value.__cause__ = cause - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - def raise_from_cause(exception, exc_info=None): - if exc_info is None: - exc_info = sys.exc_info() - exc_type, exc_value, exc_tb = exc_info - reraise(type(exception), exception, tb=exc_tb, cause=exc_value) - - -else: - exec( - "def reraise(tp, value, tb=None, cause=None):\n" - " raise tp, value, tb\n" - ) - - def raise_from_cause(exception, exc_info=None): - # not as nice as that of Py3K, but at least preserves - # the code line where the issue occurred - if exc_info is None: - exc_info = sys.exc_info() - exc_type, exc_value, exc_tb = exc_info - reraise(type(exception), exception, tb=exc_tb) - - -# produce a wrapper that allows encoded text to stream -# into a given buffer, but doesn't close it. -# not sure of a more idiomatic approach to this. -class EncodedIO(io.TextIOWrapper): - def close(self): - pass - - -if py2k: - # in Py2K, the io.* package is awkward because it does not - # easily wrap the file type (e.g. sys.stdout) and I can't - # figure out at all how to wrap StringIO.StringIO - # and also might be user specified too. So create a full - # adapter. - - class ActLikePy3kIO(object): - - """Produce an object capable of wrapping either - sys.stdout (e.g. file) *or* StringIO.StringIO(). - - """ - - def _false(self): - return False - - def _true(self): - return True - - readable = seekable = _false - writable = _true - closed = False - - def __init__(self, file_): - self.file_ = file_ - - def write(self, text): - return self.file_.write(text) - - def flush(self): - return self.file_.flush() - - class EncodedIO(EncodedIO): - def __init__(self, file_, encoding): - super(EncodedIO, self).__init__( - ActLikePy3kIO(file_), encoding=encoding - ) diff --git a/venv/lib/python3.7/site-packages/alembic/util/exc.py b/venv/lib/python3.7/site-packages/alembic/util/exc.py deleted file mode 100644 index f7ad021..0000000 --- a/venv/lib/python3.7/site-packages/alembic/util/exc.py +++ /dev/null @@ -1,2 +0,0 @@ -class CommandError(Exception): - pass diff --git a/venv/lib/python3.7/site-packages/alembic/util/langhelpers.py b/venv/lib/python3.7/site-packages/alembic/util/langhelpers.py deleted file mode 100644 index bb9c8f5..0000000 --- a/venv/lib/python3.7/site-packages/alembic/util/langhelpers.py +++ /dev/null @@ -1,320 +0,0 @@ -import collections -import textwrap -import uuid -import warnings - -from .compat import callable -from .compat import collections_abc -from .compat import exec_ -from .compat import inspect_getargspec -from .compat import string_types -from .compat import with_metaclass - - -class _ModuleClsMeta(type): - def __setattr__(cls, key, value): - super(_ModuleClsMeta, cls).__setattr__(key, value) - cls._update_module_proxies(key) - - -class ModuleClsProxy(with_metaclass(_ModuleClsMeta)): - """Create module level proxy functions for the - methods on a given class. - - The functions will have a compatible signature - as the methods. - - """ - - _setups = collections.defaultdict(lambda: (set(), [])) - - @classmethod - def _update_module_proxies(cls, name): - attr_names, modules = cls._setups[cls] - for globals_, locals_ in modules: - cls._add_proxied_attribute(name, globals_, locals_, attr_names) - - def _install_proxy(self): - attr_names, modules = self._setups[self.__class__] - for globals_, locals_ in modules: - globals_["_proxy"] = self - for attr_name in attr_names: - globals_[attr_name] = getattr(self, attr_name) - - def _remove_proxy(self): - attr_names, modules = self._setups[self.__class__] - for globals_, locals_ in modules: - globals_["_proxy"] = None - for attr_name in attr_names: - del globals_[attr_name] - - @classmethod - def create_module_class_proxy(cls, globals_, locals_): - attr_names, modules = cls._setups[cls] - modules.append((globals_, locals_)) - cls._setup_proxy(globals_, locals_, attr_names) - - @classmethod - def _setup_proxy(cls, globals_, locals_, attr_names): - for methname in dir(cls): - cls._add_proxied_attribute(methname, globals_, locals_, attr_names) - - @classmethod - def _add_proxied_attribute(cls, methname, globals_, locals_, attr_names): - if not methname.startswith("_"): - meth = getattr(cls, methname) - if callable(meth): - locals_[methname] = cls._create_method_proxy( - methname, globals_, locals_ - ) - else: - attr_names.add(methname) - - @classmethod - def _create_method_proxy(cls, name, globals_, locals_): - fn = getattr(cls, name) - - def _name_error(name): - raise NameError( - "Can't invoke function '%s', as the proxy object has " - "not yet been " - "established for the Alembic '%s' class. " - "Try placing this code inside a callable." - % (name, cls.__name__) - ) - - globals_["_name_error"] = _name_error - - translations = getattr(fn, "_legacy_translations", []) - if translations: - spec = inspect_getargspec(fn) - if spec[0] and spec[0][0] == "self": - spec[0].pop(0) - - outer_args = inner_args = "*args, **kw" - translate_str = "args, kw = _translate(%r, %r, %r, args, kw)" % ( - fn.__name__, - tuple(spec), - translations, - ) - - def translate(fn_name, spec, translations, args, kw): - return_kw = {} - return_args = [] - - for oldname, newname in translations: - if oldname in kw: - warnings.warn( - "Argument %r is now named %r " - "for method %s()." % (oldname, newname, fn_name) - ) - return_kw[newname] = kw.pop(oldname) - return_kw.update(kw) - - args = list(args) - if spec[3]: - pos_only = spec[0][: -len(spec[3])] - else: - pos_only = spec[0] - for arg in pos_only: - if arg not in return_kw: - try: - return_args.append(args.pop(0)) - except IndexError: - raise TypeError( - "missing required positional argument: %s" - % arg - ) - return_args.extend(args) - - return return_args, return_kw - - globals_["_translate"] = translate - else: - outer_args = "*args, **kw" - inner_args = "*args, **kw" - translate_str = "" - - func_text = textwrap.dedent( - """\ - def %(name)s(%(args)s): - %(doc)r - %(translate)s - try: - p = _proxy - except NameError: - _name_error('%(name)s') - return _proxy.%(name)s(%(apply_kw)s) - e - """ - % { - "name": name, - "translate": translate_str, - "args": outer_args, - "apply_kw": inner_args, - "doc": fn.__doc__, - } - ) - lcl = {} - exec_(func_text, globals_, lcl) - return lcl[name] - - -def _with_legacy_names(translations): - def decorate(fn): - fn._legacy_translations = translations - return fn - - return decorate - - -def asbool(value): - return value is not None and value.lower() == "true" - - -def rev_id(): - return uuid.uuid4().hex[-12:] - - -def to_list(x, default=None): - if x is None: - return default - elif isinstance(x, string_types): - return [x] - elif isinstance(x, collections_abc.Iterable): - return list(x) - else: - return [x] - - -def to_tuple(x, default=None): - if x is None: - return default - elif isinstance(x, string_types): - return (x,) - elif isinstance(x, collections_abc.Iterable): - return tuple(x) - else: - return (x,) - - -def unique_list(seq, hashfunc=None): - seen = set() - seen_add = seen.add - if not hashfunc: - return [x for x in seq if x not in seen and not seen_add(x)] - else: - return [ - x - for x in seq - if hashfunc(x) not in seen and not seen_add(hashfunc(x)) - ] - - -def dedupe_tuple(tup): - return tuple(unique_list(tup)) - - -class memoized_property(object): - - """A read-only @property that is only evaluated once.""" - - def __init__(self, fget, doc=None): - self.fget = fget - self.__doc__ = doc or fget.__doc__ - self.__name__ = fget.__name__ - - def __get__(self, obj, cls): - if obj is None: - return self - obj.__dict__[self.__name__] = result = self.fget(obj) - return result - - -class immutabledict(dict): - def _immutable(self, *arg, **kw): - raise TypeError("%s object is immutable" % self.__class__.__name__) - - __delitem__ = ( - __setitem__ - ) = __setattr__ = clear = pop = popitem = setdefault = update = _immutable - - def __new__(cls, *args): - new = dict.__new__(cls) - dict.__init__(new, *args) - return new - - def __init__(self, *args): - pass - - def __reduce__(self): - return immutabledict, (dict(self),) - - def union(self, d): - if not self: - return immutabledict(d) - else: - d2 = immutabledict(self) - dict.update(d2, d) - return d2 - - def __repr__(self): - return "immutabledict(%s)" % dict.__repr__(self) - - -class Dispatcher(object): - def __init__(self, uselist=False): - self._registry = {} - self.uselist = uselist - - def dispatch_for(self, target, qualifier="default"): - def decorate(fn): - if self.uselist: - self._registry.setdefault((target, qualifier), []).append(fn) - else: - assert (target, qualifier) not in self._registry - self._registry[(target, qualifier)] = fn - return fn - - return decorate - - def dispatch(self, obj, qualifier="default"): - - if isinstance(obj, string_types): - targets = [obj] - elif isinstance(obj, type): - targets = obj.__mro__ - else: - targets = type(obj).__mro__ - - for spcls in targets: - if qualifier != "default" and (spcls, qualifier) in self._registry: - return self._fn_or_list(self._registry[(spcls, qualifier)]) - elif (spcls, "default") in self._registry: - return self._fn_or_list(self._registry[(spcls, "default")]) - else: - raise ValueError("no dispatch function for object: %s" % obj) - - def _fn_or_list(self, fn_or_list): - if self.uselist: - - def go(*arg, **kw): - for fn in fn_or_list: - fn(*arg, **kw) - - return go - else: - return fn_or_list - - def branch(self): - """Return a copy of this dispatcher that is independently - writable.""" - - d = Dispatcher() - if self.uselist: - d._registry.update( - (k, [fn for fn in self._registry[k]]) for k in self._registry - ) - else: - d._registry.update(self._registry) - return d diff --git a/venv/lib/python3.7/site-packages/alembic/util/messaging.py b/venv/lib/python3.7/site-packages/alembic/util/messaging.py deleted file mode 100644 index 65b92c8..0000000 --- a/venv/lib/python3.7/site-packages/alembic/util/messaging.py +++ /dev/null @@ -1,101 +0,0 @@ -import logging -import sys -import textwrap -import warnings - -from sqlalchemy.engine import url - -from .compat import binary_type -from .compat import collections_abc -from .compat import py27 -from .compat import string_types - -log = logging.getLogger(__name__) - -if py27: - # disable "no handler found" errors - logging.getLogger("alembic").addHandler(logging.NullHandler()) - - -try: - import fcntl - import termios - import struct - - ioctl = fcntl.ioctl(0, termios.TIOCGWINSZ, struct.pack("HHHH", 0, 0, 0, 0)) - _h, TERMWIDTH, _hp, _wp = struct.unpack("HHHH", ioctl) - if TERMWIDTH <= 0: # can occur if running in emacs pseudo-tty - TERMWIDTH = None -except (ImportError, IOError): - TERMWIDTH = None - - -def write_outstream(stream, *text): - encoding = getattr(stream, "encoding", "ascii") or "ascii" - for t in text: - if not isinstance(t, binary_type): - t = t.encode(encoding, "replace") - t = t.decode(encoding) - try: - stream.write(t) - except IOError: - # suppress "broken pipe" errors. - # no known way to handle this on Python 3 however - # as the exception is "ignored" (noisily) in TextIOWrapper. - break - - -def status(_statmsg, fn, *arg, **kw): - newline = kw.pop("newline", False) - msg(_statmsg + " ...", newline, True) - try: - ret = fn(*arg, **kw) - write_outstream(sys.stdout, " done\n") - return ret - except: - write_outstream(sys.stdout, " FAILED\n") - raise - - -def err(message): - log.error(message) - msg("FAILED: %s" % message) - sys.exit(-1) - - -def obfuscate_url_pw(u): - u = url.make_url(u) - if u.password: - u.password = "XXXXX" - return str(u) - - -def warn(msg, stacklevel=2): - warnings.warn(msg, UserWarning, stacklevel=stacklevel) - - -def msg(msg, newline=True, flush=False): - if TERMWIDTH is None: - write_outstream(sys.stdout, msg) - if newline: - write_outstream(sys.stdout, "\n") - else: - # left indent output lines - lines = textwrap.wrap(msg, TERMWIDTH) - if len(lines) > 1: - for line in lines[0:-1]: - write_outstream(sys.stdout, " ", line, "\n") - write_outstream(sys.stdout, " ", lines[-1], ("\n" if newline else "")) - if flush: - sys.stdout.flush() - - -def format_as_comma(value): - if value is None: - return "" - elif isinstance(value, string_types): - return value - elif isinstance(value, collections_abc.Iterable): - return ", ".join(value) - else: - raise ValueError("Don't know how to comma-format %r" % value) diff --git a/venv/lib/python3.7/site-packages/alembic/util/pyfiles.py b/venv/lib/python3.7/site-packages/alembic/util/pyfiles.py deleted file mode 100644 index 013b147..0000000 --- a/venv/lib/python3.7/site-packages/alembic/util/pyfiles.py +++ /dev/null @@ -1,107 +0,0 @@ -import os -import re -import tempfile - -from mako import exceptions -from mako.template import Template - -from .compat import get_current_bytecode_suffixes -from .compat import has_pep3147 -from .compat import load_module_py -from .compat import load_module_pyc -from .compat import py35 -from .exc import CommandError - - -def template_to_file(template_file, dest, output_encoding, **kw): - template = Template(filename=template_file) - try: - output = template.render_unicode(**kw).encode(output_encoding) - except: - with tempfile.NamedTemporaryFile(suffix=".txt", delete=False) as ntf: - ntf.write( - exceptions.text_error_template() - .render_unicode() - .encode(output_encoding) - ) - fname = ntf.name - raise CommandError( - "Template rendering failed; see %s for a " - "template-oriented traceback." % fname - ) - else: - with open(dest, "wb") as f: - f.write(output) - - -def coerce_resource_to_filename(fname): - """Interpret a filename as either a filesystem location or as a package - resource. - - Names that are non absolute paths and contain a colon - are interpreted as resources and coerced to a file location. - - """ - if not os.path.isabs(fname) and ":" in fname: - import pkg_resources - - fname = pkg_resources.resource_filename(*fname.split(":")) - return fname - - -def pyc_file_from_path(path): - """Given a python source path, locate the .pyc. - - """ - - if has_pep3147(): - if py35: - import importlib - - candidate = importlib.util.cache_from_source(path) - else: - import imp - - candidate = imp.cache_from_source(path) - if os.path.exists(candidate): - return candidate - - # even for pep3147, fall back to the old way of finding .pyc files, - # to support sourceless operation - filepath, ext = os.path.splitext(path) - for ext in get_current_bytecode_suffixes(): - if os.path.exists(filepath + ext): - return filepath + ext - else: - return None - - -def edit(path): - """Given a source path, run the EDITOR for it""" - - import editor - - try: - editor.edit(path) - except Exception as exc: - raise CommandError("Error executing editor (%s)" % (exc,)) - - -def load_python_file(dir_, filename): - """Load a file from the given path as a Python module.""" - - module_id = re.sub(r"\W", "_", filename) - path = os.path.join(dir_, filename) - _, ext = os.path.splitext(filename) - if ext == ".py": - if os.path.exists(path): - module = load_module_py(module_id, path) - else: - pyc_path = pyc_file_from_path(path) - if pyc_path is None: - raise ImportError("Can't find Python file %s" % path) - else: - module = load_module_pyc(module_id, pyc_path) - elif ext in (".pyc", ".pyo"): - module = load_module_pyc(module_id, path) - return module diff --git a/venv/lib/python3.7/site-packages/alembic/util/sqla_compat.py b/venv/lib/python3.7/site-packages/alembic/util/sqla_compat.py deleted file mode 100644 index d303033..0000000 --- a/venv/lib/python3.7/site-packages/alembic/util/sqla_compat.py +++ /dev/null @@ -1,305 +0,0 @@ -import re - -from sqlalchemy import __version__ -from sqlalchemy import inspect -from sqlalchemy import schema -from sqlalchemy import sql -from sqlalchemy import types as sqltypes -from sqlalchemy.ext.compiler import compiles -from sqlalchemy.schema import CheckConstraint -from sqlalchemy.schema import Column -from sqlalchemy.schema import ForeignKeyConstraint -from sqlalchemy.sql.elements import quoted_name -from sqlalchemy.sql.expression import _BindParamClause -from sqlalchemy.sql.expression import _TextClause as TextClause -from sqlalchemy.sql.visitors import traverse - -from . import compat - - -def _safe_int(value): - try: - return int(value) - except: - return value - - -_vers = tuple( - [_safe_int(x) for x in re.findall(r"(\d+|[abc]\d)", __version__)] -) -sqla_110 = _vers >= (1, 1, 0) -sqla_1115 = _vers >= (1, 1, 15) -sqla_120 = _vers >= (1, 2, 0) -sqla_1216 = _vers >= (1, 2, 16) -sqla_13 = _vers >= (1, 3) -sqla_14 = _vers >= (1, 4) -try: - from sqlalchemy import Computed # noqa - - has_computed = True - - has_computed_reflection = _vers >= (1, 3, 16) -except ImportError: - has_computed = False - has_computed_reflection = False - -AUTOINCREMENT_DEFAULT = "auto" - - -def _connectable_has_table(connectable, tablename, schemaname): - if sqla_14: - return inspect(connectable).has_table(tablename, schemaname) - else: - return connectable.dialect.has_table( - connectable, tablename, schemaname - ) - - -def _exec_on_inspector(inspector, statement, **params): - if sqla_14: - with inspector._operation_context() as conn: - return conn.execute(statement, params) - else: - return inspector.bind.execute(statement, params) - - -def _server_default_is_computed(column): - if not has_computed: - return False - else: - return isinstance(column.computed, Computed) - - -def _table_for_constraint(constraint): - if isinstance(constraint, ForeignKeyConstraint): - return constraint.parent - else: - return constraint.table - - -def _columns_for_constraint(constraint): - if isinstance(constraint, ForeignKeyConstraint): - return [fk.parent for fk in constraint.elements] - elif isinstance(constraint, CheckConstraint): - return _find_columns(constraint.sqltext) - else: - return list(constraint.columns) - - -def _fk_spec(constraint): - source_columns = [ - constraint.columns[key].name for key in constraint.column_keys - ] - - source_table = constraint.parent.name - source_schema = constraint.parent.schema - target_schema = constraint.elements[0].column.table.schema - target_table = constraint.elements[0].column.table.name - target_columns = [element.column.name for element in constraint.elements] - ondelete = constraint.ondelete - onupdate = constraint.onupdate - deferrable = constraint.deferrable - initially = constraint.initially - return ( - source_schema, - source_table, - source_columns, - target_schema, - target_table, - target_columns, - onupdate, - ondelete, - deferrable, - initially, - ) - - -def _fk_is_self_referential(constraint): - spec = constraint.elements[0]._get_colspec() - tokens = spec.split(".") - tokens.pop(-1) # colname - tablekey = ".".join(tokens) - return tablekey == constraint.parent.key - - -def _is_type_bound(constraint): - # this deals with SQLAlchemy #3260, don't copy CHECK constraints - # that will be generated by the type. - # new feature added for #3260 - return constraint._type_bound - - -def _find_columns(clause): - """locate Column objects within the given expression.""" - - cols = set() - traverse(clause, {}, {"column": cols.add}) - return cols - - -def _remove_column_from_collection(collection, column): - """remove a column from a ColumnCollection.""" - - # workaround for older SQLAlchemy, remove the - # same object that's present - to_remove = collection[column.key] - collection.remove(to_remove) - - -def _textual_index_column(table, text_): - """a workaround for the Index construct's severe lack of flexibility""" - if isinstance(text_, compat.string_types): - c = Column(text_, sqltypes.NULLTYPE) - table.append_column(c) - return c - elif isinstance(text_, TextClause): - return _textual_index_element(table, text_) - else: - raise ValueError("String or text() construct expected") - - -class _textual_index_element(sql.ColumnElement): - """Wrap around a sqlalchemy text() construct in such a way that - we appear like a column-oriented SQL expression to an Index - construct. - - The issue here is that currently the Postgresql dialect, the biggest - recipient of functional indexes, keys all the index expressions to - the corresponding column expressions when rendering CREATE INDEX, - so the Index we create here needs to have a .columns collection that - is the same length as the .expressions collection. Ultimately - SQLAlchemy should support text() expressions in indexes. - - See SQLAlchemy issue 3174. - - """ - - __visit_name__ = "_textual_idx_element" - - def __init__(self, table, text): - self.table = table - self.text = text - self.key = text.text - self.fake_column = schema.Column(self.text.text, sqltypes.NULLTYPE) - table.append_column(self.fake_column) - - def get_children(self): - return [self.fake_column] - - -@compiles(_textual_index_element) -def _render_textual_index_column(element, compiler, **kw): - return compiler.process(element.text, **kw) - - -class _literal_bindparam(_BindParamClause): - pass - - -@compiles(_literal_bindparam) -def _render_literal_bindparam(element, compiler, **kw): - return compiler.render_literal_bindparam(element, **kw) - - -def _get_index_expressions(idx): - return list(idx.expressions) - - -def _get_index_column_names(idx): - return [getattr(exp, "name", None) for exp in _get_index_expressions(idx)] - - -def _column_kwargs(col): - if sqla_13: - return col.kwargs - else: - return {} - - -def _get_constraint_final_name(constraint, dialect): - if constraint.name is None: - return None - elif sqla_14: - # for SQLAlchemy 1.4 we would like to have the option to expand - # the use of "deferred" names for constraints as well as to have - # some flexibility with "None" name and similar; make use of new - # SQLAlchemy API to return what would be the final compiled form of - # the name for this dialect. - return dialect.identifier_preparer.format_constraint( - constraint, _alembic_quote=False - ) - else: - - # prior to SQLAlchemy 1.4, work around quoting logic to get at the - # final compiled name without quotes. - if hasattr(constraint.name, "quote"): - # might be quoted_name, might be truncated_name, keep it the - # same - quoted_name_cls = type(constraint.name) - else: - quoted_name_cls = quoted_name - - new_name = quoted_name_cls(str(constraint.name), quote=False) - constraint = constraint.__class__(name=new_name) - - if isinstance(constraint, schema.Index): - # name should not be quoted. - return dialect.ddl_compiler(dialect, None)._prepared_index_name( - constraint - ) - else: - # name should not be quoted. - return dialect.identifier_preparer.format_constraint(constraint) - - -def _constraint_is_named(constraint, dialect): - if sqla_14: - if constraint.name is None: - return False - name = dialect.identifier_preparer.format_constraint( - constraint, _alembic_quote=False - ) - return name is not None - else: - return constraint.name is not None - - -def _dialect_supports_comments(dialect): - if sqla_120: - return dialect.supports_comments - else: - return False - - -def _comment_attribute(obj): - """return the .comment attribute from a Table or Column""" - - if sqla_120: - return obj.comment - else: - return None - - -def _is_mariadb(mysql_dialect): - return ( - mysql_dialect.server_version_info - and "MariaDB" in mysql_dialect.server_version_info - ) - - -def _mariadb_normalized_version_info(mysql_dialect): - if len(mysql_dialect.server_version_info) > 5: - return mysql_dialect.server_version_info[3:] - else: - return mysql_dialect.server_version_info - - -if sqla_14: - from sqlalchemy import create_mock_engine -else: - from sqlalchemy import create_engine - - def create_mock_engine(url, executor): - return create_engine( - "postgresql://", strategy="mock", executor=executor - ) diff --git a/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/LICENSE.rst b/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/LICENSE.rst deleted file mode 100644 index d12a849..0000000 --- a/venv/lib/python3.7/site-packages/click-7.1.1.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/lib/python3.7/site-packages/click-7.1.1.dist-info/METADATA b/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/METADATA deleted file mode 100644 index fa4536d..0000000 --- a/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/METADATA +++ /dev/null @@ -1,102 +0,0 @@ -Metadata-Version: 2.1 -Name: click -Version: 7.1.1 -Summary: Composable command line interface toolkit -Home-page: https://palletsprojects.com/p/click/ -Maintainer: Pallets -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Documentation, https://click.palletsprojects.com/ -Project-URL: Code, https://github.com/pallets/click -Project-URL: Issue tracker, https://github.com/pallets/click/issues -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 -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 3 -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* - -\$ 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/quickstart/ - - -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 ------ - -- Website: https://palletsprojects.com/p/click/ -- Documentation: https://click.palletsprojects.com/ -- Releases: https://pypi.org/project/click/ -- Code: https://github.com/pallets/click -- Issue tracker: https://github.com/pallets/click/issues -- Test status: https://dev.azure.com/pallets/click/_build -- Official chat: https://discord.gg/t6rrQZH - - diff --git a/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/RECORD b/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/RECORD deleted file mode 100644 index c52207f..0000000 --- a/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/RECORD +++ /dev/null @@ -1,40 +0,0 @@ -click-7.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -click-7.1.1.dist-info/LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 -click-7.1.1.dist-info/METADATA,sha256=qGBq4nyx59fI9CN-NY-C_ye4USndxpKszWFLe5KMhQM,2868 -click-7.1.1.dist-info/RECORD,, -click-7.1.1.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 -click-7.1.1.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 -click/__init__.py,sha256=_Mora-ZWjo_kRK3mg_vX3ZmQV3pop8vrCLj-C209TvQ,2463 -click/__pycache__/__init__.cpython-37.pyc,, -click/__pycache__/_bashcomplete.cpython-37.pyc,, -click/__pycache__/_compat.cpython-37.pyc,, -click/__pycache__/_termui_impl.cpython-37.pyc,, -click/__pycache__/_textwrap.cpython-37.pyc,, -click/__pycache__/_unicodefun.cpython-37.pyc,, -click/__pycache__/_winconsole.cpython-37.pyc,, -click/__pycache__/core.cpython-37.pyc,, -click/__pycache__/decorators.cpython-37.pyc,, -click/__pycache__/exceptions.cpython-37.pyc,, -click/__pycache__/formatting.cpython-37.pyc,, -click/__pycache__/globals.cpython-37.pyc,, -click/__pycache__/parser.cpython-37.pyc,, -click/__pycache__/termui.cpython-37.pyc,, -click/__pycache__/testing.cpython-37.pyc,, -click/__pycache__/types.cpython-37.pyc,, -click/__pycache__/utils.cpython-37.pyc,, -click/_bashcomplete.py,sha256=9J98IHQYmCAr2Jup6TDshUr5FJEen-AoQCZR0K5nKxQ,12309 -click/_compat.py,sha256=CCA3QaccPgx3TL3biRljHNnqELqCSMr3wPIe1kXaOcQ,24257 -click/_termui_impl.py,sha256=w2Fgse5XiOSjV72IZLBKG0loK_Q1oogvh9e0spJpRAY,20793 -click/_textwrap.py,sha256=ajCzkzFly5tjm9foQ5N9_MOeaYJMBjAltuFa69n4iXY,1197 -click/_unicodefun.py,sha256=apLSNEBZgUsQNPMUv072zJ1swqnm0dYVT5TqcIWTt6w,4201 -click/_winconsole.py,sha256=6YDu6Rq1Wxx4w9uinBMK2LHvP83aerZM9GQurlk3QDo,10010 -click/core.py,sha256=V6DJzastGhrC6WTDwV9MSLwcJUdX2Uf1ypmgkjBdn_Y,77650 -click/decorators.py,sha256=3TvEO_BkaHl7k6Eh1G5eC7JK4LKPdpFqH9JP0QDyTlM,11215 -click/exceptions.py,sha256=3pQAyyMFzx5A3eV0Y27WtDTyGogZRbrC6_o5DjjKBbw,8118 -click/formatting.py,sha256=Wb4gqFEpWaKPgAbOvnkCl8p-bEZx5KpM5ZSByhlnJNk,9281 -click/globals.py,sha256=ht7u2kUGI08pAarB4e4yC8Lkkxy6gJfRZyzxEj8EbWQ,1501 -click/parser.py,sha256=mFK-k58JtPpqO0AC36WAr0t5UfzEw1mvgVSyn7WCe9M,15691 -click/termui.py,sha256=G7QBEKIepRIGLvNdGwBTYiEtSImRxvTO_AglVpyHH2s,23998 -click/testing.py,sha256=EUEsDUqNXFgCLhZ0ZFOROpaVDA5I_rijwnNPE6qICgA,12854 -click/types.py,sha256=wuubik4VqgqAw5dvbYFkDt-zSAx97y9TQXuXcVaRyQA,25045 -click/utils.py,sha256=4VEcJ7iEHwjnFuzEuRtkT99o5VG3zqSD7Q2CVzv13WU,15940 diff --git a/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/WHEEL b/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/WHEEL deleted file mode 100644 index ef99c6c..0000000 --- a/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.34.2) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/top_level.txt deleted file mode 100644 index dca9a90..0000000 --- a/venv/lib/python3.7/site-packages/click-7.1.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -click diff --git a/venv/lib/python3.7/site-packages/click/__init__.py b/venv/lib/python3.7/site-packages/click/__init__.py deleted file mode 100644 index 3910b80..0000000 --- a/venv/lib/python3.7/site-packages/click/__init__.py +++ /dev/null @@ -1,79 +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 -from .core import BaseCommand -from .core import Command -from .core import CommandCollection -from .core import Context -from .core import Group -from .core import MultiCommand -from .core import Option -from .core import Parameter -from .decorators import argument -from .decorators import command -from .decorators import confirmation_option -from .decorators import group -from .decorators import help_option -from .decorators import make_pass_decorator -from .decorators import option -from .decorators import pass_context -from .decorators import pass_obj -from .decorators import password_option -from .decorators import version_option -from .exceptions import Abort -from .exceptions import BadArgumentUsage -from .exceptions import BadOptionUsage -from .exceptions import BadParameter -from .exceptions import ClickException -from .exceptions import FileError -from .exceptions import MissingParameter -from .exceptions import NoSuchOption -from .exceptions import UsageError -from .formatting import HelpFormatter -from .formatting import wrap_text -from .globals import get_current_context -from .parser import OptionParser -from .termui import clear -from .termui import confirm -from .termui import echo_via_pager -from .termui import edit -from .termui import get_terminal_size -from .termui import getchar -from .termui import launch -from .termui import pause -from .termui import progressbar -from .termui import prompt -from .termui import secho -from .termui import style -from .termui import unstyle -from .types import BOOL -from .types import Choice -from .types import DateTime -from .types import File -from .types import FLOAT -from .types import FloatRange -from .types import INT -from .types import IntRange -from .types import ParamType -from .types import Path -from .types import STRING -from .types import Tuple -from .types import UNPROCESSED -from .types import UUID -from .utils import echo -from .utils import format_filename -from .utils import get_app_dir -from .utils import get_binary_stream -from .utils import get_os_args -from .utils import get_text_stream -from .utils import open_file - -# Controls if click should emit the warning about the use of unicode -# literals. -disable_unicode_literals_warning = False - -__version__ = "7.1.1" diff --git a/venv/lib/python3.7/site-packages/click/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/click/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index e194c1a116c93b2d60a8e88ffc1b0dbef892080d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2695 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 C^gC-w{$)#3hf?Yd6Xo;bb!R z9qeSHqP13uo&QO~PT8#Efthk(rwQkft-nP8kS5IRHzYkK`Fk{JsG}%3gDk|nvTs@7 ztQ0r}4vt<4t&glK99<+DWL4@cRt}Q6&URDeF9eX%RmLH)YQTM&j~!FT(@PRwGEWg^ zAA0HqH^Fh%EpCRpTb|0Y4>iJZ^{p_iax^*AsMLQI^}N)_P|xUJM}1uCdz4krY^D{@ z+06`MCCJv6oVwA?EH*C=BFd0Q4C3F%`)1Z=){;!-y|0_OyOU16{n^&C+B-KXdAy zrqj)CyPKmIxs4kdIPm26ZEG`cTN_K={A#9~UcGnC`NR­D+$eZ1D+kDuIUYBKU6 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 x-H9XYNAi*KxzV%(SJug;zCVPPSq~l2Yg0_T2S diff --git a/venv/lib/python3.7/site-packages/click/__pycache__/_termui_impl.cpython-37.pyc b/venv/lib/python3.7/site-packages/click/__pycache__/_termui_impl.cpython-37.pyc deleted file mode 100644 index f224a8a92402cf46fe86c9d9d7b0b5bcfe5b8219..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14136 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 Hl#c#Cz5&T} diff --git a/venv/lib/python3.7/site-packages/click/__pycache__/_textwrap.cpython-37.pyc b/venv/lib/python3.7/site-packages/click/__pycache__/_textwrap.cpython-37.pyc deleted file mode 100644 index 63025a9dba99d05b3d18907309ba2c7a05e3d802..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1298 zcmZuxPjB2r6n`^gd!6le+b*;T2aveoN=+oBf`lqm0fLIdUO*IC(2?VrCQiJzGh;W& zYW9@!JvK)Ue4)8=%2(h5@7Wtzsmy4e-@Jc*{>^Xv)!n;ez%hMs`Rb1V;7{7z4&1|Y zT=p>v1&WoB(vz2L!BfuQJ5WLeZ$SkbPQ;Z+g~H{+omG#S}%;Y zzk``!1Al#b&@P&Trf8lNm2I=KeDbtg)}Jk(76*A*~r8C z(Stj-*|FtV!B4>8B_iuE9{m_E+0O&gY@TpGEvlj|vQie6(pBpp*zVBkvkvu*DG3Y_ z*+)Y}I;%^CuI;S!A=%!^>~S2#dsJb9NSSO?mN2pRQ2@dcu_;c@#;7m%wqe;$`4vQ`sg%AzGQS@RGB%p($XEs|xo+Djqb(rb_HC1?K$y!MoHZ$0(*hLW>(dZ~6fP!lP*67H6r|Z{DoW3~cvpZgVGfCT`zl7I%5;&sM+1J>JIK z<38`;-RA6}wb}g+RICTzF|3=cc6OiqG$suF96T=?TXDH-OsJce)=9@f4?)c_PhJ1 zZdr0LvmaW!*3lH5?=vUm;&I4UO_X=&H+DEaux?=CbBlXCA)J zGS~K)ynx;R?ZMBm0}tA%HDQ&-;5WHGv*aai!H3Rs3x0tI$4p)$40pJjx|3FAGizpR zkGG!FzV{Vi+9%(TFAy{VPgJy*iXTdS7|ATjhQ^6F=n@=VflGJDX8{*l#9Ht`k3>)^ z5#)pB^EHzP-#a!)CPglFFL*RcRDl1Hhz^qUm}H3aQbt3N+Y@m_UrA5SzK;o!?q@Yv2^G>jefMAfz=I+vW zfzlFcs$OsxJCj_3b%sNeNGEv~C?SH8)`hyc-8j8hARL5Nh0OP10M$c8Z5PLSlxH7q z!%h^L@i-L+BHe6D4_1~Nv`|7C2iN}6vPxbAu5LeW42@uGkFD&IYiV!Xl^-)iA)?8t*b^(We`}febL3}4fxDHh+xsov z8rxqp`Hi9HSI+UfGiSd;wQOkPt4j~}zjEfM78bYPvMP7UVGSJqy5!KQ+=hcbjW}=d zZsqASGgrUy+?LBOpxktAEy}7V{W&Q4Y)tRU)UX$` z*8IW@+8{3so}V6j@&!Lrc~4(FMy~KTsJ6{oUo&+X&{=}AAJ05!aSiaB2EK%^bMp;; zetuD3njyCq_@f=pD*xzHX#UpxGGAY?<=2G;8`zNQ1Cj=m{%}&J2Cn=W@_XC?^yMzj zJpB^Vz#9hh4ft)$H)ejrMPK0;0oe=ooc)QJT6<~w$(>B0dMe~#q)j4<>>!bOHW8Vo zTpQ*&H^IM(dj$8c3ESYq-m+A;A{8fz3EH|<S&p<%G!>}eH;?Xa-3S_SRB$MesHScl;EOM7$|P4BsXi7cDpEWx6S4@N zJUu{;2YZB#^K6g|OG75iII22B`O-71Yp?m_X7H?<+8+e9*N9uY_aWT$@7?aQgHY8s-h+7&w8XH{4{acN z#owsDQ zb#?|r9a=9iYk<*w*#KWCV3Z%&`kf~H$(<_Q1e3FfL){DOvbwT8t9C*NLk J{B!>0{{n)?#@_${ diff --git a/venv/lib/python3.7/site-packages/click/__pycache__/_winconsole.cpython-37.pyc b/venv/lib/python3.7/site-packages/click/__pycache__/_winconsole.cpython-37.pyc deleted file mode 100644 index 0832de008be6c764696162549c40cc43b744b9b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9365 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 BWETJc diff --git a/venv/lib/python3.7/site-packages/click/__pycache__/core.cpython-37.pyc b/venv/lib/python3.7/site-packages/click/__pycache__/core.cpython-37.pyc deleted file mode 100644 index 3eda7c96e2ead8c7ce68289fdba181207fba9ea3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61732 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 diff --git a/venv/lib/python3.7/site-packages/click/__pycache__/decorators.cpython-37.pyc b/venv/lib/python3.7/site-packages/click/__pycache__/decorators.cpython-37.pyc deleted file mode 100644 index 29f17c70527a4ed2645efe7a01c0cd324824ce6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11630 zcmc&)O>Ep&ekVDfniNf#1S=!yo1yuh1%(hA4<)Q0$djB`%kOa<9^=aJd{*dvmQhE>}>lwQ5|hqFis)xjct*qt)PY zEtu~uv=+Er4^H$>woanl5c8iKtrx_CIDzXau_#^;r#?4Zr^RV;22ak2CGny-izhFN zrg%x5L+PwIFD~HSOX8w<8P{{-74a&r=f!Kn#`S`@Bwok$qPQyF5O1Qz%i^-Qf+w#C z^JAm=jh|uF#zxaj7Y2RdCZ4k^-G1MbKQr+hkLUcvlQ?=YZZ0~VEw8iVbR+2uLcbFU z&k3l48_?_OZMiw# zc5FAccik}Y!%aJhZ0U78|AA*GTb`{)we_eq8^7rOw%19hQP-C-3VI!@{I-Lk`Ik-T zHQdFgaN0K#;}Iq`HvZBYn?ELknxLg5X=_?(5>zd1sfdSf1JaTjS^7dMoMm-|GAQ z6+es<%y;G5U=)3Obj^RO6ZoASeHLCPl5P^oc(p%FtD(2+bO&MQ3=K{5FwD`beK(FX z>aE@gBCI}sdo`nfBz6=ALz|v6Pc;3bknR-Cl}w->h$muuY0XU%xz=7+&sWi+ z-CVWpds}{N<9`r)-9cdcUG(6hduAy2B)z`$V#t{q3M5ZFJL*DMLN87{VaG#UdSAq9 zBD!Mrwt1A<7Bf37U_?;5ftqq2r;Nx%Qc09%`r9aE+`GV3L9?&OxoXz_0(Htbmv3aPj9}22v`(fzG zUIazeO3ckMVV;Nu9gm_zeroriaGQSP<3{+W@Q0El6kJ?Y)_0}b)2wF>tubF&=9DC4asdz_Dk<&M?YuA^NN3{Mc50)83j8B=rGqWWT@=WU>{r7lg4>mDdw=d{ErCwo8ZRBlAzpv9(>^H^+spHD!aWjnVrbxS_j=HGw*cw-ejA z>nB?gFc{`CLs@12i1eiPi+{McXnPO+nCxe>!U)%zS7g_M)v8ZPS=#vi0JgU0eNW0r zre(MXJvT|KjuW~)&v9C1HHBtz0+49|qAH1O%|cpMeY0Ik>r*nz25W+!Z=*WHm|>R9 zqS>%&X4SM%s#&A!J$J`*Sfz4tn?UO^k1~Nh#!dps&toV_49$?7&E;I)&rO;Nqpo>! zestx_4X*5Of%{b>T%=*xDo+i`3re!$s=)IK8q4z%;mkw&8K+nP&-q*(vO=>Z=gmuG68jonCLKps8 z|F1Cq{K3MZad1KuMd=ViJ1&ayPYPq}&nPjpPMTXtRe|uTFuP?VrcIzrzM1m9wDN$l zY(WtUz~yF4&KQ(=bd25bX2It{5&=wnsxh=d7`L-!qnz1QPl0-7^f|z2e+q8}1M7#G zH_wk_*b^|-L(qarMQnF84RbHSvq@~UPm;?SjIuij$c zn#aPvKeUA#Z+S7+`F__PMgxvgSkAZHaFhHEH(BNv9XI5T2+??!5PJ`u3N<;zD&z_s zjaRtIZIEZj8^Se%)zhI2C;|fpWF~)FsTQ^8X$C{`#xi|k7HV322=$myT8&7~53!DX z2Y5hA8J}W&rd&KB_Q|mz8|GM<0!)nKHLb&eA7UW{MJ%6;To& z?q??HQ*(K0_-vu;TAP&bu`v^r5u)VI2SNTmyoi1CQE?AZ>9#pG9ULkywOHfRisJx^ z97hL+fSI0X7UVb4k^D6}*>uW*Mv{s8V;nJA7z2<}HAfdRisn&gZWv)N2~T0`ZCq53 z-1o%PJvA8H){5?P8_i;}WX74QS+q`;KVIE~E%WNi}j&@zn#76lQS z3dOC_-ye@oN^lTVfUoW}7Ue#Y<_>d&BAnQc$OGKr~}BPPuz<4sv206vpPEX&T|nNpTEvKCYpDV5*u*Kcpol!BHbtS0>hh3m*L$&5SZ9WWpBU z+QCG92X`HML_eB79kldk2ebbG*Zek{35r=^VKe|{u$@V+Z4*rPqu3`jbA!AhBcl)?H20B&**AU+86_81NhARm z^rp~{`jT*pB}XG%Yd#xnoxBq~B@IgJyj+JE8XtkXzs7qFcMbEDIl7oF`y3$DIMHusD(NN)N!k><~yw) zN@{1_fPX^Em~xzkRkf3s zFNKhBlPQRR*V;z{ug|$)q=_?^bTfpX&h9yR+rUW1zIJOva!<*+|8Smc3aM8b~B6O zmh<*mKkDi|gt_$`p4rVi2=CBX@#E&=JJD=7gv^v54!qx5oJ@wOAY{}R_m_?=nYhMd zKIJ8{Yy5iqkbGCUhErN%iX8Ecj4z|h>q?Q>19nvqNTN-- zMAZW%c(rMcN-QU^v)`sA-oi;+Vjf-F-{bJ*-)Xr7Plj17Hh?bbZ*=9$E&RDm@#$mw z{1+OZvFFr6L*BvNb7Ifkqu4`|$#J;GonHlde0lB8W(yV9dZ{&h3PGLeH_uS?Egu`h ze%K!*3=y*`tejp~^!#us8}JwEGw8|*bJk}PE9Djq3j5eXKw|G|0z4BIGPqaB>!1wocHy81WHg_cA+obs+V63p ziyW<}9yQP@@(N`*=G?v{@%o!{$uf^r>5+#xPh2`f-~6Ztn5 zoW4Z%h^!tV2-!j1ksS_bM=kfH7M1MJfv1Evy3q3vOJLvk;AOpdy_M>SB^7bOC* zm!Y?R_3&^bdB6-HXQLh6R3&k;e$<@E!H&10U6sHiJBuD4K-`7BPP_NVDg=BiN@%Na z6!}bB_{b!oXMN{Psl&AAq*(#Q%vPYaL707EcFe{bQJ@vde z2D#So?L&-gs;%#{wXjdEw`Pe8y3=Eqvea%bUS6W{o7j%bXmfc$f$QIUrV`WojRY$Hkn(JZAOKJWZR-(Q5c8T z6KtZPOmb~K!IvYC3rJy?Ajyzy`hEm&O_FNH3@T^#p31eU=XKGbItV*0F^~NWYrojv z77P2>uh2fg3CuHRR$9^29li2}bjsZZ%6L$Uhu83LD2(w*0g^6;Tp*`m-=cIo@4mbV zXTm&0vSzQa&$~GM^ryoHtvD#`m9Up{275V0?B#r<_HwX~bN2_v!}rFe?b18O58vJ^ zkIM&T?7viikY+#hjlIglD@k=+d1T`Kg-@-$>fYRVZhLOu+_B_nT;8tj6+bdQ8+~GY z*7}5YYiJwtr%7EDXh$i5FElRTY4Io4Sp?(T^P=>pL@k4Md9>RD%q93vPr%~FQQ$do zNBU5Q(Z%&>5FnooEh52{un0K@(C0Hm)U=X`7F?%J6hyLlB7Ff_b>xca;~_Z0Xg_+QwRE&&eI1;=uZx@til=@+iBS(3kr zrfC6R`^fjGG}m=DgXlh@5au=*z}!79jdScQ)h6x2?8yIzo>hR{AjX`riq@$&7%`5eS2y-*vd;ka!Vonocei>lVr|Enn%rHQF)7~%>rO`~ctM^%eHG$aIqXn%wYLsF|s zI7WQtSCS&%=}=Q)6GO@@uG}W=qQogB-;weBCiU@E0YkyWMGX@Woy_5w;KU!$j4#pb z%u#t|g+_zg9}g1KS=7m_Da(3`X078z?0Bd@;K8e3Jp1Qzwd+%TU8C`cT}FLjUOGJe zJJ=8bEBOCam3I3SFMu!ES7Q7bCbr$6D1A3!v(l<(-_N2Je-%J!JL#$1bp`F!whyK4 z(n^L?m4D*+BSk<4Y=^2fBMn77zJ?doCqd2y#3?z9*BRO{9bOcK=k^z z#(Ty0NWRZ~_nv#+ef{p*TF1b({)5Lq{l!a$@f#MZ%fZcUr2M~-g+^#5#=z{EChslW zTRlteZQR>ETkf6288mtg+&9AJCq}RNr$*Qc-A|0rjapCbo{Mrj?4aCnN{B9h6s4z7Td%?#lC3lrM%GC~ru44dqMWWt1;Vc^&0v!Ye3Wk@hd3 z{A{?1@@CXUdlyl@8eT*Bnv^%f=RP#Hp8w3m6t~QBeJ@U;)E`9sBI}Q0)Lht)ihdD2 zD*Aa5MoOW|{@|~_g&!vh4zhqB^5QQAb{8rCCbGhq7=>9_d)8A+y&Rgyc4&q6C#ZeT zcxs-QAL0&OJ3C|ByXn>KSoqXt8%$S_O^m-;KQhsp`PBRgy7|}&`JK7LA*g7mwye_H ze!Vmw{ga{E_~5sHe6tt~Zw}+(YjK(vev-WQozXaZWBi@?W{||e{b?RO3Zh{VXKB7Y zeEi$?Tl-NOJsPTa*hbD_IL7$v{lhFy`$J#(gZ@FB7WwvDNf!7?{?2y&!Io2Y;#~Sl zgQ#p2qhS)2P7>!u>F|4uv@>f$2B|aZUU~6UA1#iciOew9&C8~`h`WHr>Y{*dBjw*m z78yM=Gvt)g z_baiC-@KE0wUE5xz%M*`!wdY>JMhymi9F<9evm!%iVSZ=-YAdMwxTiw6d^ATw$_Z- zQJ9!VR$-`X6RhO@Hh+)J5E_A6>)4(c6YB(qH8Cef-;uSpcE*iSvG>}WTMfmQ%4U=X zSs0b=da$M2@5gCe^!sIN5aqeQA8pyClSj#(q89bspvY8zknb;vUp<4Tmyq&RWQOVB z&ow*dsyTjkQ6Ae>54EmxnoM_*WW6TFVWpeW>z1jW#j~X@VP%;b_(gv@(C7HMNXs0* zu+-<`n_s!-Rv%`p`u!K@y1cT~<@A+>zPN@mOA3jz)GG$HnXQc_Q&yDa+4ELc@#yPF z)5-4CD#FP(kfe)OaWjEN-*?q|VLUZp{7{c$YhoPRC&r11XV%XIdC|SSGj6}HRHklu zPmYKP1h6efalndAmQ5`}wTZ%(rPt#cpVH3f%+R44Uq{{4@?5iNjxR0AhVKx1R;X`+ zll`*O?+>zYltj?I)qeluk)KSTK-yszpt>DBf@)G_Mcrg9A`Pw1EB*c`jrq9WSI^hO zS{$I-z=Ji8k2kLA*pB78uI<`TSi$|=!PDB*@q*nssnfCtU6g}Y{G zL!zCs^OrOqk*fcP&~Ly1kS|iHpDg1+9`B0@tiq<|GlV@RCtZ+GO4TY{0^)GBTXo=AgL6+tG9^I_sY-k$#=C?4JN zGQo0oCm#kGhWx0|uod{gr4aWRRW(FeS?^(-B+?XzSY6Pe1XEsU#~&3LY*tT*5A$pg zd3junP)Q#mt$apJ-U%pqUi_`0?+;KYU^oCcQvePc-A6jKl*jzgP63ED=t0XGvZkUk zrHx6Jtsol=0J$g)!Yx}XGvQ5rgV~b85ZT^Dnkw|FDD-S?XLu&qgBLl}+6+HMVbKgj z;|NaX2nc;h^K7d>;~fq2&_0>ggx0ac@?k@AsMJ;C#FB4p`R0+-w}ACfK>hA<`^1>o zCl(Oj3L8JOO#{!Ge0JQ?24B^SH)!pY#`wxd>alnI$q}snx(5sQ4x(hZ-T4fIHpY!7 zM;)MnrD*46Bgm3W&BMfsh6fsZPxuW#?rR0ok|ZSeR;SX2`!5c97w29Q)6W%GRD(>L zEJ;j2}3s#{IRHLO{VCTef z1>R~XkJ;ClaoNvDkyr5aHKg1{=C&Nmu{sUK+5oA(sJXY1@|Te%g$bUa8EzxA zfEsSO`mP^-K%NuRsmdOv-k!<^XqJ$(>j(Eev;hbLN6Dq7nZbL0QTV}uH^m45HVj&i z4W>+#i3{&lj-euTH_%ZW97sF$X!ur~Z%xr_d)s>usT>XXVHkzCZh7C@etiMh zvo^Bb!zlP1m=Yuf;gYT^fYQIak(We!1*LgIh}h{F3gU5Y7%REZ8Lh;7-Z0DacsGd_ zKvjk)ocETjl>$&}G^HA10frFlY-v3Dyy^O!(Tj|jyb*&IEXKEfB2J}sD$KRFU|*U}T?6w7tutw4ro=nS+q2jzyT z;(8R+vNXsA1EhQ%nE|#>#^1G8P1hPfw;&ab3Kdhwn0I!znrC9Kz%Cn}>r5OnH+hPX z`y(WgzuOhiWgSORU(|}*Nck;f3!vLM1-cSc=ryC3dLwG~-07ySDPX)(cKwQ_;txSc$$)=@T*2SNo$ulosADP#O^T5LS_9g_zM$We;MY zo5tNZeURPPumCC)sCZbM3x?l53k>_j=Vf?_(-17Hh(I8*p%etq_T*kPU;My%HvJL4 z2%|lJln|N)$y2}uX2G`V?{%y67w0v^*Y^QTX$4CFl%Ei5w5kHUfI;`}U9X$Ge(&Cm z^BTi@nq1%|N*Luz$f&9CK{otYc>Xd1a2F{jMVR3Ou)#S&aA^W|)dyMB=wOR>X>^#z z87MXA>AC3eM`(6VPenzkz)#pGjoz>~%<BJn>iH?(ICPKO{6*-%nK^`XxzY~z*E+}>K5L6W+O2O5WnK8h0VT@dvUEf>lt=u|pfo!%uv*g%_Ug)fS{ zvqE(NE;duz2wU{p$okmPD1Uk32s(d@l#^-B&O?q#6!6q$L=)T7eLps)mMBLAk`Pw<~Gv* zgRJjlAA;!oh3uKfd&`ai{5Tp6$z;IG>PTPZBP0?SW&r5QEg-y+e?Ih+DxE`tM4_NM zi1%zjdAK`fC{XAGtkw}y#9*K;)Tj;#Zlsy8wdt@#n;N1$b8Klv1Fu+Lxu%J3oWw;O z<&~Xri>#IKPk8qYX0s)!q48fSV3xR1>mV>o1~o6n)8NQ;sga!Qix#o3!Om146$CYa zUufR9)VC)RAs5zU%B~q=Fb(WRxRWMC0>F+D+C9d`>$nN7i06DGY@&oa0WXQXj=S%{ zPd&~?h?{_MKRNoI+Ct~!E3bYqCHhm5H;25Ll331i*1Dxu`NlAnDk4eDZ}E{cHP{>ruK?Cer`c(iNdJ&_Hb-vH|xu7x)vzsuhbYg9isn0#Es9I80)g z4XG0;1hzWfl)UKog(8qq#fV@lg{>c4iR|&v(EN_mQ#Dy*L+NO+i-;N8s+fb`AMulg z!N4T3uhlK<-RJ3z=`t6avk|>LCEhNM8~ZjAJ=wa|LrK14PPSQi8ikIdx#l zT`a_RxVNDh&+(R5@P>|8&jl zdIN-Bqq+?d@#1g2_zY6dh$|PrqN~;np1)8Clc%rM@yOL>k$#oM{vI0sPc}|Xa+_Fe z)||cAbkqxYab6g#{e2ujyw5QB_~p6P_INJAgENYD7siDc1wsR}P%+2AbQdY7OVlTx zpuE~OUPk1#c8U@{W}E;_3wiAl*GB36l%X)$8bkTXOXh;eE2Fs2fzZB7x4NtB?p?lo zgV`NsGyAB0;BQbrJtuSF1s$A{!3%EGQ?6H|rj9_(*|fSSh=+$mgHyvXAD|WoNZ0O4 zX^=#G3y`suX2&Hl`&915o%f8~EF3{MYP2+zV(}$5pIb zP#4aYl{sg+pe_>dC>wWp2r_>A&fJNLK0--|u1kll)!~W`>w$^M5z02hL1zVjXX`b? zGiuZSa6nW9*HkPojMzrSZKV7~WQ!w4gtt|n5jC+=Zt1*_bFA^-Vfaf!o!_(Ln3x_5 z+yOy`h0q*N!EoYI9LV8`pa){W#VCiz3K4yjn&~MJYqT?(dxdngZba{!p$}if(1qbF zoF{U|oUU*-F_RjB^e58*QR&FJ+)R44w*QV_vl+u2uW{zJdgFf&q{Fi{scd7#d^&Dx%=%zJ3|f7wArR{%e(+u6EQws2H9z@dXSUoMe8C&VFmoaA!iApaAfF7pwQ zRzoTSO0qi;;v=q0AWamtT>bGVE#iR&C(#7yaL&%_(UtC7`bhH~YP19)R$=S-v)yLb T>%P=|rTcdGYWG5S70LNOo*WKb diff --git a/venv/lib/python3.7/site-packages/click/__pycache__/formatting.cpython-37.pyc b/venv/lib/python3.7/site-packages/click/__pycache__/formatting.cpython-37.pyc deleted file mode 100644 index abc2ea992bdb42a050dafde81b1fb71826bf52ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8661 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 diff --git a/venv/lib/python3.7/site-packages/click/__pycache__/globals.cpython-37.pyc b/venv/lib/python3.7/site-packages/click/__pycache__/globals.cpython-37.pyc deleted file mode 100644 index accf27781b6584451d91bbd08e492867c01edf4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1832 zcmZuyO>Y}F5G8jdMPAG9N1CDqdSHrvDM;iT>K=rmXd5)BFGAt?(E3n`A}K9x?s7qL zWlK;mNv{15@v-PXTA-(%@)vq(huq!7E<#`_?r?Va_-5Yd`@Ovc!Px(C{p(*{g#Pv~ z?TBIVEj)G%6Gt2?l;Km1k-*Q;X~YLS=AGyGH0E92dyY;!{1)%SZ=?-9hPOlB0rxlfo z&Q+Z|0o*TWsXR#y1>ggR87i$H^i4s=;u11=T;@(@;s;~2nT>+q%YR{P?wt*sXfgAcd-H9cAa${&&t9IWJuuuu6_{E-pjxYH?3tUqM&l7(hpxPme{WSAg0Vn9~JOVkJOnUhm#i_A>StizfUxfU@p8Wf{W7n+&dJ3p-}&xr8c{5&kY-slOZ;~&kv(eR8==%fw%X- zXx{cy;O;encc4>gwGu!gpq@4t`V2hlD(&{6LKED_=8lhx9}n?lc&plRsS%VzUo)QE pI#s@oLp2yrfB4|qaj(zpf1PPwD)Ei~TMEYvqF$W5-|zOj{{eqE_NV{= diff --git a/venv/lib/python3.7/site-packages/click/__pycache__/parser.cpython-37.pyc b/venv/lib/python3.7/site-packages/click/__pycache__/parser.cpython-37.pyc deleted file mode 100644 index 0523dd500a709f101738705db226947d0afbe4d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11746 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 Z)bzFE)^1eiYbR@GYhNxFYR^>5{|6$;JGlS= diff --git a/venv/lib/python3.7/site-packages/click/__pycache__/testing.cpython-37.pyc b/venv/lib/python3.7/site-packages/click/__pycache__/testing.cpython-37.pyc deleted file mode 100644 index 8b55fae87c13a9278f1f83ac285df951b409aabe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11634 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

mON!pzmH!9ALa7CXYh(h>BXsRLP14sfu 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 diff --git a/venv/lib/python3.7/site-packages/click/__pycache__/utils.cpython-37.pyc b/venv/lib/python3.7/site-packages/click/__pycache__/utils.cpython-37.pyc deleted file mode 100644 index caa1efe945feef96b5fc32b90aa2f01f3348fe41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15441 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 cmd_param.nargs: - break - if start_of_option(arg_str): - last_option = arg_str - - return True if last_option and last_option in cmd_param.opts else False - - -def is_incomplete_argument(current_params, cmd_param): - """ - :param current_params: the current params and values for this - argument as already entered - :param cmd_param: the current command parameter - :return: whether or not the last argument is incomplete and - corresponds to this cmd_param. In other words whether or not the - this cmd_param argument can still accept values - """ - if not isinstance(cmd_param, Argument): - return False - current_param_values = current_params[cmd_param.name] - if current_param_values is None: - return True - if cmd_param.nargs == -1: - return True - if ( - isinstance(current_param_values, abc.Iterable) - and cmd_param.nargs > 1 - and len(current_param_values) < cmd_param.nargs - ): - return True - return False - - -def get_user_autocompletions(ctx, args, incomplete, cmd_param): - """ - :param ctx: context associated with the parsed command - :param args: full list of args - :param incomplete: the incomplete text to autocomplete - :param cmd_param: command definition - :return: all the possible user-specified completions for the param - """ - results = [] - if isinstance(cmd_param.type, Choice): - # Choices don't support descriptions. - results = [ - (c, None) for c in cmd_param.type.choices if str(c).startswith(incomplete) - ] - elif cmd_param.autocompletion is not None: - dynamic_completions = cmd_param.autocompletion( - ctx=ctx, args=args, incomplete=incomplete - ) - results = [ - c if isinstance(c, tuple) else (c, None) for c in dynamic_completions - ] - return results - - -def get_visible_commands_starting_with(ctx, starts_with): - """ - :param ctx: context associated with the parsed command - :starts_with: string that visible commands must start with. - :return: all visible (not hidden) commands that start with starts_with. - """ - for c in ctx.command.list_commands(ctx): - if c.startswith(starts_with): - command = ctx.command.get_command(ctx, c) - if not command.hidden: - yield command - - -def add_subcommand_completions(ctx, incomplete, completions_out): - # Add subcommand completions. - if isinstance(ctx.command, MultiCommand): - completions_out.extend( - [ - (c.name, c.get_short_help_str()) - for c in get_visible_commands_starting_with(ctx, incomplete) - ] - ) - - # Walk up the context list and add any other completion - # possibilities from chained commands - while ctx.parent is not None: - ctx = ctx.parent - if isinstance(ctx.command, MultiCommand) and ctx.command.chain: - remaining_commands = [ - c - for c in get_visible_commands_starting_with(ctx, incomplete) - if c.name not in ctx.protected_args - ] - completions_out.extend( - [(c.name, c.get_short_help_str()) for c in remaining_commands] - ) - - -def get_choices(cli, prog_name, args, incomplete): - """ - :param cli: command definition - :param prog_name: the program that is running - :param args: full list of args - :param incomplete: the incomplete text to autocomplete - :return: all the possible completions for the incomplete - """ - all_args = copy.deepcopy(args) - - ctx = resolve_ctx(cli, prog_name, args) - if ctx is None: - return [] - - has_double_dash = "--" in all_args - - # In newer versions of bash long opts with '='s are partitioned, but - # it's easier to parse without the '=' - if start_of_option(incomplete) and WORDBREAK in incomplete: - partition_incomplete = incomplete.partition(WORDBREAK) - all_args.append(partition_incomplete[0]) - incomplete = partition_incomplete[2] - elif incomplete == WORDBREAK: - incomplete = "" - - completions = [] - if not has_double_dash and start_of_option(incomplete): - # completions for partial options - for param in ctx.command.params: - if isinstance(param, Option) and not param.hidden: - param_opts = [ - param_opt - for param_opt in param.opts + param.secondary_opts - if param_opt not in all_args or param.multiple - ] - completions.extend( - [(o, param.help) for o in param_opts if o.startswith(incomplete)] - ) - return completions - # completion for option values from user supplied values - for param in ctx.command.params: - if is_incomplete_option(all_args, param): - return get_user_autocompletions(ctx, all_args, incomplete, param) - # completion for argument values from user supplied values - for param in ctx.command.params: - if is_incomplete_argument(ctx.params, param): - return get_user_autocompletions(ctx, all_args, incomplete, param) - - add_subcommand_completions(ctx, incomplete, completions) - # Sort before returning so that proper ordering can be enforced in custom types. - return sorted(completions) - - -def do_complete(cli, prog_name, include_descriptions): - 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 = "" - - for item in get_choices(cli, prog_name, args, incomplete): - echo(item[0]) - if include_descriptions: - # ZSH has trouble dealing with empty array parameters when - # returned from commands, use '_' to indicate no description - # is present. - echo(item[1] if item[1] else "_") - - return True - - -def do_complete_fish(cli, prog_name): - cwords = split_arg_string(os.environ["COMP_WORDS"]) - incomplete = os.environ["COMP_CWORD"] - args = cwords[1:] - - for item in get_choices(cli, prog_name, args, incomplete): - if item[1]: - echo("{arg}\t{desc}".format(arg=item[0], desc=item[1])) - else: - echo(item[0]) - - return True - - -def bashcomplete(cli, prog_name, complete_var, complete_instr): - if "_" in complete_instr: - command, shell = complete_instr.split("_", 1) - else: - command = complete_instr - shell = "bash" - - if command == "source": - echo(get_completion_script(prog_name, complete_var, shell)) - return True - elif command == "complete": - if shell == "fish": - return do_complete_fish(cli, prog_name) - elif shell in {"bash", "zsh"}: - return do_complete(cli, prog_name, shell == "zsh") - - return False diff --git a/venv/lib/python3.7/site-packages/click/_compat.py b/venv/lib/python3.7/site-packages/click/_compat.py deleted file mode 100644 index ed57a18..0000000 --- a/venv/lib/python3.7/site-packages/click/_compat.py +++ /dev/null @@ -1,790 +0,0 @@ -# flake8: noqa -import codecs -import io -import os -import re -import sys -from weakref import WeakKeyDictionary - -PY2 = sys.version_info[0] == 2 -CYGWIN = sys.platform.startswith("cygwin") -MSYS2 = sys.platform.startswith("win") and ("GCC" in sys.version) -# Determine local App Engine environment, per Google's own suggestion -APP_ENGINE = "APPENGINE_RUNTIME" in os.environ and "Development/" in os.environ.get( - "SERVER_SOFTWARE", "" -) -WIN = sys.platform.startswith("win") and not APP_ENGINE and not MSYS2 -DEFAULT_COLUMNS = 80 - - -_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") - - -def get_filesystem_encoding(): - return sys.getfilesystemencoding() or sys.getdefaultencoding() - - -def _make_text_stream( - stream, encoding, errors, force_readable=False, force_writable=False -): - 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): - """Checks if a given encoding is ascii.""" - try: - return codecs.lookup(encoding).name == "ascii" - except LookupError: - return False - - -def get_best_encoding(stream): - """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, - encoding, - errors, - force_readable=False, - force_writable=False, - **extra - ): - self._stream = stream = _FixupStream(stream, force_readable, force_writable) - io.TextIOWrapper.__init__(self, stream, encoding, errors, **extra) - - # The io module is a place where the Python 3 text behavior - # was forced upon Python 2, so we need to unbreak - # it to look like Python 2. - if PY2: - - def write(self, x): - if isinstance(x, str) or is_bytes(x): - try: - self.flush() - except Exception: - pass - return self.buffer.write(str(x)) - return io.TextIOWrapper.write(self, x) - - def writelines(self, lines): - for line in lines: - self.write(line) - - def __del__(self): - try: - self.detach() - except Exception: - pass - - def isatty(self): - # https://bitbucket.org/pypy/pypy/issue/1803 - return self._stream.isatty() - - -class _FixupStream(object): - """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, force_readable=False, force_writable=False): - self._stream = stream - self._force_readable = force_readable - self._force_writable = force_writable - - def __getattr__(self, name): - return getattr(self._stream, name) - - def read1(self, size): - f = getattr(self._stream, "read1", None) - if f is not None: - return f(size) - # We only dispatch to readline instead of read in Python 2 as we - # do not want cause problems with the different implementation - # of line buffering. - if PY2: - return self._stream.readline(size) - return self._stream.read(size) - - def readable(self): - if self._force_readable: - return True - x = getattr(self._stream, "readable", None) - if x is not None: - return x() - try: - self._stream.read(0) - except Exception: - return False - return True - - def writable(self): - if self._force_writable: - return True - x = getattr(self._stream, "writable", None) - if x is not None: - return x() - try: - self._stream.write("") - except Exception: - try: - self._stream.write(b"") - except Exception: - return False - return True - - def seekable(self): - x = getattr(self._stream, "seekable", None) - if x is not None: - return x() - try: - self._stream.seek(self._stream.tell()) - except Exception: - return False - return True - - -if PY2: - text_type = unicode - raw_input = raw_input - string_types = (str, unicode) - int_types = (int, long) - iteritems = lambda x: x.iteritems() - range_type = xrange - - from pipes import quote as shlex_quote - - def is_bytes(x): - return isinstance(x, (buffer, bytearray)) - - _identifier_re = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*$") - - # For Windows, we need to force stdout/stdin/stderr to binary if it's - # fetched for that. This obviously is not the most correct way to do - # it as it changes global state. Unfortunately, there does not seem to - # be a clear better way to do it as just reopening the file in binary - # mode does not change anything. - # - # An option would be to do what Python 3 does and to open the file as - # binary only, patch it back to the system, and then use a wrapper - # stream that converts newlines. It's not quite clear what's the - # correct option here. - # - # This code also lives in _winconsole for the fallback to the console - # emulation stream. - # - # There are also Windows environments where the `msvcrt` module is not - # available (which is why we use try-catch instead of the WIN variable - # here), such as the Google App Engine development server on Windows. In - # those cases there is just nothing we can do. - def set_binary_mode(f): - return f - - try: - import msvcrt - except ImportError: - pass - else: - - def set_binary_mode(f): - try: - fileno = f.fileno() - except Exception: - pass - else: - msvcrt.setmode(fileno, os.O_BINARY) - return f - - try: - import fcntl - except ImportError: - pass - else: - - def set_binary_mode(f): - try: - fileno = f.fileno() - except Exception: - pass - else: - flags = fcntl.fcntl(fileno, fcntl.F_GETFL) - fcntl.fcntl(fileno, fcntl.F_SETFL, flags & ~os.O_NONBLOCK) - return f - - def isidentifier(x): - return _identifier_re.search(x) is not None - - def get_binary_stdin(): - return set_binary_mode(sys.stdin) - - def get_binary_stdout(): - _wrap_std_stream("stdout") - return set_binary_mode(sys.stdout) - - def get_binary_stderr(): - _wrap_std_stream("stderr") - return set_binary_mode(sys.stderr) - - def get_text_stdin(encoding=None, errors=None): - rv = _get_windows_console_stream(sys.stdin, encoding, errors) - if rv is not None: - return rv - return _make_text_stream(sys.stdin, encoding, errors, force_readable=True) - - def get_text_stdout(encoding=None, errors=None): - _wrap_std_stream("stdout") - rv = _get_windows_console_stream(sys.stdout, encoding, errors) - if rv is not None: - return rv - return _make_text_stream(sys.stdout, encoding, errors, force_writable=True) - - def get_text_stderr(encoding=None, errors=None): - _wrap_std_stream("stderr") - rv = _get_windows_console_stream(sys.stderr, encoding, errors) - if rv is not None: - return rv - return _make_text_stream(sys.stderr, encoding, errors, force_writable=True) - - def filename_to_ui(value): - if isinstance(value, bytes): - value = value.decode(get_filesystem_encoding(), "replace") - return value - - -else: - import io - - text_type = str - raw_input = input - string_types = (str,) - int_types = (int,) - range_type = range - isidentifier = lambda x: x.isidentifier() - iteritems = lambda x: iter(x.items()) - - from shlex import quote as shlex_quote - - def is_bytes(x): - return isinstance(x, (bytes, memoryview, bytearray)) - - def _is_binary_reader(stream, default=False): - 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, default=False): - try: - stream.write(b"") - except Exception: - try: - stream.write("") - return False - except Exception: - pass - return default - return True - - def _find_binary_reader(stream): - # 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 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 buf - - def _find_binary_writer(stream): - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detatching - # 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 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 buf - - def _stream_is_misconfigured(stream): - """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, attr, value): - """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, encoding, errors): - """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, - encoding, - errors, - is_binary, - find_binary, - force_readable=False, - force_writable=False, - ): - if is_binary(text_stream, False): - binary_reader = text_stream - else: - # 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. - binary_reader = find_binary(text_stream) - - # If that's not possible, silently use the original reader - # and get mojibake instead of exceptions. - if binary_reader is None: - return text_stream - - # 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, encoding, errors, force_readable=False): - 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, encoding, errors, force_writable=False): - return _force_correct_text_stream( - text_writer, - encoding, - errors, - _is_binary_writer, - _find_binary_writer, - force_writable=force_writable, - ) - - def get_binary_stdin(): - 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(): - 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(): - 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=None, errors=None): - 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=None, errors=None): - 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=None, errors=None): - 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 filename_to_ui(value): - if isinstance(value, bytes): - value = value.decode(get_filesystem_encoding(), "replace") - else: - value = value.encode("utf-8", "surrogateescape").decode("utf-8", "replace") - return value - - -def get_streerror(e, default=None): - if hasattr(e, "strerror"): - msg = e.strerror - else: - if default is not None: - msg = default - else: - msg = str(e) - if isinstance(msg, bytes): - msg = msg.decode("utf-8", "replace") - return msg - - -def _wrap_io_open(file, mode, encoding, errors): - """On Python 2, :func:`io.open` returns a text file wrapper that - requires passing ``unicode`` to ``write``. Need to open the file in - binary mode then wrap it in a subclass that can write ``str`` and - ``unicode``. - - Also handles not passing ``encoding`` and ``errors`` in binary mode. - """ - binary = "b" in mode - - if binary: - kwargs = {} - else: - kwargs = {"encoding": encoding, "errors": errors} - - if not PY2 or binary: - return io.open(file, mode, **kwargs) - - f = io.open(file, "{}b".format(mode.replace("t", ""))) - return _make_text_stream(f, **kwargs) - - -def open_stream(filename, mode="r", encoding=None, errors="strict", atomic=False): - binary = "b" in mode - - # Standard streams first. These are simple because they don't need - # special handling for the atomic flag. It's entirely ignored. - if 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 = 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), - ".__atomic-write{:08x}".format(random.randrange(1 << 32)), - ) - 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) - return _AtomicFile(f, tmp_filename, os.path.realpath(filename)), True - - -# Used in a destructor call, needs extra protection from interpreter cleanup. -if hasattr(os, "replace"): - _replace = os.replace - _can_replace = True -else: - _replace = os.rename - _can_replace = not WIN - - -class _AtomicFile(object): - def __init__(self, f, tmp_filename, real_filename): - self._f = f - self._tmp_filename = tmp_filename - self._real_filename = real_filename - self.closed = False - - @property - def name(self): - return self._real_filename - - def close(self, delete=False): - if self.closed: - return - self._f.close() - if not _can_replace: - try: - os.remove(self._real_filename) - except OSError: - pass - _replace(self._tmp_filename, self._real_filename) - self.closed = True - - def __getattr__(self, name): - return getattr(self._f, name) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, tb): - self.close(delete=exc_type is not None) - - def __repr__(self): - return repr(self._f) - - -auto_wrap_for_ansi = None -colorama = None -get_winterm_size = None - - -def strip_ansi(value): - return _ansi_re.sub("", value) - - -def _is_jupyter_kernel_output(stream): - if WIN: - # TODO: Couldn't test on Windows, should't try to support until - # someone tests the details wrt colorama. - return - - while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): - stream = stream._stream - - return stream.__class__.__module__.startswith("ipykernel.") - - -def should_strip_ansi(stream=None, color=None): - 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 - - -# If we're on Windows, we provide transparent integration through -# colorama. This will make ANSI colors through the echo function -# work automatically. -if WIN: - # Windows has a smaller terminal - DEFAULT_COLUMNS = 79 - - from ._winconsole import _get_windows_console_stream, _wrap_std_stream - - def _get_argv_encoding(): - import locale - - return locale.getpreferredencoding() - - if PY2: - - def raw_input(prompt=""): - sys.stderr.flush() - if prompt: - stdout = _default_text_stdout() - stdout.write(prompt) - stdin = _default_text_stdin() - return stdin.readline().rstrip("\r\n") - - try: - import colorama - except ImportError: - pass - else: - _ansi_stream_wrappers = WeakKeyDictionary() - - def auto_wrap_for_ansi(stream, color=None): - """This function wraps a stream so that calls through colorama - are issued to the win32 console API to recolor on demand. It - also ensures to reset the colors if a write call is interrupted - to not destroy the console afterwards. - """ - try: - cached = _ansi_stream_wrappers.get(stream) - except Exception: - cached = None - if cached is not None: - return cached - strip = should_strip_ansi(stream, color) - ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) - rv = ansi_wrapper.stream - _write = rv.write - - def _safe_write(s): - try: - return _write(s) - except: - ansi_wrapper.reset_all() - raise - - rv.write = _safe_write - try: - _ansi_stream_wrappers[stream] = rv - except Exception: - pass - return rv - - def get_winterm_size(): - win = colorama.win32.GetConsoleScreenBufferInfo( - colorama.win32.STDOUT - ).srWindow - return win.Right - win.Left, win.Bottom - win.Top - - -else: - - def _get_argv_encoding(): - return getattr(sys.stdin, "encoding", None) or get_filesystem_encoding() - - _get_windows_console_stream = lambda *x: None - _wrap_std_stream = lambda *x: None - - -def term_len(x): - return len(strip_ansi(x)) - - -def isatty(stream): - try: - return stream.isatty() - except Exception: - return False - - -def _make_cached_stream_func(src_func, wrapper_func): - cache = WeakKeyDictionary() - - def func(): - stream = src_func() - try: - rv = cache.get(stream) - except Exception: - rv = None - if rv is not None: - return rv - rv = wrapper_func() - try: - stream = src_func() # In case wrapper_func() modified the stream - 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 = { - "stdin": get_binary_stdin, - "stdout": get_binary_stdout, - "stderr": get_binary_stderr, -} - -text_streams = { - "stdin": get_text_stdin, - "stdout": get_text_stdout, - "stderr": get_text_stderr, -} diff --git a/venv/lib/python3.7/site-packages/click/_termui_impl.py b/venv/lib/python3.7/site-packages/click/_termui_impl.py deleted file mode 100644 index c6e86cc..0000000 --- a/venv/lib/python3.7/site-packages/click/_termui_impl.py +++ /dev/null @@ -1,661 +0,0 @@ -# -*- coding: utf-8 -*- -""" -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 - -from ._compat import _default_text_stdout -from ._compat import CYGWIN -from ._compat import get_best_encoding -from ._compat import int_types -from ._compat import isatty -from ._compat import open_stream -from ._compat import range_type -from ._compat import shlex_quote -from ._compat import strip_ansi -from ._compat import term_len -from ._compat import WIN -from .exceptions import ClickException -from .utils import echo - -if os.name == "nt": - BEFORE_BAR = "\r" - AFTER_BAR = "\n" -else: - BEFORE_BAR = "\r\033[?25l" - AFTER_BAR = "\033[?25h\n" - - -def _length_hint(obj): - """Returns the length hint of an object.""" - try: - return len(obj) - except (AttributeError, TypeError): - try: - get_hint = type(obj).__length_hint__ - except AttributeError: - return None - try: - hint = get_hint(obj) - except TypeError: - return None - if hint is NotImplemented or not isinstance(hint, int_types) or hint < 0: - return None - return hint - - -class ProgressBar(object): - def __init__( - self, - iterable, - length=None, - fill_char="#", - empty_char=" ", - bar_template="%(bar)s", - info_sep=" ", - show_eta=True, - show_percent=None, - show_pos=False, - item_show_func=None, - label=None, - file=None, - color=None, - width=30, - ): - 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.width = width - self.autowidth = width == 0 - - if length is None: - length = _length_hint(iterable) - if iterable is None: - if length is None: - raise TypeError("iterable or length is required") - iterable = range_type(length) - self.iter = iter(iterable) - self.length = length - self.length_known = length is not None - self.pos = 0 - self.avg = [] - self.start = self.last_eta = time.time() - self.eta_known = False - self.finished = False - self.max_width = None - self.entered = False - self.current_item = None - self.is_hidden = not isatty(self.file) - self._last_line = None - self.short_limit = 0.5 - - def __enter__(self): - self.entered = True - self.render_progress() - return self - - def __exit__(self, exc_type, exc_value, tb): - self.render_finish() - - def __iter__(self): - 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): - # 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)) - - # Python 2 compat - next = __next__ - - def is_fast(self): - return time.time() - self.start <= self.short_limit - - def render_finish(self): - if self.is_hidden or self.is_fast(): - return - self.file.write(AFTER_BAR) - self.file.flush() - - @property - def pct(self): - if self.finished: - return 1.0 - return min(self.pos / (float(self.length) or 1), 1.0) - - @property - def time_per_iteration(self): - if not self.avg: - return 0.0 - return sum(self.avg) / float(len(self.avg)) - - @property - def eta(self): - if self.length_known and not self.finished: - return self.time_per_iteration * (self.length - self.pos) - return 0.0 - - def format_eta(self): - 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 "{}d {:02}:{:02}:{:02}".format(t, hours, minutes, seconds) - else: - return "{:02}:{:02}:{:02}".format(hours, minutes, seconds) - return "" - - def format_pos(self): - pos = str(self.pos) - if self.length_known: - pos += "/{}".format(self.length) - return pos - - def format_pct(self): - return "{: 4}%".format(int(self.pct * 100))[1:] - - def format_bar(self): - if self.length_known: - 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: - bar = list(self.empty_char * (self.width or 1)) - if self.time_per_iteration != 0: - bar[ - int( - (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) - * self.width - ) - ] = self.fill_char - bar = "".join(bar) - return bar - - def format_progress_line(self): - show_percent = self.show_percent - - info_bits = [] - if self.length_known 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): - from .termui import get_terminal_size - - if self.is_hidden: - 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, get_terminal_size()[0] - clutter_length) - if new_width < old_width: - buf.append(BEFORE_BAR) - buf.append(" " * self.max_width) - 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 and not self.is_fast(): - self._last_line = line - echo(line, file=self.file, color=self.color, nl=False) - self.file.flush() - - def make_step(self, n_steps): - self.pos += n_steps - if self.length_known 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_known - - def update(self, n_steps): - self.make_step(n_steps) - self.render_progress() - - def finish(self): - self.eta_known = 0 - self.current_item = None - self.finished = True - - def generator(self): - """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: - for rv in self.iter: - yield rv - else: - for rv in self.iter: - self.current_item = rv - yield rv - self.update(1) - self.finish() - self.render_progress() - - -def pager(generator, color=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("more {}".format(shlex_quote(filename))) == 0 - ): - return _pipepager(generator, "more", color) - return _nullpager(stdout, generator, color) - finally: - os.unlink(filename) - - -def _pipepager(generator, cmd, color): - """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 = "{}{}".format(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) - encoding = get_best_encoding(c.stdin) - try: - for text in generator: - if not color: - text = strip_ansi(text) - - c.stdin.write(text.encode(encoding, "replace")) - except (IOError, KeyboardInterrupt): - pass - else: - c.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, cmd, color): - """Page through text by invoking a program on a temporary file.""" - import tempfile - - filename = tempfile.mktemp() - # 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("{} {}".format(shlex_quote(cmd), shlex_quote(filename))) - finally: - os.unlink(filename) - - -def _nullpager(stream, generator, color): - """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(object): - def __init__(self, editor=None, env=None, require_save=True, extension=".txt"): - self.editor = editor - self.env = env - self.require_save = require_save - self.extension = extension - - def get_editor(self): - 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("which {} >/dev/null 2>&1".format(editor)) == 0: - return editor - return "vi" - - def edit_file(self, filename): - import subprocess - - editor = self.get_editor() - if self.env: - environ = os.environ.copy() - environ.update(self.env) - else: - environ = None - try: - c = subprocess.Popen( - "{} {}".format(shlex_quote(editor), shlex_quote(filename)), - env=environ, - shell=True, - ) - exit_code = c.wait() - if exit_code != 0: - raise ClickException("{}: Editing failed!".format(editor)) - except OSError as e: - raise ClickException("{}: Editing failed: {}".format(editor, e)) - - def edit(self, text): - import tempfile - - text = text or "" - if text and not text.endswith("\n"): - text += "\n" - - fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) - try: - if WIN: - encoding = "utf-8-sig" - text = text.replace("\n", "\r\n") - else: - encoding = "utf-8" - text = text.encode(encoding) - - f = os.fdopen(fd, "wb") - f.write(text) - f.close() - timestamp = os.path.getmtime(name) - - self.edit_file(name) - - if self.require_save and os.path.getmtime(name) == timestamp: - return None - - f = open(name, "rb") - try: - rv = f.read() - finally: - f.close() - return rv.decode("utf-8-sig").replace("\r\n", "\n") - finally: - os.unlink(name) - - -def open_url(url, wait=False, locate=False): - import subprocess - - def _unquote_file(url): - try: - import urllib - except ImportError: - import urllib - if url.startswith("file://"): - url = urllib.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) - args = "explorer /select,{}".format(shlex_quote(url)) - else: - args = 'start {} "" {}'.format("/WAIT" if wait else "", shlex_quote(url)) - return os.system(args) - elif CYGWIN: - if locate: - url = _unquote_file(url) - args = "cygstart {}".format(shlex_quote(os.path.dirname(url))) - else: - args = "cygstart {} {}".format("-w" if wait else "", shlex_quote(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): - if ch == u"\x03": - raise KeyboardInterrupt() - if ch == u"\x04" and not WIN: # Unix-like, Ctrl+D - raise EOFError() - if ch == u"\x1a" and WIN: # Windows, Ctrl+Z - raise EOFError() - - -if WIN: - import msvcrt - - @contextlib.contextmanager - def raw_terminal(): - yield - - def getchar(echo): - # 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`. - if echo: - func = msvcrt.getwche - else: - func = msvcrt.getwch - - rv = func() - if rv in (u"\x00", u"\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(): - 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): - with raw_terminal() as fd: - ch = os.read(fd, 32) - ch = ch.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/lib/python3.7/site-packages/click/_textwrap.py b/venv/lib/python3.7/site-packages/click/_textwrap.py deleted file mode 100644 index 6959087..0000000 --- a/venv/lib/python3.7/site-packages/click/_textwrap.py +++ /dev/null @@ -1,37 +0,0 @@ -import textwrap -from contextlib import contextmanager - - -class TextWrapper(textwrap.TextWrapper): - def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width): - 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): - 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): - rv = [] - for idx, line in enumerate(text.splitlines()): - indent = self.initial_indent - if idx > 0: - indent = self.subsequent_indent - rv.append(indent + line) - return "\n".join(rv) diff --git a/venv/lib/python3.7/site-packages/click/_unicodefun.py b/venv/lib/python3.7/site-packages/click/_unicodefun.py deleted file mode 100644 index 781c365..0000000 --- a/venv/lib/python3.7/site-packages/click/_unicodefun.py +++ /dev/null @@ -1,131 +0,0 @@ -import codecs -import os -import sys - -from ._compat import PY2 - - -def _find_unicode_literals_frame(): - import __future__ - - if not hasattr(sys, "_getframe"): # not all Python implementations have it - return 0 - frm = sys._getframe(1) - idx = 1 - while frm is not None: - if frm.f_globals.get("__name__", "").startswith("click."): - frm = frm.f_back - idx += 1 - elif frm.f_code.co_flags & __future__.unicode_literals.compiler_flag: - return idx - else: - break - return 0 - - -def _check_for_unicode_literals(): - if not __debug__: - return - - from . import disable_unicode_literals_warning - - if not PY2 or disable_unicode_literals_warning: - return - bad_frame = _find_unicode_literals_frame() - if bad_frame <= 0: - return - from warnings import warn - - warn( - Warning( - "Click detected the use of the unicode_literals __future__" - " import. This is heavily discouraged because it can" - " introduce subtle bugs in your code. You should instead" - ' use explicit u"" literals for your unicode strings. For' - " more information see" - " https://click.palletsprojects.com/python3/" - ), - stacklevel=bad_frame, - ) - - -def _verify_python3_env(): - """Ensures that the environment is good for unicode on Python 3.""" - if PY2: - return - try: - import locale - - fs_enc = codecs.lookup(locale.getpreferredencoding()).name - except Exception: - fs_enc = "ascii" - if fs_enc != "ascii": - return - - extra = "" - if os.name == "posix": - import subprocess - - try: - rv = subprocess.Popen( - ["locale", "-a"], stdout=subprocess.PIPE, stderr=subprocess.PIPE - ).communicate()[0] - except OSError: - rv = b"" - good_locales = set() - has_c_utf8 = False - - # Make sure we're operating on text here. - if isinstance(rv, bytes): - rv = rv.decode("ascii", "replace") - - for line in rv.splitlines(): - locale = line.strip() - if locale.lower().endswith((".utf-8", ".utf8")): - good_locales.add(locale) - if locale.lower() in ("c.utf8", "c.utf-8"): - has_c_utf8 = True - - extra += "\n\n" - if not good_locales: - extra += ( - "Additional information: on this system no suitable" - " UTF-8 locales were discovered. This most likely" - " requires resolving by reconfiguring the locale" - " system." - ) - elif has_c_utf8: - extra += ( - "This system supports the C.UTF-8 locale which is" - " recommended. You might be able to resolve your issue" - " by exporting the following environment variables:\n\n" - " export LC_ALL=C.UTF-8\n" - " export LANG=C.UTF-8" - ) - else: - extra += ( - "This system lists a couple of UTF-8 supporting locales" - " that you can pick from. The following suitable" - " locales were discovered: {}".format(", ".join(sorted(good_locales))) - ) - - bad_locale = None - for locale in os.environ.get("LC_ALL"), os.environ.get("LANG"): - if locale and locale.lower().endswith((".utf-8", ".utf8")): - bad_locale = locale - if locale is not None: - break - if bad_locale is not None: - extra += ( - "\n\nClick discovered that you exported a UTF-8 locale" - " but the locale system could not pick up from it" - " because it does not exist. The exported locale is" - " '{}' but it is not supported".format(bad_locale) - ) - - raise RuntimeError( - "Click will abort further execution because Python 3 was" - " configured to use ASCII as encoding for the environment." - " Consult https://click.palletsprojects.com/python3/ for" - " mitigation steps.{}".format(extra) - ) diff --git a/venv/lib/python3.7/site-packages/click/_winconsole.py b/venv/lib/python3.7/site-packages/click/_winconsole.py deleted file mode 100644 index b6c4274..0000000 --- a/venv/lib/python3.7/site-packages/click/_winconsole.py +++ /dev/null @@ -1,370 +0,0 @@ -# -*- coding: utf-8 -*- -# 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 prmopt. -import ctypes -import io -import os -import sys -import time -import zlib -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 windll -from ctypes import WinError -from ctypes import WINFUNCTYPE -from ctypes.wintypes import DWORD -from ctypes.wintypes import HANDLE -from ctypes.wintypes import LPCWSTR -from ctypes.wintypes import LPWSTR - -import msvcrt - -from ._compat import _NonClosingTextIOWrapper -from ._compat import PY2 -from ._compat import text_type - -try: - from ctypes import pythonapi - - PyObject_GetBuffer = pythonapi.PyObject_GetBuffer - PyBuffer_Release = pythonapi.PyBuffer_Release -except ImportError: - pythonapi = None - - -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(ctypes.c_void_p, ctypes.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 - - -class Py_buffer(ctypes.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), - ] - - if PY2: - _fields_.insert(-1, ("smalltable", c_ssize_t * 2)) - - -# On PyPy we cannot get buffers so our ability to operate here is -# serverly limited. -if pythonapi is None: - get_buffer = None -else: - - 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): - io.RawIOBase.isatty(self) - 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("Windows error: {}".format(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 "Windows error {}".format(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(object): - def __init__(self, text_stream, byte_stream): - self._text_stream = text_stream - self.buffer = byte_stream - - @property - def name(self): - return self.buffer.name - - def write(self, x): - if isinstance(x, text_type): - return self._text_stream.write(x) - try: - self.flush() - except Exception: - pass - return self.buffer.write(x) - - def writelines(self, lines): - for line in lines: - self.write(line) - - def __getattr__(self, name): - return getattr(self._text_stream, name) - - def isatty(self): - return self.buffer.isatty() - - def __repr__(self): - return "".format( - self.name, self.encoding - ) - - -class WindowsChunkedWriter(object): - """ - Wraps a stream (such as stdout), acting as a transparent proxy for all - attribute access apart from method 'write()' which we wrap to write in - limited chunks due to a Windows limitation on binary console streams. - """ - - def __init__(self, wrapped): - # double-underscore everything to prevent clashes with names of - # attributes on the wrapped stream object. - self.__wrapped = wrapped - - def __getattr__(self, name): - return getattr(self.__wrapped, name) - - def write(self, text): - total_to_write = len(text) - written = 0 - - while written < total_to_write: - to_write = min(total_to_write - written, MAX_BYTES_WRITTEN) - self.__wrapped.write(text[written : written + to_write]) - written += to_write - - -_wrapped_std_streams = set() - - -def _wrap_std_stream(name): - # Python 2 & Windows 7 and below - if ( - PY2 - and sys.getwindowsversion()[:2] <= (6, 1) - and name not in _wrapped_std_streams - ): - setattr(sys, name, WindowsChunkedWriter(getattr(sys, name))) - _wrapped_std_streams.add(name) - - -def _get_text_stdin(buffer_stream): - text_stream = _NonClosingTextIOWrapper( - io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return ConsoleStream(text_stream, buffer_stream) - - -def _get_text_stdout(buffer_stream): - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return ConsoleStream(text_stream, buffer_stream) - - -def _get_text_stderr(buffer_stream): - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return ConsoleStream(text_stream, buffer_stream) - - -if PY2: - - def _hash_py_argv(): - return zlib.crc32("\x00".join(sys.argv[1:])) - - _initial_argv_hash = _hash_py_argv() - - def _get_windows_argv(): - argc = c_int(0) - argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc)) - if not argv_unicode: - raise WinError() - try: - argv = [argv_unicode[i] for i in range(0, argc.value)] - finally: - LocalFree(argv_unicode) - del argv_unicode - - if not hasattr(sys, "frozen"): - argv = argv[1:] - while len(argv) > 0: - arg = argv[0] - if not arg.startswith("-") or arg == "-": - break - argv = argv[1:] - if arg.startswith(("-c", "-m")): - break - - return argv[1:] - - -_stream_factories = { - 0: _get_text_stdin, - 1: _get_text_stdout, - 2: _get_text_stderr, -} - - -def _is_console(f): - if not hasattr(f, "fileno"): - return False - - try: - fileno = f.fileno() - except OSError: - return False - - handle = msvcrt.get_osfhandle(fileno) - return bool(GetConsoleMode(handle, byref(DWORD()))) - - -def _get_windows_console_stream(f, encoding, errors): - 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: - if not PY2: - f = getattr(f, "buffer", None) - if f is None: - return None - else: - # If we are on Python 2 we need to set the stream that we - # deal with to binary mode as otherwise the exercise if a - # bit moot. The same problems apply as for - # get_binary_stdin and friends from _compat. - msvcrt.setmode(f.fileno(), os.O_BINARY) - return func(f) diff --git a/venv/lib/python3.7/site-packages/click/core.py b/venv/lib/python3.7/site-packages/click/core.py deleted file mode 100644 index f58bf26..0000000 --- a/venv/lib/python3.7/site-packages/click/core.py +++ /dev/null @@ -1,2030 +0,0 @@ -import errno -import inspect -import os -import sys -from contextlib import contextmanager -from functools import update_wrapper -from itertools import repeat - -from ._compat import isidentifier -from ._compat import iteritems -from ._compat import PY2 -from ._compat import string_types -from ._unicodefun import _check_for_unicode_literals -from ._unicodefun import _verify_python3_env -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 OptionParser -from .parser import split_opt -from .termui import confirm -from .termui import prompt -from .termui import style -from .types import BOOL -from .types import convert_type -from .types import IntRange -from .utils import echo -from .utils import get_os_args -from .utils import make_default_short_help -from .utils import make_str -from .utils import PacifyFlushWrapper - -_missing = object() - -SUBCOMMAND_METAVAR = "COMMAND [ARGS]..." -SUBCOMMANDS_METAVAR = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." - -DEPRECATED_HELP_NOTICE = " (DEPRECATED)" -DEPRECATED_INVOKE_NOTICE = "DeprecationWarning: The command %(name)s is deprecated." - - -def _maybe_show_deprecated_notice(cmd): - if cmd.deprecated: - echo(style(DEPRECATED_INVOKE_NOTICE % {"name": cmd.name}, fg="red"), err=True) - - -def fast_exit(code): - """Exit without garbage collection, this speeds up exit by about 10ms for - things like bash completion. - """ - sys.stdout.flush() - sys.stderr.flush() - os._exit(code) - - -def _bashcomplete(cmd, prog_name, complete_var=None): - """Internal handler for the bash completion support.""" - if complete_var is None: - complete_var = "_{}_COMPLETE".format(prog_name.replace("-", "_").upper()) - complete_instr = os.environ.get(complete_var) - if not complete_instr: - return - - from ._bashcomplete import bashcomplete - - if bashcomplete(cmd, prog_name, complete_var, complete_instr): - fast_exit(1) - - -def _check_multicommand(base_command, cmd_name, cmd, register=False): - 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( - "{}. Command '{}' is set to chain and '{}' was added as" - " subcommand but it in itself is a multi command. ('{}' is a {}" - " within a chained {} named '{}').".format( - hint, - base_command.name, - cmd_name, - cmd_name, - cmd.__class__.__name__, - base_command.__class__.__name__, - base_command.name, - ) - ) - - -def batch(iterable, batch_size): - return list(zip(*repeat(iter(iterable), batch_size))) - - -def invoke_param_callback(callback, ctx, param, value): - code = getattr(callback, "__code__", None) - args = getattr(code, "co_argcount", 3) - - if args < 3: - from warnings import warn - - warn( - "Parameter callbacks take 3 args, (ctx, param, value). The" - " 2-arg style is deprecated and will be removed in 8.0.".format(callback), - DeprecationWarning, - stacklevel=3, - ) - return callback(ctx, value) - - return callback(ctx, param, value) - - -@contextmanager -def augment_usage_errors(ctx, param=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, declaration_order): - """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): - try: - idx = invocation_order.index(item) - except ValueError: - idx = float("inf") - return (not item.is_eager, idx) - - return sorted(declaration_order, key=sort_key) - - -class Context(object): - """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. - - .. versionadded:: 2.0 - Added the `resilient_parsing`, `help_option_names`, - `token_normalize_func` parameters. - - .. versionadded:: 3.0 - Added the `allow_extra_args` and `allow_interspersed_args` - parameters. - - .. versionadded:: 4.0 - Added the `color`, `ignore_unknown_options`, and - `max_content_width` parameters. - - .. versionadded:: 7.1 - Added the `show_default` parameter. - - :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: if True, shows defaults for all options. - Even if an option is later created with show_default=False, - this command-level setting overrides it. - """ - - def __init__( - self, - command, - parent=None, - info_name=None, - obj=None, - auto_envvar_prefix=None, - default_map=None, - terminal_width=None, - max_content_width=None, - resilient_parsing=False, - allow_extra_args=None, - allow_interspersed_args=None, - ignore_unknown_options=None, - help_option_names=None, - token_normalize_func=None, - color=None, - show_default=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 - #: the parsed parameters except if the value is hidden in which - #: case it's not remembered. - self.params = {} - #: the leftover arguments. - self.args = [] - #: 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 = [] - if obj is None and parent is not None: - obj = parent.obj - #: the user object stored. - self.obj = obj - self._meta = getattr(parent, "meta", {}) - - #: A dictionary (-like object) with defaults for parameters. - if ( - default_map is None - and parent is not None - and parent.default_map is not None - ): - default_map = parent.default_map.get(info_name) - self.default_map = 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:`resultcallback`. - self.invoked_subcommand = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = "{}_{}".format( - 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 = 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 = color - - self.show_default = show_default - - self._close_callbacks = [] - self._depth = 0 - - def __enter__(self): - self._depth += 1 - push_context(self) - return self - - def __exit__(self, exc_type, exc_value, tb): - self._depth -= 1 - if self._depth == 0: - self.close() - pop_context() - - @contextmanager - def scope(self, cleanup=True): - """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): - """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): - """Creates the formatter for the help and usage output.""" - return HelpFormatter( - width=self.terminal_width, max_width=self.max_content_width - ) - - def call_on_close(self, f): - """This decorator remembers a function as callback that should be - executed when the context tears down. This is most useful to bind - resource handling to the script execution. For instance, file objects - opened by the :class:`File` type will register their close callbacks - here. - - :param f: the function to execute on teardown. - """ - self._close_callbacks.append(f) - return f - - def close(self): - """Invokes all close callbacks.""" - for cb in self._close_callbacks: - cb() - self._close_callbacks = [] - - @property - def command_path(self): - """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: - rv = "{} {}".format(self.parent.command_path, rv) - return rv.lstrip() - - def find_root(self): - """Finds the outermost context.""" - node = self - while node.parent is not None: - node = node.parent - return node - - def find_object(self, object_type): - """Finds the closest object of a given type.""" - node = self - while node is not None: - if isinstance(node.obj, object_type): - return node.obj - node = node.parent - - def ensure_object(self, object_type): - """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 - - def lookup_default(self, name): - """Looks up the default for a parameter name. This by default - looks into the :attr:`default_map` if available. - """ - if self.default_map is not None: - rv = self.default_map.get(name) - if callable(rv): - rv = rv() - return rv - - def fail(self, message): - """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): - """Aborts the script.""" - raise Abort() - - def exit(self, code=0): - """Exits the application with a given exit code.""" - raise Exit(code) - - def get_usage(self): - """Helper method to get formatted usage string for the current - context and command. - """ - return self.command.get_usage(self) - - def get_help(self): - """Helper method to get formatted help page for the current - context and command. - """ - return self.command.get_help(self) - - def invoke(*args, **kwargs): # noqa: B902 - """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`. - """ - self, callback = args[:2] - ctx = self - - # It's also possible to invoke another command which might or - # might not have a callback. In that case we also fill - # in defaults and make a new context for this command. - if isinstance(callback, Command): - other_cmd = callback - callback = other_cmd.callback - ctx = Context(other_cmd, info_name=other_cmd.name, parent=self) - if callback is None: - raise TypeError( - "The given command does not have a callback that can be invoked." - ) - - for param in other_cmd.params: - if param.name not in kwargs and param.expose_value: - kwargs[param.name] = param.get_default(ctx) - - args = args[2:] - with augment_usage_errors(self): - with ctx: - return callback(*args, **kwargs) - - def forward(*args, **kwargs): # noqa: B902 - """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. - """ - self, cmd = args[:2] - - # It's also possible to invoke another command which might or - # might not have a callback. - 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, **kwargs) - - -class BaseCommand(object): - """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 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, context_settings=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 = context_settings - - def __repr__(self): - return "<{} {}>".format(self.__class__.__name__, self.name) - - def get_usage(self, ctx): - raise NotImplementedError("Base commands cannot get usage") - - def get_help(self, ctx): - raise NotImplementedError("Base commands cannot get help") - - def make_context(self, info_name, args, parent=None, **extra): - """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. - - :param info_name: the info name for this invokation. 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 script. - :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. - """ - for key, value in iteritems(self.context_settings): - if key not in extra: - extra[key] = value - ctx = Context(self, info_name=info_name, parent=parent, **extra) - with ctx.scope(cleanup=False): - self.parse_args(ctx, args) - return ctx - - def parse_args(self, ctx, args): - """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): - """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 main( - self, - args=None, - prog_name=None, - complete_var=None, - standalone_mode=True, - **extra - ): - """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`. - - .. versionadded:: 3.0 - Added the `standalone_mode` flag to control the standalone mode. - - :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 extra: extra keyword arguments are forwarded to the context - constructor. See :class:`Context` for more information. - """ - # If we are in Python 3, we will verify that the environment is - # sane at this point or reject further execution to avoid a - # broken script. - if not PY2: - _verify_python3_env() - else: - _check_for_unicode_literals() - - if args is None: - args = get_os_args() - else: - args = list(args) - - if prog_name is None: - prog_name = make_str( - os.path.basename(sys.argv[0] if sys.argv else __file__) - ) - - # Hook for the Bash completion. This only activates if the Bash - # completion is actually enabled, otherwise this is quite a fast - # noop. - _bashcomplete(self, 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() - except ClickException as e: - if not standalone_mode: - raise - e.show() - sys.exit(e.exit_code) - except IOError as e: - if e.errno == errno.EPIPE: - sys.stdout = PacifyFlushWrapper(sys.stdout) - sys.stderr = 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 __call__(self, *args, **kwargs): - """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. - - .. versionchanged:: 2.0 - Added the `context_settings` parameter. - .. versionchanged:: 7.1 - Added the `no_args_is_help` 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. - :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. - """ - - def __init__( - self, - name, - context_settings=None, - callback=None, - params=None, - help=None, - epilog=None, - short_help=None, - options_metavar="[OPTIONS]", - add_help_option=True, - no_args_is_help=False, - hidden=False, - deprecated=False, - ): - BaseCommand.__init__(self, 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 = params or [] - # if a form feed (page break) is found in the help text, truncate help - # text to the content preceding the first form feed - if help and "\f" in help: - help = help.split("\f", 1)[0] - 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 get_usage(self, ctx): - """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): - 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, formatter): - """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): - """Returns all the pieces that go into the usage line and returns - it as a list of strings. - """ - rv = [self.options_metavar] - for param in self.get_params(ctx): - rv.extend(param.get_usage_pieces(ctx)) - return rv - - def get_help_option_names(self, ctx): - """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 all_names - - def get_help_option(self, ctx): - """Returns the help option object.""" - help_options = self.get_help_option_names(ctx) - if not help_options or not self.add_help_option: - return - - def show_help(ctx, param, value): - 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): - """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): - """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=45): - """Gets short help for the command or makes it by shortening the - long help string. - """ - return ( - self.short_help - or self.help - and make_default_short_help(self.help, limit) - or "" - ) - - def format_help(self, ctx, formatter): - """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, formatter): - """Writes the help text to the formatter if it exists.""" - if self.help: - formatter.write_paragraph() - with formatter.indentation(): - help_text = self.help - if self.deprecated: - help_text += DEPRECATED_HELP_NOTICE - formatter.write_text(help_text) - elif self.deprecated: - formatter.write_paragraph() - with formatter.indentation(): - formatter.write_text(DEPRECATED_HELP_NOTICE) - - def format_options(self, ctx, formatter): - """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, formatter): - """Writes the epilog into the formatter if it exists.""" - if self.epilog: - formatter.write_paragraph() - with formatter.indentation(): - formatter.write_text(self.epilog) - - def parse_args(self, ctx, args): - 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( - "Got unexpected extra argument{} ({})".format( - "s" if len(args) != 1 else "", " ".join(map(make_str, args)) - ) - ) - - ctx.args = args - return args - - def invoke(self, ctx): - """Given a context, this invokes the attached callback (if it exists) - in the right way. - """ - _maybe_show_deprecated_notice(self) - if self.callback is not None: - return ctx.invoke(self.callback, **ctx.params) - - -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. - """ - - allow_extra_args = True - allow_interspersed_args = False - - def __init__( - self, - name=None, - invoke_without_command=False, - no_args_is_help=None, - subcommand_metavar=None, - chain=False, - result_callback=None, - **attrs - ): - Command.__init__(self, 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 = SUBCOMMANDS_METAVAR - else: - subcommand_metavar = SUBCOMMAND_METAVAR - self.subcommand_metavar = subcommand_metavar - self.chain = chain - #: The result callback that is stored. This can be set or - #: overridden with the :func:`resultcallback` 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 collect_usage_pieces(self, ctx): - rv = Command.collect_usage_pieces(self, ctx) - rv.append(self.subcommand_metavar) - return rv - - def format_options(self, ctx, formatter): - Command.format_options(self, ctx, formatter) - self.format_commands(ctx, formatter) - - def resultcallback(self, replace=False): - """Adds a result callback to the chain 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.resultcallback() - def process_result(result, input): - return result + input - - .. versionadded:: 3.0 - - :param replace: if set to `True` an already existing result - callback will be removed. - """ - - def decorator(f): - old_callback = self.result_callback - if old_callback is None or replace: - self.result_callback = f - return f - - def function(__value, *args, **kwargs): - return f(old_callback(__value, *args, **kwargs), *args, **kwargs) - - self.result_callback = rv = update_wrapper(function, f) - return rv - - return decorator - - def format_commands(self, ctx, formatter): - """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, args): - if not args and self.no_args_is_help and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - rest = Command.parse_args(self, 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): - def _process_result(value): - if self.result_callback is not None: - value = ctx.invoke(self.result_callback, value, **ctx.params) - return value - - if not ctx.protected_args: - # If we are invoked without command the chain flag controls - # how this happens. If we are not in chain mode, the return - # value here is the return value of the command. - # If however we are in chain mode, the return value is the - # return value of the result processor invoked with an empty - # list (which means that no subcommand actually was executed). - if self.invoke_without_command: - if not self.chain: - return Command.invoke(self, ctx) - with ctx: - Command.invoke(self, ctx) - return _process_result([]) - 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) - ctx.invoked_subcommand = cmd_name - Command.invoke(self, 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 - Command.invoke(self, 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) - 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, args): - 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 '{}'.".format(original_cmd_name)) - - return cmd_name, cmd, args[1:] - - def get_command(self, ctx, cmd_name): - """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): - """Returns a list of subcommand names in the order they should - appear. - """ - return [] - - -class Group(MultiCommand): - """A group allows a command to have subcommands attached. This is the - most common way to implement nesting in Click. - - :param commands: a dictionary of commands. - """ - - def __init__(self, name=None, commands=None, **attrs): - MultiCommand.__init__(self, name, **attrs) - #: the registered subcommands by their exported names. - self.commands = commands or {} - - def add_command(self, cmd, name=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 - - def command(self, *args, **kwargs): - """A shortcut decorator for declaring and attaching a command to - the group. This takes the same arguments as :func:`command` but - immediately registers the created command with this instance by - calling into :meth:`add_command`. - """ - from .decorators import command - - def decorator(f): - cmd = command(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - return decorator - - def group(self, *args, **kwargs): - """A shortcut decorator for declaring and attaching a group to - the group. This takes the same arguments as :func:`group` but - immediately registers the created command with this instance by - calling into :meth:`add_command`. - """ - from .decorators import group - - def decorator(f): - cmd = group(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - return decorator - - def get_command(self, ctx, cmd_name): - return self.commands.get(cmd_name) - - def list_commands(self, ctx): - 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=None, sources=None, **attrs): - MultiCommand.__init__(self, name, **attrs) - #: The list of registered multi commands. - self.sources = sources or [] - - def add_source(self, multi_cmd): - """Adds a new multi command to the chain dispatcher.""" - self.sources.append(multi_cmd) - - def get_command(self, ctx, cmd_name): - 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 - - def list_commands(self, ctx): - rv = set() - for source in self.sources: - rv.update(source.list_commands(ctx)) - return sorted(rv) - - -class Parameter(object): - 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 callback that should be executed after the parameter - was matched. This is called as ``fn(ctx, param, - value)`` and needs to return the value. - :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). - :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. - - .. 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=None, - type=None, - required=False, - default=None, - callback=None, - nargs=None, - metavar=None, - expose_value=True, - is_eager=False, - envvar=None, - autocompletion=None, - ): - self.name, self.opts, self.secondary_opts = self._parse_decls( - param_decls or (), expose_value - ) - - self.type = 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 = False - self.expose_value = expose_value - self.default = default - self.is_eager = is_eager - self.metavar = metavar - self.envvar = envvar - self.autocompletion = autocompletion - - def __repr__(self): - return "<{} {}>".format(self.__class__.__name__, self.name) - - @property - def human_readable_name(self): - """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 - - def make_metavar(self): - 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 - - def get_default(self, ctx): - """Given a context variable this calculates the default value.""" - # Otherwise go with the regular default. - if callable(self.default): - rv = self.default() - else: - rv = self.default - return self.type_cast_value(ctx, rv) - - def add_to_parser(self, parser, ctx): - pass - - def consume_value(self, ctx, opts): - value = opts.get(self.name) - if value is None: - value = self.value_from_envvar(ctx) - if value is None: - value = ctx.lookup_default(self.name) - return value - - def type_cast_value(self, ctx, value): - """Given a value this runs it properly through the type system. - This automatically handles things like `nargs` and `multiple` as - well as composite types. - """ - if self.type.is_composite: - if self.nargs <= 1: - raise TypeError( - "Attempted to invoke composite type but nargs has" - " been set to {}. This is not supported; nargs" - " needs to be set to a fixed value > 1.".format(self.nargs) - ) - if self.multiple: - return tuple(self.type(x or (), self, ctx) for x in value or ()) - return self.type(value or (), self, ctx) - - def _convert(value, level): - if level == 0: - return self.type(value, self, ctx) - return tuple(_convert(x, level - 1) for x in value or ()) - - return _convert(value, (self.nargs != 1) + bool(self.multiple)) - - def process_value(self, ctx, value): - """Given a value and context this runs the logic to convert the - value as necessary. - """ - # If the value we were given is None we do nothing. This way - # code that calls this can easily figure out if something was - # not provided. Otherwise it would be converted into an empty - # tuple for multiple invocations which is inconvenient. - if value is not None: - return self.type_cast_value(ctx, value) - - def value_is_missing(self, value): - if value is None: - return True - if (self.nargs != 1 or self.multiple) and value == (): - return True - return False - - def full_process_value(self, ctx, value): - value = self.process_value(ctx, value) - - if value is None and not ctx.resilient_parsing: - value = self.get_default(ctx) - - if self.required and self.value_is_missing(value): - raise MissingParameter(ctx=ctx, param=self) - - return value - - def resolve_envvar_value(self, ctx): - if self.envvar is None: - return - if isinstance(self.envvar, (tuple, list)): - for envvar in self.envvar: - rv = os.environ.get(envvar) - if rv is not None: - return rv - else: - rv = os.environ.get(self.envvar) - - if rv != "": - return rv - - def value_from_envvar(self, ctx): - rv = 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, opts, args): - with augment_usage_errors(ctx, param=self): - value = self.consume_value(ctx, opts) - try: - value = self.full_process_value(ctx, value) - except Exception: - if not ctx.resilient_parsing: - raise - value = None - if self.callback is not None: - try: - value = invoke_param_callback(self.callback, ctx, self, value) - except Exception: - if not ctx.resilient_parsing: - raise - - if self.expose_value: - ctx.params[self.name] = value - return value, args - - def get_help_record(self, ctx): - pass - - def get_usage_pieces(self, ctx): - return [] - - def get_error_hint(self, ctx): - """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(repr(x) for x in hint_list) - - -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: controls if the default value should be shown on the - help page. Normally, defaults are not shown. If this - value is a string, it shows the string instead of the - value. This is particularly useful for dynamic options. - :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: if set then the value will need to be confirmed - if it was prompted for. - :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. - """ - - param_type_name = "option" - - def __init__( - self, - param_decls=None, - show_default=False, - prompt=False, - confirmation_prompt=False, - hide_input=False, - is_flag=None, - flag_value=None, - multiple=False, - count=False, - allow_from_autoenv=True, - type=None, - help=None, - hidden=False, - show_choices=True, - show_envvar=False, - **attrs - ): - default_is_missing = attrs.get("default", _missing) is _missing - Parameter.__init__(self, param_decls, type=type, **attrs) - - if prompt is True: - prompt_text = 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.hide_input = hide_input - self.hidden = hidden - - # Flags - if is_flag is None: - if flag_value is not None: - is_flag = True - else: - is_flag = bool(self.secondary_opts) - if is_flag and default_is_missing: - self.default = False - if flag_value is None: - flag_value = not self.default - self.is_flag = is_flag - self.flag_value = flag_value - if self.is_flag and isinstance(self.flag_value, bool) and type in [None, bool]: - self.type = BOOL - self.is_bool_flag = True - else: - self.is_bool_flag = False - - # Counting - self.count = count - if count: - if type is None: - self.type = IntRange(min=0) - if default_is_missing: - self.default = 0 - - self.multiple = multiple - 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 - - # Sanity check for stuff we don't support - if __debug__: - if self.nargs < 0: - raise TypeError("Options cannot have nargs < 0") - if self.prompt and self.is_flag and not self.is_bool_flag: - raise TypeError("Cannot prompt for flags that are not bools.") - if not self.is_bool_flag and self.secondary_opts: - raise TypeError("Got secondary option for non boolean flag.") - if self.is_bool_flag and self.hide_input and self.prompt is not None: - raise TypeError("Hidden input does not work with boolean flag prompts.") - if self.count: - if self.multiple: - raise TypeError( - "Options cannot be multiple and count at the same time." - ) - elif self.is_flag: - raise TypeError( - "Options cannot be count and flags at the same time." - ) - - def _parse_decls(self, decls, expose_value): - opts = [] - secondary_opts = [] - name = None - possible_names = [] - - for decl in decls: - if isidentifier(decl): - if name is not None: - raise TypeError("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()) - 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 isidentifier(name): - 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( - "No options defined but a name was passed ({}). Did you" - " mean to declare an argument instead of an option?".format(name) - ) - - return name, opts, secondary_opts - - def add_to_parser(self, parser, ctx): - kwargs = { - "dest": self.name, - "nargs": self.nargs, - "obj": self, - } - - if self.multiple: - action = "append" - elif self.count: - action = "count" - else: - action = "store" - - if self.is_flag: - kwargs.pop("nargs", None) - action_const = "{}_const".format(action) - if self.is_bool_flag and self.secondary_opts: - parser.add_option(self.opts, action=action_const, const=True, **kwargs) - parser.add_option( - self.secondary_opts, action=action_const, const=False, **kwargs - ) - else: - parser.add_option( - self.opts, action=action_const, const=self.flag_value, **kwargs - ) - else: - kwargs["action"] = action - parser.add_option(self.opts, **kwargs) - - def get_help_record(self, ctx): - if self.hidden: - return - any_prefix_is_slash = [] - - def _write_opts(opts): - rv, any_slashes = join_options(opts) - if any_slashes: - any_prefix_is_slash[:] = [True] - if not self.is_flag and not self.count: - rv += " {}".format(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: - envvar = "{}_{}".format(ctx.auto_envvar_prefix, self.name.upper()) - if envvar is not None: - extra.append( - "env var: {}".format( - ", ".join(str(d) for d in envvar) - if isinstance(envvar, (list, tuple)) - else envvar - ) - ) - if self.default is not None and (self.show_default or ctx.show_default): - if isinstance(self.show_default, string_types): - default_string = "({})".format(self.show_default) - elif isinstance(self.default, (list, tuple)): - default_string = ", ".join(str(d) for d in self.default) - elif inspect.isfunction(self.default): - default_string = "(dynamic)" - else: - default_string = self.default - extra.append("default: {}".format(default_string)) - - if self.required: - extra.append("required") - if extra: - help = "{}[{}]".format( - "{} ".format(help) if help else "", "; ".join(extra) - ) - - return ("; " if any_prefix_is_slash else " / ").join(rv), help - - def get_default(self, ctx): - # 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 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 - return None - return Parameter.get_default(self, ctx) - - def prompt_for_value(self, ctx): - """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. - """ - # 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): - rv = Parameter.resolve_envvar_value(self, ctx) - if rv is not None: - return rv - if self.allow_from_autoenv and ctx.auto_envvar_prefix is not None: - envvar = "{}_{}".format(ctx.auto_envvar_prefix, self.name.upper()) - return os.environ.get(envvar) - - def value_from_envvar(self, ctx): - rv = self.resolve_envvar_value(ctx) - if rv is None: - return None - value_depth = (self.nargs != 1) + bool(self.multiple) - if value_depth > 0 and rv is not None: - rv = self.type.split_envvar_value(rv) - if self.multiple and self.nargs != 1: - rv = batch(rv, self.nargs) - return rv - - def full_process_value(self, ctx, value): - if value is None and self.prompt is not None and not ctx.resilient_parsing: - return self.prompt_for_value(ctx) - return Parameter.full_process_value(self, ctx, value) - - -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, required=None, **attrs): - if required is None: - if attrs.get("default") is not None: - required = False - else: - required = attrs.get("nargs", 1) > 0 - Parameter.__init__(self, param_decls, required=required, **attrs) - if self.default is not None and self.nargs < 0: - raise TypeError( - "nargs=-1 in combination with a default value is not supported." - ) - - @property - def human_readable_name(self): - if self.metavar is not None: - return self.metavar - return self.name.upper() - - def make_metavar(self): - if self.metavar is not None: - return self.metavar - var = self.type.get_metavar(self) - if not var: - var = self.name.upper() - if not self.required: - var = "[{}]".format(var) - if self.nargs != 1: - var += "..." - return var - - def _parse_decls(self, decls, expose_value): - 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" - " {}".format(len(decls)) - ) - return name, [arg], [] - - def get_usage_pieces(self, ctx): - return [self.make_metavar()] - - def get_error_hint(self, ctx): - return repr(self.make_metavar()) - - def add_to_parser(self, parser, ctx): - parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) diff --git a/venv/lib/python3.7/site-packages/click/decorators.py b/venv/lib/python3.7/site-packages/click/decorators.py deleted file mode 100644 index c7b5af6..0000000 --- a/venv/lib/python3.7/site-packages/click/decorators.py +++ /dev/null @@ -1,333 +0,0 @@ -import inspect -import sys -from functools import update_wrapper - -from ._compat import iteritems -from ._unicodefun import _check_for_unicode_literals -from .core import Argument -from .core import Command -from .core import Group -from .core import Option -from .globals import get_current_context -from .utils import echo - - -def pass_context(f): - """Marks a callback as wanting to receive the current context - object as first argument. - """ - - def new_func(*args, **kwargs): - return f(get_current_context(), *args, **kwargs) - - return update_wrapper(new_func, f) - - -def pass_obj(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): - return f(get_current_context().obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - -def make_pass_decorator(object_type, ensure=False): - """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): - def new_func(*args, **kwargs): - 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" - " object of type '{}' existing".format(object_type.__name__) - ) - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - return decorator - - -def _make_command(f, name, attrs, cls): - if isinstance(f, Command): - raise TypeError("Attempted to convert a callback into a command twice.") - try: - params = f.__click_params__ - params.reverse() - del f.__click_params__ - except AttributeError: - params = [] - help = attrs.get("help") - if help is None: - help = inspect.getdoc(f) - if isinstance(help, bytes): - help = help.decode("utf-8") - else: - help = inspect.cleandoc(help) - attrs["help"] = help - _check_for_unicode_literals() - return cls( - name=name or f.__name__.lower().replace("_", "-"), - callback=f, - params=params, - **attrs - ) - - -def command(name=None, cls=None, **attrs): - 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. - - 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`. - """ - if cls is None: - cls = Command - - def decorator(f): - cmd = _make_command(f, name, attrs, cls) - cmd.__doc__ = f.__doc__ - return cmd - - return decorator - - -def group(name=None, **attrs): - """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`. - """ - attrs.setdefault("cls", Group) - return command(name, **attrs) - - -def _param_memo(f, param): - if isinstance(f, Command): - f.params.append(param) - else: - if not hasattr(f, "__click_params__"): - f.__click_params__ = [] - f.__click_params__.append(param) - - -def argument(*param_decls, **attrs): - """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): - ArgumentClass = attrs.pop("cls", Argument) - _param_memo(f, ArgumentClass(param_decls, **attrs)) - return f - - return decorator - - -def option(*param_decls, **attrs): - """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): - # Issue 926, copy attrs, so pre-defined options can re-use the same cls= - option_attrs = attrs.copy() - - if "help" in option_attrs: - option_attrs["help"] = inspect.cleandoc(option_attrs["help"]) - OptionClass = option_attrs.pop("cls", Option) - _param_memo(f, OptionClass(param_decls, **option_attrs)) - return f - - return decorator - - -def confirmation_option(*param_decls, **attrs): - """Shortcut for confirmation prompts that can be ignored by passing - ``--yes`` as parameter. - - This is equivalent to decorating a function with :func:`option` with - the following parameters:: - - def callback(ctx, param, value): - if not value: - ctx.abort() - - @click.command() - @click.option('--yes', is_flag=True, callback=callback, - expose_value=False, prompt='Do you want to continue?') - def dropdb(): - pass - """ - - def decorator(f): - def callback(ctx, param, value): - if not value: - ctx.abort() - - attrs.setdefault("is_flag", True) - attrs.setdefault("callback", callback) - attrs.setdefault("expose_value", False) - attrs.setdefault("prompt", "Do you want to continue?") - attrs.setdefault("help", "Confirm the action without prompting.") - return option(*(param_decls or ("--yes",)), **attrs)(f) - - return decorator - - -def password_option(*param_decls, **attrs): - """Shortcut for password prompts. - - This is equivalent to decorating a function with :func:`option` with - the following parameters:: - - @click.command() - @click.option('--password', prompt=True, confirmation_prompt=True, - hide_input=True) - def changeadmin(password): - pass - """ - - def decorator(f): - attrs.setdefault("prompt", True) - attrs.setdefault("confirmation_prompt", True) - attrs.setdefault("hide_input", True) - return option(*(param_decls or ("--password",)), **attrs)(f) - - return decorator - - -def version_option(version=None, *param_decls, **attrs): - """Adds a ``--version`` option which immediately ends the program - printing out the version number. This is implemented as an eager - option that prints the version and exits the program in the callback. - - :param version: the version number to show. If not provided Click - attempts an auto discovery via setuptools. - :param prog_name: the name of the program (defaults to autodetection) - :param message: custom message to show instead of the default - (``'%(prog)s, version %(version)s'``) - :param others: everything else is forwarded to :func:`option`. - """ - if version is None: - if hasattr(sys, "_getframe"): - module = sys._getframe(1).f_globals.get("__name__") - else: - module = "" - - def decorator(f): - prog_name = attrs.pop("prog_name", None) - message = attrs.pop("message", "%(prog)s, version %(version)s") - - def callback(ctx, param, value): - if not value or ctx.resilient_parsing: - return - prog = prog_name - if prog is None: - prog = ctx.find_root().info_name - ver = version - if ver is None: - try: - import pkg_resources - except ImportError: - pass - else: - for dist in pkg_resources.working_set: - scripts = dist.get_entry_map().get("console_scripts") or {} - for _, entry_point in iteritems(scripts): - if entry_point.module_name == module: - ver = dist.version - break - if ver is None: - raise RuntimeError("Could not determine version") - echo(message % {"prog": prog, "version": ver}, color=ctx.color) - ctx.exit() - - attrs.setdefault("is_flag", True) - attrs.setdefault("expose_value", False) - attrs.setdefault("is_eager", True) - attrs.setdefault("help", "Show the version and exit.") - attrs["callback"] = callback - return option(*(param_decls or ("--version",)), **attrs)(f) - - return decorator - - -def help_option(*param_decls, **attrs): - """Adds a ``--help`` option which immediately ends the program - printing out the help page. This is usually unnecessary to add as - this is added by default to all commands unless suppressed. - - Like :func:`version_option`, this is implemented as eager option that - prints in the callback and exits. - - All arguments are forwarded to :func:`option`. - """ - - def decorator(f): - def callback(ctx, param, value): - if value and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - attrs.setdefault("is_flag", True) - attrs.setdefault("expose_value", False) - attrs.setdefault("help", "Show this message and exit.") - attrs.setdefault("is_eager", True) - attrs["callback"] = callback - return option(*(param_decls or ("--help",)), **attrs)(f) - - return decorator diff --git a/venv/lib/python3.7/site-packages/click/exceptions.py b/venv/lib/python3.7/site-packages/click/exceptions.py deleted file mode 100644 index 592ee38..0000000 --- a/venv/lib/python3.7/site-packages/click/exceptions.py +++ /dev/null @@ -1,253 +0,0 @@ -from ._compat import filename_to_ui -from ._compat import get_text_stderr -from ._compat import PY2 -from .utils import echo - - -def _join_param_hints(param_hint): - if isinstance(param_hint, (tuple, list)): - 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): - ctor_msg = message - if PY2: - if ctor_msg is not None: - ctor_msg = ctor_msg.encode("utf-8") - Exception.__init__(self, ctor_msg) - self.message = message - - def format_message(self): - return self.message - - def __str__(self): - return self.message - - if PY2: - __unicode__ = __str__ - - def __str__(self): - return self.message.encode("utf-8") - - def show(self, file=None): - if file is None: - file = get_text_stderr() - echo("Error: {}".format(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, ctx=None): - ClickException.__init__(self, message) - self.ctx = ctx - self.cmd = self.ctx.command if self.ctx else None - - def show(self, file=None): - if file is None: - file = get_text_stderr() - color = None - hint = "" - if self.cmd is not None and self.cmd.get_help_option(self.ctx) is not None: - hint = "Try '{} {}' for help.\n".format( - self.ctx.command_path, self.ctx.help_option_names[0] - ) - if self.ctx is not None: - color = self.ctx.color - echo("{}\n{}".format(self.ctx.get_usage(), hint), file=file, color=color) - echo("Error: {}".format(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, ctx=None, param=None, param_hint=None): - UsageError.__init__(self, message, ctx) - self.param = param - self.param_hint = param_hint - - def format_message(self): - 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) - else: - return "Invalid value: {}".format(self.message) - param_hint = _join_param_hints(param_hint) - - return "Invalid value for {}: {}".format(param_hint, 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=None, ctx=None, param=None, param_hint=None, param_type=None - ): - BadParameter.__init__(self, message, ctx, param, param_hint) - self.param_type = param_type - - def format_message(self): - 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) - else: - param_hint = None - param_hint = _join_param_hints(param_hint) - - 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 += ". {}".format(msg_extra) - else: - msg = msg_extra - - return "Missing {}{}{}{}".format( - param_type, - " {}".format(param_hint) if param_hint else "", - ". " if msg else ".", - msg or "", - ) - - def __str__(self): - if self.message is None: - param_name = self.param.name if self.param else None - return "missing parameter: {}".format(param_name) - else: - return self.message - - if PY2: - __unicode__ = __str__ - - def __str__(self): - return self.__unicode__().encode("utf-8") - - -class NoSuchOption(UsageError): - """Raised if click attempted to handle an option that does not - exist. - - .. versionadded:: 4.0 - """ - - def __init__(self, option_name, message=None, possibilities=None, ctx=None): - if message is None: - message = "no such option: {}".format(option_name) - UsageError.__init__(self, message, ctx) - self.option_name = option_name - self.possibilities = possibilities - - def format_message(self): - bits = [self.message] - if self.possibilities: - if len(self.possibilities) == 1: - bits.append("Did you mean {}?".format(self.possibilities[0])) - else: - possibilities = sorted(self.possibilities) - bits.append("(Possible options: {})".format(", ".join(possibilities))) - return " ".join(bits) - - -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, message, ctx=None): - UsageError.__init__(self, 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 - """ - - def __init__(self, message, ctx=None): - UsageError.__init__(self, message, ctx) - - -class FileError(ClickException): - """Raised if a file cannot be opened.""" - - def __init__(self, filename, hint=None): - ui_filename = filename_to_ui(filename) - if hint is None: - hint = "unknown error" - ClickException.__init__(self, hint) - self.ui_filename = ui_filename - self.filename = filename - - def format_message(self): - return "Could not open file {}: {}".format(self.ui_filename, 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=0): - self.exit_code = code diff --git a/venv/lib/python3.7/site-packages/click/formatting.py b/venv/lib/python3.7/site-packages/click/formatting.py deleted file mode 100644 index 319c7f6..0000000 --- a/venv/lib/python3.7/site-packages/click/formatting.py +++ /dev/null @@ -1,283 +0,0 @@ -from contextlib import contextmanager - -from ._compat import term_len -from .parser import split_opt -from .termui import get_terminal_size - -# Can force a width. This is used by the test system -FORCED_WIDTH = None - - -def measure_table(rows): - widths = {} - 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, col_count): - for row in rows: - row = tuple(row) - yield row + ("",) * (col_count - len(row)) - - -def wrap_text( - text, width=78, initial_indent="", subsequent_indent="", preserve_paragraphs=False -): - """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 = [] - buf = [] - indent = None - - def _flush_par(): - 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(object): - """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=2, width=None, max_width=None): - 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(get_terminal_size()[0], max_width) - 2, 50) - self.width = width - self.current_indent = 0 - self.buffer = [] - - def write(self, string): - """Writes a unicode string into the internal buffer.""" - self.buffer.append(string) - - def indent(self): - """Increases the indentation.""" - self.current_indent += self.indent_increment - - def dedent(self): - """Decreases the indentation.""" - self.current_indent -= self.indent_increment - - def write_usage(self, prog, args="", prefix="Usage: "): - """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. - """ - usage_prefix = "{:>{w}}{} ".format(prefix, prog, w=self.current_indent) - 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): - """Writes a heading into the buffer.""" - self.write("{:>{w}}{}:\n".format("", heading, w=self.current_indent)) - - def write_paragraph(self): - """Writes a paragraph into the buffer.""" - if self.buffer: - self.write("\n") - - def write_text(self, text): - """Writes re-indented text into the buffer. This rewraps and - preserves paragraphs. - """ - text_width = max(self.width - self.current_indent, 11) - indent = " " * self.current_indent - self.write( - wrap_text( - text, - text_width, - initial_indent=indent, - subsequent_indent=indent, - preserve_paragraphs=True, - ) - ) - self.write("\n") - - def write_dl(self, rows, col_max=30, col_spacing=2): - """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("{:>{w}}{}".format("", first, w=self.current_indent)) - 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("{}\n".format(lines[0])) - - for line in lines[1:]: - self.write( - "{:>{w}}{}\n".format( - "", line, w=first_col + self.current_indent - ) - ) - - if len(lines) > 1: - # separate long help from next option - self.write("\n") - else: - self.write("\n") - - @contextmanager - def section(self, name): - """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): - """A context manager that increases the indentation.""" - self.indent() - try: - yield - finally: - self.dedent() - - def getvalue(self): - """Returns the buffer contents.""" - return "".join(self.buffer) - - -def join_options(options): - """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]) - - rv = ", ".join(x[1] for x in rv) - return rv, any_prefix_is_slash diff --git a/venv/lib/python3.7/site-packages/click/globals.py b/venv/lib/python3.7/site-packages/click/globals.py deleted file mode 100644 index 1649f9a..0000000 --- a/venv/lib/python3.7/site-packages/click/globals.py +++ /dev/null @@ -1,47 +0,0 @@ -from threading import local - -_local = local() - - -def get_current_context(silent=False): - """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 _local.stack[-1] - except (AttributeError, IndexError): - if not silent: - raise RuntimeError("There is no active click context.") - - -def push_context(ctx): - """Pushes a new context to the current stack.""" - _local.__dict__.setdefault("stack", []).append(ctx) - - -def pop_context(): - """Removes the top level from the stack.""" - _local.stack.pop() - - -def resolve_color_default(color=None): - """"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 diff --git a/venv/lib/python3.7/site-packages/click/parser.py b/venv/lib/python3.7/site-packages/click/parser.py deleted file mode 100644 index f43ebfe..0000000 --- a/venv/lib/python3.7/site-packages/click/parser.py +++ /dev/null @@ -1,428 +0,0 @@ -# -*- coding: utf-8 -*- -""" -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. -""" -import re -from collections import deque - -from .exceptions import BadArgumentUsage -from .exceptions import BadOptionUsage -from .exceptions import NoSuchOption -from .exceptions import UsageError - - -def _unpack_args(args, nargs_spec): - """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 = [] - spos = None - - def _fetch(c): - 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 == 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 _error_opt_args(nargs, opt): - if nargs == 1: - raise BadOptionUsage(opt, "{} option requires an argument".format(opt)) - raise BadOptionUsage(opt, "{} option requires {} arguments".format(opt, nargs)) - - -def split_opt(opt): - 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, ctx): - if ctx is None or ctx.token_normalize_func is None: - return opt - prefix, opt = split_opt(opt) - return prefix + ctx.token_normalize_func(opt) - - -def split_arg_string(string): - """Given an argument string this attempts to split it into small parts.""" - rv = [] - for match in re.finditer( - r"('([^'\\]*(?:\\.[^'\\]*)*)'|\"([^\"\\]*(?:\\.[^\"\\]*)*)\"|\S+)\s*", - string, - re.S, - ): - arg = match.group().strip() - if arg[:1] == arg[-1:] and arg[:1] in "\"'": - arg = arg[1:-1].encode("ascii", "backslashreplace").decode("unicode-escape") - try: - arg = type(string)(arg) - except UnicodeError: - pass - rv.append(arg) - return rv - - -class Option(object): - def __init__(self, opts, dest, action=None, nargs=1, const=None, obj=None): - self._short_opts = [] - self._long_opts = [] - self.prefixes = set() - - for opt in opts: - prefix, value = split_opt(opt) - if not prefix: - raise ValueError("Invalid start character for option ({})".format(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): - return self.action in ("store", "append") - - def process(self, value, state): - if self.action == "store": - state.opts[self.dest] = value - elif self.action == "store_const": - state.opts[self.dest] = self.const - elif self.action == "append": - state.opts.setdefault(self.dest, []).append(value) - elif self.action == "append_const": - state.opts.setdefault(self.dest, []).append(self.const) - elif self.action == "count": - state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 - else: - raise ValueError("unknown action '{}'".format(self.action)) - state.order.append(self.obj) - - -class Argument(object): - def __init__(self, dest, nargs=1, obj=None): - self.dest = dest - self.nargs = nargs - self.obj = obj - - def process(self, value, state): - if self.nargs > 1: - holes = sum(1 for x in value if x is None) - if holes == len(value): - value = None - elif holes != 0: - raise BadArgumentUsage( - "argument {} takes {} values".format(self.dest, self.nargs) - ) - state.opts[self.dest] = value - state.order.append(self.obj) - - -class ParsingState(object): - def __init__(self, rargs): - self.opts = {} - self.largs = [] - self.rargs = rargs - self.order = [] - - -class OptionParser(object): - """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=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 = {} - self._long_opt = {} - self._opt_prefixes = {"-", "--"} - self._args = [] - - def add_option(self, opts, dest, action=None, nargs=1, const=None, obj=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``, ``appnd_const`` or ``count``. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - if obj is None: - obj = dest - opts = [normalize_opt(opt, self.ctx) for opt in opts] - option = Option(opts, dest, action=action, nargs=nargs, const=const, obj=obj) - 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, dest, nargs=1, obj=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. - """ - if obj is None: - obj = dest - self._args.append(Argument(dest=dest, nargs=nargs, obj=obj)) - - def parse_args(self, args): - """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): - 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): - 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, explicit_value, state): - if opt not in self._long_opt: - possibilities = [word for word in self._long_opt if word.startswith(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) - - nargs = option.nargs - if len(state.rargs) < nargs: - _error_opt_args(nargs, opt) - elif nargs == 1: - value = state.rargs.pop(0) - else: - value = tuple(state.rargs[:nargs]) - del state.rargs[:nargs] - - elif explicit_value is not None: - raise BadOptionUsage(opt, "{} option does not take a value".format(opt)) - - else: - value = None - - option.process(value, state) - - def _match_short_opt(self, arg, state): - stop = False - i = 1 - prefix = arg[0] - unknown_options = [] - - for ch in arg[1:]: - opt = normalize_opt(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 - - nargs = option.nargs - if len(state.rargs) < nargs: - _error_opt_args(nargs, opt) - elif nargs == 1: - value = state.rargs.pop(0) - else: - value = tuple(state.rargs[:nargs]) - del state.rargs[:nargs] - - 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("{}{}".format(prefix, "".join(unknown_options))) - - def _process_opts(self, arg, state): - 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: - return self._match_short_opt(arg, state) - if not self.ignore_unknown_options: - raise - state.largs.append(arg) diff --git a/venv/lib/python3.7/site-packages/click/termui.py b/venv/lib/python3.7/site-packages/click/termui.py deleted file mode 100644 index 02ef9e9..0000000 --- a/venv/lib/python3.7/site-packages/click/termui.py +++ /dev/null @@ -1,681 +0,0 @@ -import inspect -import io -import itertools -import os -import struct -import sys - -from ._compat import DEFAULT_COLUMNS -from ._compat import get_winterm_size -from ._compat import isatty -from ._compat import raw_input -from ._compat import string_types -from ._compat import strip_ansi -from ._compat import text_type -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 Path -from .utils import echo -from .utils import LazyFile - -# The prompt functions to use. The doc tools currently override these -# functions to customize how they work. -visible_prompt_func = raw_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): - import getpass - - return getpass.getpass(prompt) - - -def _build_prompt( - text, suffix, show_default=False, default=None, show_choices=True, type=None -): - prompt = text - if type is not None and show_choices and isinstance(type, Choice): - prompt += " ({})".format(", ".join(map(str, type.choices))) - if default is not None and show_default: - prompt = "{} [{}]".format(prompt, _format_default(default)) - return prompt + suffix - - -def _format_default(default): - if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): - return default.name - - return default - - -def prompt( - text, - default=None, - hide_input=False, - confirmation_prompt=False, - type=None, - value_proc=None, - prompt_suffix=": ", - show_default=True, - err=False, - show_choices=True, -): - """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 a interrupt signal, this - function will catch it and raise a :exc:`Abort` exception. - - .. 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. - - :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: asks for confirmation for the value. - :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): ". - """ - result = None - - def prompt_func(text): - 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, nl=False, err=err) - 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() - - if value_proc is None: - value_proc = convert_type(type, default) - - prompt = _build_prompt( - text, prompt_suffix, show_default, default, show_choices, type - ) - - while 1: - while 1: - value = prompt_func(prompt) - if value: - break - elif default is not None: - if isinstance(value_proc, Path): - # validate Path default value(exists, dir_okay etc.) - value = default - break - return default - try: - result = value_proc(value) - except UsageError as e: - echo("Error: {}".format(e.message), err=err) # noqa: B306 - continue - if not confirmation_prompt: - return result - while 1: - value2 = prompt_func("Repeat for confirmation: ") - if value2: - break - if value == value2: - return result - echo("Error: the two entered values do not match", err=err) - - -def confirm( - text, default=False, abort=False, prompt_suffix=": ", show_default=True, err=False -): - """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. - - .. versionadded:: 4.0 - Added the `err` parameter. - - :param text: the question to ask. - :param default: the default for the prompt. - :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. - """ - prompt = _build_prompt( - text, prompt_suffix, show_default, "Y/n" if default else "y/N" - ) - while 1: - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(prompt, nl=False, err=err) - value = visible_prompt_func("").lower().strip() - except (KeyboardInterrupt, EOFError): - raise Abort() - if value in ("y", "yes"): - rv = True - elif value in ("n", "no"): - rv = False - elif value == "": - rv = default - else: - echo("Error: invalid input", err=err) - continue - break - if abort and not rv: - raise Abort() - return rv - - -def get_terminal_size(): - """Returns the current size of the terminal as tuple in the form - ``(width, height)`` in columns and rows. - """ - # If shutil has get_terminal_size() (Python 3.3 and later) use that - if sys.version_info >= (3, 3): - import shutil - - shutil_get_terminal_size = getattr(shutil, "get_terminal_size", None) - if shutil_get_terminal_size: - sz = shutil_get_terminal_size() - return sz.columns, sz.lines - - # We provide a sensible default for get_winterm_size() when being invoked - # inside a subprocess. Without this, it would not provide a useful input. - if get_winterm_size is not None: - size = get_winterm_size() - if size == (0, 0): - return (79, 24) - else: - return size - - def ioctl_gwinsz(fd): - try: - import fcntl - import termios - - cr = struct.unpack("hh", fcntl.ioctl(fd, termios.TIOCGWINSZ, "1234")) - except Exception: - return - return cr - - cr = ioctl_gwinsz(0) or ioctl_gwinsz(1) or ioctl_gwinsz(2) - if not cr: - try: - fd = os.open(os.ctermid(), os.O_RDONLY) - try: - cr = ioctl_gwinsz(fd) - finally: - os.close(fd) - except Exception: - pass - if not cr or not cr[0] or not cr[1]: - cr = (os.environ.get("LINES", 25), os.environ.get("COLUMNS", DEFAULT_COLUMNS)) - return int(cr[1]), int(cr[0]) - - -def echo_via_pager(text_or_generator, color=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 = text_or_generator() - elif isinstance(text_or_generator, string_types): - i = [text_or_generator] - else: - i = iter(text_or_generator) - - # convert every element of i to a text type if necessary - text_generator = (el if isinstance(el, string_types) else text_type(el) for el in i) - - from ._termui_impl import pager - - return pager(itertools.chain(text_generator, "\n"), color) - - -def progressbar( - iterable=None, - length=None, - label=None, - show_eta=True, - show_percent=None, - show_pos=False, - item_show_func=None, - fill_char="#", - empty_char="-", - bar_template="%(label)s [%(bar)s] %(info)s", - info_sep=" ", - width=36, - file=None, - color=None, -): - """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) - - .. versionadded:: 2.0 - - .. versionadded:: 4.0 - Added the `color` parameter. Added a `update` method to the - progressbar object. - - :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 the current item - next to the progress bar. Note that the current - item can be `None`! - :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. - """ - 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, - ) - - -def clear(): - """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 we're on Windows and we don't have colorama available, then we - # clear the screen by shelling out. Otherwise we can use an escape - # sequence. - if WIN: - os.system("cls") - else: - sys.stdout.write("\033[2J\033[1;1H") - - -def style( - text, - fg=None, - bg=None, - bold=None, - dim=None, - underline=None, - blink=None, - reverse=None, - reset=True, -): - """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')) - - 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) - - .. versionadded:: 2.0 - - .. versionadded:: 7.0 - Added support for bright colors. - - :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 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 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. - """ - bits = [] - if fg: - try: - bits.append("\033[{}m".format(_ansi_colors[fg])) - except KeyError: - raise TypeError("Unknown color '{}'".format(fg)) - if bg: - try: - bits.append("\033[{}m".format(_ansi_colors[bg] + 10)) - except KeyError: - raise TypeError("Unknown color '{}'".format(bg)) - if bold is not None: - bits.append("\033[{}m".format(1 if bold else 22)) - if dim is not None: - bits.append("\033[{}m".format(2 if dim else 22)) - if underline is not None: - bits.append("\033[{}m".format(4 if underline else 24)) - if blink is not None: - bits.append("\033[{}m".format(5 if blink else 25)) - if reverse is not None: - bits.append("\033[{}m".format(7 if reverse else 27)) - bits.append(text) - if reset: - bits.append(_ansi_reset_all) - return "".join(bits) - - -def unstyle(text): - """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=None, file=None, nl=True, err=False, color=None, **styles): - """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. - - .. versionadded:: 2.0 - """ - if message is not None: - message = style(message, **styles) - return echo(message, file=file, nl=nl, err=err, color=color) - - -def edit( - text=None, editor=None, env=None, require_save=True, extension=".txt", filename=None -): - 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 - - editor = Editor( - editor=editor, env=env, require_save=require_save, extension=extension - ) - if filename is None: - return editor.edit(text) - editor.edit_file(filename) - - -def launch(url, wait=False, locate=False): - """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: waits for the program to stop. - :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 = None - - -def getchar(echo=False): - """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. - """ - f = _getchar - if f is None: - from ._termui_impl import getchar as f - return f(echo) - - -def raw_terminal(): - from ._termui_impl import raw_terminal as f - - return f() - - -def pause(info="Press any key to continue ...", err=False): - """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 info string to print before pausing. - :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 - 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/lib/python3.7/site-packages/click/testing.py b/venv/lib/python3.7/site-packages/click/testing.py deleted file mode 100644 index a3dba3b..0000000 --- a/venv/lib/python3.7/site-packages/click/testing.py +++ /dev/null @@ -1,382 +0,0 @@ -import contextlib -import os -import shlex -import shutil -import sys -import tempfile - -from . import formatting -from . import termui -from . import utils -from ._compat import iteritems -from ._compat import PY2 -from ._compat import string_types - - -if PY2: - from cStringIO import StringIO -else: - import io - from ._compat import _find_binary_reader - - -class EchoingStdin(object): - def __init__(self, input, output): - self._input = input - self._output = output - - def __getattr__(self, x): - return getattr(self._input, x) - - def _echo(self, rv): - self._output.write(rv) - return rv - - def read(self, n=-1): - return self._echo(self._input.read(n)) - - def readline(self, n=-1): - return self._echo(self._input.readline(n)) - - def readlines(self): - return [self._echo(x) for x in self._input.readlines()] - - def __iter__(self): - return iter(self._echo(x) for x in self._input) - - def __repr__(self): - return repr(self._input) - - -def make_input_stream(input, charset): - # Is already an input stream. - if hasattr(input, "read"): - if PY2: - return input - rv = _find_binary_reader(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 not isinstance(input, bytes): - input = input.encode(charset) - if PY2: - return StringIO(input) - return io.BytesIO(input) - - -class Result(object): - """Holds the captured result of an invoked CLI script.""" - - def __init__( - self, runner, stdout_bytes, stderr_bytes, exit_code, exception, exc_info=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 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): - """The (standard) output as unicode string.""" - return self.stdout - - @property - def stdout(self): - """The standard output as unicode string.""" - return self.stdout_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - @property - def stderr(self): - """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): - return "<{} {}>".format( - type(self).__name__, repr(self.exception) if self.exception else "okay" - ) - - -class CliRunner(object): - """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. This is - UTF-8 by default and should not be changed currently as - the reporting to Click only works in Python 2 properly. - :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=None, env=None, echo_stdin=False, mix_stderr=True): - if charset is None: - charset = "utf-8" - self.charset = charset - self.env = env or {} - self.echo_stdin = echo_stdin - self.mix_stderr = mix_stderr - - def get_default_prog_name(self, cli): - """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=None): - """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=None, env=None, color=False): - """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. - - .. versionadded:: 4.0 - The ``color`` parameter was added. - - :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. - """ - input = make_input_stream(input, self.charset) - - 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) - - if PY2: - bytes_output = StringIO() - if self.echo_stdin: - input = EchoingStdin(input, bytes_output) - sys.stdout = bytes_output - if not self.mix_stderr: - bytes_error = StringIO() - sys.stderr = bytes_error - else: - bytes_output = io.BytesIO() - if self.echo_stdin: - input = EchoingStdin(input, bytes_output) - input = io.TextIOWrapper(input, encoding=self.charset) - sys.stdout = io.TextIOWrapper(bytes_output, encoding=self.charset) - if not self.mix_stderr: - bytes_error = io.BytesIO() - sys.stderr = io.TextIOWrapper(bytes_error, encoding=self.charset) - - if self.mix_stderr: - sys.stderr = sys.stdout - - sys.stdin = input - - def visible_input(prompt=None): - sys.stdout.write(prompt or "") - val = input.readline().rstrip("\r\n") - sys.stdout.write("{}\n".format(val)) - sys.stdout.flush() - return val - - def hidden_input(prompt=None): - sys.stdout.write("{}\n".format(prompt or "")) - sys.stdout.flush() - return input.readline().rstrip("\r\n") - - def _getchar(echo): - char = sys.stdin.read(1) - if echo: - sys.stdout.write(char) - sys.stdout.flush() - return char - - default_color = color - - def should_strip_ansi(stream=None, color=None): - 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 - termui.visible_prompt_func = visible_input - termui.hidden_prompt_func = hidden_input - termui._getchar = _getchar - utils.should_strip_ansi = should_strip_ansi - - old_env = {} - try: - for key, value in iteritems(env): - 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, not self.mix_stderr and bytes_error) - finally: - for key, value in iteritems(old_env): - 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 - formatting.FORCED_WIDTH = old_forced_width - - def invoke( - self, - cli, - args=None, - input=None, - env=None, - catch_exceptions=True, - color=False, - **extra - ): - """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. - - .. versionadded:: 3.0 - The ``catch_exceptions`` parameter was added. - - .. versionchanged:: 3.0 - The result object now has an `exc_info` attribute with the - traceback if available. - - .. versionadded:: 4.0 - The ``color`` parameter was added. - - :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. - """ - exc_info = None - with self.isolation(input=input, env=env, color=color) as outstreams: - exception = None - exit_code = 0 - - if isinstance(args, string_types): - args = shlex.split(args) - - try: - prog_name = extra.pop("prog_name") - except KeyError: - prog_name = self.get_default_prog_name(cli) - - try: - cli.main(args=args or (), prog_name=prog_name, **extra) - except SystemExit as e: - exc_info = sys.exc_info() - exit_code = e.code - if exit_code is None: - exit_code = 0 - - if exit_code != 0: - exception = e - - if not isinstance(exit_code, int): - sys.stdout.write(str(exit_code)) - sys.stdout.write("\n") - exit_code = 1 - - 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() - - return Result( - runner=self, - stdout_bytes=stdout, - stderr_bytes=stderr, - exit_code=exit_code, - exception=exception, - exc_info=exc_info, - ) - - @contextlib.contextmanager - def isolated_filesystem(self): - """A context manager that creates a temporary folder and changes - the current working directory to it for isolated filesystem tests. - """ - cwd = os.getcwd() - t = tempfile.mkdtemp() - os.chdir(t) - try: - yield t - finally: - os.chdir(cwd) - try: - shutil.rmtree(t) - except (OSError, IOError): # noqa: B014 - pass diff --git a/venv/lib/python3.7/site-packages/click/types.py b/venv/lib/python3.7/site-packages/click/types.py deleted file mode 100644 index 505c39f..0000000 --- a/venv/lib/python3.7/site-packages/click/types.py +++ /dev/null @@ -1,762 +0,0 @@ -import os -import stat -from datetime import datetime - -from ._compat import _get_argv_encoding -from ._compat import filename_to_ui -from ._compat import get_filesystem_encoding -from ._compat import get_streerror -from ._compat import open_stream -from ._compat import PY2 -from ._compat import text_type -from .exceptions import BadParameter -from .utils import LazyFile -from .utils import safecall - - -class ParamType(object): - """Helper for converting values through types. The following is - necessary for a valid type: - - * it needs a name - * it needs to pass through None unchanged - * it needs to convert from a string - * it needs to convert its result type through unchanged - (eg: needs to be idempotent) - * it needs to be able to deal with param and context being `None`. - This can be the case when the object is used with prompt - inputs. - """ - - is_composite = False - - #: the descriptive name of this type - name = None - - #: 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 = None - - def __call__(self, value, param=None, ctx=None): - if value is not None: - return self.convert(value, param, ctx) - - def get_metavar(self, param): - """Returns the metavar default for this param if it provides one.""" - - def get_missing_message(self, param): - """Optionally might return extra information about a missing - parameter. - - .. versionadded:: 2.0 - """ - - def convert(self, value, param, ctx): - """Converts the value. This is not invoked for values that are - `None` (the missing value). - """ - return value - - def split_envvar_value(self, rv): - """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, param=None, ctx=None): - """Helper method to fail with an invalid value message.""" - raise BadParameter(message, ctx=ctx, param=param) - - -class CompositeParamType(ParamType): - is_composite = True - - @property - def arity(self): - raise NotImplementedError() - - -class FuncParamType(ParamType): - def __init__(self, func): - self.name = func.__name__ - self.func = func - - def convert(self, value, param, ctx): - try: - return self.func(value) - except ValueError: - try: - value = text_type(value) - except UnicodeError: - value = str(value).decode("utf-8", "replace") - self.fail(value, param, ctx) - - -class UnprocessedParamType(ParamType): - name = "text" - - def convert(self, value, param, ctx): - return value - - def __repr__(self): - return "UNPROCESSED" - - -class StringParamType(ParamType): - name = "text" - - def convert(self, value, param, ctx): - 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 value - - def __repr__(self): - 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, case_sensitive=True): - self.choices = choices - self.case_sensitive = case_sensitive - - def get_metavar(self, param): - return "[{}]".format("|".join(self.choices)) - - def get_missing_message(self, param): - return "Choose from:\n\t{}.".format(",\n\t".join(self.choices)) - - def convert(self, value, param, ctx): - # 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: - if PY2: - lower = str.lower - else: - lower = str.casefold - - normed_value = lower(normed_value) - normed_choices = { - lower(normed_choice): original - for normed_choice, original in normed_choices.items() - } - - if normed_value in normed_choices: - return normed_choices[normed_value] - - self.fail( - "invalid choice: {}. (choose from {})".format( - value, ", ".join(self.choices) - ), - param, - ctx, - ) - - def __repr__(self): - return "Choice('{}')".format(list(self.choices)) - - -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=None): - self.formats = formats or ["%Y-%m-%d", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S"] - - def get_metavar(self, param): - return "[{}]".format("|".join(self.formats)) - - def _try_to_convert_date(self, value, format): - try: - return datetime.strptime(value, format) - except ValueError: - return None - - def convert(self, value, param, ctx): - # Exact match - for format in self.formats: - dtime = self._try_to_convert_date(value, format) - if dtime: - return dtime - - self.fail( - "invalid datetime format: {}. (choose from {})".format( - value, ", ".join(self.formats) - ) - ) - - def __repr__(self): - return "DateTime" - - -class IntParamType(ParamType): - name = "integer" - - def convert(self, value, param, ctx): - try: - return int(value) - except ValueError: - self.fail("{} is not a valid integer".format(value), param, ctx) - - def __repr__(self): - return "INT" - - -class IntRange(IntParamType): - """A parameter that works similar to :data:`click.INT` but restricts - the value to fit into a range. The default behavior is to fail if the - value falls outside the range, but it can also be silently clamped - between the two edges. - - See :ref:`ranges` for an example. - """ - - name = "integer range" - - def __init__(self, min=None, max=None, clamp=False): - self.min = min - self.max = max - self.clamp = clamp - - def convert(self, value, param, ctx): - rv = IntParamType.convert(self, value, param, ctx) - if self.clamp: - if self.min is not None and rv < self.min: - return self.min - if self.max is not None and rv > self.max: - return self.max - if ( - self.min is not None - and rv < self.min - or self.max is not None - and rv > self.max - ): - if self.min is None: - self.fail( - "{} is bigger than the maximum valid value {}.".format( - rv, self.max - ), - param, - ctx, - ) - elif self.max is None: - self.fail( - "{} is smaller than the minimum valid value {}.".format( - rv, self.min - ), - param, - ctx, - ) - else: - self.fail( - "{} is not in the valid range of {} to {}.".format( - rv, self.min, self.max - ), - param, - ctx, - ) - return rv - - def __repr__(self): - return "IntRange({}, {})".format(self.min, self.max) - - -class FloatParamType(ParamType): - name = "float" - - def convert(self, value, param, ctx): - try: - return float(value) - except ValueError: - self.fail( - "{} is not a valid floating point value".format(value), param, ctx - ) - - def __repr__(self): - return "FLOAT" - - -class FloatRange(FloatParamType): - """A parameter that works similar to :data:`click.FLOAT` but restricts - the value to fit into a range. The default behavior is to fail if the - value falls outside the range, but it can also be silently clamped - between the two edges. - - See :ref:`ranges` for an example. - """ - - name = "float range" - - def __init__(self, min=None, max=None, clamp=False): - self.min = min - self.max = max - self.clamp = clamp - - def convert(self, value, param, ctx): - rv = FloatParamType.convert(self, value, param, ctx) - if self.clamp: - if self.min is not None and rv < self.min: - return self.min - if self.max is not None and rv > self.max: - return self.max - if ( - self.min is not None - and rv < self.min - or self.max is not None - and rv > self.max - ): - if self.min is None: - self.fail( - "{} is bigger than the maximum valid value {}.".format( - rv, self.max - ), - param, - ctx, - ) - elif self.max is None: - self.fail( - "{} is smaller than the minimum valid value {}.".format( - rv, self.min - ), - param, - ctx, - ) - else: - self.fail( - "{} is not in the valid range of {} to {}.".format( - rv, self.min, self.max - ), - param, - ctx, - ) - return rv - - def __repr__(self): - return "FloatRange({}, {})".format(self.min, self.max) - - -class BoolParamType(ParamType): - name = "boolean" - - def convert(self, value, param, ctx): - if isinstance(value, bool): - return bool(value) - value = value.lower() - if value in ("true", "t", "1", "yes", "y"): - return True - elif value in ("false", "f", "0", "no", "n"): - return False - self.fail("{} is not a valid boolean".format(value), param, ctx) - - def __repr__(self): - return "BOOL" - - -class UUIDParameterType(ParamType): - name = "uuid" - - def convert(self, value, param, ctx): - import uuid - - try: - if PY2 and isinstance(value, text_type): - value = value.encode("ascii") - return uuid.UUID(value) - except ValueError: - self.fail("{} is not a valid UUID value".format(value), param, ctx) - - def __repr__(self): - 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="r", encoding=None, errors="strict", lazy=None, atomic=False - ): - self.mode = mode - self.encoding = encoding - self.errors = errors - self.lazy = lazy - self.atomic = atomic - - def resolve_lazy_flag(self, value): - 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, param, ctx): - try: - if hasattr(value, "read") or hasattr(value, "write"): - return value - - lazy = self.resolve_lazy_flag(value) - - if lazy: - f = LazyFile( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - if ctx is not None: - ctx.call_on_close(f.close_intelligently) - 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 (IOError, OSError) as e: # noqa: B014 - self.fail( - "Could not open file: {}: {}".format( - filename_to_ui(value), get_streerror(e) - ), - param, - ctx, - ) - - -class Path(ParamType): - """The path type is similar to the :class:`File` type but it performs - different checks. First of all, instead of returning an open file - handle it returns just the filename. Secondly, it can perform various - basic checks about what the file or directory should be. - - .. versionchanged:: 6.0 - `allow_dash` was added. - - :param exists: if set to true, the file or directory needs to exist for - this value to be valid. If this is not required and a - file does indeed not exist, then all further checks are - silently skipped. - :param file_okay: controls if a file is a possible value. - :param dir_okay: controls if a directory is a possible value. - :param writable: if true, a writable check is performed. - :param readable: if true, a readable check is performed. - :param resolve_path: if this is true, then the path is fully resolved - before the value is passed onwards. This means - that it's absolute and symlinks are resolved. It - will not expand a tilde-prefix, as this is - supposed to be done by the shell only. - :param allow_dash: If this is set to `True`, a single dash to indicate - standard streams is permitted. - :param path_type: optionally a string type that should be used to - represent the path. The default is `None` which - means the return value will be either bytes or - unicode depending on what makes most sense given the - input data Click deals with. - """ - - envvar_list_splitter = os.path.pathsep - - def __init__( - self, - exists=False, - file_okay=True, - dir_okay=True, - writable=False, - readable=True, - resolve_path=False, - allow_dash=False, - path_type=None, - ): - self.exists = exists - self.file_okay = file_okay - self.dir_okay = dir_okay - self.writable = writable - self.readable = readable - 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" - self.path_type = "File" - elif self.dir_okay and not self.file_okay: - self.name = "directory" - self.path_type = "Directory" - else: - self.name = "path" - self.path_type = "Path" - - def coerce_path_result(self, rv): - if self.type is not None and not isinstance(rv, self.type): - if self.type is text_type: - rv = rv.decode(get_filesystem_encoding()) - else: - rv = rv.encode(get_filesystem_encoding()) - return rv - - def convert(self, value, param, ctx): - rv = value - - is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") - - if not is_dash: - if self.resolve_path: - rv = os.path.realpath(rv) - - try: - st = os.stat(rv) - except OSError: - if not self.exists: - return self.coerce_path_result(rv) - self.fail( - "{} '{}' does not exist.".format( - self.path_type, filename_to_ui(value) - ), - param, - ctx, - ) - - if not self.file_okay and stat.S_ISREG(st.st_mode): - self.fail( - "{} '{}' is a file.".format(self.path_type, filename_to_ui(value)), - param, - ctx, - ) - if not self.dir_okay and stat.S_ISDIR(st.st_mode): - self.fail( - "{} '{}' is a directory.".format( - self.path_type, filename_to_ui(value) - ), - param, - ctx, - ) - if self.writable and not os.access(value, os.W_OK): - self.fail( - "{} '{}' is not writable.".format( - self.path_type, filename_to_ui(value) - ), - param, - ctx, - ) - if self.readable and not os.access(value, os.R_OK): - self.fail( - "{} '{}' is not readable.".format( - self.path_type, filename_to_ui(value) - ), - param, - ctx, - ) - - return self.coerce_path_result(rv) - - -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): - self.types = [convert_type(ty) for ty in types] - - @property - def name(self): - return "<{}>".format(" ".join(ty.name for ty in self.types)) - - @property - def arity(self): - return len(self.types) - - def convert(self, value, param, ctx): - if len(value) != len(self.types): - raise TypeError( - "It would appear that nargs is set to conflict with the" - " composite type arity." - ) - return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) - - -def convert_type(ty, default=None): - """Converts a callable or python type into the most appropriate - param type. - """ - guessed_type = False - if ty is None and default is not None: - if isinstance(default, tuple): - ty = tuple(map(type, default)) - else: - ty = type(default) - guessed_type = True - - if isinstance(ty, tuple): - return Tuple(ty) - if isinstance(ty, ParamType): - return ty - if ty is text_type or ty is str or ty is None: - return STRING - if ty is int: - return INT - # Booleans are only okay if not guessed. This is done because for - # flags the default value is actually a bit of a lie in that it - # indicates which of the flags is the one we want. See get_default() - # for more information. - if ty is bool and not guessed_type: - return BOOL - if ty is float: - return FLOAT - if guessed_type: - return STRING - - # Catch a common mistake - if __debug__: - try: - if issubclass(ty, ParamType): - raise AssertionError( - "Attempted to use an uninstantiated parameter type ({}).".format(ty) - ) - except TypeError: - 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. This is necessary to achieve the -#: same bytes/unicode behavior on Python 2/3 in situations where you want -#: to not convert argument types. 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/lib/python3.7/site-packages/click/utils.py b/venv/lib/python3.7/site-packages/click/utils.py deleted file mode 100644 index 79265e7..0000000 --- a/venv/lib/python3.7/site-packages/click/utils.py +++ /dev/null @@ -1,455 +0,0 @@ -import os -import sys - -from ._compat import _default_text_stderr -from ._compat import _default_text_stdout -from ._compat import auto_wrap_for_ansi -from ._compat import binary_streams -from ._compat import filename_to_ui -from ._compat import get_filesystem_encoding -from ._compat import get_streerror -from ._compat import is_bytes -from ._compat import open_stream -from ._compat import PY2 -from ._compat import should_strip_ansi -from ._compat import string_types -from ._compat import strip_ansi -from ._compat import text_streams -from ._compat import text_type -from ._compat import WIN -from .globals import resolve_color_default - -if not PY2: - from ._compat import _find_binary_writer -elif WIN: - from ._winconsole import _get_windows_argv - from ._winconsole import _hash_py_argv - from ._winconsole import _initial_argv_hash - -echo_native_types = string_types + (bytes, bytearray) - - -def _posixify(name): - return "-".join(name.split()).lower() - - -def safecall(func): - """Wraps a function so that it swallows exceptions.""" - - def wrapper(*args, **kwargs): - try: - return func(*args, **kwargs) - except Exception: - pass - - return wrapper - - -def make_str(value): - """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 text_type(value) - - -def make_default_short_help(help, max_length=45): - """Return a condensed version of help string.""" - words = help.split() - total_length = 0 - result = [] - done = False - - for word in words: - if word[-1:] == ".": - done = True - new_length = 1 + len(word) if result else len(word) - if total_length + new_length > max_length: - result.append("...") - done = True - else: - if result: - result.append(" ") - result.append(word) - if done: - break - total_length += new_length - - return "".join(result) - - -class LazyFile(object): - """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, mode="r", encoding=None, errors="strict", atomic=False - ): - self.name = filename - self.mode = mode - self.encoding = encoding - self.errors = errors - self.atomic = atomic - - 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): - return getattr(self.open(), name) - - def __repr__(self): - if self._f is not None: - return repr(self._f) - return "".format(self.name, self.mode) - - def open(self): - """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 (IOError, OSError) as e: # noqa: E402 - from .exceptions import FileError - - raise FileError(self.name, hint=get_streerror(e)) - self._f = rv - return rv - - def close(self): - """Closes the underlying file, no matter what.""" - if self._f is not None: - self._f.close() - - def close_intelligently(self): - """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): - return self - - def __exit__(self, exc_type, exc_value, tb): - self.close_intelligently() - - def __iter__(self): - self.open() - return iter(self._f) - - -class KeepOpenFile(object): - def __init__(self, file): - self._file = file - - def __getattr__(self, name): - return getattr(self._file, name) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, tb): - pass - - def __repr__(self): - return repr(self._file) - - def __iter__(self): - return iter(self._file) - - -def echo(message=None, file=None, nl=True, err=False, color=None): - """Prints a message plus a newline to the given file or stdout. On - first sight, this looks like the print function, but it has improved - support for handling Unicode and binary data that does not fail no - matter how badly configured the system is. - - Primarily it means that you can print binary data as well as Unicode - data on both 2.x and 3.x to the given file in the most appropriate way - possible. This is a very carefree function in that it will try its - best to not fail. As of Click 6.0 this includes support for unicode - output on the Windows console. - - In addition to that, if `colorama`_ is installed, the echo function will - also support clever handling of ANSI codes. Essentially it will then - do the following: - - - add transparent handling of ANSI color codes on Windows. - - hide ANSI codes automatically if the destination file is not a - terminal. - - .. _colorama: https://pypi.org/project/colorama/ - - .. versionchanged:: 6.0 - As of Click 6.0 the echo function will properly support unicode - output on the windows console. Not that click does not modify - the interpreter in any way which means that `sys.stdout` or the - print statement or function will still not provide unicode support. - - .. versionchanged:: 2.0 - Starting with version 2.0 of Click, the echo function will work - with colorama if it's installed. - - .. versionadded:: 3.0 - The `err` parameter was added. - - .. versionchanged:: 4.0 - Added the `color` flag. - - :param message: the message to print - :param file: the file to write to (defaults to ``stdout``) - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``. This is faster and easier than calling - :func:`get_text_stderr` yourself. - :param nl: if set to `True` (the default) a newline is printed afterwards. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. - """ - 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, echo_native_types): - message = text_type(message) - - if nl: - message = message or u"" - if isinstance(message, text_type): - message += u"\n" - else: - message += b"\n" - - # If there is a message, and we're in Python 3, 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 message and not PY2 and is_bytes(message): - binary_file = _find_binary_writer(file) - if binary_file is not None: - file.flush() - binary_file.write(message) - binary_file.flush() - return - - # ANSI-style support. If there is no message or we are dealing with - # bytes nothing is happening. If we are connected to a file we want - # to strip colors. If we are on windows we either wrap the stream - # to strip the color or we use the colorama support to translate the - # ansi codes to API calls. - if message and not is_bytes(message): - color = resolve_color_default(color) - if should_strip_ansi(file, color): - message = strip_ansi(message) - elif WIN: - if auto_wrap_for_ansi is not None: - file = auto_wrap_for_ansi(file) - elif not color: - message = strip_ansi(message) - - if message: - file.write(message) - file.flush() - - -def get_binary_stream(name): - """Returns a system stream for byte processing. This essentially - returns the stream from the sys module with the given name but it - solves some compatibility issues between different Python versions. - Primarily this function is necessary for getting binary streams on - Python 3. - - :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("Unknown standard stream '{}'".format(name)) - return opener() - - -def get_text_stream(name, encoding=None, errors="strict"): - """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 on Python 3 - 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("Unknown standard stream '{}'".format(name)) - return opener(encoding, errors) - - -def open_file( - filename, mode="r", encoding=None, errors="strict", lazy=False, atomic=False -): - """This is similar to how the :class:`File` works but for manual - usage. Files are opened non lazy by default. This can open regular - files as well as stdin/stdout if ``'-'`` is passed. - - If stdin/stdout is returned the stream is wrapped so that the context - manager will not close the stream accidentally. This makes it possible - to always use the function like this without having to worry to - accidentally close a standard stream:: - - with open_file(filename) as f: - ... - - .. versionadded:: 3.0 - - :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 use. - :param errors: the error handling for this file. - :param lazy: can be flipped to true to open the file lazily. - :param atomic: in atomic mode writes go into a temporary file and it's - moved on close. - """ - if lazy: - return LazyFile(filename, mode, encoding, errors, atomic=atomic) - f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) - if not should_close: - f = KeepOpenFile(f) - return f - - -def get_os_args(): - """This returns the argument part of sys.argv in the most appropriate - form for processing. What this means is that this return value is in - a format that works for Click to process but does not necessarily - correspond well to what's actually standard for the interpreter. - - On most environments the return value is ``sys.argv[:1]`` unchanged. - However if you are on Windows and running Python 2 the return value - will actually be a list of unicode strings instead because the - default behavior on that platform otherwise will not be able to - carry all possible values that sys.argv can have. - - .. versionadded:: 6.0 - """ - # We can only extract the unicode argv if sys.argv has not been - # changed since the startup of the application. - if PY2 and WIN and _initial_argv_hash == _hash_py_argv(): - return _get_windows_argv() - return sys.argv[1:] - - -def format_filename(filename, shorten=False): - """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 filename_to_ui(filename) - - -def get_app_dir(app_name, roaming=True, force_posix=False): - 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`` - Win XP (roaming): - ``C:\Documents and Settings\\Local Settings\Application Data\Foo Bar`` - Win XP (not roaming): - ``C:\Documents and Settings\\Application Data\Foo Bar`` - Win 7 (roaming): - ``C:\Users\\AppData\Roaming\Foo Bar`` - Win 7 (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("~/.{}".format(_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(object): - """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): - self.wrapped = wrapped - - def flush(self): - try: - self.wrapped.flush() - except IOError as e: - import errno - - if e.errno != errno.EPIPE: - raise - - def __getattr__(self, attr): - return getattr(self.wrapped, attr) diff --git a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/DESCRIPTION.rst b/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/DESCRIPTION.rst deleted file mode 100644 index 2f7b1f5..0000000 --- a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,76 +0,0 @@ -Copyright (c) 2018 Beto Dealmeida - -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. - -Description: console_log - =========== - - This module provides a WSGI middleware that allows you to log to the - browser console from Python: - - .. code:: - - import logging - - from flask import Flask - - from console_log import ConsoleLog - - console = logging.getLogger('console') - console.setLevel(logging.DEBUG) - - app = Flask(__name__) - - @app.route('/') - def hello(): - logger.error('Error logged from Python') - logger.warning('Warning logged from Python') - logger.info('Info logged from Python') - logger.debug('Debug logged from Python') - logger.debug({'foo': ['bar', 'baz']}) - return "Hello World!" - - app.wsgi_app = ConsoleLog(app.wsgi_app, console) - - The logged messages will then show up in the browser console. - - - How it works - ============ - - The new WSGI app does two things: - - 1. Creates a websocket backchannel. - 2. Injects Javascript code into HTML responses, fetching data from the - websocket channel and logging them to console. - -Platform: UNKNOWN -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Provides-Extra: dev -Provides-Extra: examples diff --git a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/METADATA b/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/METADATA deleted file mode 100644 index c6fc29b..0000000 --- a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/METADATA +++ /dev/null @@ -1,95 +0,0 @@ -Metadata-Version: 2.0 -Name: console-log -Version: 0.2.10 -Summary: Log to browser console -Home-page: https://github.com/betodealmeida/consolelog -Author: Beto Dealmeida -Author-email: beto@lyft.com -License: MIT License -Requires-Dist: gevent -Requires-Dist: gevent-websocket -Requires-Dist: werkzeug -Requires-Dist: wsgigzip -Provides-Extra: dev -Requires-Dist: nose; extra == 'dev' -Requires-Dist: pipreqs; extra == 'dev' -Requires-Dist: twine; extra == 'dev' -Provides-Extra: examples -Requires-Dist: flask; extra == 'examples' - -Copyright (c) 2018 Beto Dealmeida - -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. - -Description: console_log - =========== - - This module provides a WSGI middleware that allows you to log to the - browser console from Python: - - .. code:: - - import logging - - from flask import Flask - - from console_log import ConsoleLog - - console = logging.getLogger('console') - console.setLevel(logging.DEBUG) - - app = Flask(__name__) - - @app.route('/') - def hello(): - logger.error('Error logged from Python') - logger.warning('Warning logged from Python') - logger.info('Info logged from Python') - logger.debug('Debug logged from Python') - logger.debug({'foo': ['bar', 'baz']}) - return "Hello World!" - - app.wsgi_app = ConsoleLog(app.wsgi_app, console) - - The logged messages will then show up in the browser console. - - - How it works - ============ - - The new WSGI app does two things: - - 1. Creates a websocket backchannel. - 2. Injects Javascript code into HTML responses, fetching data from the - websocket channel and logging them to console. - -Platform: UNKNOWN -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Provides-Extra: dev -Provides-Extra: examples diff --git a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/RECORD b/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/RECORD deleted file mode 100644 index e5020f8..0000000 --- a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/RECORD +++ /dev/null @@ -1,9 +0,0 @@ -__pycache__/console_log.cpython-37.pyc,, -console_log-0.2.10.dist-info/DESCRIPTION.rst,sha256=cf_tJhRidEY9tiuXXN0sOyTOJvbl3kGcT9TUP_fECeA,3027 -console_log-0.2.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -console_log-0.2.10.dist-info/METADATA,sha256=g55Ez3pJ-AT-bZJ4mfs-acg9iaKa6d_tggagV7vbsRI,3544 -console_log-0.2.10.dist-info/RECORD,, -console_log-0.2.10.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110 -console_log-0.2.10.dist-info/metadata.json,sha256=msMuqEW2XvUVWEgGk7vLBezqSKQGNiMIQYtYat-MyVI,645 -console_log-0.2.10.dist-info/top_level.txt,sha256=L8ibfMkDJYTl4bJqXkTqei_S-9CHXytVFnmFE79aUzU,12 -console_log.py,sha256=Vexc_X2xAB3_qmg5XggxV8h8-MB2p9JeOW9P6CvwFUg,3090 diff --git a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/WHEEL b/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/WHEEL deleted file mode 100644 index 7332a41..0000000 --- a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.30.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/metadata.json b/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/metadata.json deleted file mode 100644 index 77faf9d..0000000 --- a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"extensions": {"python.details": {"contacts": [{"email": "beto@lyft.com", "name": "Beto Dealmeida", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/betodealmeida/consolelog"}}}, "extras": ["dev", "examples"], "generator": "bdist_wheel (0.30.0)", "license": "MIT License", "metadata_version": "2.0", "name": "console-log", "run_requires": [{"extra": "examples", "requires": ["flask"]}, {"requires": ["gevent", "gevent-websocket", "werkzeug", "wsgigzip"]}, {"extra": "dev", "requires": ["nose", "pipreqs", "twine"]}], "summary": "Log to browser console", "version": "0.2.10"} \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/top_level.txt deleted file mode 100644 index d3a814f..0000000 --- a/venv/lib/python3.7/site-packages/console_log-0.2.10.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -console_log diff --git a/venv/lib/python3.7/site-packages/console_log.py b/venv/lib/python3.7/site-packages/console_log.py deleted file mode 100644 index c986c9c..0000000 --- a/venv/lib/python3.7/site-packages/console_log.py +++ /dev/null @@ -1,105 +0,0 @@ -import json -import logging -import os.path - -from gevent.queue import Queue -from geventwebsocket import WebSocketError -from werkzeug.exceptions import RequestTimeout -from werkzeug.wrappers import Response -from wsgigzip import gzip - - -# map between Python levels and the console method in Javascript -levels = { - logging.CRITICAL: 'error', - logging.ERROR: 'error', - logging.WARNING: 'warn', - logging.INFO: 'info', - logging.DEBUG: 'debug', - logging.NOTSET: 'log', -} - - -class DictHandler(logging.Handler): - def __init__(self, queue): - super().__init__() - self.queue = queue - - def emit(self, record): - record.pathname = os.path.abspath(record.pathname) - message = { - 'level': levels[record.levelno], - 'content': record.msg, - } - try: - payload = json.dumps(message) - except TypeError: - message['content'] = repr(record.msg) - payload = json.dumps(message) - - self.queue.put_nowait(payload) - - -JAVASCRIPT = """ -console.log('Starting...'); - -const ws = new WebSocket("ws://{base}/__ws__"); -ws.onmessage = function (event) {{ - const msg = JSON.parse(event.data); - console[msg.level](msg.content); -}}; -""" - - -class ConsoleLog: - def __init__(self, app, logger, js_path='/__console__.js'): - self.app = app - self.queue = Queue() - self.logger = logger - self.js_path = js_path - - handler = DictHandler(self.queue) - self.logger.addHandler(handler) - - def __call__(self, environ, start_response): - if 'wsgi.websocket' in environ: - ws = environ["wsgi.websocket"] - while not ws.closed: - message = self.queue.get() - try: - ws.send(message) - except WebSocketError: - break - raise RequestTimeout() - elif environ["PATH_INFO"] == self.js_path: - if environ.get('HTTP_HOST'): - base = environ['HTTP_HOST'] - else: - host = environ['SERVER_NAME'] - port = environ['SERVER_PORT'] - base = ':'.join((host, port)) - response = Response(JAVASCRIPT.format(base=base)) - return response(environ, start_response) - - # request non-compressed response - http_accept_encoding = environ.pop('HTTP_ACCEPT_ENCODING', '') - response = Response.from_app(self.app, environ) - - # inject JS - if response.mimetype == 'text/html': - response = self.inject(response) - - # compress response, if necessary - if http_accept_encoding: - environ['HTTP_ACCEPT_ENCODING'] = http_accept_encoding - response = gzip()(response) - - return response(environ, start_response) - - def inject(self, response): - code = ''.format(self.js_path) - data = response.get_data() - payload = data.decode(response.charset) - response.data = '{code}\n{payload}'.format(code=code, payload=payload) - - return response diff --git a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/LICENSE.txt b/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/LICENSE.txt deleted file mode 100644 index 00aa6b9..0000000 --- a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 2013, Open Knowledge Foundation, Friedrich Lindenberg, - Gregor Aisch - -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/lib/python3.7/site-packages/dataset-1.3.1.dist-info/METADATA b/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/METADATA deleted file mode 100644 index d16bf0b..0000000 --- a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/METADATA +++ /dev/null @@ -1,50 +0,0 @@ -Metadata-Version: 2.1 -Name: dataset -Version: 1.3.1 -Summary: Toolkit for Python-based database access. -Home-page: http://github.com/pudo/dataset -Author: Friedrich Lindenberg, Gregor Aisch, Stefan Wehrmeyer -Author-email: friedrich.lindenberg@gmail.com -License: MIT -Keywords: sql sqlalchemy etl loading utility -Platform: UNKNOWN -Classifier: Development Status :: 3 - Alpha -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Description-Content-Type: text/markdown -Requires-Dist: sqlalchemy (>=1.3.1) -Requires-Dist: alembic (>=0.6.2) -Provides-Extra: dev -Requires-Dist: pip ; extra == 'dev' -Requires-Dist: nose ; extra == 'dev' -Requires-Dist: wheel ; extra == 'dev' -Requires-Dist: flake8 ; extra == 'dev' -Requires-Dist: coverage ; extra == 'dev' -Requires-Dist: psycopg2-binary ; extra == 'dev' -Requires-Dist: PyMySQL ; extra == 'dev' - -dataset: databases for lazy people -================================== - -![build](https://github.com/pudo/dataset/workflows/build/badge.svg) - -In short, **dataset** makes reading and writing data in databases as simple as reading and writing JSON files. - -[Read the docs](https://dataset.readthedocs.io/) - -To install dataset, fetch it with ``pip``: - -```bash -$ pip install dataset -``` - -**Note:** as of version 1.0, **dataset** is split into two packages, with the -data export features now extracted into a stand-alone package, **datafreeze**. -See the relevant repository [here](https://github.com/pudo/datafreeze). - - diff --git a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/RECORD b/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/RECORD deleted file mode 100644 index b236ac1..0000000 --- a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/RECORD +++ /dev/null @@ -1,19 +0,0 @@ -dataset-1.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -dataset-1.3.1.dist-info/LICENSE.txt,sha256=Vgm6HhOV7-JiCwHQp6ZhJstX-bYr7vndLOKWlzRqaZI,1108 -dataset-1.3.1.dist-info/METADATA,sha256=i145t3x92yoosw0q02eoagRqlThaxnLlMEVDhBHU9A0,1733 -dataset-1.3.1.dist-info/RECORD,, -dataset-1.3.1.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 -dataset-1.3.1.dist-info/namespace_packages.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -dataset-1.3.1.dist-info/top_level.txt,sha256=azD5Wy9MBv9bfMbTscYXdFdDxcIUlm2bl46qT0i1ra4,8 -dataset/__init__.py,sha256=FBxK1e-pmxtrnJjweIz4_d7ZOuDXnSrAIIlSVk-Bg1w,2253 -dataset/__pycache__/__init__.cpython-37.pyc,, -dataset/__pycache__/chunked.cpython-37.pyc,, -dataset/__pycache__/database.cpython-37.pyc,, -dataset/__pycache__/table.cpython-37.pyc,, -dataset/__pycache__/types.cpython-37.pyc,, -dataset/__pycache__/util.cpython-37.pyc,, -dataset/chunked.py,sha256=KcT689u-QTbUgL1pW_EALC27eE07pKYgw14iTCMzOgE,2485 -dataset/database.py,sha256=3-hThm-fQcPv5myUcxvq8U4191viNPGLBK98QD9DqfI,9809 -dataset/table.py,sha256=BS57A30_gTyh6lLeXKLUv9rkWLdhZOC9isPrARpm-aw,27036 -dataset/types.py,sha256=rTXlXNpYIaVjkmUgjlzQeCgWwjEEIlLcKzWb1IC2eLY,1461 -dataset/util.py,sha256=qrOSYPZq2c3bMtoUGWtANUxgbz6xxYz9BXJJoxTPP6k,3368 diff --git a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/WHEEL b/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/WHEEL deleted file mode 100644 index ef99c6c..0000000 --- a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.34.2) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/namespace_packages.txt b/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/namespace_packages.txt deleted file mode 100644 index 8b13789..0000000 --- a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/namespace_packages.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/top_level.txt deleted file mode 100644 index caba867..0000000 --- a/venv/lib/python3.7/site-packages/dataset-1.3.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -dataset diff --git a/venv/lib/python3.7/site-packages/dataset/__init__.py b/venv/lib/python3.7/site-packages/dataset/__init__.py deleted file mode 100644 index a0fc789..0000000 --- a/venv/lib/python3.7/site-packages/dataset/__init__.py +++ /dev/null @@ -1,47 +0,0 @@ -import os -import warnings -from dataset.database import Database -from dataset.table import Table -from dataset.util import row_type - -# shut up useless SA warning: -warnings.filterwarnings( - 'ignore', 'Unicode type received non-unicode bind param value.') -warnings.filterwarnings( - 'ignore', 'Skipping unsupported ALTER for creation of implicit constraint') - -__all__ = ['Database', 'Table', 'freeze', 'connect'] -__version__ = '1.3.1' - - -def connect(url=None, schema=None, reflect_metadata=True, engine_kwargs=None, - reflect_views=True, ensure_schema=True, row_type=row_type): - """ Opens a new connection to a database. - - *url* can be any valid `SQLAlchemy engine URL`_. If *url* is not defined - it will try to use *DATABASE_URL* from environment variable. Returns an - instance of :py:class:`Database `. Set *reflect_metadata* - to False if you don't want the entire database schema to be pre-loaded. - This significantly speeds up connecting to large databases with lots of - tables. *reflect_views* can be set to False if you don't want views to be - loaded. Additionally, *engine_kwargs* will be directly passed to - SQLAlchemy, e.g. set *engine_kwargs={'pool_recycle': 3600}* will avoid `DB - connection timeout`_. Set *row_type* to an alternate dict-like class to - change the type of container rows are stored in.:: - - db = dataset.connect('sqlite:///factbook.db') - - One of the main features of `dataset` is to automatically create tables and - columns as data is inserted. This behaviour can optionally be disabled via - the `ensure_schema` argument. It can also be overridden in a lot of the - data manipulation methods using the `ensure` flag. - - .. _SQLAlchemy Engine URL: http://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine - .. _DB connection timeout: http://docs.sqlalchemy.org/en/latest/core/pooling.html#setting-pool-recycle - """ - if url is None: - url = os.environ.get('DATABASE_URL', 'sqlite://') - - return Database(url, schema=schema, reflect_metadata=reflect_metadata, - engine_kwargs=engine_kwargs, reflect_views=reflect_views, - ensure_schema=ensure_schema, row_type=row_type) diff --git a/venv/lib/python3.7/site-packages/dataset/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/dataset/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 6057bd862555588b33d21df52c4234955eca78c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2231 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 rF!;uu`=69wW}gy}O@N{Sv&K)j+;y6+@73p= self.chunksize: - self.flush() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.flush() - - -class ChunkedInsert(_Chunker): - """Batch up insert operations - with ChunkedInsert(my_table) as inserter: - inserter(row) - - Rows will be inserted in groups of `chunksize` (defaulting to 1000). An - optional callback can be provided that will be called before the insert. - This callback takes one parameter which is the queue which is about to be - inserted into the database - """ - - def __init__(self, table, chunksize=1000, callback=None): - self.fields = set() - super().__init__(table, chunksize, callback) - - def insert(self, item): - self.fields.update(item.keys()) - super()._queue_add(item) - - def flush(self): - for item in self.queue: - for field in self.fields: - item[field] = item.get(field) - if self.callback is not None: - self.callback(self.queue) - self.table.insert_many(self.queue) - super().flush() - - -class ChunkedUpdate(_Chunker): - """Batch up update operations - with ChunkedUpdate(my_table) as updater: - updater(row) - - Rows will be updated in groups of `chunksize` (defaulting to 1000). An - optional callback can be provided that will be called before the update. - This callback takes one parameter which is the queue which is about to be - updated into the database - """ - - def __init__(self, table, keys, chunksize=1000, callback=None): - self.keys = keys - super().__init__(table, chunksize, callback) - - def update(self, item): - super()._queue_add(item) - - def flush(self): - if self.callback is not None: - self.callback(self.queue) - self.queue.sort(key=dict.keys) - for fields, items in itertools.groupby(self.queue, key=dict.keys): - self.table.update_many(list(items), self.keys) - super().flush() diff --git a/venv/lib/python3.7/site-packages/dataset/database.py b/venv/lib/python3.7/site-packages/dataset/database.py deleted file mode 100644 index 87d85be..0000000 --- a/venv/lib/python3.7/site-packages/dataset/database.py +++ /dev/null @@ -1,273 +0,0 @@ -import logging -import threading -from urllib.parse import parse_qs, urlparse - -from sqlalchemy import create_engine -from sqlalchemy.sql import text -from sqlalchemy.schema import MetaData -from sqlalchemy.util import safe_reraise -from sqlalchemy.engine.reflection import Inspector - -from alembic.migration import MigrationContext -from alembic.operations import Operations - -from dataset.table import Table -from dataset.util import ResultIter, row_type, safe_url, QUERY_STEP -from dataset.util import normalize_table_name -from dataset.types import Types - -log = logging.getLogger(__name__) - - -class Database(object): - """A database object represents a SQL database with multiple tables.""" - - def __init__(self, url, schema=None, reflect_metadata=True, - engine_kwargs=None, reflect_views=True, - ensure_schema=True, row_type=row_type): - """Configure and connect to the database.""" - if engine_kwargs is None: - engine_kwargs = {} - - parsed_url = urlparse(url) - # if parsed_url.scheme.lower() in 'sqlite': - # # ref: https://github.com/pudo/dataset/issues/163 - # if 'poolclass' not in engine_kwargs: - # engine_kwargs['poolclass'] = StaticPool - - self.lock = threading.RLock() - self.local = threading.local() - - if len(parsed_url.query): - query = parse_qs(parsed_url.query) - if schema is None: - schema_qs = query.get('schema', query.get('searchpath', [])) - if len(schema_qs): - schema = schema_qs.pop() - - self.schema = schema - self.engine = create_engine(url, **engine_kwargs) - self.types = Types(self.engine.dialect.name) - self.url = url - self.row_type = row_type - self.ensure_schema = ensure_schema - self._tables = {} - - @property - def executable(self): - """Connection against which statements will be executed.""" - if not hasattr(self.local, 'conn'): - self.local.conn = self.engine.connect() - return self.local.conn - - @property - def op(self): - """Get an alembic operations context.""" - ctx = MigrationContext.configure(self.executable) - return Operations(ctx) - - @property - def inspect(self): - """Get a SQLAlchemy inspector.""" - return Inspector.from_engine(self.executable) - - @property - def metadata(self): - """Return a SQLAlchemy schema cache object.""" - return MetaData(schema=self.schema, bind=self.executable) - - @property - def in_transaction(self): - """Check if this database is in a transactional context.""" - if not hasattr(self.local, 'tx'): - return False - return len(self.local.tx) > 0 - - def _flush_tables(self): - """Clear the table metadata after transaction rollbacks.""" - for table in self._tables.values(): - table._table = None - - def begin(self): - """Enter a transaction explicitly. - - No data will be written until the transaction has been committed. - """ - if not hasattr(self.local, 'tx'): - self.local.tx = [] - self.local.tx.append(self.executable.begin()) - - def commit(self): - """Commit the current transaction. - - Make all statements executed since the transaction was begun permanent. - """ - if hasattr(self.local, 'tx') and self.local.tx: - tx = self.local.tx.pop() - tx.commit() - self._flush_tables() - - def rollback(self): - """Roll back the current transaction. - - Discard all statements executed since the transaction was begun. - """ - if hasattr(self.local, 'tx') and self.local.tx: - tx = self.local.tx.pop() - tx.rollback() - self._flush_tables() - - def __enter__(self): - """Start a transaction.""" - self.begin() - return self - - def __exit__(self, error_type, error_value, traceback): - """End a transaction by committing or rolling back.""" - if error_type is None: - try: - self.commit() - except Exception: - with safe_reraise(): - self.rollback() - else: - self.rollback() - - def close(self): - """Close database connections. Makes this object unusable.""" - self.engine.dispose() - self._tables = {} - self.engine = None - - @property - def tables(self): - """Get a listing of all tables that exist in the database.""" - return self.inspect.get_table_names(schema=self.schema) - - @property - def views(self): - """Get a listing of all views that exist in the database.""" - return self.inspect.get_view_names(schema=self.schema) - - def __contains__(self, table_name): - """Check if the given table name exists in the database.""" - try: - table_name = normalize_table_name(table_name) - if table_name in self.tables: - return True - if table_name in self.views: - return True - return False - except ValueError: - return False - - def create_table(self, table_name, primary_id=None, primary_type=None): - """Create a new table. - - Either loads a table or creates it if it doesn't exist yet. You can - define the name and type of the primary key field, if a new table is to - be created. The default is to create an auto-incrementing integer, - ``id``. You can also set the primary key to be a string or big integer. - The caller will be responsible for the uniqueness of ``primary_id`` if - it is defined as a text type. - - Returns a :py:class:`Table ` instance. - :: - - table = db.create_table('population') - - # custom id and type - table2 = db.create_table('population2', 'age') - table3 = db.create_table('population3', - primary_id='city', - primary_type=db.types.text) - # custom length of String - table4 = db.create_table('population4', - primary_id='city', - primary_type=db.types.string(25)) - # no primary key - table5 = db.create_table('population5', - primary_id=False) - """ - assert not isinstance(primary_type, str), \ - 'Text-based primary_type support is dropped, use db.types.' - table_name = normalize_table_name(table_name) - with self.lock: - if table_name not in self._tables: - self._tables[table_name] = Table(self, table_name, - primary_id=primary_id, - primary_type=primary_type, - auto_create=True) - return self._tables.get(table_name) - - def load_table(self, table_name): - """Load a table. - - This will fail if the tables does not already exist in the database. If - the table exists, its columns will be reflected and are available on - the :py:class:`Table ` object. - - Returns a :py:class:`Table ` instance. - :: - - table = db.load_table('population') - """ - table_name = normalize_table_name(table_name) - with self.lock: - if table_name not in self._tables: - self._tables[table_name] = Table(self, table_name) - return self._tables.get(table_name) - - def get_table(self, table_name, primary_id=None, primary_type=None): - """Load or create a table. - - This is now the same as ``create_table``. - :: - - table = db.get_table('population') - # you can also use the short-hand syntax: - table = db['population'] - """ - return self.create_table(table_name, primary_id, primary_type) - - def __getitem__(self, table_name): - """Get a given table.""" - return self.get_table(table_name) - - def _ipython_key_completions_(self): - """Completion for table names with IPython.""" - return self.tables - - def query(self, query, *args, **kwargs): - """Run a statement on the database directly. - - Allows for the execution of arbitrary read/write queries. A query can - either be a plain text string, or a `SQLAlchemy expression - `_. - If a plain string is passed in, it will be converted to an expression - automatically. - - Further positional and keyword arguments will be used for parameter - binding. To include a positional argument in your query, use question - marks in the query (i.e. ``SELECT * FROM tbl WHERE a = ?```). For - keyword arguments, use a bind parameter (i.e. ``SELECT * FROM tbl - WHERE a = :foo``). - :: - - statement = 'SELECT user, COUNT(*) c FROM photos GROUP BY user' - for row in db.query(statement): - print(row['user'], row['c']) - - The returned iterator will yield each result sequentially. - """ - if isinstance(query, str): - query = text(query) - _step = kwargs.pop('_step', QUERY_STEP) - if _step is False or _step == 0: - _step = None - rp = self.executable.execute(query, *args, **kwargs) - return ResultIter(rp, row_type=self.row_type, step=_step) - - def __repr__(self): - """Text representation contains the URL.""" - return '' % safe_url(self.url) diff --git a/venv/lib/python3.7/site-packages/dataset/table.py b/venv/lib/python3.7/site-packages/dataset/table.py deleted file mode 100644 index 9fc3332..0000000 --- a/venv/lib/python3.7/site-packages/dataset/table.py +++ /dev/null @@ -1,719 +0,0 @@ -import logging -import warnings -import threading - -from sqlalchemy.sql import and_, expression -from sqlalchemy.sql.expression import bindparam, ClauseElement -from sqlalchemy.schema import Column, Index -from sqlalchemy import func, select, false -from sqlalchemy.schema import Table as SQLATable -from sqlalchemy.exc import NoSuchTableError - -from dataset.types import Types -from dataset.util import index_name, ensure_tuple -from dataset.util import DatasetException, ResultIter, QUERY_STEP -from dataset.util import normalize_table_name, pad_chunk_columns -from dataset.util import normalize_column_name, normalize_column_key - - -log = logging.getLogger(__name__) - - -class Table(object): - """Represents a table in a database and exposes common operations.""" - PRIMARY_DEFAULT = 'id' - - def __init__(self, database, table_name, primary_id=None, - primary_type=None, auto_create=False): - """Initialise the table from database schema.""" - self.db = database - self.name = normalize_table_name(table_name) - self._table = None - self._columns = None - self._indexes = [] - self._primary_id = primary_id if primary_id is not None \ - else self.PRIMARY_DEFAULT - self._primary_type = primary_type if primary_type is not None \ - else Types.integer - self._auto_create = auto_create - - @property - def exists(self): - """Check to see if the table currently exists in the database.""" - if self._table is not None: - return True - return self.name in self.db - - @property - def table(self): - """Get a reference to the table, which may be reflected or created.""" - if self._table is None: - self._sync_table(()) - return self._table - - @property - def _column_keys(self): - """Get a dictionary of all columns and their case mapping.""" - if not self.exists: - return {} - with self.db.lock: - if self._columns is None: - # Initialise the table if it doesn't exist - table = self.table - self._columns = {} - for column in table.columns: - name = normalize_column_name(column.name) - key = normalize_column_key(name) - if key in self._columns: - log.warning("Duplicate column: %s", name) - self._columns[key] = name - return self._columns - - def _flush_metadata(self): - with self.db.lock: - self._columns = None - - @property - def columns(self): - """Get a listing of all columns that exist in the table.""" - return list(self._column_keys.values()) - - def has_column(self, column): - """Check if a column with the given name exists on this table.""" - key = normalize_column_key(normalize_column_name(column)) - return key in self._column_keys - - def _get_column_name(self, name): - """Find the best column name with case-insensitive matching.""" - name = normalize_column_name(name) - key = normalize_column_key(name) - return self._column_keys.get(key, name) - - def insert(self, row, ensure=None, types=None): - """Add a ``row`` dict by inserting it into the table. - - If ``ensure`` is set, any of the keys of the row are not - table columns, they will be created automatically. - - During column creation, ``types`` will be checked for a key - matching the name of a column to be created, and the given - SQLAlchemy column type will be used. Otherwise, the type is - guessed from the row value, defaulting to a simple unicode - field. - :: - - data = dict(title='I am a banana!') - table.insert(data) - - Returns the inserted row's primary key. - """ - row = self._sync_columns(row, ensure, types=types) - res = self.db.executable.execute(self.table.insert(row)) - if len(res.inserted_primary_key) > 0: - return res.inserted_primary_key[0] - return True - - def insert_ignore(self, row, keys, ensure=None, types=None): - """Add a ``row`` dict into the table if the row does not exist. - - If rows with matching ``keys`` exist no change is made. - - Setting ``ensure`` results in automatically creating missing columns, - i.e., keys of the row are not table columns. - - During column creation, ``types`` will be checked for a key - matching the name of a column to be created, and the given - SQLAlchemy column type will be used. Otherwise, the type is - guessed from the row value, defaulting to a simple unicode - field. - :: - - data = dict(id=10, title='I am a banana!') - table.insert_ignore(data, ['id']) - """ - row = self._sync_columns(row, ensure, types=types) - if self._check_ensure(ensure): - self.create_index(keys) - args, _ = self._keys_to_args(row, keys) - if self.count(**args) == 0: - return self.insert(row, ensure=False) - return False - - def insert_many(self, rows, chunk_size=1000, ensure=None, types=None): - """Add many rows at a time. - - This is significantly faster than adding them one by one. Per default - the rows are processed in chunks of 1000 per commit, unless you specify - a different ``chunk_size``. - - See :py:meth:`insert() ` for details on - the other parameters. - :: - - rows = [dict(name='Dolly')] * 10000 - table.insert_many(rows) - """ - # Sync table before inputting rows. - sync_row = {} - for row in rows: - # Only get non-existing columns. - sync_keys = list(sync_row.keys()) - for key in [k for k in row.keys() if k not in sync_keys]: - # Get a sample of the new column(s) from the row. - sync_row[key] = row[key] - self._sync_columns(sync_row, ensure, types=types) - - # Get columns name list to be used for padding later. - columns = sync_row.keys() - - chunk = [] - for index, row in enumerate(rows): - chunk.append(row) - - # Insert when chunk_size is fulfilled or this is the last row - if len(chunk) == chunk_size or index == len(rows) - 1: - chunk = pad_chunk_columns(chunk, columns) - self.table.insert().execute(chunk) - chunk = [] - - def update(self, row, keys, ensure=None, types=None, return_count=False): - """Update a row in the table. - - The update is managed via the set of column names stated in ``keys``: - they will be used as filters for the data to be updated, using the - values in ``row``. - :: - - # update all entries with id matching 10, setting their title - # columns - data = dict(id=10, title='I am a banana!') - table.update(data, ['id']) - - If keys in ``row`` update columns not present in the table, they will - be created based on the settings of ``ensure`` and ``types``, matching - the behavior of :py:meth:`insert() `. - """ - row = self._sync_columns(row, ensure, types=types) - args, row = self._keys_to_args(row, keys) - clause = self._args_to_clause(args) - if not len(row): - return self.count(clause) - stmt = self.table.update(whereclause=clause, values=row) - rp = self.db.executable.execute(stmt) - if rp.supports_sane_rowcount(): - return rp.rowcount - if return_count: - return self.count(clause) - - def update_many(self, rows, keys, chunk_size=1000, ensure=None, - types=None): - """Update many rows in the table at a time. - - This is significantly faster than updating them one by one. Per default - the rows are processed in chunks of 1000 per commit, unless you specify - a different ``chunk_size``. - - See :py:meth:`update() ` for details on - the other parameters. - """ - # Convert keys to a list if not a list or tuple. - keys = keys if type(keys) in (list, tuple) else [keys] - - chunk = [] - columns = [] - for index, row in enumerate(rows): - chunk.append(row) - for col in row.keys(): - if col not in columns: - columns.append(col) - - # bindparam requires names to not conflict (cannot be "id" for id) - for key in keys: - row['_%s' % key] = row[key] - - # Update when chunk_size is fulfilled or this is the last row - if len(chunk) == chunk_size or index == len(rows) - 1: - cl = [self.table.c[k] == bindparam('_%s' % k) for k in keys] - stmt = self.table.update( - whereclause=and_(*cl), - values={ - col: bindparam(col, required=False) for col in columns - } - ) - self.db.executable.execute(stmt, chunk) - chunk = [] - - def upsert(self, row, keys, ensure=None, types=None): - """An UPSERT is a smart combination of insert and update. - - If rows with matching ``keys`` exist they will be updated, otherwise a - new row is inserted in the table. - :: - - data = dict(id=10, title='I am a banana!') - table.upsert(data, ['id']) - """ - row = self._sync_columns(row, ensure, types=types) - if self._check_ensure(ensure): - self.create_index(keys) - row_count = self.update(row, keys, ensure=False, return_count=True) - if row_count == 0: - return self.insert(row, ensure=False) - return True - - def upsert_many(self, rows, keys, chunk_size=1000, ensure=None, - types=None): - """ - Sorts multiple input rows into upserts and inserts. Inserts are passed - to insert_many and upserts are updated. - - See :py:meth:`upsert() ` and - :py:meth:`insert_many() `. - """ - # Convert keys to a list if not a list or tuple. - keys = keys if type(keys) in (list, tuple) else [keys] - - to_insert = [] - to_update = [] - for row in rows: - if self.find_one(**{key: row.get(key) for key in keys}): - # Row exists - update it. - to_update.append(row) - else: - # Row doesn't exist - insert it. - to_insert.append(row) - - # Insert non-existing rows. - self.insert_many(to_insert, chunk_size, ensure, types) - - # Update existing rows. - self.update_many(to_update, keys, chunk_size, ensure, types) - - def delete(self, *clauses, **filters): - """Delete rows from the table. - - Keyword arguments can be used to add column-based filters. The filter - criterion will always be equality: - :: - - table.delete(place='Berlin') - - If no arguments are given, all records are deleted. - """ - if not self.exists: - return False - clause = self._args_to_clause(filters, clauses=clauses) - stmt = self.table.delete(whereclause=clause) - rp = self.db.executable.execute(stmt) - return rp.rowcount > 0 - - def _reflect_table(self): - """Load the tables definition from the database.""" - with self.db.lock: - self._flush_metadata() - try: - self._table = SQLATable(self.name, - self.db.metadata, - schema=self.db.schema, - autoload=True) - except NoSuchTableError: - self._table = None - - def _threading_warn(self): - if self.db.in_transaction and threading.active_count() > 1: - warnings.warn("Changing the database schema inside a transaction " - "in a multi-threaded environment is likely to lead " - "to race conditions and synchronization issues.", - RuntimeWarning) - - def _sync_table(self, columns): - """Lazy load, create or adapt the table structure in the database.""" - self._flush_metadata() - if self._table is None: - # Load an existing table from the database. - self._reflect_table() - if self._table is None: - # Create the table with an initial set of columns. - if not self._auto_create: - raise DatasetException("Table does not exist: %s" % self.name) - # Keep the lock scope small because this is run very often. - with self.db.lock: - self._threading_warn() - self._table = SQLATable(self.name, - self.db.metadata, - schema=self.db.schema) - if self._primary_id is not False: - # This can go wrong on DBMS like MySQL and SQLite where - # tables cannot have no columns. - primary_id = self._primary_id - primary_type = self._primary_type - increment = primary_type in [Types.integer, Types.bigint] - column = Column(primary_id, primary_type, - primary_key=True, - autoincrement=increment) - self._table.append_column(column) - for column in columns: - if not column.name == self._primary_id: - self._table.append_column(column) - self._table.create(self.db.executable, checkfirst=True) - elif len(columns): - with self.db.lock: - self._reflect_table() - self._threading_warn() - for column in columns: - if not self.has_column(column.name): - self.db.op.add_column(self.name, - column, - self.db.schema) - self._reflect_table() - - def _sync_columns(self, row, ensure, types=None): - """Create missing columns (or the table) prior to writes. - - If automatic schema generation is disabled (``ensure`` is ``False``), - this will remove any keys from the ``row`` for which there is no - matching column. - """ - ensure = self._check_ensure(ensure) - types = types or {} - types = {self._get_column_name(k): v for (k, v) in types.items()} - out = {} - sync_columns = {} - for name, value in row.items(): - name = self._get_column_name(name) - if self.has_column(name): - out[name] = value - elif ensure: - _type = types.get(name) - if _type is None: - _type = self.db.types.guess(value) - sync_columns[name] = Column(name, _type) - out[name] = value - self._sync_table(sync_columns.values()) - return out - - def _check_ensure(self, ensure): - if ensure is None: - return self.db.ensure_schema - return ensure - - def _generate_clause(self, column, op, value): - if op in ('like',): - return self.table.c[column].like(value) - if op in ('ilike',): - return self.table.c[column].ilike(value) - if op in ('>', 'gt'): - return self.table.c[column] > value - if op in ('<', 'lt'): - return self.table.c[column] < value - if op in ('>=', 'gte'): - return self.table.c[column] >= value - if op in ('<=', 'lte'): - return self.table.c[column] <= value - if op in ('=', '==', 'is'): - return self.table.c[column] == value - if op in ('!=', '<>', 'not'): - return self.table.c[column] != value - if op in ('in'): - return self.table.c[column].in_(value) - if op in ('between', '..'): - start, end = value - return self.table.c[column].between(start, end) - if op in ('startswith',): - return self.table.c[column].like('%' + value) - if op in ('endswith',): - return self.table.c[column].like(value + '%') - return false() - - def _args_to_clause(self, args, clauses=()): - clauses = list(clauses) - for column, value in args.items(): - column = self._get_column_name(column) - if not self.has_column(column): - clauses.append(false()) - elif isinstance(value, (list, tuple, set)): - clauses.append(self._generate_clause(column, 'in', value)) - elif isinstance(value, dict): - for op, op_value in value.items(): - clauses.append(self._generate_clause(column, op, op_value)) - else: - clauses.append(self._generate_clause(column, '=', value)) - return and_(*clauses) - - def _args_to_order_by(self, order_by): - orderings = [] - for ordering in ensure_tuple(order_by): - if ordering is None: - continue - column = ordering.lstrip('-') - column = self._get_column_name(column) - if not self.has_column(column): - continue - if ordering.startswith('-'): - orderings.append(self.table.c[column].desc()) - else: - orderings.append(self.table.c[column].asc()) - return orderings - - def _keys_to_args(self, row, keys): - keys = ensure_tuple(keys) - keys = [self._get_column_name(k) for k in keys] - row = row.copy() - args = {k: row.pop(k, None) for k in keys} - return args, row - - def create_column(self, name, type, **kwargs): - """Create a new column ``name`` of a specified type. - :: - - table.create_column('created_at', db.types.datetime) - - `type` corresponds to an SQLAlchemy type as described by - `dataset.db.Types`. Additional keyword arguments are passed - to the constructor of `Column`, so that default values, and - options like `nullable` and `unique` can be set. - :: - - table.create_column('key', unique=True, nullable=False) - table.create_column('food', default='banana') - """ - name = self._get_column_name(name) - if self.has_column(name): - log.debug("Column exists: %s" % name) - return - self._sync_table((Column(name, type, **kwargs),)) - - def create_column_by_example(self, name, value): - """ - Explicitly create a new column ``name`` with a type that is appropriate - to store the given example ``value``. The type is guessed in the same - way as for the insert method with ``ensure=True``. - :: - - table.create_column_by_example('length', 4.2) - - If a column of the same name already exists, no action is taken, even - if it is not of the type we would have created. - """ - type_ = self.db.types.guess(value) - self.create_column(name, type_) - - def drop_column(self, name): - """Drop the column ``name``. - :: - table.drop_column('created_at') - """ - if self.db.engine.dialect.name == 'sqlite': - raise RuntimeError("SQLite does not support dropping columns.") - name = self._get_column_name(name) - with self.db.lock: - if not self.exists or not self.has_column(name): - log.debug("Column does not exist: %s", name) - return - - self._threading_warn() - self.db.op.drop_column( - self.table.name, - name, - self.table.schema - ) - self._reflect_table() - - def drop(self): - """Drop the table from the database. - - Deletes both the schema and all the contents within it. - """ - with self.db.lock: - if self.exists: - self._threading_warn() - self.table.drop(self.db.executable, checkfirst=True) - self._table = None - self._flush_metadata() - - def has_index(self, columns): - """Check if an index exists to cover the given ``columns``.""" - if not self.exists: - return False - columns = set([self._get_column_name(c) for c in columns]) - if columns in self._indexes: - return True - for column in columns: - if not self.has_column(column): - return False - indexes = self.db.inspect.get_indexes(self.name, schema=self.db.schema) - for index in indexes: - if columns == set(index.get('column_names', [])): - self._indexes.append(columns) - return True - return False - - def create_index(self, columns, name=None, **kw): - """Create an index to speed up queries on a table. - - If no ``name`` is given a random name is created. - :: - - table.create_index(['name', 'country']) - """ - columns = [self._get_column_name(c) for c in ensure_tuple(columns)] - with self.db.lock: - if not self.exists: - raise DatasetException("Table has not been created yet.") - - for column in columns: - if not self.has_column(column): - return - - if not self.has_index(columns): - self._threading_warn() - name = name or index_name(self.name, columns) - columns = [self.table.c[c] for c in columns] - idx = Index(name, *columns, **kw) - idx.create(self.db.executable) - - def find(self, *_clauses, **kwargs): - """Perform a simple search on the table. - - Simply pass keyword arguments as ``filter``. - :: - - results = table.find(country='France') - results = table.find(country='France', year=1980) - - Using ``_limit``:: - - # just return the first 10 rows - results = table.find(country='France', _limit=10) - - You can sort the results by single or multiple columns. Append a minus - sign to the column name for descending order:: - - # sort results by a column 'year' - results = table.find(country='France', order_by='year') - # return all rows sorted by multiple columns (descending by year) - results = table.find(order_by=['country', '-year']) - - To perform complex queries with advanced filters or to perform - aggregation, use :py:meth:`db.query() ` - instead. - """ - if not self.exists: - return iter([]) - - _limit = kwargs.pop('_limit', None) - _offset = kwargs.pop('_offset', 0) - order_by = kwargs.pop('order_by', None) - _streamed = kwargs.pop('_streamed', False) - _step = kwargs.pop('_step', QUERY_STEP) - if _step is False or _step == 0: - _step = None - - order_by = self._args_to_order_by(order_by) - args = self._args_to_clause(kwargs, clauses=_clauses) - query = self.table.select(whereclause=args, - limit=_limit, - offset=_offset) - if len(order_by): - query = query.order_by(*order_by) - - conn = self.db.executable - if _streamed: - conn = self.db.engine.connect() - conn = conn.execution_options(stream_results=True) - - return ResultIter(conn.execute(query), - row_type=self.db.row_type, - step=_step) - - def find_one(self, *args, **kwargs): - """Get a single result from the table. - - Works just like :py:meth:`find() ` but returns one - result, or ``None``. - :: - - row = table.find_one(country='United States') - """ - if not self.exists: - return None - - kwargs['_limit'] = 1 - kwargs['_step'] = None - resiter = self.find(*args, **kwargs) - try: - for row in resiter: - return row - finally: - resiter.close() - - def count(self, *_clauses, **kwargs): - """Return the count of results for the given filter set.""" - # NOTE: this does not have support for limit and offset since I can't - # see how this is useful. Still, there might be compatibility issues - # with people using these flags. Let's see how it goes. - if not self.exists: - return 0 - - args = self._args_to_clause(kwargs, clauses=_clauses) - query = select([func.count()], whereclause=args) - query = query.select_from(self.table) - rp = self.db.executable.execute(query) - return rp.fetchone()[0] - - def __len__(self): - """Return the number of rows in the table.""" - return self.count() - - def distinct(self, *args, **_filter): - """Return all the unique (distinct) values for the given ``columns``. - :: - - # returns only one row per year, ignoring the rest - table.distinct('year') - # works with multiple columns, too - table.distinct('year', 'country') - # you can also combine this with a filter - table.distinct('year', country='China') - """ - if not self.exists: - return iter([]) - - columns = [] - clauses = [] - for column in args: - if isinstance(column, ClauseElement): - clauses.append(column) - else: - if not self.has_column(column): - raise DatasetException("No such column: %s" % column) - columns.append(self.table.c[column]) - - clause = self._args_to_clause(_filter, clauses=clauses) - if not len(columns): - return iter([]) - - q = expression.select(columns, - distinct=True, - whereclause=clause, - order_by=[c.asc() for c in columns]) - return self.db.query(q) - - # Legacy methods for running find queries. - all = find - - def __iter__(self): - """Return all rows of the table as simple dictionaries. - - Allows for iterating over all rows in the table without explicetly - calling :py:meth:`find() `. - :: - - for row in table: - print(row) - """ - return self.find() - - def __repr__(self): - """Get table representation.""" - return '' % self.table.name diff --git a/venv/lib/python3.7/site-packages/dataset/types.py b/venv/lib/python3.7/site-packages/dataset/types.py deleted file mode 100644 index d30d3c1..0000000 --- a/venv/lib/python3.7/site-packages/dataset/types.py +++ /dev/null @@ -1,49 +0,0 @@ -from datetime import datetime, date - -from sqlalchemy import Integer, UnicodeText, Float, BigInteger -from sqlalchemy import Boolean, Date, DateTime, Unicode, JSON -from sqlalchemy.dialects.postgresql import JSONB -from sqlalchemy.types import TypeEngine - - -class Types(object): - """A holder class for easy access to SQLAlchemy type names.""" - integer = Integer - string = Unicode - text = UnicodeText - float = Float - bigint = BigInteger - boolean = Boolean - date = Date - datetime = DateTime - - def __init__(self, dialect=None): - self._dialect = dialect - - @property - def json(self): - if self._dialect is not None and self._dialect == 'postgresql': - return JSONB - return JSON - - def guess(self, sample): - """Given a single sample, guess the column type for the field. - - If the sample is an instance of an SQLAlchemy type, the type will be - used instead. - """ - if isinstance(sample, TypeEngine): - return sample - if isinstance(sample, bool): - return self.boolean - elif isinstance(sample, int): - return self.bigint - elif isinstance(sample, float): - return self.float - elif isinstance(sample, datetime): - return self.datetime - elif isinstance(sample, date): - return self.date - elif isinstance(sample, dict): - return self.json - return self.text diff --git a/venv/lib/python3.7/site-packages/dataset/util.py b/venv/lib/python3.7/site-packages/dataset/util.py deleted file mode 100644 index 2b0f8c3..0000000 --- a/venv/lib/python3.7/site-packages/dataset/util.py +++ /dev/null @@ -1,124 +0,0 @@ -from hashlib import sha1 -from urllib.parse import urlparse -from collections import OrderedDict -from collections.abc import Iterable - -QUERY_STEP = 1000 -row_type = OrderedDict - - -class DatasetException(Exception): - pass - - -def convert_row(row_type, row): - if row is None: - return None - return row_type(row.items()) - - -def iter_result_proxy(rp, step=None): - """Iterate over the ResultProxy.""" - while True: - if step is None: - chunk = rp.fetchall() - else: - chunk = rp.fetchmany(size=step) - if not chunk: - break - for row in chunk: - yield row - - -class ResultIter(object): - """ SQLAlchemy ResultProxies are not iterable to get a - list of dictionaries. This is to wrap them. """ - - def __init__(self, result_proxy, row_type=row_type, step=None): - self.row_type = row_type - self.result_proxy = result_proxy - self.keys = list(result_proxy.keys()) - self._iter = iter_result_proxy(result_proxy, step=step) - - def __next__(self): - try: - return convert_row(self.row_type, next(self._iter)) - except StopIteration: - self.close() - raise - - next = __next__ - - def __iter__(self): - return self - - def close(self): - self.result_proxy.close() - - -def normalize_column_name(name): - """Check if a string is a reasonable thing to use as a column name.""" - if not isinstance(name, str): - raise ValueError('%r is not a valid column name.' % name) - - # limit to 63 characters - name = name.strip()[:63] - # column names can be 63 *bytes* max in postgresql - if isinstance(name, str): - while len(name.encode('utf-8')) >= 64: - name = name[:len(name) - 1] - - if not len(name) or '.' in name or '-' in name: - raise ValueError('%r is not a valid column name.' % name) - return name - - -def normalize_column_key(name): - """Return a comparable column name.""" - if name is None or not isinstance(name, str): - return None - return name.upper().strip().replace(' ', '') - - -def normalize_table_name(name): - """Check if the table name is obviously invalid.""" - if not isinstance(name, str): - raise ValueError("Invalid table name: %r" % name) - name = name.strip()[:63] - if not len(name): - raise ValueError("Invalid table name: %r" % name) - return name - - -def safe_url(url): - """Remove password from printed connection URLs.""" - parsed = urlparse(url) - if parsed.password is not None: - pwd = ':%s@' % parsed.password - url = url.replace(pwd, ':*****@') - return url - - -def index_name(table, columns): - """Generate an artificial index name.""" - sig = '||'.join(columns) - key = sha1(sig.encode('utf-8')).hexdigest()[:16] - return 'ix_%s_%s' % (table, key) - - -def ensure_tuple(obj): - """Try and make the given argument into a tuple.""" - if obj is None: - return tuple() - if isinstance(obj, Iterable) and not isinstance(obj, (str, bytes)): - return tuple(obj) - return obj, - - -def pad_chunk_columns(chunk, columns): - """Given a set of items to be inserted, make sure they all have the - same columns by padding columns with None if they are missing.""" - for record in chunk: - for column in columns: - record.setdefault(column, None) - return chunk diff --git a/venv/lib/python3.7/site-packages/dateutil/__init__.py b/venv/lib/python3.7/site-packages/dateutil/__init__.py deleted file mode 100644 index 0defb82..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- -try: - from ._version import version as __version__ -except ImportError: - __version__ = 'unknown' - -__all__ = ['easter', 'parser', 'relativedelta', 'rrule', 'tz', - 'utils', 'zoneinfo'] diff --git a/venv/lib/python3.7/site-packages/dateutil/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/dateutil/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 7c6dbc359bd3b8288bbe818b17347ed9c08d67b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmX|7u}%Xq3{BEr@3>P@M?QfL`^3gk=zfVp8)}?NlQ7SWJS!;n8?wl z#A8YZ1IF1sG3<`O2*!}X1ac_g;4$Z8C~wKU`lM;ioW^`B(JO0W-kFWD&xTKASp&(HpLTxy}1p%T|EnEl^Z3XgymFwLQH;$d|Izp+; zseK2oAaUU>cn)8=@&ufiS?8yz*l1^Fz2n_)zWJP&jfO{H{Q3Ip;}46F-?*3!8-f=w z^*R_qeDaD2D%d#@Owu#UXTsViZTs||x04QsY0?T)AzNcDMJq~L!*QHNqgb|vsTjvn zZ+RgcGaqnSdH5a#lK2!ZU;-}q#C%I!5tgvesc(ylaL$Qe5mn)WcSKEi;HzRq)WN%= zA)4T8f&rA(qWW3Nfe0oAO}Zgofdf5*xdT(Lg2`!4ILR4UxE5Zd-8NGcb`<8dt-{ta z?k%4DBnrv+`>c} zm-8rzGR|von8p(cb?E8p6!g|?J46&X&|{iG-hu#;ACm!7%^Yy&vq~&e zL{Z~Bj03GXH+4XP$b;E4#gwK3&k$D##cQS3rL{=s&A#)+mAbSGAq=m?G z3g|3-17Zp>9a!p?p!?)KN!DzVv4N)^QG!2w`T>*#>|5QvgSNF`yJ&7_nTn3ancP(> zRa59iCC&O$T?X%PE>AeW3K(=9455s!Q<20lt612O?JklABr z01YJpGUx}ozW~;zC5PCOW%@9W^PBK|N*|;4Qe(@6CHm%)#4j)h>ISS{iqV`sYZ&hS zr{+X*ejD#IT3MiMY0wW}=+phZT&0C)x z9Qy42F8J3z+k5A;{cV_sr_~L8f8&8@FMTHPsTw!-2sj3IL%Pws9J^RsueV-WYt82-MxUu^bS>T+KO*! vOmnHrJll0#7iOtN6hM`8k%n-ulO7$*Fe|mN=>Pn*!hKp|e2!$Brr6d$^A!%> diff --git a/venv/lib/python3.7/site-packages/dateutil/__pycache__/_version.cpython-37.pyc b/venv/lib/python3.7/site-packages/dateutil/__pycache__/_version.cpython-37.pyc deleted file mode 100644 index 372d549d5e0c4225a07f9421075f28ebd5badc90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmZ?b<>g`kf;ZC-#FYT)#~=<2FajA4KwQiLBvKfn7*ZI688n%ySdH{7^bGwp8E>(d zr4|)u=I5Q(bPe)Ni&Kl!^7IQTOEU8FbW;*b jQcFuRbM)bic&I^o1(mlrY;yBcN^?@}Sb#=;24V&P02?d+ diff --git a/venv/lib/python3.7/site-packages/dateutil/__pycache__/easter.cpython-37.pyc b/venv/lib/python3.7/site-packages/dateutil/__pycache__/easter.cpython-37.pyc deleted file mode 100644 index 5d84c76dfc8752d254b73203c2364299ee9bbf18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2167 zcmZ`)&2k$>5Z>8c{aBV0Lmb<20!*cHh$&gJV}~NCBt#@85J(KMA(ReSW6emKXm@s* z9a&atbs-!$rMPj0BX7ZT?3I(Mcmhsz?@F>$DONSDnV#;idwRNiK3!NSS@8Yy+h0G# zF#8)9)6a#;eHhUW5NBhT%9 zYkmIZN$H>~BkBjd?+F^T+d@Z_(T-3;%N7+ZGD6c<;D>!9Rfqb*bOTP?fu>9iX-6Il zMTdgv3hhTAPjYYwt{+uPWANE}n&dMJ$--`Z|6upo z;p1<=`l9|cIX_wMJv;b(@8RC}$+-#R`7Vk*9TU(V+ejQBEu7(3hEag=07mozggA+b zYdKbr=p}CVNc6t4iDfMAydpo5*c#cf&D~{d=`smwO4rq+uw{P??Tc$Vz{0{oK|Ys~_^rPu+Ti#T6R$6MZ(!0Q5dliHhk zpNsRrb62d<9N^CJWssWVE3m(s`hRH|PBAKR8@Ox0Eg*L^Z^-Yqabo)w0Xm=3(kt?Z z1Icuml_4Wb6uvB{vQ!zch=zeS0r z>lHfD`>`LOZ=iT}_ayX~VkXc-y5A2&PxwL^a45y9M@9!K@MVj6sl~eIgLLa^g??S7 z^h==>oS5zl$p!8}4G1m)tXet^%Be%rpWsJ;u7#jnV)dcHtR_+=u+{2&%t$y;R(sLy z3~q~VK#j?cRLrAi#o#29dIPRd9BcEKc@oc@T!#z(aNFx|Rw7BsU5 zafXsj6`&8OW077Z#N?3{SkCMe^lf`-Yl!I9&5yS+j60jRZl!j%!Ok;rEb+>wX29=NAdxZH6ZJ5Qu>a0eX*-`ppzn2fRVmPT%0A2RA#-LxR_l@KJzjm z!-RAaA`&7K@**Lvgme=UCWI%%|I^YNfcx*An(@P0D8mhjIpuj9o59UUL~T_Ihwuif z4Kx7Hr&pUzrokF&e7W#w5qfJ~TPDS_ONs=By-1dT;_9kXBo(qruDNA$g)EZwLQ*(9 yKqb8PrW=ts=!N%cd{q{9*RZyY`S*QE`v4rIsXCi#z%nw diff --git a/venv/lib/python3.7/site-packages/dateutil/__pycache__/relativedelta.cpython-37.pyc b/venv/lib/python3.7/site-packages/dateutil/__pycache__/relativedelta.cpython-37.pyc deleted file mode 100644 index 942d66bdde86bee6c87bd9887fb729dbc45fab26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15121 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 diff --git a/venv/lib/python3.7/site-packages/dateutil/_common.py b/venv/lib/python3.7/site-packages/dateutil/_common.py deleted file mode 100644 index 4eb2659..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/_common.py +++ /dev/null @@ -1,43 +0,0 @@ -""" -Common code used in multiple modules. -""" - - -class weekday(object): - __slots__ = ["weekday", "n"] - - def __init__(self, weekday, n=None): - self.weekday = weekday - self.n = n - - def __call__(self, n): - if n == self.n: - return self - else: - return self.__class__(self.weekday, n) - - def __eq__(self, other): - try: - if self.weekday != other.weekday or self.n != other.n: - return False - except AttributeError: - return False - return True - - def __hash__(self): - return hash(( - self.weekday, - self.n, - )) - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday] - if not self.n: - return s - else: - return "%s(%+d)" % (s, self.n) - -# vim:ts=4:sw=4:et diff --git a/venv/lib/python3.7/site-packages/dateutil/_version.py b/venv/lib/python3.7/site-packages/dateutil/_version.py deleted file mode 100644 index eac1209..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/_version.py +++ /dev/null @@ -1,4 +0,0 @@ -# coding: utf-8 -# file generated by setuptools_scm -# don't change, don't track in version control -version = '2.8.1' diff --git a/venv/lib/python3.7/site-packages/dateutil/easter.py b/venv/lib/python3.7/site-packages/dateutil/easter.py deleted file mode 100644 index 53b7c78..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/easter.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers a generic easter computing method for any given year, using -Western, Orthodox or Julian algorithms. -""" - -import datetime - -__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"] - -EASTER_JULIAN = 1 -EASTER_ORTHODOX = 2 -EASTER_WESTERN = 3 - - -def easter(year, method=EASTER_WESTERN): - """ - This method was ported from the work done by GM Arts, - on top of the algorithm by Claus Tondering, which was - based in part on the algorithm of Ouding (1940), as - quoted in "Explanatory Supplement to the Astronomical - Almanac", P. Kenneth Seidelmann, editor. - - This algorithm implements three different easter - calculation methods: - - 1 - Original calculation in Julian calendar, valid in - dates after 326 AD - 2 - Original method, with date converted to Gregorian - calendar, valid in years 1583 to 4099 - 3 - Revised method, in Gregorian calendar, valid in - years 1583 to 4099 as well - - These methods are represented by the constants: - - * ``EASTER_JULIAN = 1`` - * ``EASTER_ORTHODOX = 2`` - * ``EASTER_WESTERN = 3`` - - The default method is method 3. - - More about the algorithm may be found at: - - `GM Arts: Easter Algorithms `_ - - and - - `The Calendar FAQ: Easter `_ - - """ - - if not (1 <= method <= 3): - raise ValueError("invalid method") - - # g - Golden year - 1 - # c - Century - # h - (23 - Epact) mod 30 - # i - Number of days from March 21 to Paschal Full Moon - # j - Weekday for PFM (0=Sunday, etc) - # p - Number of days from March 21 to Sunday on or before PFM - # (-6 to 28 methods 1 & 3, to 56 for method 2) - # e - Extra days to add for method 2 (converting Julian - # date to Gregorian date) - - y = year - g = y % 19 - e = 0 - if method < 3: - # Old method - i = (19*g + 15) % 30 - j = (y + y//4 + i) % 7 - if method == 2: - # Extra dates to convert Julian to Gregorian date - e = 10 - if y > 1600: - e = e + y//100 - 16 - (y//100 - 16)//4 - else: - # New method - c = y//100 - h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30 - i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11)) - j = (y + y//4 + i + 2 - c + c//4) % 7 - - # p can be from -6 to 56 corresponding to dates 22 March to 23 May - # (later dates apply to method 2, although 23 May never actually occurs) - p = i - j + e - d = 1 + (p + 27 + (p + 6)//40) % 31 - m = 3 + (p + 26)//30 - return datetime.date(int(y), int(m), int(d)) diff --git a/venv/lib/python3.7/site-packages/dateutil/parser/__init__.py b/venv/lib/python3.7/site-packages/dateutil/parser/__init__.py deleted file mode 100644 index d174b0e..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/parser/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -from ._parser import parse, parser, parserinfo, ParserError -from ._parser import DEFAULTPARSER, DEFAULTTZPARSER -from ._parser import UnknownTimezoneWarning - -from ._parser import __doc__ - -from .isoparser import isoparser, isoparse - -__all__ = ['parse', 'parser', 'parserinfo', - 'isoparse', 'isoparser', - 'ParserError', - 'UnknownTimezoneWarning'] - - -### -# Deprecate portions of the private interface so that downstream code that -# is improperly relying on it is given *some* notice. - - -def __deprecated_private_func(f): - from functools import wraps - import warnings - - msg = ('{name} is a private function and may break without warning, ' - 'it will be moved and or renamed in future versions.') - msg = msg.format(name=f.__name__) - - @wraps(f) - def deprecated_func(*args, **kwargs): - warnings.warn(msg, DeprecationWarning) - return f(*args, **kwargs) - - return deprecated_func - -def __deprecate_private_class(c): - import warnings - - msg = ('{name} is a private class and may break without warning, ' - 'it will be moved and or renamed in future versions.') - msg = msg.format(name=c.__name__) - - class private_class(c): - __doc__ = c.__doc__ - - def __init__(self, *args, **kwargs): - warnings.warn(msg, DeprecationWarning) - super(private_class, self).__init__(*args, **kwargs) - - private_class.__name__ = c.__name__ - - return private_class - - -from ._parser import _timelex, _resultbase -from ._parser import _tzparser, _parsetz - -_timelex = __deprecate_private_class(_timelex) -_tzparser = __deprecate_private_class(_tzparser) -_resultbase = __deprecate_private_class(_resultbase) -_parsetz = __deprecated_private_func(_parsetz) diff --git a/venv/lib/python3.7/site-packages/dateutil/parser/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/dateutil/parser/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 3b82d79f9e542062ce6735aeec6cd853bbc485a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2055 zcmcIlOK%)S5bo}I?5w>n+aZ|n$bfh);B|z=0V#@-D25BNqQntWA83uYd(GJMSh{Cz zysS^QwCe*oA#sHxe}FT;W3EU@k@y9isOnj-V;%<%%xJ2syKAbxuKud~ezUnm;Q9Ug zU%vRwC*)V`Ts$>U?!sq&1|f;02}voZDdQ}4xRbivr8v%D+~Z#AbKmwI=+}77>MrO3 z53KGb^|a3G=@MUpzAtMskaf8vmt|wG#+PMNw$2D|$hPc2+XT-m@OO*1(l&2f53A7c z@J_nIS13_U)jFlT1#Jh~4zz7(+p3{fpk0w`k4g91GYa6lZs`ppZB*&oMwd%f8)t*O zTz-gCdQ0nEcUjqdu=UBkC!g&+y!Ytw)}yjL@9ywwpi9f^PqKq7KgxFERE_gYeIDs7 z&h}uYCWOrULV%lkZ1Q=qV4*Sqqa743ie(hI0op?mfaoJ$e9#Jwur>EVNNO`pPblPq zN|La1CY^ISqx;T`?7PzamY&lIosm;IB~vi94!R5%!A{UXk@Fv?_@M#tfGxh_S(SrWS zD4CH7nb4;ckkf5Qsf(e@)dy;*RX;+A7nz5-Nbi}_KLC?G({)NZD4o>omBAdY`HB3o zwOORY&0##;h%-|}NwRS(|Hvpa$To+^u()hP!um%=oNO+XY6~}oh_kp5qBlG)+j0&- zNrAa~6|v(Y2y4*shd_bL`FT#QUGH|1_oKwz={;wF4!T}hw@J_Q#ONkC(l3B0{XwqN zs3-#=Flj(5N3Y?mHCaauQ+6?W4F~W?{UV6+rGEv2Hl_iB&;|{d%UW#R)2~2(!9HXm za?-NzE-039Hcmbi>xX3qlbNrNr5HP(<8;g|MkJbzvb;Y-a&?r(n)KfbWcN zJ(o{$v9A{R<;GqaUL+HfxFGo((3v@xBrhO66LQM-oe7<=r&!#iBD|~HV5>VIO3#dj zN+T009sk4}d zIKF-vBQ6P%=5mw(SIdSFUyY)qVy>=ZTnt$@=P3IsNdT#3uv^l;#jIaPJ0xhA>JWA0 zvK@UN6pJ;WKC>f0d`tHmXoB(KpSMu2d{(-xiiOv|m&Vntd=rCIrBM~ejatC;+vuA? z_6s=i6ZLhuEVMGCq}Yv&!n0l!MA@`Gh*0qA#7L(=LliuX|1?YtDW@Ppgc9^ApGCIqogJG8+XtiycjQbzqC NXa{Q@+F=33_fO@J0Z9M= diff --git a/venv/lib/python3.7/site-packages/dateutil/parser/__pycache__/_parser.cpython-37.pyc b/venv/lib/python3.7/site-packages/dateutil/parser/__pycache__/_parser.cpython-37.pyc deleted file mode 100644 index 789d8f88fb2ea3986fa672385cb4ad885379633b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40026 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 K$`2HtSN{jEe_r_j diff --git a/venv/lib/python3.7/site-packages/dateutil/parser/_parser.py b/venv/lib/python3.7/site-packages/dateutil/parser/_parser.py deleted file mode 100644 index 458aa6a..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/parser/_parser.py +++ /dev/null @@ -1,1609 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers a generic date/time string parser which is able to parse -most known formats to represent a date and/or time. - -This module attempts to be forgiving with regards to unlikely input formats, -returning a datetime object even for dates which are ambiguous. If an element -of a date/time stamp is omitted, the following rules are applied: - -- If AM or PM is left unspecified, a 24-hour clock is assumed, however, an hour - on a 12-hour clock (``0 <= hour <= 12``) *must* be specified if AM or PM is - specified. -- If a time zone is omitted, a timezone-naive datetime is returned. - -If any other elements are missing, they are taken from the -:class:`datetime.datetime` object passed to the parameter ``default``. If this -results in a day number exceeding the valid number of days per month, the -value falls back to the end of the month. - -Additional resources about date/time string formats can be found below: - -- `A summary of the international standard date and time notation - `_ -- `W3C Date and Time Formats `_ -- `Time Formats (Planetary Rings Node) `_ -- `CPAN ParseDate module - `_ -- `Java SimpleDateFormat Class - `_ -""" -from __future__ import unicode_literals - -import datetime -import re -import string -import time -import warnings - -from calendar import monthrange -from io import StringIO - -import six -from six import integer_types, text_type - -from decimal import Decimal - -from warnings import warn - -from .. import relativedelta -from .. import tz - -__all__ = ["parse", "parserinfo", "ParserError"] - - -# TODO: pandas.core.tools.datetimes imports this explicitly. Might be worth -# making public and/or figuring out if there is something we can -# take off their plate. -class _timelex(object): - # Fractional seconds are sometimes split by a comma - _split_decimal = re.compile("([.,])") - - def __init__(self, instream): - if six.PY2: - # In Python 2, we can't duck type properly because unicode has - # a 'decode' function, and we'd be double-decoding - if isinstance(instream, (bytes, bytearray)): - instream = instream.decode() - else: - if getattr(instream, 'decode', None) is not None: - instream = instream.decode() - - if isinstance(instream, text_type): - instream = StringIO(instream) - elif getattr(instream, 'read', None) is None: - raise TypeError('Parser must be a string or character stream, not ' - '{itype}'.format(itype=instream.__class__.__name__)) - - self.instream = instream - self.charstack = [] - self.tokenstack = [] - self.eof = False - - def get_token(self): - """ - This function breaks the time string into lexical units (tokens), which - can be parsed by the parser. Lexical units are demarcated by changes in - the character set, so any continuous string of letters is considered - one unit, any continuous string of numbers is considered one unit. - - The main complication arises from the fact that dots ('.') can be used - both as separators (e.g. "Sep.20.2009") or decimal points (e.g. - "4:30:21.447"). As such, it is necessary to read the full context of - any dot-separated strings before breaking it into tokens; as such, this - function maintains a "token stack", for when the ambiguous context - demands that multiple tokens be parsed at once. - """ - if self.tokenstack: - return self.tokenstack.pop(0) - - seenletters = False - token = None - state = None - - while not self.eof: - # We only realize that we've reached the end of a token when we - # find a character that's not part of the current token - since - # that character may be part of the next token, it's stored in the - # charstack. - if self.charstack: - nextchar = self.charstack.pop(0) - else: - nextchar = self.instream.read(1) - while nextchar == '\x00': - nextchar = self.instream.read(1) - - if not nextchar: - self.eof = True - break - elif not state: - # First character of the token - determines if we're starting - # to parse a word, a number or something else. - token = nextchar - if self.isword(nextchar): - state = 'a' - elif self.isnum(nextchar): - state = '0' - elif self.isspace(nextchar): - token = ' ' - break # emit token - else: - break # emit token - elif state == 'a': - # If we've already started reading a word, we keep reading - # letters until we find something that's not part of a word. - seenletters = True - if self.isword(nextchar): - token += nextchar - elif nextchar == '.': - token += nextchar - state = 'a.' - else: - self.charstack.append(nextchar) - break # emit token - elif state == '0': - # If we've already started reading a number, we keep reading - # numbers until we find something that doesn't fit. - if self.isnum(nextchar): - token += nextchar - elif nextchar == '.' or (nextchar == ',' and len(token) >= 2): - token += nextchar - state = '0.' - else: - self.charstack.append(nextchar) - break # emit token - elif state == 'a.': - # If we've seen some letters and a dot separator, continue - # parsing, and the tokens will be broken up later. - seenletters = True - if nextchar == '.' or self.isword(nextchar): - token += nextchar - elif self.isnum(nextchar) and token[-1] == '.': - token += nextchar - state = '0.' - else: - self.charstack.append(nextchar) - break # emit token - elif state == '0.': - # If we've seen at least one dot separator, keep going, we'll - # break up the tokens later. - if nextchar == '.' or self.isnum(nextchar): - token += nextchar - elif self.isword(nextchar) and token[-1] == '.': - token += nextchar - state = 'a.' - else: - self.charstack.append(nextchar) - break # emit token - - if (state in ('a.', '0.') and (seenletters or token.count('.') > 1 or - token[-1] in '.,')): - l = self._split_decimal.split(token) - token = l[0] - for tok in l[1:]: - if tok: - self.tokenstack.append(tok) - - if state == '0.' and token.count('.') == 0: - token = token.replace(',', '.') - - return token - - def __iter__(self): - return self - - def __next__(self): - token = self.get_token() - if token is None: - raise StopIteration - - return token - - def next(self): - return self.__next__() # Python 2.x support - - @classmethod - def split(cls, s): - return list(cls(s)) - - @classmethod - def isword(cls, nextchar): - """ Whether or not the next character is part of a word """ - return nextchar.isalpha() - - @classmethod - def isnum(cls, nextchar): - """ Whether the next character is part of a number """ - return nextchar.isdigit() - - @classmethod - def isspace(cls, nextchar): - """ Whether the next character is whitespace """ - return nextchar.isspace() - - -class _resultbase(object): - - def __init__(self): - for attr in self.__slots__: - setattr(self, attr, None) - - def _repr(self, classname): - l = [] - for attr in self.__slots__: - value = getattr(self, attr) - if value is not None: - l.append("%s=%s" % (attr, repr(value))) - return "%s(%s)" % (classname, ", ".join(l)) - - def __len__(self): - return (sum(getattr(self, attr) is not None - for attr in self.__slots__)) - - def __repr__(self): - return self._repr(self.__class__.__name__) - - -class parserinfo(object): - """ - Class which handles what inputs are accepted. Subclass this to customize - the language and acceptable values for each parameter. - - :param dayfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the day (``True``) or month (``False``). If - ``yearfirst`` is set to ``True``, this distinguishes between YDM - and YMD. Default is ``False``. - - :param yearfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the year. If ``True``, the first number is taken - to be the year, otherwise the last number is taken to be the year. - Default is ``False``. - """ - - # m from a.m/p.m, t from ISO T separator - JUMP = [" ", ".", ",", ";", "-", "/", "'", - "at", "on", "and", "ad", "m", "t", "of", - "st", "nd", "rd", "th"] - - WEEKDAYS = [("Mon", "Monday"), - ("Tue", "Tuesday"), # TODO: "Tues" - ("Wed", "Wednesday"), - ("Thu", "Thursday"), # TODO: "Thurs" - ("Fri", "Friday"), - ("Sat", "Saturday"), - ("Sun", "Sunday")] - MONTHS = [("Jan", "January"), - ("Feb", "February"), # TODO: "Febr" - ("Mar", "March"), - ("Apr", "April"), - ("May", "May"), - ("Jun", "June"), - ("Jul", "July"), - ("Aug", "August"), - ("Sep", "Sept", "September"), - ("Oct", "October"), - ("Nov", "November"), - ("Dec", "December")] - HMS = [("h", "hour", "hours"), - ("m", "minute", "minutes"), - ("s", "second", "seconds")] - AMPM = [("am", "a"), - ("pm", "p")] - UTCZONE = ["UTC", "GMT", "Z", "z"] - PERTAIN = ["of"] - TZOFFSET = {} - # TODO: ERA = ["AD", "BC", "CE", "BCE", "Stardate", - # "Anno Domini", "Year of Our Lord"] - - def __init__(self, dayfirst=False, yearfirst=False): - self._jump = self._convert(self.JUMP) - self._weekdays = self._convert(self.WEEKDAYS) - self._months = self._convert(self.MONTHS) - self._hms = self._convert(self.HMS) - self._ampm = self._convert(self.AMPM) - self._utczone = self._convert(self.UTCZONE) - self._pertain = self._convert(self.PERTAIN) - - self.dayfirst = dayfirst - self.yearfirst = yearfirst - - self._year = time.localtime().tm_year - self._century = self._year // 100 * 100 - - def _convert(self, lst): - dct = {} - for i, v in enumerate(lst): - if isinstance(v, tuple): - for v in v: - dct[v.lower()] = i - else: - dct[v.lower()] = i - return dct - - def jump(self, name): - return name.lower() in self._jump - - def weekday(self, name): - try: - return self._weekdays[name.lower()] - except KeyError: - pass - return None - - def month(self, name): - try: - return self._months[name.lower()] + 1 - except KeyError: - pass - return None - - def hms(self, name): - try: - return self._hms[name.lower()] - except KeyError: - return None - - def ampm(self, name): - try: - return self._ampm[name.lower()] - except KeyError: - return None - - def pertain(self, name): - return name.lower() in self._pertain - - def utczone(self, name): - return name.lower() in self._utczone - - def tzoffset(self, name): - if name in self._utczone: - return 0 - - return self.TZOFFSET.get(name) - - def convertyear(self, year, century_specified=False): - """ - Converts two-digit years to year within [-50, 49] - range of self._year (current local time) - """ - - # Function contract is that the year is always positive - assert year >= 0 - - if year < 100 and not century_specified: - # assume current century to start - year += self._century - - if year >= self._year + 50: # if too far in future - year -= 100 - elif year < self._year - 50: # if too far in past - year += 100 - - return year - - def validate(self, res): - # move to info - if res.year is not None: - res.year = self.convertyear(res.year, res.century_specified) - - if ((res.tzoffset == 0 and not res.tzname) or - (res.tzname == 'Z' or res.tzname == 'z')): - res.tzname = "UTC" - res.tzoffset = 0 - elif res.tzoffset != 0 and res.tzname and self.utczone(res.tzname): - res.tzoffset = 0 - return True - - -class _ymd(list): - def __init__(self, *args, **kwargs): - super(self.__class__, self).__init__(*args, **kwargs) - self.century_specified = False - self.dstridx = None - self.mstridx = None - self.ystridx = None - - @property - def has_year(self): - return self.ystridx is not None - - @property - def has_month(self): - return self.mstridx is not None - - @property - def has_day(self): - return self.dstridx is not None - - def could_be_day(self, value): - if self.has_day: - return False - elif not self.has_month: - return 1 <= value <= 31 - elif not self.has_year: - # Be permissive, assume leap year - month = self[self.mstridx] - return 1 <= value <= monthrange(2000, month)[1] - else: - month = self[self.mstridx] - year = self[self.ystridx] - return 1 <= value <= monthrange(year, month)[1] - - def append(self, val, label=None): - if hasattr(val, '__len__'): - if val.isdigit() and len(val) > 2: - self.century_specified = True - if label not in [None, 'Y']: # pragma: no cover - raise ValueError(label) - label = 'Y' - elif val > 100: - self.century_specified = True - if label not in [None, 'Y']: # pragma: no cover - raise ValueError(label) - label = 'Y' - - super(self.__class__, self).append(int(val)) - - if label == 'M': - if self.has_month: - raise ValueError('Month is already set') - self.mstridx = len(self) - 1 - elif label == 'D': - if self.has_day: - raise ValueError('Day is already set') - self.dstridx = len(self) - 1 - elif label == 'Y': - if self.has_year: - raise ValueError('Year is already set') - self.ystridx = len(self) - 1 - - def _resolve_from_stridxs(self, strids): - """ - Try to resolve the identities of year/month/day elements using - ystridx, mstridx, and dstridx, if enough of these are specified. - """ - if len(self) == 3 and len(strids) == 2: - # we can back out the remaining stridx value - missing = [x for x in range(3) if x not in strids.values()] - key = [x for x in ['y', 'm', 'd'] if x not in strids] - assert len(missing) == len(key) == 1 - key = key[0] - val = missing[0] - strids[key] = val - - assert len(self) == len(strids) # otherwise this should not be called - out = {key: self[strids[key]] for key in strids} - return (out.get('y'), out.get('m'), out.get('d')) - - def resolve_ymd(self, yearfirst, dayfirst): - len_ymd = len(self) - year, month, day = (None, None, None) - - strids = (('y', self.ystridx), - ('m', self.mstridx), - ('d', self.dstridx)) - - strids = {key: val for key, val in strids if val is not None} - if (len(self) == len(strids) > 0 or - (len(self) == 3 and len(strids) == 2)): - return self._resolve_from_stridxs(strids) - - mstridx = self.mstridx - - if len_ymd > 3: - raise ValueError("More than three YMD values") - elif len_ymd == 1 or (mstridx is not None and len_ymd == 2): - # One member, or two members with a month string - if mstridx is not None: - month = self[mstridx] - # since mstridx is 0 or 1, self[mstridx-1] always - # looks up the other element - other = self[mstridx - 1] - else: - other = self[0] - - if len_ymd > 1 or mstridx is None: - if other > 31: - year = other - else: - day = other - - elif len_ymd == 2: - # Two members with numbers - if self[0] > 31: - # 99-01 - year, month = self - elif self[1] > 31: - # 01-99 - month, year = self - elif dayfirst and self[1] <= 12: - # 13-01 - day, month = self - else: - # 01-13 - month, day = self - - elif len_ymd == 3: - # Three members - if mstridx == 0: - if self[1] > 31: - # Apr-2003-25 - month, year, day = self - else: - month, day, year = self - elif mstridx == 1: - if self[0] > 31 or (yearfirst and self[2] <= 31): - # 99-Jan-01 - year, month, day = self - else: - # 01-Jan-01 - # Give precedence to day-first, since - # two-digit years is usually hand-written. - day, month, year = self - - elif mstridx == 2: - # WTF!? - if self[1] > 31: - # 01-99-Jan - day, year, month = self - else: - # 99-01-Jan - year, day, month = self - - else: - if (self[0] > 31 or - self.ystridx == 0 or - (yearfirst and self[1] <= 12 and self[2] <= 31)): - # 99-01-01 - if dayfirst and self[2] <= 12: - year, day, month = self - else: - year, month, day = self - elif self[0] > 12 or (dayfirst and self[1] <= 12): - # 13-01-01 - day, month, year = self - else: - # 01-13-01 - month, day, year = self - - return year, month, day - - -class parser(object): - def __init__(self, info=None): - self.info = info or parserinfo() - - def parse(self, timestr, default=None, - ignoretz=False, tzinfos=None, **kwargs): - """ - Parse the date/time string into a :class:`datetime.datetime` object. - - :param timestr: - Any date/time string using the supported formats. - - :param default: - The default datetime object, if this is a datetime object and not - ``None``, elements specified in ``timestr`` replace elements in the - default object. - - :param ignoretz: - If set ``True``, time zones in parsed strings are ignored and a - naive :class:`datetime.datetime` object is returned. - - :param tzinfos: - Additional time zone names / aliases which may be present in the - string. This argument maps time zone names (and optionally offsets - from those time zones) to time zones. This parameter can be a - dictionary with timezone aliases mapping time zone names to time - zones or a function taking two parameters (``tzname`` and - ``tzoffset``) and returning a time zone. - - The timezones to which the names are mapped can be an integer - offset from UTC in seconds or a :class:`tzinfo` object. - - .. doctest:: - :options: +NORMALIZE_WHITESPACE - - >>> from dateutil.parser import parse - >>> from dateutil.tz import gettz - >>> tzinfos = {"BRST": -7200, "CST": gettz("America/Chicago")} - >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -7200)) - >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, - tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) - - This parameter is ignored if ``ignoretz`` is set. - - :param \\*\\*kwargs: - Keyword arguments as passed to ``_parse()``. - - :return: - Returns a :class:`datetime.datetime` object or, if the - ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the - first element being a :class:`datetime.datetime` object, the second - a tuple containing the fuzzy tokens. - - :raises ParserError: - Raised for invalid or unknown string format, if the provided - :class:`tzinfo` is not in a valid format, or if an invalid date - would be created. - - :raises TypeError: - Raised for non-string or character stream input. - - :raises OverflowError: - Raised if the parsed date exceeds the largest valid C integer on - your system. - """ - - if default is None: - default = datetime.datetime.now().replace(hour=0, minute=0, - second=0, microsecond=0) - - res, skipped_tokens = self._parse(timestr, **kwargs) - - if res is None: - raise ParserError("Unknown string format: %s", timestr) - - if len(res) == 0: - raise ParserError("String does not contain a date: %s", timestr) - - try: - ret = self._build_naive(res, default) - except ValueError as e: - six.raise_from(ParserError(e.args[0] + ": %s", timestr), e) - - if not ignoretz: - ret = self._build_tzaware(ret, res, tzinfos) - - if kwargs.get('fuzzy_with_tokens', False): - return ret, skipped_tokens - else: - return ret - - class _result(_resultbase): - __slots__ = ["year", "month", "day", "weekday", - "hour", "minute", "second", "microsecond", - "tzname", "tzoffset", "ampm","any_unused_tokens"] - - def _parse(self, timestr, dayfirst=None, yearfirst=None, fuzzy=False, - fuzzy_with_tokens=False): - """ - Private method which performs the heavy lifting of parsing, called from - ``parse()``, which passes on its ``kwargs`` to this function. - - :param timestr: - The string to parse. - - :param dayfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the day (``True``) or month (``False``). If - ``yearfirst`` is set to ``True``, this distinguishes between YDM - and YMD. If set to ``None``, this value is retrieved from the - current :class:`parserinfo` object (which itself defaults to - ``False``). - - :param yearfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the year. If ``True``, the first number is taken - to be the year, otherwise the last number is taken to be the year. - If this is set to ``None``, the value is retrieved from the current - :class:`parserinfo` object (which itself defaults to ``False``). - - :param fuzzy: - Whether to allow fuzzy parsing, allowing for string like "Today is - January 1, 2047 at 8:21:00AM". - - :param fuzzy_with_tokens: - If ``True``, ``fuzzy`` is automatically set to True, and the parser - will return a tuple where the first element is the parsed - :class:`datetime.datetime` datetimestamp and the second element is - a tuple containing the portions of the string which were ignored: - - .. doctest:: - - >>> from dateutil.parser import parse - >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) - (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) - - """ - if fuzzy_with_tokens: - fuzzy = True - - info = self.info - - if dayfirst is None: - dayfirst = info.dayfirst - - if yearfirst is None: - yearfirst = info.yearfirst - - res = self._result() - l = _timelex.split(timestr) # Splits the timestr into tokens - - skipped_idxs = [] - - # year/month/day list - ymd = _ymd() - - len_l = len(l) - i = 0 - try: - while i < len_l: - - # Check if it's a number - value_repr = l[i] - try: - value = float(value_repr) - except ValueError: - value = None - - if value is not None: - # Numeric token - i = self._parse_numeric_token(l, i, info, ymd, res, fuzzy) - - # Check weekday - elif info.weekday(l[i]) is not None: - value = info.weekday(l[i]) - res.weekday = value - - # Check month name - elif info.month(l[i]) is not None: - value = info.month(l[i]) - ymd.append(value, 'M') - - if i + 1 < len_l: - if l[i + 1] in ('-', '/'): - # Jan-01[-99] - sep = l[i + 1] - ymd.append(l[i + 2]) - - if i + 3 < len_l and l[i + 3] == sep: - # Jan-01-99 - ymd.append(l[i + 4]) - i += 2 - - i += 2 - - elif (i + 4 < len_l and l[i + 1] == l[i + 3] == ' ' and - info.pertain(l[i + 2])): - # Jan of 01 - # In this case, 01 is clearly year - if l[i + 4].isdigit(): - # Convert it here to become unambiguous - value = int(l[i + 4]) - year = str(info.convertyear(value)) - ymd.append(year, 'Y') - else: - # Wrong guess - pass - # TODO: not hit in tests - i += 4 - - # Check am/pm - elif info.ampm(l[i]) is not None: - value = info.ampm(l[i]) - val_is_ampm = self._ampm_valid(res.hour, res.ampm, fuzzy) - - if val_is_ampm: - res.hour = self._adjust_ampm(res.hour, value) - res.ampm = value - - elif fuzzy: - skipped_idxs.append(i) - - # Check for a timezone name - elif self._could_be_tzname(res.hour, res.tzname, res.tzoffset, l[i]): - res.tzname = l[i] - res.tzoffset = info.tzoffset(res.tzname) - - # Check for something like GMT+3, or BRST+3. Notice - # that it doesn't mean "I am 3 hours after GMT", but - # "my time +3 is GMT". If found, we reverse the - # logic so that timezone parsing code will get it - # right. - if i + 1 < len_l and l[i + 1] in ('+', '-'): - l[i + 1] = ('+', '-')[l[i + 1] == '+'] - res.tzoffset = None - if info.utczone(res.tzname): - # With something like GMT+3, the timezone - # is *not* GMT. - res.tzname = None - - # Check for a numbered timezone - elif res.hour is not None and l[i] in ('+', '-'): - signal = (-1, 1)[l[i] == '+'] - len_li = len(l[i + 1]) - - # TODO: check that l[i + 1] is integer? - if len_li == 4: - # -0300 - hour_offset = int(l[i + 1][:2]) - min_offset = int(l[i + 1][2:]) - elif i + 2 < len_l and l[i + 2] == ':': - # -03:00 - hour_offset = int(l[i + 1]) - min_offset = int(l[i + 3]) # TODO: Check that l[i+3] is minute-like? - i += 2 - elif len_li <= 2: - # -[0]3 - hour_offset = int(l[i + 1][:2]) - min_offset = 0 - else: - raise ValueError(timestr) - - res.tzoffset = signal * (hour_offset * 3600 + min_offset * 60) - - # Look for a timezone name between parenthesis - if (i + 5 < len_l and - info.jump(l[i + 2]) and l[i + 3] == '(' and - l[i + 5] == ')' and - 3 <= len(l[i + 4]) and - self._could_be_tzname(res.hour, res.tzname, - None, l[i + 4])): - # -0300 (BRST) - res.tzname = l[i + 4] - i += 4 - - i += 1 - - # Check jumps - elif not (info.jump(l[i]) or fuzzy): - raise ValueError(timestr) - - else: - skipped_idxs.append(i) - i += 1 - - # Process year/month/day - year, month, day = ymd.resolve_ymd(yearfirst, dayfirst) - - res.century_specified = ymd.century_specified - res.year = year - res.month = month - res.day = day - - except (IndexError, ValueError): - return None, None - - if not info.validate(res): - return None, None - - if fuzzy_with_tokens: - skipped_tokens = self._recombine_skipped(l, skipped_idxs) - return res, tuple(skipped_tokens) - else: - return res, None - - def _parse_numeric_token(self, tokens, idx, info, ymd, res, fuzzy): - # Token is a number - value_repr = tokens[idx] - try: - value = self._to_decimal(value_repr) - except Exception as e: - six.raise_from(ValueError('Unknown numeric token'), e) - - len_li = len(value_repr) - - len_l = len(tokens) - - if (len(ymd) == 3 and len_li in (2, 4) and - res.hour is None and - (idx + 1 >= len_l or - (tokens[idx + 1] != ':' and - info.hms(tokens[idx + 1]) is None))): - # 19990101T23[59] - s = tokens[idx] - res.hour = int(s[:2]) - - if len_li == 4: - res.minute = int(s[2:]) - - elif len_li == 6 or (len_li > 6 and tokens[idx].find('.') == 6): - # YYMMDD or HHMMSS[.ss] - s = tokens[idx] - - if not ymd and '.' not in tokens[idx]: - ymd.append(s[:2]) - ymd.append(s[2:4]) - ymd.append(s[4:]) - else: - # 19990101T235959[.59] - - # TODO: Check if res attributes already set. - res.hour = int(s[:2]) - res.minute = int(s[2:4]) - res.second, res.microsecond = self._parsems(s[4:]) - - elif len_li in (8, 12, 14): - # YYYYMMDD - s = tokens[idx] - ymd.append(s[:4], 'Y') - ymd.append(s[4:6]) - ymd.append(s[6:8]) - - if len_li > 8: - res.hour = int(s[8:10]) - res.minute = int(s[10:12]) - - if len_li > 12: - res.second = int(s[12:]) - - elif self._find_hms_idx(idx, tokens, info, allow_jump=True) is not None: - # HH[ ]h or MM[ ]m or SS[.ss][ ]s - hms_idx = self._find_hms_idx(idx, tokens, info, allow_jump=True) - (idx, hms) = self._parse_hms(idx, tokens, info, hms_idx) - if hms is not None: - # TODO: checking that hour/minute/second are not - # already set? - self._assign_hms(res, value_repr, hms) - - elif idx + 2 < len_l and tokens[idx + 1] == ':': - # HH:MM[:SS[.ss]] - res.hour = int(value) - value = self._to_decimal(tokens[idx + 2]) # TODO: try/except for this? - (res.minute, res.second) = self._parse_min_sec(value) - - if idx + 4 < len_l and tokens[idx + 3] == ':': - res.second, res.microsecond = self._parsems(tokens[idx + 4]) - - idx += 2 - - idx += 2 - - elif idx + 1 < len_l and tokens[idx + 1] in ('-', '/', '.'): - sep = tokens[idx + 1] - ymd.append(value_repr) - - if idx + 2 < len_l and not info.jump(tokens[idx + 2]): - if tokens[idx + 2].isdigit(): - # 01-01[-01] - ymd.append(tokens[idx + 2]) - else: - # 01-Jan[-01] - value = info.month(tokens[idx + 2]) - - if value is not None: - ymd.append(value, 'M') - else: - raise ValueError() - - if idx + 3 < len_l and tokens[idx + 3] == sep: - # We have three members - value = info.month(tokens[idx + 4]) - - if value is not None: - ymd.append(value, 'M') - else: - ymd.append(tokens[idx + 4]) - idx += 2 - - idx += 1 - idx += 1 - - elif idx + 1 >= len_l or info.jump(tokens[idx + 1]): - if idx + 2 < len_l and info.ampm(tokens[idx + 2]) is not None: - # 12 am - hour = int(value) - res.hour = self._adjust_ampm(hour, info.ampm(tokens[idx + 2])) - idx += 1 - else: - # Year, month or day - ymd.append(value) - idx += 1 - - elif info.ampm(tokens[idx + 1]) is not None and (0 <= value < 24): - # 12am - hour = int(value) - res.hour = self._adjust_ampm(hour, info.ampm(tokens[idx + 1])) - idx += 1 - - elif ymd.could_be_day(value): - ymd.append(value) - - elif not fuzzy: - raise ValueError() - - return idx - - def _find_hms_idx(self, idx, tokens, info, allow_jump): - len_l = len(tokens) - - if idx+1 < len_l and info.hms(tokens[idx+1]) is not None: - # There is an "h", "m", or "s" label following this token. We take - # assign the upcoming label to the current token. - # e.g. the "12" in 12h" - hms_idx = idx + 1 - - elif (allow_jump and idx+2 < len_l and tokens[idx+1] == ' ' and - info.hms(tokens[idx+2]) is not None): - # There is a space and then an "h", "m", or "s" label. - # e.g. the "12" in "12 h" - hms_idx = idx + 2 - - elif idx > 0 and info.hms(tokens[idx-1]) is not None: - # There is a "h", "m", or "s" preceding this token. Since neither - # of the previous cases was hit, there is no label following this - # token, so we use the previous label. - # e.g. the "04" in "12h04" - hms_idx = idx-1 - - elif (1 < idx == len_l-1 and tokens[idx-1] == ' ' and - info.hms(tokens[idx-2]) is not None): - # If we are looking at the final token, we allow for a - # backward-looking check to skip over a space. - # TODO: Are we sure this is the right condition here? - hms_idx = idx - 2 - - else: - hms_idx = None - - return hms_idx - - def _assign_hms(self, res, value_repr, hms): - # See GH issue #427, fixing float rounding - value = self._to_decimal(value_repr) - - if hms == 0: - # Hour - res.hour = int(value) - if value % 1: - res.minute = int(60*(value % 1)) - - elif hms == 1: - (res.minute, res.second) = self._parse_min_sec(value) - - elif hms == 2: - (res.second, res.microsecond) = self._parsems(value_repr) - - def _could_be_tzname(self, hour, tzname, tzoffset, token): - return (hour is not None and - tzname is None and - tzoffset is None and - len(token) <= 5 and - (all(x in string.ascii_uppercase for x in token) - or token in self.info.UTCZONE)) - - def _ampm_valid(self, hour, ampm, fuzzy): - """ - For fuzzy parsing, 'a' or 'am' (both valid English words) - may erroneously trigger the AM/PM flag. Deal with that - here. - """ - val_is_ampm = True - - # If there's already an AM/PM flag, this one isn't one. - if fuzzy and ampm is not None: - val_is_ampm = False - - # If AM/PM is found and hour is not, raise a ValueError - if hour is None: - if fuzzy: - val_is_ampm = False - else: - raise ValueError('No hour specified with AM or PM flag.') - elif not 0 <= hour <= 12: - # If AM/PM is found, it's a 12 hour clock, so raise - # an error for invalid range - if fuzzy: - val_is_ampm = False - else: - raise ValueError('Invalid hour specified for 12-hour clock.') - - return val_is_ampm - - def _adjust_ampm(self, hour, ampm): - if hour < 12 and ampm == 1: - hour += 12 - elif hour == 12 and ampm == 0: - hour = 0 - return hour - - def _parse_min_sec(self, value): - # TODO: Every usage of this function sets res.second to the return - # value. Are there any cases where second will be returned as None and - # we *don't* want to set res.second = None? - minute = int(value) - second = None - - sec_remainder = value % 1 - if sec_remainder: - second = int(60 * sec_remainder) - return (minute, second) - - def _parse_hms(self, idx, tokens, info, hms_idx): - # TODO: Is this going to admit a lot of false-positives for when we - # just happen to have digits and "h", "m" or "s" characters in non-date - # text? I guess hex hashes won't have that problem, but there's plenty - # of random junk out there. - if hms_idx is None: - hms = None - new_idx = idx - elif hms_idx > idx: - hms = info.hms(tokens[hms_idx]) - new_idx = hms_idx - else: - # Looking backwards, increment one. - hms = info.hms(tokens[hms_idx]) + 1 - new_idx = idx - - return (new_idx, hms) - - # ------------------------------------------------------------------ - # Handling for individual tokens. These are kept as methods instead - # of functions for the sake of customizability via subclassing. - - def _parsems(self, value): - """Parse a I[.F] seconds value into (seconds, microseconds).""" - if "." not in value: - return int(value), 0 - else: - i, f = value.split(".") - return int(i), int(f.ljust(6, "0")[:6]) - - def _to_decimal(self, val): - try: - decimal_value = Decimal(val) - # See GH 662, edge case, infinite value should not be converted - # via `_to_decimal` - if not decimal_value.is_finite(): - raise ValueError("Converted decimal value is infinite or NaN") - except Exception as e: - msg = "Could not convert %s to decimal" % val - six.raise_from(ValueError(msg), e) - else: - return decimal_value - - # ------------------------------------------------------------------ - # Post-Parsing construction of datetime output. These are kept as - # methods instead of functions for the sake of customizability via - # subclassing. - - def _build_tzinfo(self, tzinfos, tzname, tzoffset): - if callable(tzinfos): - tzdata = tzinfos(tzname, tzoffset) - else: - tzdata = tzinfos.get(tzname) - # handle case where tzinfo is paased an options that returns None - # eg tzinfos = {'BRST' : None} - if isinstance(tzdata, datetime.tzinfo) or tzdata is None: - tzinfo = tzdata - elif isinstance(tzdata, text_type): - tzinfo = tz.tzstr(tzdata) - elif isinstance(tzdata, integer_types): - tzinfo = tz.tzoffset(tzname, tzdata) - else: - raise TypeError("Offset must be tzinfo subclass, tz string, " - "or int offset.") - return tzinfo - - def _build_tzaware(self, naive, res, tzinfos): - if (callable(tzinfos) or (tzinfos and res.tzname in tzinfos)): - tzinfo = self._build_tzinfo(tzinfos, res.tzname, res.tzoffset) - aware = naive.replace(tzinfo=tzinfo) - aware = self._assign_tzname(aware, res.tzname) - - elif res.tzname and res.tzname in time.tzname: - aware = naive.replace(tzinfo=tz.tzlocal()) - - # Handle ambiguous local datetime - aware = self._assign_tzname(aware, res.tzname) - - # This is mostly relevant for winter GMT zones parsed in the UK - if (aware.tzname() != res.tzname and - res.tzname in self.info.UTCZONE): - aware = aware.replace(tzinfo=tz.UTC) - - elif res.tzoffset == 0: - aware = naive.replace(tzinfo=tz.UTC) - - elif res.tzoffset: - aware = naive.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset)) - - elif not res.tzname and not res.tzoffset: - # i.e. no timezone information was found. - aware = naive - - elif res.tzname: - # tz-like string was parsed but we don't know what to do - # with it - warnings.warn("tzname {tzname} identified but not understood. " - "Pass `tzinfos` argument in order to correctly " - "return a timezone-aware datetime. In a future " - "version, this will raise an " - "exception.".format(tzname=res.tzname), - category=UnknownTimezoneWarning) - aware = naive - - return aware - - def _build_naive(self, res, default): - repl = {} - for attr in ("year", "month", "day", "hour", - "minute", "second", "microsecond"): - value = getattr(res, attr) - if value is not None: - repl[attr] = value - - if 'day' not in repl: - # If the default day exceeds the last day of the month, fall back - # to the end of the month. - cyear = default.year if res.year is None else res.year - cmonth = default.month if res.month is None else res.month - cday = default.day if res.day is None else res.day - - if cday > monthrange(cyear, cmonth)[1]: - repl['day'] = monthrange(cyear, cmonth)[1] - - naive = default.replace(**repl) - - if res.weekday is not None and not res.day: - naive = naive + relativedelta.relativedelta(weekday=res.weekday) - - return naive - - def _assign_tzname(self, dt, tzname): - if dt.tzname() != tzname: - new_dt = tz.enfold(dt, fold=1) - if new_dt.tzname() == tzname: - return new_dt - - return dt - - def _recombine_skipped(self, tokens, skipped_idxs): - """ - >>> tokens = ["foo", " ", "bar", " ", "19June2000", "baz"] - >>> skipped_idxs = [0, 1, 2, 5] - >>> _recombine_skipped(tokens, skipped_idxs) - ["foo bar", "baz"] - """ - skipped_tokens = [] - for i, idx in enumerate(sorted(skipped_idxs)): - if i > 0 and idx - 1 == skipped_idxs[i - 1]: - skipped_tokens[-1] = skipped_tokens[-1] + tokens[idx] - else: - skipped_tokens.append(tokens[idx]) - - return skipped_tokens - - -DEFAULTPARSER = parser() - - -def parse(timestr, parserinfo=None, **kwargs): - """ - - Parse a string in one of the supported formats, using the - ``parserinfo`` parameters. - - :param timestr: - A string containing a date/time stamp. - - :param parserinfo: - A :class:`parserinfo` object containing parameters for the parser. - If ``None``, the default arguments to the :class:`parserinfo` - constructor are used. - - The ``**kwargs`` parameter takes the following keyword arguments: - - :param default: - The default datetime object, if this is a datetime object and not - ``None``, elements specified in ``timestr`` replace elements in the - default object. - - :param ignoretz: - If set ``True``, time zones in parsed strings are ignored and a naive - :class:`datetime` object is returned. - - :param tzinfos: - Additional time zone names / aliases which may be present in the - string. This argument maps time zone names (and optionally offsets - from those time zones) to time zones. This parameter can be a - dictionary with timezone aliases mapping time zone names to time - zones or a function taking two parameters (``tzname`` and - ``tzoffset``) and returning a time zone. - - The timezones to which the names are mapped can be an integer - offset from UTC in seconds or a :class:`tzinfo` object. - - .. doctest:: - :options: +NORMALIZE_WHITESPACE - - >>> from dateutil.parser import parse - >>> from dateutil.tz import gettz - >>> tzinfos = {"BRST": -7200, "CST": gettz("America/Chicago")} - >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -7200)) - >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, - tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) - - This parameter is ignored if ``ignoretz`` is set. - - :param dayfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the day (``True``) or month (``False``). If - ``yearfirst`` is set to ``True``, this distinguishes between YDM and - YMD. If set to ``None``, this value is retrieved from the current - :class:`parserinfo` object (which itself defaults to ``False``). - - :param yearfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the year. If ``True``, the first number is taken to - be the year, otherwise the last number is taken to be the year. If - this is set to ``None``, the value is retrieved from the current - :class:`parserinfo` object (which itself defaults to ``False``). - - :param fuzzy: - Whether to allow fuzzy parsing, allowing for string like "Today is - January 1, 2047 at 8:21:00AM". - - :param fuzzy_with_tokens: - If ``True``, ``fuzzy`` is automatically set to True, and the parser - will return a tuple where the first element is the parsed - :class:`datetime.datetime` datetimestamp and the second element is - a tuple containing the portions of the string which were ignored: - - .. doctest:: - - >>> from dateutil.parser import parse - >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) - (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) - - :return: - Returns a :class:`datetime.datetime` object or, if the - ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the - first element being a :class:`datetime.datetime` object, the second - a tuple containing the fuzzy tokens. - - :raises ValueError: - Raised for invalid or unknown string format, if the provided - :class:`tzinfo` is not in a valid format, or if an invalid date - would be created. - - :raises OverflowError: - Raised if the parsed date exceeds the largest valid C integer on - your system. - """ - if parserinfo: - return parser(parserinfo).parse(timestr, **kwargs) - else: - return DEFAULTPARSER.parse(timestr, **kwargs) - - -class _tzparser(object): - - class _result(_resultbase): - - __slots__ = ["stdabbr", "stdoffset", "dstabbr", "dstoffset", - "start", "end"] - - class _attr(_resultbase): - __slots__ = ["month", "week", "weekday", - "yday", "jyday", "day", "time"] - - def __repr__(self): - return self._repr("") - - def __init__(self): - _resultbase.__init__(self) - self.start = self._attr() - self.end = self._attr() - - def parse(self, tzstr): - res = self._result() - l = [x for x in re.split(r'([,:.]|[a-zA-Z]+|[0-9]+)',tzstr) if x] - used_idxs = list() - try: - - len_l = len(l) - - i = 0 - while i < len_l: - # BRST+3[BRDT[+2]] - j = i - while j < len_l and not [x for x in l[j] - if x in "0123456789:,-+"]: - j += 1 - if j != i: - if not res.stdabbr: - offattr = "stdoffset" - res.stdabbr = "".join(l[i:j]) - else: - offattr = "dstoffset" - res.dstabbr = "".join(l[i:j]) - - for ii in range(j): - used_idxs.append(ii) - i = j - if (i < len_l and (l[i] in ('+', '-') or l[i][0] in - "0123456789")): - if l[i] in ('+', '-'): - # Yes, that's right. See the TZ variable - # documentation. - signal = (1, -1)[l[i] == '+'] - used_idxs.append(i) - i += 1 - else: - signal = -1 - len_li = len(l[i]) - if len_li == 4: - # -0300 - setattr(res, offattr, (int(l[i][:2]) * 3600 + - int(l[i][2:]) * 60) * signal) - elif i + 1 < len_l and l[i + 1] == ':': - # -03:00 - setattr(res, offattr, - (int(l[i]) * 3600 + - int(l[i + 2]) * 60) * signal) - used_idxs.append(i) - i += 2 - elif len_li <= 2: - # -[0]3 - setattr(res, offattr, - int(l[i][:2]) * 3600 * signal) - else: - return None - used_idxs.append(i) - i += 1 - if res.dstabbr: - break - else: - break - - - if i < len_l: - for j in range(i, len_l): - if l[j] == ';': - l[j] = ',' - - assert l[i] == ',' - - i += 1 - - if i >= len_l: - pass - elif (8 <= l.count(',') <= 9 and - not [y for x in l[i:] if x != ',' - for y in x if y not in "0123456789+-"]): - # GMT0BST,3,0,30,3600,10,0,26,7200[,3600] - for x in (res.start, res.end): - x.month = int(l[i]) - used_idxs.append(i) - i += 2 - if l[i] == '-': - value = int(l[i + 1]) * -1 - used_idxs.append(i) - i += 1 - else: - value = int(l[i]) - used_idxs.append(i) - i += 2 - if value: - x.week = value - x.weekday = (int(l[i]) - 1) % 7 - else: - x.day = int(l[i]) - used_idxs.append(i) - i += 2 - x.time = int(l[i]) - used_idxs.append(i) - i += 2 - if i < len_l: - if l[i] in ('-', '+'): - signal = (-1, 1)[l[i] == "+"] - used_idxs.append(i) - i += 1 - else: - signal = 1 - used_idxs.append(i) - res.dstoffset = (res.stdoffset + int(l[i]) * signal) - - # This was a made-up format that is not in normal use - warn(('Parsed time zone "%s"' % tzstr) + - 'is in a non-standard dateutil-specific format, which ' + - 'is now deprecated; support for parsing this format ' + - 'will be removed in future versions. It is recommended ' + - 'that you switch to a standard format like the GNU ' + - 'TZ variable format.', tz.DeprecatedTzFormatWarning) - elif (l.count(',') == 2 and l[i:].count('/') <= 2 and - not [y for x in l[i:] if x not in (',', '/', 'J', 'M', - '.', '-', ':') - for y in x if y not in "0123456789"]): - for x in (res.start, res.end): - if l[i] == 'J': - # non-leap year day (1 based) - used_idxs.append(i) - i += 1 - x.jyday = int(l[i]) - elif l[i] == 'M': - # month[-.]week[-.]weekday - used_idxs.append(i) - i += 1 - x.month = int(l[i]) - used_idxs.append(i) - i += 1 - assert l[i] in ('-', '.') - used_idxs.append(i) - i += 1 - x.week = int(l[i]) - if x.week == 5: - x.week = -1 - used_idxs.append(i) - i += 1 - assert l[i] in ('-', '.') - used_idxs.append(i) - i += 1 - x.weekday = (int(l[i]) - 1) % 7 - else: - # year day (zero based) - x.yday = int(l[i]) + 1 - - used_idxs.append(i) - i += 1 - - if i < len_l and l[i] == '/': - used_idxs.append(i) - i += 1 - # start time - len_li = len(l[i]) - if len_li == 4: - # -0300 - x.time = (int(l[i][:2]) * 3600 + - int(l[i][2:]) * 60) - elif i + 1 < len_l and l[i + 1] == ':': - # -03:00 - x.time = int(l[i]) * 3600 + int(l[i + 2]) * 60 - used_idxs.append(i) - i += 2 - if i + 1 < len_l and l[i + 1] == ':': - used_idxs.append(i) - i += 2 - x.time += int(l[i]) - elif len_li <= 2: - # -[0]3 - x.time = (int(l[i][:2]) * 3600) - else: - return None - used_idxs.append(i) - i += 1 - - assert i == len_l or l[i] == ',' - - i += 1 - - assert i >= len_l - - except (IndexError, ValueError, AssertionError): - return None - - unused_idxs = set(range(len_l)).difference(used_idxs) - res.any_unused_tokens = not {l[n] for n in unused_idxs}.issubset({",",":"}) - return res - - -DEFAULTTZPARSER = _tzparser() - - -def _parsetz(tzstr): - return DEFAULTTZPARSER.parse(tzstr) - - -class ParserError(ValueError): - """Error class for representing failure to parse a datetime string.""" - def __str__(self): - try: - return self.args[0] % self.args[1:] - except (TypeError, IndexError): - return super(ParserError, self).__str__() - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, str(self)) - - -class UnknownTimezoneWarning(RuntimeWarning): - """Raised when the parser finds a timezone it cannot parse into a tzinfo""" -# vim:ts=4:sw=4:et diff --git a/venv/lib/python3.7/site-packages/dateutil/parser/isoparser.py b/venv/lib/python3.7/site-packages/dateutil/parser/isoparser.py deleted file mode 100644 index 48f86a3..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/parser/isoparser.py +++ /dev/null @@ -1,411 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers a parser for ISO-8601 strings - -It is intended to support all valid date, time and datetime formats per the -ISO-8601 specification. - -..versionadded:: 2.7.0 -""" -from datetime import datetime, timedelta, time, date -import calendar -from dateutil import tz - -from functools import wraps - -import re -import six - -__all__ = ["isoparse", "isoparser"] - - -def _takes_ascii(f): - @wraps(f) - def func(self, str_in, *args, **kwargs): - # If it's a stream, read the whole thing - str_in = getattr(str_in, 'read', lambda: str_in)() - - # If it's unicode, turn it into bytes, since ISO-8601 only covers ASCII - if isinstance(str_in, six.text_type): - # ASCII is the same in UTF-8 - try: - str_in = str_in.encode('ascii') - except UnicodeEncodeError as e: - msg = 'ISO-8601 strings should contain only ASCII characters' - six.raise_from(ValueError(msg), e) - - return f(self, str_in, *args, **kwargs) - - return func - - -class isoparser(object): - def __init__(self, sep=None): - """ - :param sep: - A single character that separates date and time portions. If - ``None``, the parser will accept any single character. - For strict ISO-8601 adherence, pass ``'T'``. - """ - if sep is not None: - if (len(sep) != 1 or ord(sep) >= 128 or sep in '0123456789'): - raise ValueError('Separator must be a single, non-numeric ' + - 'ASCII character') - - sep = sep.encode('ascii') - - self._sep = sep - - @_takes_ascii - def isoparse(self, dt_str): - """ - Parse an ISO-8601 datetime string into a :class:`datetime.datetime`. - - An ISO-8601 datetime string consists of a date portion, followed - optionally by a time portion - the date and time portions are separated - by a single character separator, which is ``T`` in the official - standard. Incomplete date formats (such as ``YYYY-MM``) may *not* be - combined with a time portion. - - Supported date formats are: - - Common: - - - ``YYYY`` - - ``YYYY-MM`` or ``YYYYMM`` - - ``YYYY-MM-DD`` or ``YYYYMMDD`` - - Uncommon: - - - ``YYYY-Www`` or ``YYYYWww`` - ISO week (day defaults to 0) - - ``YYYY-Www-D`` or ``YYYYWwwD`` - ISO week and day - - The ISO week and day numbering follows the same logic as - :func:`datetime.date.isocalendar`. - - Supported time formats are: - - - ``hh`` - - ``hh:mm`` or ``hhmm`` - - ``hh:mm:ss`` or ``hhmmss`` - - ``hh:mm:ss.ssssss`` (Up to 6 sub-second digits) - - Midnight is a special case for `hh`, as the standard supports both - 00:00 and 24:00 as a representation. The decimal separator can be - either a dot or a comma. - - - .. caution:: - - Support for fractional components other than seconds is part of the - ISO-8601 standard, but is not currently implemented in this parser. - - Supported time zone offset formats are: - - - `Z` (UTC) - - `±HH:MM` - - `±HHMM` - - `±HH` - - Offsets will be represented as :class:`dateutil.tz.tzoffset` objects, - with the exception of UTC, which will be represented as - :class:`dateutil.tz.tzutc`. Time zone offsets equivalent to UTC (such - as `+00:00`) will also be represented as :class:`dateutil.tz.tzutc`. - - :param dt_str: - A string or stream containing only an ISO-8601 datetime string - - :return: - Returns a :class:`datetime.datetime` representing the string. - Unspecified components default to their lowest value. - - .. warning:: - - As of version 2.7.0, the strictness of the parser should not be - considered a stable part of the contract. Any valid ISO-8601 string - that parses correctly with the default settings will continue to - parse correctly in future versions, but invalid strings that - currently fail (e.g. ``2017-01-01T00:00+00:00:00``) are not - guaranteed to continue failing in future versions if they encode - a valid date. - - .. versionadded:: 2.7.0 - """ - components, pos = self._parse_isodate(dt_str) - - if len(dt_str) > pos: - if self._sep is None or dt_str[pos:pos + 1] == self._sep: - components += self._parse_isotime(dt_str[pos + 1:]) - else: - raise ValueError('String contains unknown ISO components') - - if len(components) > 3 and components[3] == 24: - components[3] = 0 - return datetime(*components) + timedelta(days=1) - - return datetime(*components) - - @_takes_ascii - def parse_isodate(self, datestr): - """ - Parse the date portion of an ISO string. - - :param datestr: - The string portion of an ISO string, without a separator - - :return: - Returns a :class:`datetime.date` object - """ - components, pos = self._parse_isodate(datestr) - if pos < len(datestr): - raise ValueError('String contains unknown ISO ' + - 'components: {}'.format(datestr)) - return date(*components) - - @_takes_ascii - def parse_isotime(self, timestr): - """ - Parse the time portion of an ISO string. - - :param timestr: - The time portion of an ISO string, without a separator - - :return: - Returns a :class:`datetime.time` object - """ - components = self._parse_isotime(timestr) - if components[0] == 24: - components[0] = 0 - return time(*components) - - @_takes_ascii - def parse_tzstr(self, tzstr, zero_as_utc=True): - """ - Parse a valid ISO time zone string. - - See :func:`isoparser.isoparse` for details on supported formats. - - :param tzstr: - A string representing an ISO time zone offset - - :param zero_as_utc: - Whether to return :class:`dateutil.tz.tzutc` for zero-offset zones - - :return: - Returns :class:`dateutil.tz.tzoffset` for offsets and - :class:`dateutil.tz.tzutc` for ``Z`` and (if ``zero_as_utc`` is - specified) offsets equivalent to UTC. - """ - return self._parse_tzstr(tzstr, zero_as_utc=zero_as_utc) - - # Constants - _DATE_SEP = b'-' - _TIME_SEP = b':' - _FRACTION_REGEX = re.compile(b'[\\.,]([0-9]+)') - - def _parse_isodate(self, dt_str): - try: - return self._parse_isodate_common(dt_str) - except ValueError: - return self._parse_isodate_uncommon(dt_str) - - def _parse_isodate_common(self, dt_str): - len_str = len(dt_str) - components = [1, 1, 1] - - if len_str < 4: - raise ValueError('ISO string too short') - - # Year - components[0] = int(dt_str[0:4]) - pos = 4 - if pos >= len_str: - return components, pos - - has_sep = dt_str[pos:pos + 1] == self._DATE_SEP - if has_sep: - pos += 1 - - # Month - if len_str - pos < 2: - raise ValueError('Invalid common month') - - components[1] = int(dt_str[pos:pos + 2]) - pos += 2 - - if pos >= len_str: - if has_sep: - return components, pos - else: - raise ValueError('Invalid ISO format') - - if has_sep: - if dt_str[pos:pos + 1] != self._DATE_SEP: - raise ValueError('Invalid separator in ISO string') - pos += 1 - - # Day - if len_str - pos < 2: - raise ValueError('Invalid common day') - components[2] = int(dt_str[pos:pos + 2]) - return components, pos + 2 - - def _parse_isodate_uncommon(self, dt_str): - if len(dt_str) < 4: - raise ValueError('ISO string too short') - - # All ISO formats start with the year - year = int(dt_str[0:4]) - - has_sep = dt_str[4:5] == self._DATE_SEP - - pos = 4 + has_sep # Skip '-' if it's there - if dt_str[pos:pos + 1] == b'W': - # YYYY-?Www-?D? - pos += 1 - weekno = int(dt_str[pos:pos + 2]) - pos += 2 - - dayno = 1 - if len(dt_str) > pos: - if (dt_str[pos:pos + 1] == self._DATE_SEP) != has_sep: - raise ValueError('Inconsistent use of dash separator') - - pos += has_sep - - dayno = int(dt_str[pos:pos + 1]) - pos += 1 - - base_date = self._calculate_weekdate(year, weekno, dayno) - else: - # YYYYDDD or YYYY-DDD - if len(dt_str) - pos < 3: - raise ValueError('Invalid ordinal day') - - ordinal_day = int(dt_str[pos:pos + 3]) - pos += 3 - - if ordinal_day < 1 or ordinal_day > (365 + calendar.isleap(year)): - raise ValueError('Invalid ordinal day' + - ' {} for year {}'.format(ordinal_day, year)) - - base_date = date(year, 1, 1) + timedelta(days=ordinal_day - 1) - - components = [base_date.year, base_date.month, base_date.day] - return components, pos - - def _calculate_weekdate(self, year, week, day): - """ - Calculate the day of corresponding to the ISO year-week-day calendar. - - This function is effectively the inverse of - :func:`datetime.date.isocalendar`. - - :param year: - The year in the ISO calendar - - :param week: - The week in the ISO calendar - range is [1, 53] - - :param day: - The day in the ISO calendar - range is [1 (MON), 7 (SUN)] - - :return: - Returns a :class:`datetime.date` - """ - if not 0 < week < 54: - raise ValueError('Invalid week: {}'.format(week)) - - if not 0 < day < 8: # Range is 1-7 - raise ValueError('Invalid weekday: {}'.format(day)) - - # Get week 1 for the specific year: - jan_4 = date(year, 1, 4) # Week 1 always has January 4th in it - week_1 = jan_4 - timedelta(days=jan_4.isocalendar()[2] - 1) - - # Now add the specific number of weeks and days to get what we want - week_offset = (week - 1) * 7 + (day - 1) - return week_1 + timedelta(days=week_offset) - - def _parse_isotime(self, timestr): - len_str = len(timestr) - components = [0, 0, 0, 0, None] - pos = 0 - comp = -1 - - if len(timestr) < 2: - raise ValueError('ISO time too short') - - has_sep = len_str >= 3 and timestr[2:3] == self._TIME_SEP - - while pos < len_str and comp < 5: - comp += 1 - - if timestr[pos:pos + 1] in b'-+Zz': - # Detect time zone boundary - components[-1] = self._parse_tzstr(timestr[pos:]) - pos = len_str - break - - if comp < 3: - # Hour, minute, second - components[comp] = int(timestr[pos:pos + 2]) - pos += 2 - if (has_sep and pos < len_str and - timestr[pos:pos + 1] == self._TIME_SEP): - pos += 1 - - if comp == 3: - # Fraction of a second - frac = self._FRACTION_REGEX.match(timestr[pos:]) - if not frac: - continue - - us_str = frac.group(1)[:6] # Truncate to microseconds - components[comp] = int(us_str) * 10**(6 - len(us_str)) - pos += len(frac.group()) - - if pos < len_str: - raise ValueError('Unused components in ISO string') - - if components[0] == 24: - # Standard supports 00:00 and 24:00 as representations of midnight - if any(component != 0 for component in components[1:4]): - raise ValueError('Hour may only be 24 at 24:00:00.000') - - return components - - def _parse_tzstr(self, tzstr, zero_as_utc=True): - if tzstr == b'Z' or tzstr == b'z': - return tz.UTC - - if len(tzstr) not in {3, 5, 6}: - raise ValueError('Time zone offset must be 1, 3, 5 or 6 characters') - - if tzstr[0:1] == b'-': - mult = -1 - elif tzstr[0:1] == b'+': - mult = 1 - else: - raise ValueError('Time zone offset requires sign') - - hours = int(tzstr[1:3]) - if len(tzstr) == 3: - minutes = 0 - else: - minutes = int(tzstr[(4 if tzstr[3:4] == self._TIME_SEP else 3):]) - - if zero_as_utc and hours == 0 and minutes == 0: - return tz.UTC - else: - if minutes > 59: - raise ValueError('Invalid minutes in time zone offset') - - if hours > 23: - raise ValueError('Invalid hours in time zone offset') - - return tz.tzoffset(None, mult * (hours * 60 + minutes) * 60) - - -DEFAULT_ISOPARSER = isoparser() -isoparse = DEFAULT_ISOPARSER.isoparse diff --git a/venv/lib/python3.7/site-packages/dateutil/relativedelta.py b/venv/lib/python3.7/site-packages/dateutil/relativedelta.py deleted file mode 100644 index a9e85f7..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/relativedelta.py +++ /dev/null @@ -1,599 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -import calendar - -import operator -from math import copysign - -from six import integer_types -from warnings import warn - -from ._common import weekday - -MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) - -__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] - - -class relativedelta(object): - """ - The relativedelta type is designed to be applied to an existing datetime and - can replace specific components of that datetime, or represents an interval - of time. - - It is based on the specification of the excellent work done by M.-A. Lemburg - in his - `mx.DateTime `_ extension. - However, notice that this type does *NOT* implement the same algorithm as - his work. Do *NOT* expect it to behave like mx.DateTime's counterpart. - - There are two different ways to build a relativedelta instance. The - first one is passing it two date/datetime classes:: - - relativedelta(datetime1, datetime2) - - The second one is passing it any number of the following keyword arguments:: - - relativedelta(arg1=x,arg2=y,arg3=z...) - - year, month, day, hour, minute, second, microsecond: - Absolute information (argument is singular); adding or subtracting a - relativedelta with absolute information does not perform an arithmetic - operation, but rather REPLACES the corresponding value in the - original datetime with the value(s) in relativedelta. - - years, months, weeks, days, hours, minutes, seconds, microseconds: - Relative information, may be negative (argument is plural); adding - or subtracting a relativedelta with relative information performs - the corresponding arithmetic operation on the original datetime value - with the information in the relativedelta. - - weekday: - One of the weekday instances (MO, TU, etc) available in the - relativedelta module. These instances may receive a parameter N, - specifying the Nth weekday, which could be positive or negative - (like MO(+1) or MO(-2)). Not specifying it is the same as specifying - +1. You can also use an integer, where 0=MO. This argument is always - relative e.g. if the calculated date is already Monday, using MO(1) - or MO(-1) won't change the day. To effectively make it absolute, use - it in combination with the day argument (e.g. day=1, MO(1) for first - Monday of the month). - - leapdays: - Will add given days to the date found, if year is a leap - year, and the date found is post 28 of february. - - yearday, nlyearday: - Set the yearday or the non-leap year day (jump leap days). - These are converted to day/month/leapdays information. - - There are relative and absolute forms of the keyword - arguments. The plural is relative, and the singular is - absolute. For each argument in the order below, the absolute form - is applied first (by setting each attribute to that value) and - then the relative form (by adding the value to the attribute). - - The order of attributes considered when this relativedelta is - added to a datetime is: - - 1. Year - 2. Month - 3. Day - 4. Hours - 5. Minutes - 6. Seconds - 7. Microseconds - - Finally, weekday is applied, using the rule described above. - - For example - - >>> from datetime import datetime - >>> from dateutil.relativedelta import relativedelta, MO - >>> dt = datetime(2018, 4, 9, 13, 37, 0) - >>> delta = relativedelta(hours=25, day=1, weekday=MO(1)) - >>> dt + delta - datetime.datetime(2018, 4, 2, 14, 37) - - First, the day is set to 1 (the first of the month), then 25 hours - are added, to get to the 2nd day and 14th hour, finally the - weekday is applied, but since the 2nd is already a Monday there is - no effect. - - """ - - def __init__(self, dt1=None, dt2=None, - years=0, months=0, days=0, leapdays=0, weeks=0, - hours=0, minutes=0, seconds=0, microseconds=0, - year=None, month=None, day=None, weekday=None, - yearday=None, nlyearday=None, - hour=None, minute=None, second=None, microsecond=None): - - if dt1 and dt2: - # datetime is a subclass of date. So both must be date - if not (isinstance(dt1, datetime.date) and - isinstance(dt2, datetime.date)): - raise TypeError("relativedelta only diffs datetime/date") - - # We allow two dates, or two datetimes, so we coerce them to be - # of the same type - if (isinstance(dt1, datetime.datetime) != - isinstance(dt2, datetime.datetime)): - if not isinstance(dt1, datetime.datetime): - dt1 = datetime.datetime.fromordinal(dt1.toordinal()) - elif not isinstance(dt2, datetime.datetime): - dt2 = datetime.datetime.fromordinal(dt2.toordinal()) - - self.years = 0 - self.months = 0 - self.days = 0 - self.leapdays = 0 - self.hours = 0 - self.minutes = 0 - self.seconds = 0 - self.microseconds = 0 - self.year = None - self.month = None - self.day = None - self.weekday = None - self.hour = None - self.minute = None - self.second = None - self.microsecond = None - self._has_time = 0 - - # Get year / month delta between the two - months = (dt1.year - dt2.year) * 12 + (dt1.month - dt2.month) - self._set_months(months) - - # Remove the year/month delta so the timedelta is just well-defined - # time units (seconds, days and microseconds) - dtm = self.__radd__(dt2) - - # If we've overshot our target, make an adjustment - if dt1 < dt2: - compare = operator.gt - increment = 1 - else: - compare = operator.lt - increment = -1 - - while compare(dt1, dtm): - months += increment - self._set_months(months) - dtm = self.__radd__(dt2) - - # Get the timedelta between the "months-adjusted" date and dt1 - delta = dt1 - dtm - self.seconds = delta.seconds + delta.days * 86400 - self.microseconds = delta.microseconds - else: - # Check for non-integer values in integer-only quantities - if any(x is not None and x != int(x) for x in (years, months)): - raise ValueError("Non-integer years and months are " - "ambiguous and not currently supported.") - - # Relative information - self.years = int(years) - self.months = int(months) - self.days = days + weeks * 7 - self.leapdays = leapdays - self.hours = hours - self.minutes = minutes - self.seconds = seconds - self.microseconds = microseconds - - # Absolute information - self.year = year - self.month = month - self.day = day - self.hour = hour - self.minute = minute - self.second = second - self.microsecond = microsecond - - if any(x is not None and int(x) != x - for x in (year, month, day, hour, - minute, second, microsecond)): - # For now we'll deprecate floats - later it'll be an error. - warn("Non-integer value passed as absolute information. " + - "This is not a well-defined condition and will raise " + - "errors in future versions.", DeprecationWarning) - - if isinstance(weekday, integer_types): - self.weekday = weekdays[weekday] - else: - self.weekday = weekday - - yday = 0 - if nlyearday: - yday = nlyearday - elif yearday: - yday = yearday - if yearday > 59: - self.leapdays = -1 - if yday: - ydayidx = [31, 59, 90, 120, 151, 181, 212, - 243, 273, 304, 334, 366] - for idx, ydays in enumerate(ydayidx): - if yday <= ydays: - self.month = idx+1 - if idx == 0: - self.day = yday - else: - self.day = yday-ydayidx[idx-1] - break - else: - raise ValueError("invalid year day (%d)" % yday) - - self._fix() - - def _fix(self): - if abs(self.microseconds) > 999999: - s = _sign(self.microseconds) - div, mod = divmod(self.microseconds * s, 1000000) - self.microseconds = mod * s - self.seconds += div * s - if abs(self.seconds) > 59: - s = _sign(self.seconds) - div, mod = divmod(self.seconds * s, 60) - self.seconds = mod * s - self.minutes += div * s - if abs(self.minutes) > 59: - s = _sign(self.minutes) - div, mod = divmod(self.minutes * s, 60) - self.minutes = mod * s - self.hours += div * s - if abs(self.hours) > 23: - s = _sign(self.hours) - div, mod = divmod(self.hours * s, 24) - self.hours = mod * s - self.days += div * s - if abs(self.months) > 11: - s = _sign(self.months) - div, mod = divmod(self.months * s, 12) - self.months = mod * s - self.years += div * s - if (self.hours or self.minutes or self.seconds or self.microseconds - or self.hour is not None or self.minute is not None or - self.second is not None or self.microsecond is not None): - self._has_time = 1 - else: - self._has_time = 0 - - @property - def weeks(self): - return int(self.days / 7.0) - - @weeks.setter - def weeks(self, value): - self.days = self.days - (self.weeks * 7) + value * 7 - - def _set_months(self, months): - self.months = months - if abs(self.months) > 11: - s = _sign(self.months) - div, mod = divmod(self.months * s, 12) - self.months = mod * s - self.years = div * s - else: - self.years = 0 - - def normalized(self): - """ - Return a version of this object represented entirely using integer - values for the relative attributes. - - >>> relativedelta(days=1.5, hours=2).normalized() - relativedelta(days=+1, hours=+14) - - :return: - Returns a :class:`dateutil.relativedelta.relativedelta` object. - """ - # Cascade remainders down (rounding each to roughly nearest microsecond) - days = int(self.days) - - hours_f = round(self.hours + 24 * (self.days - days), 11) - hours = int(hours_f) - - minutes_f = round(self.minutes + 60 * (hours_f - hours), 10) - minutes = int(minutes_f) - - seconds_f = round(self.seconds + 60 * (minutes_f - minutes), 8) - seconds = int(seconds_f) - - microseconds = round(self.microseconds + 1e6 * (seconds_f - seconds)) - - # Constructor carries overflow back up with call to _fix() - return self.__class__(years=self.years, months=self.months, - days=days, hours=hours, minutes=minutes, - seconds=seconds, microseconds=microseconds, - leapdays=self.leapdays, year=self.year, - month=self.month, day=self.day, - weekday=self.weekday, hour=self.hour, - minute=self.minute, second=self.second, - microsecond=self.microsecond) - - def __add__(self, other): - if isinstance(other, relativedelta): - return self.__class__(years=other.years + self.years, - months=other.months + self.months, - days=other.days + self.days, - hours=other.hours + self.hours, - minutes=other.minutes + self.minutes, - seconds=other.seconds + self.seconds, - microseconds=(other.microseconds + - self.microseconds), - leapdays=other.leapdays or self.leapdays, - year=(other.year if other.year is not None - else self.year), - month=(other.month if other.month is not None - else self.month), - day=(other.day if other.day is not None - else self.day), - weekday=(other.weekday if other.weekday is not None - else self.weekday), - hour=(other.hour if other.hour is not None - else self.hour), - minute=(other.minute if other.minute is not None - else self.minute), - second=(other.second if other.second is not None - else self.second), - microsecond=(other.microsecond if other.microsecond - is not None else - self.microsecond)) - if isinstance(other, datetime.timedelta): - return self.__class__(years=self.years, - months=self.months, - days=self.days + other.days, - hours=self.hours, - minutes=self.minutes, - seconds=self.seconds + other.seconds, - microseconds=self.microseconds + other.microseconds, - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - if not isinstance(other, datetime.date): - return NotImplemented - elif self._has_time and not isinstance(other, datetime.datetime): - other = datetime.datetime.fromordinal(other.toordinal()) - year = (self.year or other.year)+self.years - month = self.month or other.month - if self.months: - assert 1 <= abs(self.months) <= 12 - month += self.months - if month > 12: - year += 1 - month -= 12 - elif month < 1: - year -= 1 - month += 12 - day = min(calendar.monthrange(year, month)[1], - self.day or other.day) - repl = {"year": year, "month": month, "day": day} - for attr in ["hour", "minute", "second", "microsecond"]: - value = getattr(self, attr) - if value is not None: - repl[attr] = value - days = self.days - if self.leapdays and month > 2 and calendar.isleap(year): - days += self.leapdays - ret = (other.replace(**repl) - + datetime.timedelta(days=days, - hours=self.hours, - minutes=self.minutes, - seconds=self.seconds, - microseconds=self.microseconds)) - if self.weekday: - weekday, nth = self.weekday.weekday, self.weekday.n or 1 - jumpdays = (abs(nth) - 1) * 7 - if nth > 0: - jumpdays += (7 - ret.weekday() + weekday) % 7 - else: - jumpdays += (ret.weekday() - weekday) % 7 - jumpdays *= -1 - ret += datetime.timedelta(days=jumpdays) - return ret - - def __radd__(self, other): - return self.__add__(other) - - def __rsub__(self, other): - return self.__neg__().__radd__(other) - - def __sub__(self, other): - if not isinstance(other, relativedelta): - return NotImplemented # In case the other object defines __rsub__ - return self.__class__(years=self.years - other.years, - months=self.months - other.months, - days=self.days - other.days, - hours=self.hours - other.hours, - minutes=self.minutes - other.minutes, - seconds=self.seconds - other.seconds, - microseconds=self.microseconds - other.microseconds, - leapdays=self.leapdays or other.leapdays, - year=(self.year if self.year is not None - else other.year), - month=(self.month if self.month is not None else - other.month), - day=(self.day if self.day is not None else - other.day), - weekday=(self.weekday if self.weekday is not None else - other.weekday), - hour=(self.hour if self.hour is not None else - other.hour), - minute=(self.minute if self.minute is not None else - other.minute), - second=(self.second if self.second is not None else - other.second), - microsecond=(self.microsecond if self.microsecond - is not None else - other.microsecond)) - - def __abs__(self): - return self.__class__(years=abs(self.years), - months=abs(self.months), - days=abs(self.days), - hours=abs(self.hours), - minutes=abs(self.minutes), - seconds=abs(self.seconds), - microseconds=abs(self.microseconds), - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - - def __neg__(self): - return self.__class__(years=-self.years, - months=-self.months, - days=-self.days, - hours=-self.hours, - minutes=-self.minutes, - seconds=-self.seconds, - microseconds=-self.microseconds, - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - - def __bool__(self): - return not (not self.years and - not self.months and - not self.days and - not self.hours and - not self.minutes and - not self.seconds and - not self.microseconds and - not self.leapdays and - self.year is None and - self.month is None and - self.day is None and - self.weekday is None and - self.hour is None and - self.minute is None and - self.second is None and - self.microsecond is None) - # Compatibility with Python 2.x - __nonzero__ = __bool__ - - def __mul__(self, other): - try: - f = float(other) - except TypeError: - return NotImplemented - - return self.__class__(years=int(self.years * f), - months=int(self.months * f), - days=int(self.days * f), - hours=int(self.hours * f), - minutes=int(self.minutes * f), - seconds=int(self.seconds * f), - microseconds=int(self.microseconds * f), - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - - __rmul__ = __mul__ - - def __eq__(self, other): - if not isinstance(other, relativedelta): - return NotImplemented - if self.weekday or other.weekday: - if not self.weekday or not other.weekday: - return False - if self.weekday.weekday != other.weekday.weekday: - return False - n1, n2 = self.weekday.n, other.weekday.n - if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)): - return False - return (self.years == other.years and - self.months == other.months and - self.days == other.days and - self.hours == other.hours and - self.minutes == other.minutes and - self.seconds == other.seconds and - self.microseconds == other.microseconds and - self.leapdays == other.leapdays and - self.year == other.year and - self.month == other.month and - self.day == other.day and - self.hour == other.hour and - self.minute == other.minute and - self.second == other.second and - self.microsecond == other.microsecond) - - def __hash__(self): - return hash(( - self.weekday, - self.years, - self.months, - self.days, - self.hours, - self.minutes, - self.seconds, - self.microseconds, - self.leapdays, - self.year, - self.month, - self.day, - self.hour, - self.minute, - self.second, - self.microsecond, - )) - - def __ne__(self, other): - return not self.__eq__(other) - - def __div__(self, other): - try: - reciprocal = 1 / float(other) - except TypeError: - return NotImplemented - - return self.__mul__(reciprocal) - - __truediv__ = __div__ - - def __repr__(self): - l = [] - for attr in ["years", "months", "days", "leapdays", - "hours", "minutes", "seconds", "microseconds"]: - value = getattr(self, attr) - if value: - l.append("{attr}={value:+g}".format(attr=attr, value=value)) - for attr in ["year", "month", "day", "weekday", - "hour", "minute", "second", "microsecond"]: - value = getattr(self, attr) - if value is not None: - l.append("{attr}={value}".format(attr=attr, value=repr(value))) - return "{classname}({attrs})".format(classname=self.__class__.__name__, - attrs=", ".join(l)) - - -def _sign(x): - return int(copysign(1, x)) - -# vim:ts=4:sw=4:et diff --git a/venv/lib/python3.7/site-packages/dateutil/rrule.py b/venv/lib/python3.7/site-packages/dateutil/rrule.py deleted file mode 100644 index 6bf0ea9..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/rrule.py +++ /dev/null @@ -1,1735 +0,0 @@ -# -*- coding: utf-8 -*- -""" -The rrule module offers a small, complete, and very fast, implementation of -the recurrence rules documented in the -`iCalendar RFC `_, -including support for caching of results. -""" -import itertools -import datetime -import calendar -import re -import sys - -try: - from math import gcd -except ImportError: - from fractions import gcd - -from six import advance_iterator, integer_types -from six.moves import _thread, range -import heapq - -from ._common import weekday as weekdaybase - -# For warning about deprecation of until and count -from warnings import warn - -__all__ = ["rrule", "rruleset", "rrulestr", - "YEARLY", "MONTHLY", "WEEKLY", "DAILY", - "HOURLY", "MINUTELY", "SECONDLY", - "MO", "TU", "WE", "TH", "FR", "SA", "SU"] - -# Every mask is 7 days longer to handle cross-year weekly periods. -M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30 + - [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7) -M365MASK = list(M366MASK) -M29, M30, M31 = list(range(1, 30)), list(range(1, 31)), list(range(1, 32)) -MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) -MDAY365MASK = list(MDAY366MASK) -M29, M30, M31 = list(range(-29, 0)), list(range(-30, 0)), list(range(-31, 0)) -NMDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) -NMDAY365MASK = list(NMDAY366MASK) -M366RANGE = (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366) -M365RANGE = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365) -WDAYMASK = [0, 1, 2, 3, 4, 5, 6]*55 -del M29, M30, M31, M365MASK[59], MDAY365MASK[59], NMDAY365MASK[31] -MDAY365MASK = tuple(MDAY365MASK) -M365MASK = tuple(M365MASK) - -FREQNAMES = ['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY'] - -(YEARLY, - MONTHLY, - WEEKLY, - DAILY, - HOURLY, - MINUTELY, - SECONDLY) = list(range(7)) - -# Imported on demand. -easter = None -parser = None - - -class weekday(weekdaybase): - """ - This version of weekday does not allow n = 0. - """ - def __init__(self, wkday, n=None): - if n == 0: - raise ValueError("Can't create weekday with n==0") - - super(weekday, self).__init__(wkday, n) - - -MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) - - -def _invalidates_cache(f): - """ - Decorator for rruleset methods which may invalidate the - cached length. - """ - def inner_func(self, *args, **kwargs): - rv = f(self, *args, **kwargs) - self._invalidate_cache() - return rv - - return inner_func - - -class rrulebase(object): - def __init__(self, cache=False): - if cache: - self._cache = [] - self._cache_lock = _thread.allocate_lock() - self._invalidate_cache() - else: - self._cache = None - self._cache_complete = False - self._len = None - - def __iter__(self): - if self._cache_complete: - return iter(self._cache) - elif self._cache is None: - return self._iter() - else: - return self._iter_cached() - - def _invalidate_cache(self): - if self._cache is not None: - self._cache = [] - self._cache_complete = False - self._cache_gen = self._iter() - - if self._cache_lock.locked(): - self._cache_lock.release() - - self._len = None - - def _iter_cached(self): - i = 0 - gen = self._cache_gen - cache = self._cache - acquire = self._cache_lock.acquire - release = self._cache_lock.release - while gen: - if i == len(cache): - acquire() - if self._cache_complete: - break - try: - for j in range(10): - cache.append(advance_iterator(gen)) - except StopIteration: - self._cache_gen = gen = None - self._cache_complete = True - break - release() - yield cache[i] - i += 1 - while i < self._len: - yield cache[i] - i += 1 - - def __getitem__(self, item): - if self._cache_complete: - return self._cache[item] - elif isinstance(item, slice): - if item.step and item.step < 0: - return list(iter(self))[item] - else: - return list(itertools.islice(self, - item.start or 0, - item.stop or sys.maxsize, - item.step or 1)) - elif item >= 0: - gen = iter(self) - try: - for i in range(item+1): - res = advance_iterator(gen) - except StopIteration: - raise IndexError - return res - else: - return list(iter(self))[item] - - def __contains__(self, item): - if self._cache_complete: - return item in self._cache - else: - for i in self: - if i == item: - return True - elif i > item: - return False - return False - - # __len__() introduces a large performance penalty. - def count(self): - """ Returns the number of recurrences in this set. It will have go - trough the whole recurrence, if this hasn't been done before. """ - if self._len is None: - for x in self: - pass - return self._len - - def before(self, dt, inc=False): - """ Returns the last recurrence before the given datetime instance. The - inc keyword defines what happens if dt is an occurrence. With - inc=True, if dt itself is an occurrence, it will be returned. """ - if self._cache_complete: - gen = self._cache - else: - gen = self - last = None - if inc: - for i in gen: - if i > dt: - break - last = i - else: - for i in gen: - if i >= dt: - break - last = i - return last - - def after(self, dt, inc=False): - """ Returns the first recurrence after the given datetime instance. The - inc keyword defines what happens if dt is an occurrence. With - inc=True, if dt itself is an occurrence, it will be returned. """ - if self._cache_complete: - gen = self._cache - else: - gen = self - if inc: - for i in gen: - if i >= dt: - return i - else: - for i in gen: - if i > dt: - return i - return None - - def xafter(self, dt, count=None, inc=False): - """ - Generator which yields up to `count` recurrences after the given - datetime instance, equivalent to `after`. - - :param dt: - The datetime at which to start generating recurrences. - - :param count: - The maximum number of recurrences to generate. If `None` (default), - dates are generated until the recurrence rule is exhausted. - - :param inc: - If `dt` is an instance of the rule and `inc` is `True`, it is - included in the output. - - :yields: Yields a sequence of `datetime` objects. - """ - - if self._cache_complete: - gen = self._cache - else: - gen = self - - # Select the comparison function - if inc: - comp = lambda dc, dtc: dc >= dtc - else: - comp = lambda dc, dtc: dc > dtc - - # Generate dates - n = 0 - for d in gen: - if comp(d, dt): - if count is not None: - n += 1 - if n > count: - break - - yield d - - def between(self, after, before, inc=False, count=1): - """ Returns all the occurrences of the rrule between after and before. - The inc keyword defines what happens if after and/or before are - themselves occurrences. With inc=True, they will be included in the - list, if they are found in the recurrence set. """ - if self._cache_complete: - gen = self._cache - else: - gen = self - started = False - l = [] - if inc: - for i in gen: - if i > before: - break - elif not started: - if i >= after: - started = True - l.append(i) - else: - l.append(i) - else: - for i in gen: - if i >= before: - break - elif not started: - if i > after: - started = True - l.append(i) - else: - l.append(i) - return l - - -class rrule(rrulebase): - """ - That's the base of the rrule operation. It accepts all the keywords - defined in the RFC as its constructor parameters (except byday, - which was renamed to byweekday) and more. The constructor prototype is:: - - rrule(freq) - - Where freq must be one of YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, - or SECONDLY. - - .. note:: - Per RFC section 3.3.10, recurrence instances falling on invalid dates - and times are ignored rather than coerced: - - Recurrence rules may generate recurrence instances with an invalid - date (e.g., February 30) or nonexistent local time (e.g., 1:30 AM - on a day where the local time is moved forward by an hour at 1:00 - AM). Such recurrence instances MUST be ignored and MUST NOT be - counted as part of the recurrence set. - - This can lead to possibly surprising behavior when, for example, the - start date occurs at the end of the month: - - >>> from dateutil.rrule import rrule, MONTHLY - >>> from datetime import datetime - >>> start_date = datetime(2014, 12, 31) - >>> list(rrule(freq=MONTHLY, count=4, dtstart=start_date)) - ... # doctest: +NORMALIZE_WHITESPACE - [datetime.datetime(2014, 12, 31, 0, 0), - datetime.datetime(2015, 1, 31, 0, 0), - datetime.datetime(2015, 3, 31, 0, 0), - datetime.datetime(2015, 5, 31, 0, 0)] - - Additionally, it supports the following keyword arguments: - - :param dtstart: - The recurrence start. Besides being the base for the recurrence, - missing parameters in the final recurrence instances will also be - extracted from this date. If not given, datetime.now() will be used - instead. - :param interval: - The interval between each freq iteration. For example, when using - YEARLY, an interval of 2 means once every two years, but with HOURLY, - it means once every two hours. The default interval is 1. - :param wkst: - The week start day. Must be one of the MO, TU, WE constants, or an - integer, specifying the first day of the week. This will affect - recurrences based on weekly periods. The default week start is got - from calendar.firstweekday(), and may be modified by - calendar.setfirstweekday(). - :param count: - If given, this determines how many occurrences will be generated. - - .. note:: - As of version 2.5.0, the use of the keyword ``until`` in conjunction - with ``count`` is deprecated, to make sure ``dateutil`` is fully - compliant with `RFC-5545 Sec. 3.3.10 `_. Therefore, ``until`` and ``count`` - **must not** occur in the same call to ``rrule``. - :param until: - If given, this must be a datetime instance specifying the upper-bound - limit of the recurrence. The last recurrence in the rule is the greatest - datetime that is less than or equal to the value specified in the - ``until`` parameter. - - .. note:: - As of version 2.5.0, the use of the keyword ``until`` in conjunction - with ``count`` is deprecated, to make sure ``dateutil`` is fully - compliant with `RFC-5545 Sec. 3.3.10 `_. Therefore, ``until`` and ``count`` - **must not** occur in the same call to ``rrule``. - :param bysetpos: - If given, it must be either an integer, or a sequence of integers, - positive or negative. Each given integer will specify an occurrence - number, corresponding to the nth occurrence of the rule inside the - frequency period. For example, a bysetpos of -1 if combined with a - MONTHLY frequency, and a byweekday of (MO, TU, WE, TH, FR), will - result in the last work day of every month. - :param bymonth: - If given, it must be either an integer, or a sequence of integers, - meaning the months to apply the recurrence to. - :param bymonthday: - If given, it must be either an integer, or a sequence of integers, - meaning the month days to apply the recurrence to. - :param byyearday: - If given, it must be either an integer, or a sequence of integers, - meaning the year days to apply the recurrence to. - :param byeaster: - If given, it must be either an integer, or a sequence of integers, - positive or negative. Each integer will define an offset from the - Easter Sunday. Passing the offset 0 to byeaster will yield the Easter - Sunday itself. This is an extension to the RFC specification. - :param byweekno: - If given, it must be either an integer, or a sequence of integers, - meaning the week numbers to apply the recurrence to. Week numbers - have the meaning described in ISO8601, that is, the first week of - the year is that containing at least four days of the new year. - :param byweekday: - If given, it must be either an integer (0 == MO), a sequence of - integers, one of the weekday constants (MO, TU, etc), or a sequence - of these constants. When given, these variables will define the - weekdays where the recurrence will be applied. It's also possible to - use an argument n for the weekday instances, which will mean the nth - occurrence of this weekday in the period. For example, with MONTHLY, - or with YEARLY and BYMONTH, using FR(+1) in byweekday will specify the - first friday of the month where the recurrence happens. Notice that in - the RFC documentation, this is specified as BYDAY, but was renamed to - avoid the ambiguity of that keyword. - :param byhour: - If given, it must be either an integer, or a sequence of integers, - meaning the hours to apply the recurrence to. - :param byminute: - If given, it must be either an integer, or a sequence of integers, - meaning the minutes to apply the recurrence to. - :param bysecond: - If given, it must be either an integer, or a sequence of integers, - meaning the seconds to apply the recurrence to. - :param cache: - If given, it must be a boolean value specifying to enable or disable - caching of results. If you will use the same rrule instance multiple - times, enabling caching will improve the performance considerably. - """ - def __init__(self, freq, dtstart=None, - interval=1, wkst=None, count=None, until=None, bysetpos=None, - bymonth=None, bymonthday=None, byyearday=None, byeaster=None, - byweekno=None, byweekday=None, - byhour=None, byminute=None, bysecond=None, - cache=False): - super(rrule, self).__init__(cache) - global easter - if not dtstart: - if until and until.tzinfo: - dtstart = datetime.datetime.now(tz=until.tzinfo).replace(microsecond=0) - else: - dtstart = datetime.datetime.now().replace(microsecond=0) - elif not isinstance(dtstart, datetime.datetime): - dtstart = datetime.datetime.fromordinal(dtstart.toordinal()) - else: - dtstart = dtstart.replace(microsecond=0) - self._dtstart = dtstart - self._tzinfo = dtstart.tzinfo - self._freq = freq - self._interval = interval - self._count = count - - # Cache the original byxxx rules, if they are provided, as the _byxxx - # attributes do not necessarily map to the inputs, and this can be - # a problem in generating the strings. Only store things if they've - # been supplied (the string retrieval will just use .get()) - self._original_rule = {} - - if until and not isinstance(until, datetime.datetime): - until = datetime.datetime.fromordinal(until.toordinal()) - self._until = until - - if self._dtstart and self._until: - if (self._dtstart.tzinfo is not None) != (self._until.tzinfo is not None): - # According to RFC5545 Section 3.3.10: - # https://tools.ietf.org/html/rfc5545#section-3.3.10 - # - # > If the "DTSTART" property is specified as a date with UTC - # > time or a date with local time and time zone reference, - # > then the UNTIL rule part MUST be specified as a date with - # > UTC time. - raise ValueError( - 'RRULE UNTIL values must be specified in UTC when DTSTART ' - 'is timezone-aware' - ) - - if count is not None and until: - warn("Using both 'count' and 'until' is inconsistent with RFC 5545" - " and has been deprecated in dateutil. Future versions will " - "raise an error.", DeprecationWarning) - - if wkst is None: - self._wkst = calendar.firstweekday() - elif isinstance(wkst, integer_types): - self._wkst = wkst - else: - self._wkst = wkst.weekday - - if bysetpos is None: - self._bysetpos = None - elif isinstance(bysetpos, integer_types): - if bysetpos == 0 or not (-366 <= bysetpos <= 366): - raise ValueError("bysetpos must be between 1 and 366, " - "or between -366 and -1") - self._bysetpos = (bysetpos,) - else: - self._bysetpos = tuple(bysetpos) - for pos in self._bysetpos: - if pos == 0 or not (-366 <= pos <= 366): - raise ValueError("bysetpos must be between 1 and 366, " - "or between -366 and -1") - - if self._bysetpos: - self._original_rule['bysetpos'] = self._bysetpos - - if (byweekno is None and byyearday is None and bymonthday is None and - byweekday is None and byeaster is None): - if freq == YEARLY: - if bymonth is None: - bymonth = dtstart.month - self._original_rule['bymonth'] = None - bymonthday = dtstart.day - self._original_rule['bymonthday'] = None - elif freq == MONTHLY: - bymonthday = dtstart.day - self._original_rule['bymonthday'] = None - elif freq == WEEKLY: - byweekday = dtstart.weekday() - self._original_rule['byweekday'] = None - - # bymonth - if bymonth is None: - self._bymonth = None - else: - if isinstance(bymonth, integer_types): - bymonth = (bymonth,) - - self._bymonth = tuple(sorted(set(bymonth))) - - if 'bymonth' not in self._original_rule: - self._original_rule['bymonth'] = self._bymonth - - # byyearday - if byyearday is None: - self._byyearday = None - else: - if isinstance(byyearday, integer_types): - byyearday = (byyearday,) - - self._byyearday = tuple(sorted(set(byyearday))) - self._original_rule['byyearday'] = self._byyearday - - # byeaster - if byeaster is not None: - if not easter: - from dateutil import easter - if isinstance(byeaster, integer_types): - self._byeaster = (byeaster,) - else: - self._byeaster = tuple(sorted(byeaster)) - - self._original_rule['byeaster'] = self._byeaster - else: - self._byeaster = None - - # bymonthday - if bymonthday is None: - self._bymonthday = () - self._bynmonthday = () - else: - if isinstance(bymonthday, integer_types): - bymonthday = (bymonthday,) - - bymonthday = set(bymonthday) # Ensure it's unique - - self._bymonthday = tuple(sorted(x for x in bymonthday if x > 0)) - self._bynmonthday = tuple(sorted(x for x in bymonthday if x < 0)) - - # Storing positive numbers first, then negative numbers - if 'bymonthday' not in self._original_rule: - self._original_rule['bymonthday'] = tuple( - itertools.chain(self._bymonthday, self._bynmonthday)) - - # byweekno - if byweekno is None: - self._byweekno = None - else: - if isinstance(byweekno, integer_types): - byweekno = (byweekno,) - - self._byweekno = tuple(sorted(set(byweekno))) - - self._original_rule['byweekno'] = self._byweekno - - # byweekday / bynweekday - if byweekday is None: - self._byweekday = None - self._bynweekday = None - else: - # If it's one of the valid non-sequence types, convert to a - # single-element sequence before the iterator that builds the - # byweekday set. - if isinstance(byweekday, integer_types) or hasattr(byweekday, "n"): - byweekday = (byweekday,) - - self._byweekday = set() - self._bynweekday = set() - for wday in byweekday: - if isinstance(wday, integer_types): - self._byweekday.add(wday) - elif not wday.n or freq > MONTHLY: - self._byweekday.add(wday.weekday) - else: - self._bynweekday.add((wday.weekday, wday.n)) - - if not self._byweekday: - self._byweekday = None - elif not self._bynweekday: - self._bynweekday = None - - if self._byweekday is not None: - self._byweekday = tuple(sorted(self._byweekday)) - orig_byweekday = [weekday(x) for x in self._byweekday] - else: - orig_byweekday = () - - if self._bynweekday is not None: - self._bynweekday = tuple(sorted(self._bynweekday)) - orig_bynweekday = [weekday(*x) for x in self._bynweekday] - else: - orig_bynweekday = () - - if 'byweekday' not in self._original_rule: - self._original_rule['byweekday'] = tuple(itertools.chain( - orig_byweekday, orig_bynweekday)) - - # byhour - if byhour is None: - if freq < HOURLY: - self._byhour = {dtstart.hour} - else: - self._byhour = None - else: - if isinstance(byhour, integer_types): - byhour = (byhour,) - - if freq == HOURLY: - self._byhour = self.__construct_byset(start=dtstart.hour, - byxxx=byhour, - base=24) - else: - self._byhour = set(byhour) - - self._byhour = tuple(sorted(self._byhour)) - self._original_rule['byhour'] = self._byhour - - # byminute - if byminute is None: - if freq < MINUTELY: - self._byminute = {dtstart.minute} - else: - self._byminute = None - else: - if isinstance(byminute, integer_types): - byminute = (byminute,) - - if freq == MINUTELY: - self._byminute = self.__construct_byset(start=dtstart.minute, - byxxx=byminute, - base=60) - else: - self._byminute = set(byminute) - - self._byminute = tuple(sorted(self._byminute)) - self._original_rule['byminute'] = self._byminute - - # bysecond - if bysecond is None: - if freq < SECONDLY: - self._bysecond = ((dtstart.second,)) - else: - self._bysecond = None - else: - if isinstance(bysecond, integer_types): - bysecond = (bysecond,) - - self._bysecond = set(bysecond) - - if freq == SECONDLY: - self._bysecond = self.__construct_byset(start=dtstart.second, - byxxx=bysecond, - base=60) - else: - self._bysecond = set(bysecond) - - self._bysecond = tuple(sorted(self._bysecond)) - self._original_rule['bysecond'] = self._bysecond - - if self._freq >= HOURLY: - self._timeset = None - else: - self._timeset = [] - for hour in self._byhour: - for minute in self._byminute: - for second in self._bysecond: - self._timeset.append( - datetime.time(hour, minute, second, - tzinfo=self._tzinfo)) - self._timeset.sort() - self._timeset = tuple(self._timeset) - - def __str__(self): - """ - Output a string that would generate this RRULE if passed to rrulestr. - This is mostly compatible with RFC5545, except for the - dateutil-specific extension BYEASTER. - """ - - output = [] - h, m, s = [None] * 3 - if self._dtstart: - output.append(self._dtstart.strftime('DTSTART:%Y%m%dT%H%M%S')) - h, m, s = self._dtstart.timetuple()[3:6] - - parts = ['FREQ=' + FREQNAMES[self._freq]] - if self._interval != 1: - parts.append('INTERVAL=' + str(self._interval)) - - if self._wkst: - parts.append('WKST=' + repr(weekday(self._wkst))[0:2]) - - if self._count is not None: - parts.append('COUNT=' + str(self._count)) - - if self._until: - parts.append(self._until.strftime('UNTIL=%Y%m%dT%H%M%S')) - - if self._original_rule.get('byweekday') is not None: - # The str() method on weekday objects doesn't generate - # RFC5545-compliant strings, so we should modify that. - original_rule = dict(self._original_rule) - wday_strings = [] - for wday in original_rule['byweekday']: - if wday.n: - wday_strings.append('{n:+d}{wday}'.format( - n=wday.n, - wday=repr(wday)[0:2])) - else: - wday_strings.append(repr(wday)) - - original_rule['byweekday'] = wday_strings - else: - original_rule = self._original_rule - - partfmt = '{name}={vals}' - for name, key in [('BYSETPOS', 'bysetpos'), - ('BYMONTH', 'bymonth'), - ('BYMONTHDAY', 'bymonthday'), - ('BYYEARDAY', 'byyearday'), - ('BYWEEKNO', 'byweekno'), - ('BYDAY', 'byweekday'), - ('BYHOUR', 'byhour'), - ('BYMINUTE', 'byminute'), - ('BYSECOND', 'bysecond'), - ('BYEASTER', 'byeaster')]: - value = original_rule.get(key) - if value: - parts.append(partfmt.format(name=name, vals=(','.join(str(v) - for v in value)))) - - output.append('RRULE:' + ';'.join(parts)) - return '\n'.join(output) - - def replace(self, **kwargs): - """Return new rrule with same attributes except for those attributes given new - values by whichever keyword arguments are specified.""" - new_kwargs = {"interval": self._interval, - "count": self._count, - "dtstart": self._dtstart, - "freq": self._freq, - "until": self._until, - "wkst": self._wkst, - "cache": False if self._cache is None else True } - new_kwargs.update(self._original_rule) - new_kwargs.update(kwargs) - return rrule(**new_kwargs) - - def _iter(self): - year, month, day, hour, minute, second, weekday, yearday, _ = \ - self._dtstart.timetuple() - - # Some local variables to speed things up a bit - freq = self._freq - interval = self._interval - wkst = self._wkst - until = self._until - bymonth = self._bymonth - byweekno = self._byweekno - byyearday = self._byyearday - byweekday = self._byweekday - byeaster = self._byeaster - bymonthday = self._bymonthday - bynmonthday = self._bynmonthday - bysetpos = self._bysetpos - byhour = self._byhour - byminute = self._byminute - bysecond = self._bysecond - - ii = _iterinfo(self) - ii.rebuild(year, month) - - getdayset = {YEARLY: ii.ydayset, - MONTHLY: ii.mdayset, - WEEKLY: ii.wdayset, - DAILY: ii.ddayset, - HOURLY: ii.ddayset, - MINUTELY: ii.ddayset, - SECONDLY: ii.ddayset}[freq] - - if freq < HOURLY: - timeset = self._timeset - else: - gettimeset = {HOURLY: ii.htimeset, - MINUTELY: ii.mtimeset, - SECONDLY: ii.stimeset}[freq] - if ((freq >= HOURLY and - self._byhour and hour not in self._byhour) or - (freq >= MINUTELY and - self._byminute and minute not in self._byminute) or - (freq >= SECONDLY and - self._bysecond and second not in self._bysecond)): - timeset = () - else: - timeset = gettimeset(hour, minute, second) - - total = 0 - count = self._count - while True: - # Get dayset with the right frequency - dayset, start, end = getdayset(year, month, day) - - # Do the "hard" work ;-) - filtered = False - for i in dayset[start:end]: - if ((bymonth and ii.mmask[i] not in bymonth) or - (byweekno and not ii.wnomask[i]) or - (byweekday and ii.wdaymask[i] not in byweekday) or - (ii.nwdaymask and not ii.nwdaymask[i]) or - (byeaster and not ii.eastermask[i]) or - ((bymonthday or bynmonthday) and - ii.mdaymask[i] not in bymonthday and - ii.nmdaymask[i] not in bynmonthday) or - (byyearday and - ((i < ii.yearlen and i+1 not in byyearday and - -ii.yearlen+i not in byyearday) or - (i >= ii.yearlen and i+1-ii.yearlen not in byyearday and - -ii.nextyearlen+i-ii.yearlen not in byyearday)))): - dayset[i] = None - filtered = True - - # Output results - if bysetpos and timeset: - poslist = [] - for pos in bysetpos: - if pos < 0: - daypos, timepos = divmod(pos, len(timeset)) - else: - daypos, timepos = divmod(pos-1, len(timeset)) - try: - i = [x for x in dayset[start:end] - if x is not None][daypos] - time = timeset[timepos] - except IndexError: - pass - else: - date = datetime.date.fromordinal(ii.yearordinal+i) - res = datetime.datetime.combine(date, time) - if res not in poslist: - poslist.append(res) - poslist.sort() - for res in poslist: - if until and res > until: - self._len = total - return - elif res >= self._dtstart: - if count is not None: - count -= 1 - if count < 0: - self._len = total - return - total += 1 - yield res - else: - for i in dayset[start:end]: - if i is not None: - date = datetime.date.fromordinal(ii.yearordinal + i) - for time in timeset: - res = datetime.datetime.combine(date, time) - if until and res > until: - self._len = total - return - elif res >= self._dtstart: - if count is not None: - count -= 1 - if count < 0: - self._len = total - return - - total += 1 - yield res - - # Handle frequency and interval - fixday = False - if freq == YEARLY: - year += interval - if year > datetime.MAXYEAR: - self._len = total - return - ii.rebuild(year, month) - elif freq == MONTHLY: - month += interval - if month > 12: - div, mod = divmod(month, 12) - month = mod - year += div - if month == 0: - month = 12 - year -= 1 - if year > datetime.MAXYEAR: - self._len = total - return - ii.rebuild(year, month) - elif freq == WEEKLY: - if wkst > weekday: - day += -(weekday+1+(6-wkst))+self._interval*7 - else: - day += -(weekday-wkst)+self._interval*7 - weekday = wkst - fixday = True - elif freq == DAILY: - day += interval - fixday = True - elif freq == HOURLY: - if filtered: - # Jump to one iteration before next day - hour += ((23-hour)//interval)*interval - - if byhour: - ndays, hour = self.__mod_distance(value=hour, - byxxx=self._byhour, - base=24) - else: - ndays, hour = divmod(hour+interval, 24) - - if ndays: - day += ndays - fixday = True - - timeset = gettimeset(hour, minute, second) - elif freq == MINUTELY: - if filtered: - # Jump to one iteration before next day - minute += ((1439-(hour*60+minute))//interval)*interval - - valid = False - rep_rate = (24*60) - for j in range(rep_rate // gcd(interval, rep_rate)): - if byminute: - nhours, minute = \ - self.__mod_distance(value=minute, - byxxx=self._byminute, - base=60) - else: - nhours, minute = divmod(minute+interval, 60) - - div, hour = divmod(hour+nhours, 24) - if div: - day += div - fixday = True - filtered = False - - if not byhour or hour in byhour: - valid = True - break - - if not valid: - raise ValueError('Invalid combination of interval and ' + - 'byhour resulting in empty rule.') - - timeset = gettimeset(hour, minute, second) - elif freq == SECONDLY: - if filtered: - # Jump to one iteration before next day - second += (((86399 - (hour * 3600 + minute * 60 + second)) - // interval) * interval) - - rep_rate = (24 * 3600) - valid = False - for j in range(0, rep_rate // gcd(interval, rep_rate)): - if bysecond: - nminutes, second = \ - self.__mod_distance(value=second, - byxxx=self._bysecond, - base=60) - else: - nminutes, second = divmod(second+interval, 60) - - div, minute = divmod(minute+nminutes, 60) - if div: - hour += div - div, hour = divmod(hour, 24) - if div: - day += div - fixday = True - - if ((not byhour or hour in byhour) and - (not byminute or minute in byminute) and - (not bysecond or second in bysecond)): - valid = True - break - - if not valid: - raise ValueError('Invalid combination of interval, ' + - 'byhour and byminute resulting in empty' + - ' rule.') - - timeset = gettimeset(hour, minute, second) - - if fixday and day > 28: - daysinmonth = calendar.monthrange(year, month)[1] - if day > daysinmonth: - while day > daysinmonth: - day -= daysinmonth - month += 1 - if month == 13: - month = 1 - year += 1 - if year > datetime.MAXYEAR: - self._len = total - return - daysinmonth = calendar.monthrange(year, month)[1] - ii.rebuild(year, month) - - def __construct_byset(self, start, byxxx, base): - """ - If a `BYXXX` sequence is passed to the constructor at the same level as - `FREQ` (e.g. `FREQ=HOURLY,BYHOUR={2,4,7},INTERVAL=3`), there are some - specifications which cannot be reached given some starting conditions. - - This occurs whenever the interval is not coprime with the base of a - given unit and the difference between the starting position and the - ending position is not coprime with the greatest common denominator - between the interval and the base. For example, with a FREQ of hourly - starting at 17:00 and an interval of 4, the only valid values for - BYHOUR would be {21, 1, 5, 9, 13, 17}, because 4 and 24 are not - coprime. - - :param start: - Specifies the starting position. - :param byxxx: - An iterable containing the list of allowed values. - :param base: - The largest allowable value for the specified frequency (e.g. - 24 hours, 60 minutes). - - This does not preserve the type of the iterable, returning a set, since - the values should be unique and the order is irrelevant, this will - speed up later lookups. - - In the event of an empty set, raises a :exception:`ValueError`, as this - results in an empty rrule. - """ - - cset = set() - - # Support a single byxxx value. - if isinstance(byxxx, integer_types): - byxxx = (byxxx, ) - - for num in byxxx: - i_gcd = gcd(self._interval, base) - # Use divmod rather than % because we need to wrap negative nums. - if i_gcd == 1 or divmod(num - start, i_gcd)[1] == 0: - cset.add(num) - - if len(cset) == 0: - raise ValueError("Invalid rrule byxxx generates an empty set.") - - return cset - - def __mod_distance(self, value, byxxx, base): - """ - Calculates the next value in a sequence where the `FREQ` parameter is - specified along with a `BYXXX` parameter at the same "level" - (e.g. `HOURLY` specified with `BYHOUR`). - - :param value: - The old value of the component. - :param byxxx: - The `BYXXX` set, which should have been generated by - `rrule._construct_byset`, or something else which checks that a - valid rule is present. - :param base: - The largest allowable value for the specified frequency (e.g. - 24 hours, 60 minutes). - - If a valid value is not found after `base` iterations (the maximum - number before the sequence would start to repeat), this raises a - :exception:`ValueError`, as no valid values were found. - - This returns a tuple of `divmod(n*interval, base)`, where `n` is the - smallest number of `interval` repetitions until the next specified - value in `byxxx` is found. - """ - accumulator = 0 - for ii in range(1, base + 1): - # Using divmod() over % to account for negative intervals - div, value = divmod(value + self._interval, base) - accumulator += div - if value in byxxx: - return (accumulator, value) - - -class _iterinfo(object): - __slots__ = ["rrule", "lastyear", "lastmonth", - "yearlen", "nextyearlen", "yearordinal", "yearweekday", - "mmask", "mrange", "mdaymask", "nmdaymask", - "wdaymask", "wnomask", "nwdaymask", "eastermask"] - - def __init__(self, rrule): - for attr in self.__slots__: - setattr(self, attr, None) - self.rrule = rrule - - def rebuild(self, year, month): - # Every mask is 7 days longer to handle cross-year weekly periods. - rr = self.rrule - if year != self.lastyear: - self.yearlen = 365 + calendar.isleap(year) - self.nextyearlen = 365 + calendar.isleap(year + 1) - firstyday = datetime.date(year, 1, 1) - self.yearordinal = firstyday.toordinal() - self.yearweekday = firstyday.weekday() - - wday = datetime.date(year, 1, 1).weekday() - if self.yearlen == 365: - self.mmask = M365MASK - self.mdaymask = MDAY365MASK - self.nmdaymask = NMDAY365MASK - self.wdaymask = WDAYMASK[wday:] - self.mrange = M365RANGE - else: - self.mmask = M366MASK - self.mdaymask = MDAY366MASK - self.nmdaymask = NMDAY366MASK - self.wdaymask = WDAYMASK[wday:] - self.mrange = M366RANGE - - if not rr._byweekno: - self.wnomask = None - else: - self.wnomask = [0]*(self.yearlen+7) - # no1wkst = firstwkst = self.wdaymask.index(rr._wkst) - no1wkst = firstwkst = (7-self.yearweekday+rr._wkst) % 7 - if no1wkst >= 4: - no1wkst = 0 - # Number of days in the year, plus the days we got - # from last year. - wyearlen = self.yearlen+(self.yearweekday-rr._wkst) % 7 - else: - # Number of days in the year, minus the days we - # left in last year. - wyearlen = self.yearlen-no1wkst - div, mod = divmod(wyearlen, 7) - numweeks = div+mod//4 - for n in rr._byweekno: - if n < 0: - n += numweeks+1 - if not (0 < n <= numweeks): - continue - if n > 1: - i = no1wkst+(n-1)*7 - if no1wkst != firstwkst: - i -= 7-firstwkst - else: - i = no1wkst - for j in range(7): - self.wnomask[i] = 1 - i += 1 - if self.wdaymask[i] == rr._wkst: - break - if 1 in rr._byweekno: - # Check week number 1 of next year as well - # TODO: Check -numweeks for next year. - i = no1wkst+numweeks*7 - if no1wkst != firstwkst: - i -= 7-firstwkst - if i < self.yearlen: - # If week starts in next year, we - # don't care about it. - for j in range(7): - self.wnomask[i] = 1 - i += 1 - if self.wdaymask[i] == rr._wkst: - break - if no1wkst: - # Check last week number of last year as - # well. If no1wkst is 0, either the year - # started on week start, or week number 1 - # got days from last year, so there are no - # days from last year's last week number in - # this year. - if -1 not in rr._byweekno: - lyearweekday = datetime.date(year-1, 1, 1).weekday() - lno1wkst = (7-lyearweekday+rr._wkst) % 7 - lyearlen = 365+calendar.isleap(year-1) - if lno1wkst >= 4: - lno1wkst = 0 - lnumweeks = 52+(lyearlen + - (lyearweekday-rr._wkst) % 7) % 7//4 - else: - lnumweeks = 52+(self.yearlen-no1wkst) % 7//4 - else: - lnumweeks = -1 - if lnumweeks in rr._byweekno: - for i in range(no1wkst): - self.wnomask[i] = 1 - - if (rr._bynweekday and (month != self.lastmonth or - year != self.lastyear)): - ranges = [] - if rr._freq == YEARLY: - if rr._bymonth: - for month in rr._bymonth: - ranges.append(self.mrange[month-1:month+1]) - else: - ranges = [(0, self.yearlen)] - elif rr._freq == MONTHLY: - ranges = [self.mrange[month-1:month+1]] - if ranges: - # Weekly frequency won't get here, so we may not - # care about cross-year weekly periods. - self.nwdaymask = [0]*self.yearlen - for first, last in ranges: - last -= 1 - for wday, n in rr._bynweekday: - if n < 0: - i = last+(n+1)*7 - i -= (self.wdaymask[i]-wday) % 7 - else: - i = first+(n-1)*7 - i += (7-self.wdaymask[i]+wday) % 7 - if first <= i <= last: - self.nwdaymask[i] = 1 - - if rr._byeaster: - self.eastermask = [0]*(self.yearlen+7) - eyday = easter.easter(year).toordinal()-self.yearordinal - for offset in rr._byeaster: - self.eastermask[eyday+offset] = 1 - - self.lastyear = year - self.lastmonth = month - - def ydayset(self, year, month, day): - return list(range(self.yearlen)), 0, self.yearlen - - def mdayset(self, year, month, day): - dset = [None]*self.yearlen - start, end = self.mrange[month-1:month+1] - for i in range(start, end): - dset[i] = i - return dset, start, end - - def wdayset(self, year, month, day): - # We need to handle cross-year weeks here. - dset = [None]*(self.yearlen+7) - i = datetime.date(year, month, day).toordinal()-self.yearordinal - start = i - for j in range(7): - dset[i] = i - i += 1 - # if (not (0 <= i < self.yearlen) or - # self.wdaymask[i] == self.rrule._wkst): - # This will cross the year boundary, if necessary. - if self.wdaymask[i] == self.rrule._wkst: - break - return dset, start, i - - def ddayset(self, year, month, day): - dset = [None] * self.yearlen - i = datetime.date(year, month, day).toordinal() - self.yearordinal - dset[i] = i - return dset, i, i + 1 - - def htimeset(self, hour, minute, second): - tset = [] - rr = self.rrule - for minute in rr._byminute: - for second in rr._bysecond: - tset.append(datetime.time(hour, minute, second, - tzinfo=rr._tzinfo)) - tset.sort() - return tset - - def mtimeset(self, hour, minute, second): - tset = [] - rr = self.rrule - for second in rr._bysecond: - tset.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) - tset.sort() - return tset - - def stimeset(self, hour, minute, second): - return (datetime.time(hour, minute, second, - tzinfo=self.rrule._tzinfo),) - - -class rruleset(rrulebase): - """ The rruleset type allows more complex recurrence setups, mixing - multiple rules, dates, exclusion rules, and exclusion dates. The type - constructor takes the following keyword arguments: - - :param cache: If True, caching of results will be enabled, improving - performance of multiple queries considerably. """ - - class _genitem(object): - def __init__(self, genlist, gen): - try: - self.dt = advance_iterator(gen) - genlist.append(self) - except StopIteration: - pass - self.genlist = genlist - self.gen = gen - - def __next__(self): - try: - self.dt = advance_iterator(self.gen) - except StopIteration: - if self.genlist[0] is self: - heapq.heappop(self.genlist) - else: - self.genlist.remove(self) - heapq.heapify(self.genlist) - - next = __next__ - - def __lt__(self, other): - return self.dt < other.dt - - def __gt__(self, other): - return self.dt > other.dt - - def __eq__(self, other): - return self.dt == other.dt - - def __ne__(self, other): - return self.dt != other.dt - - def __init__(self, cache=False): - super(rruleset, self).__init__(cache) - self._rrule = [] - self._rdate = [] - self._exrule = [] - self._exdate = [] - - @_invalidates_cache - def rrule(self, rrule): - """ Include the given :py:class:`rrule` instance in the recurrence set - generation. """ - self._rrule.append(rrule) - - @_invalidates_cache - def rdate(self, rdate): - """ Include the given :py:class:`datetime` instance in the recurrence - set generation. """ - self._rdate.append(rdate) - - @_invalidates_cache - def exrule(self, exrule): - """ Include the given rrule instance in the recurrence set exclusion - list. Dates which are part of the given recurrence rules will not - be generated, even if some inclusive rrule or rdate matches them. - """ - self._exrule.append(exrule) - - @_invalidates_cache - def exdate(self, exdate): - """ Include the given datetime instance in the recurrence set - exclusion list. Dates included that way will not be generated, - even if some inclusive rrule or rdate matches them. """ - self._exdate.append(exdate) - - def _iter(self): - rlist = [] - self._rdate.sort() - self._genitem(rlist, iter(self._rdate)) - for gen in [iter(x) for x in self._rrule]: - self._genitem(rlist, gen) - exlist = [] - self._exdate.sort() - self._genitem(exlist, iter(self._exdate)) - for gen in [iter(x) for x in self._exrule]: - self._genitem(exlist, gen) - lastdt = None - total = 0 - heapq.heapify(rlist) - heapq.heapify(exlist) - while rlist: - ritem = rlist[0] - if not lastdt or lastdt != ritem.dt: - while exlist and exlist[0] < ritem: - exitem = exlist[0] - advance_iterator(exitem) - if exlist and exlist[0] is exitem: - heapq.heapreplace(exlist, exitem) - if not exlist or ritem != exlist[0]: - total += 1 - yield ritem.dt - lastdt = ritem.dt - advance_iterator(ritem) - if rlist and rlist[0] is ritem: - heapq.heapreplace(rlist, ritem) - self._len = total - - - - -class _rrulestr(object): - """ Parses a string representation of a recurrence rule or set of - recurrence rules. - - :param s: - Required, a string defining one or more recurrence rules. - - :param dtstart: - If given, used as the default recurrence start if not specified in the - rule string. - - :param cache: - If set ``True`` caching of results will be enabled, improving - performance of multiple queries considerably. - - :param unfold: - If set ``True`` indicates that a rule string is split over more - than one line and should be joined before processing. - - :param forceset: - If set ``True`` forces a :class:`dateutil.rrule.rruleset` to - be returned. - - :param compatible: - If set ``True`` forces ``unfold`` and ``forceset`` to be ``True``. - - :param ignoretz: - If set ``True``, time zones in parsed strings are ignored and a naive - :class:`datetime.datetime` object is returned. - - :param tzids: - If given, a callable or mapping used to retrieve a - :class:`datetime.tzinfo` from a string representation. - Defaults to :func:`dateutil.tz.gettz`. - - :param tzinfos: - Additional time zone names / aliases which may be present in a string - representation. See :func:`dateutil.parser.parse` for more - information. - - :return: - Returns a :class:`dateutil.rrule.rruleset` or - :class:`dateutil.rrule.rrule` - """ - - _freq_map = {"YEARLY": YEARLY, - "MONTHLY": MONTHLY, - "WEEKLY": WEEKLY, - "DAILY": DAILY, - "HOURLY": HOURLY, - "MINUTELY": MINUTELY, - "SECONDLY": SECONDLY} - - _weekday_map = {"MO": 0, "TU": 1, "WE": 2, "TH": 3, - "FR": 4, "SA": 5, "SU": 6} - - def _handle_int(self, rrkwargs, name, value, **kwargs): - rrkwargs[name.lower()] = int(value) - - def _handle_int_list(self, rrkwargs, name, value, **kwargs): - rrkwargs[name.lower()] = [int(x) for x in value.split(',')] - - _handle_INTERVAL = _handle_int - _handle_COUNT = _handle_int - _handle_BYSETPOS = _handle_int_list - _handle_BYMONTH = _handle_int_list - _handle_BYMONTHDAY = _handle_int_list - _handle_BYYEARDAY = _handle_int_list - _handle_BYEASTER = _handle_int_list - _handle_BYWEEKNO = _handle_int_list - _handle_BYHOUR = _handle_int_list - _handle_BYMINUTE = _handle_int_list - _handle_BYSECOND = _handle_int_list - - def _handle_FREQ(self, rrkwargs, name, value, **kwargs): - rrkwargs["freq"] = self._freq_map[value] - - def _handle_UNTIL(self, rrkwargs, name, value, **kwargs): - global parser - if not parser: - from dateutil import parser - try: - rrkwargs["until"] = parser.parse(value, - ignoretz=kwargs.get("ignoretz"), - tzinfos=kwargs.get("tzinfos")) - except ValueError: - raise ValueError("invalid until date") - - def _handle_WKST(self, rrkwargs, name, value, **kwargs): - rrkwargs["wkst"] = self._weekday_map[value] - - def _handle_BYWEEKDAY(self, rrkwargs, name, value, **kwargs): - """ - Two ways to specify this: +1MO or MO(+1) - """ - l = [] - for wday in value.split(','): - if '(' in wday: - # If it's of the form TH(+1), etc. - splt = wday.split('(') - w = splt[0] - n = int(splt[1][:-1]) - elif len(wday): - # If it's of the form +1MO - for i in range(len(wday)): - if wday[i] not in '+-0123456789': - break - n = wday[:i] or None - w = wday[i:] - if n: - n = int(n) - else: - raise ValueError("Invalid (empty) BYDAY specification.") - - l.append(weekdays[self._weekday_map[w]](n)) - rrkwargs["byweekday"] = l - - _handle_BYDAY = _handle_BYWEEKDAY - - def _parse_rfc_rrule(self, line, - dtstart=None, - cache=False, - ignoretz=False, - tzinfos=None): - if line.find(':') != -1: - name, value = line.split(':') - if name != "RRULE": - raise ValueError("unknown parameter name") - else: - value = line - rrkwargs = {} - for pair in value.split(';'): - name, value = pair.split('=') - name = name.upper() - value = value.upper() - try: - getattr(self, "_handle_"+name)(rrkwargs, name, value, - ignoretz=ignoretz, - tzinfos=tzinfos) - except AttributeError: - raise ValueError("unknown parameter '%s'" % name) - except (KeyError, ValueError): - raise ValueError("invalid '%s': %s" % (name, value)) - return rrule(dtstart=dtstart, cache=cache, **rrkwargs) - - def _parse_date_value(self, date_value, parms, rule_tzids, - ignoretz, tzids, tzinfos): - global parser - if not parser: - from dateutil import parser - - datevals = [] - value_found = False - TZID = None - - for parm in parms: - if parm.startswith("TZID="): - try: - tzkey = rule_tzids[parm.split('TZID=')[-1]] - except KeyError: - continue - if tzids is None: - from . import tz - tzlookup = tz.gettz - elif callable(tzids): - tzlookup = tzids - else: - tzlookup = getattr(tzids, 'get', None) - if tzlookup is None: - msg = ('tzids must be a callable, mapping, or None, ' - 'not %s' % tzids) - raise ValueError(msg) - - TZID = tzlookup(tzkey) - continue - - # RFC 5445 3.8.2.4: The VALUE parameter is optional, but may be found - # only once. - if parm not in {"VALUE=DATE-TIME", "VALUE=DATE"}: - raise ValueError("unsupported parm: " + parm) - else: - if value_found: - msg = ("Duplicate value parameter found in: " + parm) - raise ValueError(msg) - value_found = True - - for datestr in date_value.split(','): - date = parser.parse(datestr, ignoretz=ignoretz, tzinfos=tzinfos) - if TZID is not None: - if date.tzinfo is None: - date = date.replace(tzinfo=TZID) - else: - raise ValueError('DTSTART/EXDATE specifies multiple timezone') - datevals.append(date) - - return datevals - - def _parse_rfc(self, s, - dtstart=None, - cache=False, - unfold=False, - forceset=False, - compatible=False, - ignoretz=False, - tzids=None, - tzinfos=None): - global parser - if compatible: - forceset = True - unfold = True - - TZID_NAMES = dict(map( - lambda x: (x.upper(), x), - re.findall('TZID=(?P[^:]+):', s) - )) - s = s.upper() - if not s.strip(): - raise ValueError("empty string") - if unfold: - lines = s.splitlines() - i = 0 - while i < len(lines): - line = lines[i].rstrip() - if not line: - del lines[i] - elif i > 0 and line[0] == " ": - lines[i-1] += line[1:] - del lines[i] - else: - i += 1 - else: - lines = s.split() - if (not forceset and len(lines) == 1 and (s.find(':') == -1 or - s.startswith('RRULE:'))): - return self._parse_rfc_rrule(lines[0], cache=cache, - dtstart=dtstart, ignoretz=ignoretz, - tzinfos=tzinfos) - else: - rrulevals = [] - rdatevals = [] - exrulevals = [] - exdatevals = [] - for line in lines: - if not line: - continue - if line.find(':') == -1: - name = "RRULE" - value = line - else: - name, value = line.split(':', 1) - parms = name.split(';') - if not parms: - raise ValueError("empty property name") - name = parms[0] - parms = parms[1:] - if name == "RRULE": - for parm in parms: - raise ValueError("unsupported RRULE parm: "+parm) - rrulevals.append(value) - elif name == "RDATE": - for parm in parms: - if parm != "VALUE=DATE-TIME": - raise ValueError("unsupported RDATE parm: "+parm) - rdatevals.append(value) - elif name == "EXRULE": - for parm in parms: - raise ValueError("unsupported EXRULE parm: "+parm) - exrulevals.append(value) - elif name == "EXDATE": - exdatevals.extend( - self._parse_date_value(value, parms, - TZID_NAMES, ignoretz, - tzids, tzinfos) - ) - elif name == "DTSTART": - dtvals = self._parse_date_value(value, parms, TZID_NAMES, - ignoretz, tzids, tzinfos) - if len(dtvals) != 1: - raise ValueError("Multiple DTSTART values specified:" + - value) - dtstart = dtvals[0] - else: - raise ValueError("unsupported property: "+name) - if (forceset or len(rrulevals) > 1 or rdatevals - or exrulevals or exdatevals): - if not parser and (rdatevals or exdatevals): - from dateutil import parser - rset = rruleset(cache=cache) - for value in rrulevals: - rset.rrule(self._parse_rfc_rrule(value, dtstart=dtstart, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in rdatevals: - for datestr in value.split(','): - rset.rdate(parser.parse(datestr, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in exrulevals: - rset.exrule(self._parse_rfc_rrule(value, dtstart=dtstart, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in exdatevals: - rset.exdate(value) - if compatible and dtstart: - rset.rdate(dtstart) - return rset - else: - return self._parse_rfc_rrule(rrulevals[0], - dtstart=dtstart, - cache=cache, - ignoretz=ignoretz, - tzinfos=tzinfos) - - def __call__(self, s, **kwargs): - return self._parse_rfc(s, **kwargs) - - -rrulestr = _rrulestr() - -# vim:ts=4:sw=4:et diff --git a/venv/lib/python3.7/site-packages/dateutil/tz/__init__.py b/venv/lib/python3.7/site-packages/dateutil/tz/__init__.py deleted file mode 100644 index af1352c..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/tz/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -from .tz import * -from .tz import __doc__ - -__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange", - "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz", - "enfold", "datetime_ambiguous", "datetime_exists", - "resolve_imaginary", "UTC", "DeprecatedTzFormatWarning"] - - -class DeprecatedTzFormatWarning(Warning): - """Warning raised when time zones are parsed from deprecated formats.""" diff --git a/venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 764c429b3340dd4d3f4ef8975dbd09c33c36c4a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmYLGy^ho{5Vn)uY{>0$dkYkFX%}fPG;|0Z2Z9D&!y+UXSSI7-EID?t9gayHoLF+xAXzGX7{#&$u@XKSN zH6HLIuV$2jE-58b*LSWQQrGLMvfPoG>!mK4B#G-QA$f2ZrfMEituw(dLfk*Egd*8^ z?MtRLcdjQ1SCy7PR=^y0qT!S^A4T2i&XVJUkAD%?S#n~y)$%i^qG7dA%v7QVmrHXkrbjT=eG;}i9b4ovTOztBl z_ITfr2^${OpXY^Z+M*ThMkwo;l$*!;iRHFZMZ0sCT5ZCQbWX_PV7R`ZR4CynJ#BX* zha=z6MqZ`(Vm%!qzmxzK7U_HXF=n?M$L#<3dn;5A>C^qp&q5nJAA8NC3}-mOS^O8# C{=8KH diff --git a/venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/_common.cpython-37.pyc b/venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/_common.cpython-37.pyc deleted file mode 100644 index b90d0d9e6ec00154e91bc20fcedd8192a98ac3c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12219 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 bDJGEdj7#;LW9`m65owfp}G7K3Te diff --git a/venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/_factories.cpython-37.pyc b/venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/_factories.cpython-37.pyc deleted file mode 100644 index 717044f45ac84eb03a7229439dfddcb96a61e499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2860 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 diff --git a/venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/win.cpython-37.pyc b/venv/lib/python3.7/site-packages/dateutil/tz/__pycache__/win.cpython-37.pyc deleted file mode 100644 index 1c7ac4b2b32c19e38f8d6f94ebe53a3ce9747269..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11073 zcmcIqU2hv#dY&(m!w=E2?D!+eCetjoF%5-@on$wwO-WKA`J=@Xbbd1La+K8dQ%kWP5(fFLGRid1HI@)uYv;Y^PDprQjB8s zrj+K)IdjgO@ArM4_dRocZmy!?_aA@u55N5FWlj4xCdNM-k*m1k|3u(xEzQ?`qocQU zc{f@H?q;!r?VXb)O05#^g-)q!w`^UzuSG9fT2S7ph;?1#Ur_Oj zPxN2wpJ|ctspgk_yHoAfS~b*G_A7pM(`?NJ`a#{V9qO$U{#lBfqyBFIK{+-5K~{wCODM_m=- zp6EKeVW;B=FN_29xx!|954V@rZ^=5Ah3JX(X5}f?R$FQ4X>m7DcrQjrpX#U$Z&j0_@S@G&p%({fA>j*YMcz8Sw%6e! z5yVeRC_Vhq>fN8N-M@Bk`N5sAEqZZpBYALNO`Ef__Ta`q2u#Q)frv3B57s!vElhDd zeCxYkeCAu9t*$NK8JD=xixSc6tOm)0EGnB|3%9T&qAORT%~|5lz(u*Zfh)d^AkhwV zAK|ufXzXL>BW;ef#5yz%3WwO^iM6j|=by8*q==n=MeY2gw4d$zk*3OxbnH2OrC|#; zk)A+jqM)7J3pT?z5qs&v2Olnf=H9-0 zPUp2ZdT+-;yb-1-`5cTeUY3s0H%Kx|>bsvD%KF?+5`*~$m-g)l^e?~>*u$yEsD24y1%-1FDFbBqK4!}|M%HhP^PCma`&Z~6xeQz;j?nRD)^$Vlx_F3ra(WvZ*sab5 zYV*xNG_uv@t5>dEab(Hy9*2g;7SHuBCns-*g)u(oJ%&Mip>ZUqk10+rAg9?ue_U>^ z3zsfkZcIwOy6i!BipW__AeEl*9V)q3)m~$7minIXx>zNed76FlxE|#d$myFEIEX3zS@?@EQg2GSfxX zZfcK3yJdI!*9RMzvsNLJ70+z)a=v=+qk@ZArlEq<^OvXYrapIVUr7eQh3F1MD_br?MtstOV3T{=?=Q--1PQ3;pSG7i4XTKf9&E!2)|wT@zOWl!to_0Qj*DM zGL)60&$BYh8J<8(CX3%%C2!0YCu;;Coto?=wW>#Jzb983@C9j-u_#V&{n5Dxm>#1|94+)fv@r81)B9w*Q)Wec$L;hsNS-f?9s~ z{2i}Dz3}bMH5-Mr0{eOD z`kh4l07YiuX?}Lee~Cg0rcPCK%cw|dQq=3l@Qf1V*%v^M#ThnUBi6}WH?6p?vJ6}| zt-0=_f!E1$O0Mho+ODf~Q|Y6-fZyeN3YH7^Z+vj=p7=fX(_z3tiPsoR6poA$S|y=* z1Cf|knq4HGR_gZIHd6V|MC>ZA_#*_<)X9fJ0XedK%P-s!)L(w9&%FwATkM3Pd$ zZ~~#K`E$5ef~sHlPslPge;$hFB&h(Pk4%1eUD+v)G+!J(@@WSk`_0R*P8bw4&|@#` zcn@JV&8m(zH8_8~lOWx|71t0X(2Ue|8NnHTKW~?t5>}V@5c}0@C$eGH2bdbCR(c6c z8f7*GzT7HUFRJ;eDV4M7;MpJIirKEF4;S(ln%`n3EW(+U-TP}q5~%A$e`3V-1m+=l zh&j@?%^jonmxx=4TUoq-cp-}y5ie%(65^#S4hFMrXL0bl?Q#~cAYRGhRm7`VyoPu! zi_alGm&E}i+w~oqt1ul-q?Hgn7m^gUK@HL8w0?AQ(ke8n?`Ggvb^SOQC&1hj-}m-< z8@oZU10s*SNwUsdW<-PT!$72UW>2MU=5K){LqL!tV--H@hS4AiAS`&A#mju|dJi9p zw9Lmc+AtI_7kbcRVrJpMO5Na*>;4);ieE&aL1-IuvR2g&$K3ISw6u)XfjJ2K&S<`o>LH{9hBh!n%_n8xo65WFQM=de zU-=8xE}PPauS_P5`OSAFl*CsM85ft_t5K3|i7MU|lv**zU;#l|kS2dx`*;wDJsQul zFXANgia?$L6f{Q!=_D5t(s-~~|DPf$Rh(wdOB3;;G#N6r)0AD9)*FmV!Q>=C{7C-w z;ZJhl$!4FB=!ZZPZx0?C7Kauw3=DE^2Z}VJ-GE1&jTo5z zMIUPfjh|I(;8hp`-y%}%`B9Ryh7s^7Yj!a0Iy!li6Q%dSa$7H7l}$jqnR1tg=&OZId0l(wL(gCq|QLy&txBqGXF28A@B} z)h-+xTVe@2Ph4Sel>u#RWK%QCY?|!iJqCZk;3v$Ums*+Vo`FL~x>Acv&??BWwu)-3 zv#Po}8C(3fs4b?HYbT0QU)#D3t&PyE7{li#vNQEgt^<$o18QyTeW=+Tle>OJDI;Cn zL&kT=Yt_Zxhuy~+`bQKSqyAL8QzeeHd#rw;ll0{5)VRktE-3K-ls9S&pPvkNwhAny zXriciodMaNxWvF=a1%jVgX|??yBh#leQ}4+?=m2SiTf;J!#mv%M6xFvo>~*?Td8Oz zAJ|7qGG8068QZiMYGu1!dYE zk8+4B!ExFmpj&NXmP)gT&hIf(oV8Pxc7Ota+|$_*hh0!hK|!DKq|+%0KMnpR5aq(E zYW5N-XVisKgUN;=*dEzs=G@OMT^cH$!fiAdZGy;VQYdg1AS*%1v18w1qD3Y>Hk5Do?1+-y3p9BYfdGEobxYGVMhLC~Z! z!@KmWM9xELvWYNwjQN-PdWkxDXm&?)t`8aMhtii5P|a`o5LeBX}|P3!q6_PMEUTs6elWbZ-_&uIS># zvx1COliIyLN*19DX znY56fQskgxN{T1PPw72+$|ZP8qV<$Ks_}AKkOt^13p0_K7S*a@6y2P>Q* zx=ex1r%X~m37V!*4$>%lzz32P!m`Bf@Jcu03d$**9ptAZ7Ki&zh-j?_^OrwkYn zsiRP6IccFxDP4j{c3k&tEV;iGLZ45Qya{s1O4psPw*ykE>@q0NPA7IQJPvV|fOePQ z_JPubgsjW%DKAiifCQo`_3QDyT9gM+*Z``L^}M+Bp~1nfn!sjO>@&z{h+TY{DXz$r5=;I8jrq?}e+*97r+j0oI~or{2B&brJ>wz3rP znumJME}W>+a~Sv+7oBe4@qk)Z1s^`npE0w_#O`|SE%=BtCzYZkc^m#f9h9IMF~G?- ztaUPiO&q$&x?ll~7eMy@;zi8V#fu72Ya2#E+i0w4{bJ@B?+W;j`YV`u1Z|4lNcX!kfhW4B<_pKH_#Vw_OLqmnFiVkSRDa zGrT`}u;5qlepPaX@<=*0C8EQ^o6)PYSZH2gC+nzsBG?1887P z1PtilQLLeKcU8ILLq6JOFyRQBOl~n)WiUe&Bzcf*VTLG3BXx!?R1{kvQJ}Y9iVFCF z=&<4)1|KlXb~Dl-B0lRe=rWiAEeFqVsHVl25z+81LS0{wB*D-@6_B#^a|q8EAPgW1 zb!)x=5@Dzi#NpILV2@`Hl)f9dV$wExdB_=RleaE3WS5So3xbGyo!ujJYO~E9Ll?L- zvbp2Qieega(iCG6eY_x-_V^y)h!kD{@RjAf7e?kFm$hKfGW&SW!W{>Bz_^uHYGpiD zfsErDl>FjW-k6^G1ICSwNesV;c{Wek<-lSFlO>liNmfWDOt!)<+Ve1bn=pK>Ha&;@ zkzXHi(?O+SC@^I3jR6!}f$D5qhcQz;Fb<)FeB%s;c~Oftq8SU;ix4Y(-eU;n zK07G+g+pC@IWqfSB=!@!P0fSysE7l1tmy$h zK2$LnwS{-JN6vk$I@YQ*d;=d};RBz<@j%hC({gATkOyT>kyLnKY0{tR!Ph8PXQg9e zaQqos9<{V#Q5{}?qm$WEyv2tMeukh`rpsO)akk3$mfv@8-oJbAX6tMob#LEVTf4pN zF0b6Ybq(MAFk`hP8mxdjSDqZgxen0``wcra(M=rq^#%z(+QC6^tC$R755(eqwq_$& zT90W#4g{_|e)TiEt^|Q!a9v+QL^CX?MGGo%K|gKURF+hm42_y00i*Gva#(Rc3L-$O z9EV>tyS>L~m;+8tq!pO(FhhNzvB-?-)W?Xel8a*rY*<0rq&@=ghBYH0=2v`=s!q%^ z7%<>RWa{LhsQ9m%k~jI7A}!4bxfd0#9itvn`&~ufuW*;fR5UPWq?fX07{CPJgi*&p XIb4fhG?{j_XwKik-;d{iX4n50I^H@Q diff --git a/venv/lib/python3.7/site-packages/dateutil/tz/_common.py b/venv/lib/python3.7/site-packages/dateutil/tz/_common.py deleted file mode 100644 index e6ac118..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/tz/_common.py +++ /dev/null @@ -1,419 +0,0 @@ -from six import PY2 - -from functools import wraps - -from datetime import datetime, timedelta, tzinfo - - -ZERO = timedelta(0) - -__all__ = ['tzname_in_python2', 'enfold'] - - -def tzname_in_python2(namefunc): - """Change unicode output into bytestrings in Python 2 - - tzname() API changed in Python 3. It used to return bytes, but was changed - to unicode strings - """ - if PY2: - @wraps(namefunc) - def adjust_encoding(*args, **kwargs): - name = namefunc(*args, **kwargs) - if name is not None: - name = name.encode() - - return name - - return adjust_encoding - else: - return namefunc - - -# The following is adapted from Alexander Belopolsky's tz library -# https://github.com/abalkin/tz -if hasattr(datetime, 'fold'): - # This is the pre-python 3.6 fold situation - def enfold(dt, fold=1): - """ - Provides a unified interface for assigning the ``fold`` attribute to - datetimes both before and after the implementation of PEP-495. - - :param fold: - The value for the ``fold`` attribute in the returned datetime. This - should be either 0 or 1. - - :return: - Returns an object for which ``getattr(dt, 'fold', 0)`` returns - ``fold`` for all versions of Python. In versions prior to - Python 3.6, this is a ``_DatetimeWithFold`` object, which is a - subclass of :py:class:`datetime.datetime` with the ``fold`` - attribute added, if ``fold`` is 1. - - .. versionadded:: 2.6.0 - """ - return dt.replace(fold=fold) - -else: - class _DatetimeWithFold(datetime): - """ - This is a class designed to provide a PEP 495-compliant interface for - Python versions before 3.6. It is used only for dates in a fold, so - the ``fold`` attribute is fixed at ``1``. - - .. versionadded:: 2.6.0 - """ - __slots__ = () - - def replace(self, *args, **kwargs): - """ - Return a datetime with the same attributes, except for those - attributes given new values by whichever keyword arguments are - specified. Note that tzinfo=None can be specified to create a naive - datetime from an aware datetime with no conversion of date and time - data. - - This is reimplemented in ``_DatetimeWithFold`` because pypy3 will - return a ``datetime.datetime`` even if ``fold`` is unchanged. - """ - argnames = ( - 'year', 'month', 'day', 'hour', 'minute', 'second', - 'microsecond', 'tzinfo' - ) - - for arg, argname in zip(args, argnames): - if argname in kwargs: - raise TypeError('Duplicate argument: {}'.format(argname)) - - kwargs[argname] = arg - - for argname in argnames: - if argname not in kwargs: - kwargs[argname] = getattr(self, argname) - - dt_class = self.__class__ if kwargs.get('fold', 1) else datetime - - return dt_class(**kwargs) - - @property - def fold(self): - return 1 - - def enfold(dt, fold=1): - """ - Provides a unified interface for assigning the ``fold`` attribute to - datetimes both before and after the implementation of PEP-495. - - :param fold: - The value for the ``fold`` attribute in the returned datetime. This - should be either 0 or 1. - - :return: - Returns an object for which ``getattr(dt, 'fold', 0)`` returns - ``fold`` for all versions of Python. In versions prior to - Python 3.6, this is a ``_DatetimeWithFold`` object, which is a - subclass of :py:class:`datetime.datetime` with the ``fold`` - attribute added, if ``fold`` is 1. - - .. versionadded:: 2.6.0 - """ - if getattr(dt, 'fold', 0) == fold: - return dt - - args = dt.timetuple()[:6] - args += (dt.microsecond, dt.tzinfo) - - if fold: - return _DatetimeWithFold(*args) - else: - return datetime(*args) - - -def _validate_fromutc_inputs(f): - """ - The CPython version of ``fromutc`` checks that the input is a ``datetime`` - object and that ``self`` is attached as its ``tzinfo``. - """ - @wraps(f) - def fromutc(self, dt): - if not isinstance(dt, datetime): - raise TypeError("fromutc() requires a datetime argument") - if dt.tzinfo is not self: - raise ValueError("dt.tzinfo is not self") - - return f(self, dt) - - return fromutc - - -class _tzinfo(tzinfo): - """ - Base class for all ``dateutil`` ``tzinfo`` objects. - """ - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - - dt = dt.replace(tzinfo=self) - - wall_0 = enfold(dt, fold=0) - wall_1 = enfold(dt, fold=1) - - same_offset = wall_0.utcoffset() == wall_1.utcoffset() - same_dt = wall_0.replace(tzinfo=None) == wall_1.replace(tzinfo=None) - - return same_dt and not same_offset - - def _fold_status(self, dt_utc, dt_wall): - """ - Determine the fold status of a "wall" datetime, given a representation - of the same datetime as a (naive) UTC datetime. This is calculated based - on the assumption that ``dt.utcoffset() - dt.dst()`` is constant for all - datetimes, and that this offset is the actual number of hours separating - ``dt_utc`` and ``dt_wall``. - - :param dt_utc: - Representation of the datetime as UTC - - :param dt_wall: - Representation of the datetime as "wall time". This parameter must - either have a `fold` attribute or have a fold-naive - :class:`datetime.tzinfo` attached, otherwise the calculation may - fail. - """ - if self.is_ambiguous(dt_wall): - delta_wall = dt_wall - dt_utc - _fold = int(delta_wall == (dt_utc.utcoffset() - dt_utc.dst())) - else: - _fold = 0 - - return _fold - - def _fold(self, dt): - return getattr(dt, 'fold', 0) - - def _fromutc(self, dt): - """ - Given a timezone-aware datetime in a given timezone, calculates a - timezone-aware datetime in a new timezone. - - Since this is the one time that we *know* we have an unambiguous - datetime object, we take this opportunity to determine whether the - datetime is ambiguous and in a "fold" state (e.g. if it's the first - occurrence, chronologically, of the ambiguous datetime). - - :param dt: - A timezone-aware :class:`datetime.datetime` object. - """ - - # Re-implement the algorithm from Python's datetime.py - dtoff = dt.utcoffset() - if dtoff is None: - raise ValueError("fromutc() requires a non-None utcoffset() " - "result") - - # The original datetime.py code assumes that `dst()` defaults to - # zero during ambiguous times. PEP 495 inverts this presumption, so - # for pre-PEP 495 versions of python, we need to tweak the algorithm. - dtdst = dt.dst() - if dtdst is None: - raise ValueError("fromutc() requires a non-None dst() result") - delta = dtoff - dtdst - - dt += delta - # Set fold=1 so we can default to being in the fold for - # ambiguous dates. - dtdst = enfold(dt, fold=1).dst() - if dtdst is None: - raise ValueError("fromutc(): dt.dst gave inconsistent " - "results; cannot convert") - return dt + dtdst - - @_validate_fromutc_inputs - def fromutc(self, dt): - """ - Given a timezone-aware datetime in a given timezone, calculates a - timezone-aware datetime in a new timezone. - - Since this is the one time that we *know* we have an unambiguous - datetime object, we take this opportunity to determine whether the - datetime is ambiguous and in a "fold" state (e.g. if it's the first - occurrence, chronologically, of the ambiguous datetime). - - :param dt: - A timezone-aware :class:`datetime.datetime` object. - """ - dt_wall = self._fromutc(dt) - - # Calculate the fold status given the two datetimes. - _fold = self._fold_status(dt, dt_wall) - - # Set the default fold value for ambiguous dates - return enfold(dt_wall, fold=_fold) - - -class tzrangebase(_tzinfo): - """ - This is an abstract base class for time zones represented by an annual - transition into and out of DST. Child classes should implement the following - methods: - - * ``__init__(self, *args, **kwargs)`` - * ``transitions(self, year)`` - this is expected to return a tuple of - datetimes representing the DST on and off transitions in standard - time. - - A fully initialized ``tzrangebase`` subclass should also provide the - following attributes: - * ``hasdst``: Boolean whether or not the zone uses DST. - * ``_dst_offset`` / ``_std_offset``: :class:`datetime.timedelta` objects - representing the respective UTC offsets. - * ``_dst_abbr`` / ``_std_abbr``: Strings representing the timezone short - abbreviations in DST and STD, respectively. - * ``_hasdst``: Whether or not the zone has DST. - - .. versionadded:: 2.6.0 - """ - def __init__(self): - raise NotImplementedError('tzrangebase is an abstract base class') - - def utcoffset(self, dt): - isdst = self._isdst(dt) - - if isdst is None: - return None - elif isdst: - return self._dst_offset - else: - return self._std_offset - - def dst(self, dt): - isdst = self._isdst(dt) - - if isdst is None: - return None - elif isdst: - return self._dst_base_offset - else: - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - if self._isdst(dt): - return self._dst_abbr - else: - return self._std_abbr - - def fromutc(self, dt): - """ Given a datetime in UTC, return local time """ - if not isinstance(dt, datetime): - raise TypeError("fromutc() requires a datetime argument") - - if dt.tzinfo is not self: - raise ValueError("dt.tzinfo is not self") - - # Get transitions - if there are none, fixed offset - transitions = self.transitions(dt.year) - if transitions is None: - return dt + self.utcoffset(dt) - - # Get the transition times in UTC - dston, dstoff = transitions - - dston -= self._std_offset - dstoff -= self._std_offset - - utc_transitions = (dston, dstoff) - dt_utc = dt.replace(tzinfo=None) - - isdst = self._naive_isdst(dt_utc, utc_transitions) - - if isdst: - dt_wall = dt + self._dst_offset - else: - dt_wall = dt + self._std_offset - - _fold = int(not isdst and self.is_ambiguous(dt_wall)) - - return enfold(dt_wall, fold=_fold) - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - if not self.hasdst: - return False - - start, end = self.transitions(dt.year) - - dt = dt.replace(tzinfo=None) - return (end <= dt < end + self._dst_base_offset) - - def _isdst(self, dt): - if not self.hasdst: - return False - elif dt is None: - return None - - transitions = self.transitions(dt.year) - - if transitions is None: - return False - - dt = dt.replace(tzinfo=None) - - isdst = self._naive_isdst(dt, transitions) - - # Handle ambiguous dates - if not isdst and self.is_ambiguous(dt): - return not self._fold(dt) - else: - return isdst - - def _naive_isdst(self, dt, transitions): - dston, dstoff = transitions - - dt = dt.replace(tzinfo=None) - - if dston < dstoff: - isdst = dston <= dt < dstoff - else: - isdst = not dstoff <= dt < dston - - return isdst - - @property - def _dst_base_offset(self): - return self._dst_offset - self._std_offset - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s(...)" % self.__class__.__name__ - - __reduce__ = object.__reduce__ diff --git a/venv/lib/python3.7/site-packages/dateutil/tz/_factories.py b/venv/lib/python3.7/site-packages/dateutil/tz/_factories.py deleted file mode 100644 index f8a6589..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/tz/_factories.py +++ /dev/null @@ -1,80 +0,0 @@ -from datetime import timedelta -import weakref -from collections import OrderedDict - -from six.moves import _thread - - -class _TzSingleton(type): - def __init__(cls, *args, **kwargs): - cls.__instance = None - super(_TzSingleton, cls).__init__(*args, **kwargs) - - def __call__(cls): - if cls.__instance is None: - cls.__instance = super(_TzSingleton, cls).__call__() - return cls.__instance - - -class _TzFactory(type): - def instance(cls, *args, **kwargs): - """Alternate constructor that returns a fresh instance""" - return type.__call__(cls, *args, **kwargs) - - -class _TzOffsetFactory(_TzFactory): - def __init__(cls, *args, **kwargs): - cls.__instances = weakref.WeakValueDictionary() - cls.__strong_cache = OrderedDict() - cls.__strong_cache_size = 8 - - cls._cache_lock = _thread.allocate_lock() - - def __call__(cls, name, offset): - if isinstance(offset, timedelta): - key = (name, offset.total_seconds()) - else: - key = (name, offset) - - instance = cls.__instances.get(key, None) - if instance is None: - instance = cls.__instances.setdefault(key, - cls.instance(name, offset)) - - # This lock may not be necessary in Python 3. See GH issue #901 - with cls._cache_lock: - cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) - - # Remove an item if the strong cache is overpopulated - if len(cls.__strong_cache) > cls.__strong_cache_size: - cls.__strong_cache.popitem(last=False) - - return instance - - -class _TzStrFactory(_TzFactory): - def __init__(cls, *args, **kwargs): - cls.__instances = weakref.WeakValueDictionary() - cls.__strong_cache = OrderedDict() - cls.__strong_cache_size = 8 - - cls.__cache_lock = _thread.allocate_lock() - - def __call__(cls, s, posix_offset=False): - key = (s, posix_offset) - instance = cls.__instances.get(key, None) - - if instance is None: - instance = cls.__instances.setdefault(key, - cls.instance(s, posix_offset)) - - # This lock may not be necessary in Python 3. See GH issue #901 - with cls.__cache_lock: - cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) - - # Remove an item if the strong cache is overpopulated - if len(cls.__strong_cache) > cls.__strong_cache_size: - cls.__strong_cache.popitem(last=False) - - return instance - diff --git a/venv/lib/python3.7/site-packages/dateutil/tz/tz.py b/venv/lib/python3.7/site-packages/dateutil/tz/tz.py deleted file mode 100644 index af81e88..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/tz/tz.py +++ /dev/null @@ -1,1849 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers timezone implementations subclassing the abstract -:py:class:`datetime.tzinfo` type. There are classes to handle tzfile format -files (usually are in :file:`/etc/localtime`, :file:`/usr/share/zoneinfo`, -etc), TZ environment string (in all known formats), given ranges (with help -from relative deltas), local machine timezone, fixed offset timezone, and UTC -timezone. -""" -import datetime -import struct -import time -import sys -import os -import bisect -import weakref -from collections import OrderedDict - -import six -from six import string_types -from six.moves import _thread -from ._common import tzname_in_python2, _tzinfo -from ._common import tzrangebase, enfold -from ._common import _validate_fromutc_inputs - -from ._factories import _TzSingleton, _TzOffsetFactory -from ._factories import _TzStrFactory -try: - from .win import tzwin, tzwinlocal -except ImportError: - tzwin = tzwinlocal = None - -# For warning about rounding tzinfo -from warnings import warn - -ZERO = datetime.timedelta(0) -EPOCH = datetime.datetime.utcfromtimestamp(0) -EPOCHORDINAL = EPOCH.toordinal() - - -@six.add_metaclass(_TzSingleton) -class tzutc(datetime.tzinfo): - """ - This is a tzinfo object that represents the UTC time zone. - - **Examples:** - - .. doctest:: - - >>> from datetime import * - >>> from dateutil.tz import * - - >>> datetime.now() - datetime.datetime(2003, 9, 27, 9, 40, 1, 521290) - - >>> datetime.now(tzutc()) - datetime.datetime(2003, 9, 27, 12, 40, 12, 156379, tzinfo=tzutc()) - - >>> datetime.now(tzutc()).tzname() - 'UTC' - - .. versionchanged:: 2.7.0 - ``tzutc()`` is now a singleton, so the result of ``tzutc()`` will - always return the same object. - - .. doctest:: - - >>> from dateutil.tz import tzutc, UTC - >>> tzutc() is tzutc() - True - >>> tzutc() is UTC - True - """ - def utcoffset(self, dt): - return ZERO - - def dst(self, dt): - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return "UTC" - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - return False - - @_validate_fromutc_inputs - def fromutc(self, dt): - """ - Fast track version of fromutc() returns the original ``dt`` object for - any valid :py:class:`datetime.datetime` object. - """ - return dt - - def __eq__(self, other): - if not isinstance(other, (tzutc, tzoffset)): - return NotImplemented - - return (isinstance(other, tzutc) or - (isinstance(other, tzoffset) and other._offset == ZERO)) - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s()" % self.__class__.__name__ - - __reduce__ = object.__reduce__ - - -#: Convenience constant providing a :class:`tzutc()` instance -#: -#: .. versionadded:: 2.7.0 -UTC = tzutc() - - -@six.add_metaclass(_TzOffsetFactory) -class tzoffset(datetime.tzinfo): - """ - A simple class for representing a fixed offset from UTC. - - :param name: - The timezone name, to be returned when ``tzname()`` is called. - :param offset: - The time zone offset in seconds, or (since version 2.6.0, represented - as a :py:class:`datetime.timedelta` object). - """ - def __init__(self, name, offset): - self._name = name - - try: - # Allow a timedelta - offset = offset.total_seconds() - except (TypeError, AttributeError): - pass - - self._offset = datetime.timedelta(seconds=_get_supported_offset(offset)) - - def utcoffset(self, dt): - return self._offset - - def dst(self, dt): - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return self._name - - @_validate_fromutc_inputs - def fromutc(self, dt): - return dt + self._offset - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - return False - - def __eq__(self, other): - if not isinstance(other, tzoffset): - return NotImplemented - - return self._offset == other._offset - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s(%s, %s)" % (self.__class__.__name__, - repr(self._name), - int(self._offset.total_seconds())) - - __reduce__ = object.__reduce__ - - -class tzlocal(_tzinfo): - """ - A :class:`tzinfo` subclass built around the ``time`` timezone functions. - """ - def __init__(self): - super(tzlocal, self).__init__() - - self._std_offset = datetime.timedelta(seconds=-time.timezone) - if time.daylight: - self._dst_offset = datetime.timedelta(seconds=-time.altzone) - else: - self._dst_offset = self._std_offset - - self._dst_saved = self._dst_offset - self._std_offset - self._hasdst = bool(self._dst_saved) - self._tznames = tuple(time.tzname) - - def utcoffset(self, dt): - if dt is None and self._hasdst: - return None - - if self._isdst(dt): - return self._dst_offset - else: - return self._std_offset - - def dst(self, dt): - if dt is None and self._hasdst: - return None - - if self._isdst(dt): - return self._dst_offset - self._std_offset - else: - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return self._tznames[self._isdst(dt)] - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - naive_dst = self._naive_is_dst(dt) - return (not naive_dst and - (naive_dst != self._naive_is_dst(dt - self._dst_saved))) - - def _naive_is_dst(self, dt): - timestamp = _datetime_to_timestamp(dt) - return time.localtime(timestamp + time.timezone).tm_isdst - - def _isdst(self, dt, fold_naive=True): - # We can't use mktime here. It is unstable when deciding if - # the hour near to a change is DST or not. - # - # timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour, - # dt.minute, dt.second, dt.weekday(), 0, -1)) - # return time.localtime(timestamp).tm_isdst - # - # The code above yields the following result: - # - # >>> import tz, datetime - # >>> t = tz.tzlocal() - # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - # 'BRDT' - # >>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname() - # 'BRST' - # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - # 'BRST' - # >>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname() - # 'BRDT' - # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - # 'BRDT' - # - # Here is a more stable implementation: - # - if not self._hasdst: - return False - - # Check for ambiguous times: - dstval = self._naive_is_dst(dt) - fold = getattr(dt, 'fold', None) - - if self.is_ambiguous(dt): - if fold is not None: - return not self._fold(dt) - else: - return True - - return dstval - - def __eq__(self, other): - if isinstance(other, tzlocal): - return (self._std_offset == other._std_offset and - self._dst_offset == other._dst_offset) - elif isinstance(other, tzutc): - return (not self._hasdst and - self._tznames[0] in {'UTC', 'GMT'} and - self._std_offset == ZERO) - elif isinstance(other, tzoffset): - return (not self._hasdst and - self._tznames[0] == other._name and - self._std_offset == other._offset) - else: - return NotImplemented - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s()" % self.__class__.__name__ - - __reduce__ = object.__reduce__ - - -class _ttinfo(object): - __slots__ = ["offset", "delta", "isdst", "abbr", - "isstd", "isgmt", "dstoffset"] - - def __init__(self): - for attr in self.__slots__: - setattr(self, attr, None) - - def __repr__(self): - l = [] - for attr in self.__slots__: - value = getattr(self, attr) - if value is not None: - l.append("%s=%s" % (attr, repr(value))) - return "%s(%s)" % (self.__class__.__name__, ", ".join(l)) - - def __eq__(self, other): - if not isinstance(other, _ttinfo): - return NotImplemented - - return (self.offset == other.offset and - self.delta == other.delta and - self.isdst == other.isdst and - self.abbr == other.abbr and - self.isstd == other.isstd and - self.isgmt == other.isgmt and - self.dstoffset == other.dstoffset) - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __getstate__(self): - state = {} - for name in self.__slots__: - state[name] = getattr(self, name, None) - return state - - def __setstate__(self, state): - for name in self.__slots__: - if name in state: - setattr(self, name, state[name]) - - -class _tzfile(object): - """ - Lightweight class for holding the relevant transition and time zone - information read from binary tzfiles. - """ - attrs = ['trans_list', 'trans_list_utc', 'trans_idx', 'ttinfo_list', - 'ttinfo_std', 'ttinfo_dst', 'ttinfo_before', 'ttinfo_first'] - - def __init__(self, **kwargs): - for attr in self.attrs: - setattr(self, attr, kwargs.get(attr, None)) - - -class tzfile(_tzinfo): - """ - This is a ``tzinfo`` subclass that allows one to use the ``tzfile(5)`` - format timezone files to extract current and historical zone information. - - :param fileobj: - This can be an opened file stream or a file name that the time zone - information can be read from. - - :param filename: - This is an optional parameter specifying the source of the time zone - information in the event that ``fileobj`` is a file object. If omitted - and ``fileobj`` is a file stream, this parameter will be set either to - ``fileobj``'s ``name`` attribute or to ``repr(fileobj)``. - - See `Sources for Time Zone and Daylight Saving Time Data - `_ for more information. - Time zone files can be compiled from the `IANA Time Zone database files - `_ with the `zic time zone compiler - `_ - - .. note:: - - Only construct a ``tzfile`` directly if you have a specific timezone - file on disk that you want to read into a Python ``tzinfo`` object. - If you want to get a ``tzfile`` representing a specific IANA zone, - (e.g. ``'America/New_York'``), you should call - :func:`dateutil.tz.gettz` with the zone identifier. - - - **Examples:** - - Using the US Eastern time zone as an example, we can see that a ``tzfile`` - provides time zone information for the standard Daylight Saving offsets: - - .. testsetup:: tzfile - - from dateutil.tz import gettz - from datetime import datetime - - .. doctest:: tzfile - - >>> NYC = gettz('America/New_York') - >>> NYC - tzfile('/usr/share/zoneinfo/America/New_York') - - >>> print(datetime(2016, 1, 3, tzinfo=NYC)) # EST - 2016-01-03 00:00:00-05:00 - - >>> print(datetime(2016, 7, 7, tzinfo=NYC)) # EDT - 2016-07-07 00:00:00-04:00 - - - The ``tzfile`` structure contains a fully history of the time zone, - so historical dates will also have the right offsets. For example, before - the adoption of the UTC standards, New York used local solar mean time: - - .. doctest:: tzfile - - >>> print(datetime(1901, 4, 12, tzinfo=NYC)) # LMT - 1901-04-12 00:00:00-04:56 - - And during World War II, New York was on "Eastern War Time", which was a - state of permanent daylight saving time: - - .. doctest:: tzfile - - >>> print(datetime(1944, 2, 7, tzinfo=NYC)) # EWT - 1944-02-07 00:00:00-04:00 - - """ - - def __init__(self, fileobj, filename=None): - super(tzfile, self).__init__() - - file_opened_here = False - if isinstance(fileobj, string_types): - self._filename = fileobj - fileobj = open(fileobj, 'rb') - file_opened_here = True - elif filename is not None: - self._filename = filename - elif hasattr(fileobj, "name"): - self._filename = fileobj.name - else: - self._filename = repr(fileobj) - - if fileobj is not None: - if not file_opened_here: - fileobj = _nullcontext(fileobj) - - with fileobj as file_stream: - tzobj = self._read_tzfile(file_stream) - - self._set_tzdata(tzobj) - - def _set_tzdata(self, tzobj): - """ Set the time zone data of this object from a _tzfile object """ - # Copy the relevant attributes over as private attributes - for attr in _tzfile.attrs: - setattr(self, '_' + attr, getattr(tzobj, attr)) - - def _read_tzfile(self, fileobj): - out = _tzfile() - - # From tzfile(5): - # - # The time zone information files used by tzset(3) - # begin with the magic characters "TZif" to identify - # them as time zone information files, followed by - # sixteen bytes reserved for future use, followed by - # six four-byte values of type long, written in a - # ``standard'' byte order (the high-order byte - # of the value is written first). - if fileobj.read(4).decode() != "TZif": - raise ValueError("magic not found") - - fileobj.read(16) - - ( - # The number of UTC/local indicators stored in the file. - ttisgmtcnt, - - # The number of standard/wall indicators stored in the file. - ttisstdcnt, - - # The number of leap seconds for which data is - # stored in the file. - leapcnt, - - # The number of "transition times" for which data - # is stored in the file. - timecnt, - - # The number of "local time types" for which data - # is stored in the file (must not be zero). - typecnt, - - # The number of characters of "time zone - # abbreviation strings" stored in the file. - charcnt, - - ) = struct.unpack(">6l", fileobj.read(24)) - - # The above header is followed by tzh_timecnt four-byte - # values of type long, sorted in ascending order. - # These values are written in ``standard'' byte order. - # Each is used as a transition time (as returned by - # time(2)) at which the rules for computing local time - # change. - - if timecnt: - out.trans_list_utc = list(struct.unpack(">%dl" % timecnt, - fileobj.read(timecnt*4))) - else: - out.trans_list_utc = [] - - # Next come tzh_timecnt one-byte values of type unsigned - # char; each one tells which of the different types of - # ``local time'' types described in the file is associated - # with the same-indexed transition time. These values - # serve as indices into an array of ttinfo structures that - # appears next in the file. - - if timecnt: - out.trans_idx = struct.unpack(">%dB" % timecnt, - fileobj.read(timecnt)) - else: - out.trans_idx = [] - - # Each ttinfo structure is written as a four-byte value - # for tt_gmtoff of type long, in a standard byte - # order, followed by a one-byte value for tt_isdst - # and a one-byte value for tt_abbrind. In each - # structure, tt_gmtoff gives the number of - # seconds to be added to UTC, tt_isdst tells whether - # tm_isdst should be set by localtime(3), and - # tt_abbrind serves as an index into the array of - # time zone abbreviation characters that follow the - # ttinfo structure(s) in the file. - - ttinfo = [] - - for i in range(typecnt): - ttinfo.append(struct.unpack(">lbb", fileobj.read(6))) - - abbr = fileobj.read(charcnt).decode() - - # Then there are tzh_leapcnt pairs of four-byte - # values, written in standard byte order; the - # first value of each pair gives the time (as - # returned by time(2)) at which a leap second - # occurs; the second gives the total number of - # leap seconds to be applied after the given time. - # The pairs of values are sorted in ascending order - # by time. - - # Not used, for now (but seek for correct file position) - if leapcnt: - fileobj.seek(leapcnt * 8, os.SEEK_CUR) - - # Then there are tzh_ttisstdcnt standard/wall - # indicators, each stored as a one-byte value; - # they tell whether the transition times associated - # with local time types were specified as standard - # time or wall clock time, and are used when - # a time zone file is used in handling POSIX-style - # time zone environment variables. - - if ttisstdcnt: - isstd = struct.unpack(">%db" % ttisstdcnt, - fileobj.read(ttisstdcnt)) - - # Finally, there are tzh_ttisgmtcnt UTC/local - # indicators, each stored as a one-byte value; - # they tell whether the transition times associated - # with local time types were specified as UTC or - # local time, and are used when a time zone file - # is used in handling POSIX-style time zone envi- - # ronment variables. - - if ttisgmtcnt: - isgmt = struct.unpack(">%db" % ttisgmtcnt, - fileobj.read(ttisgmtcnt)) - - # Build ttinfo list - out.ttinfo_list = [] - for i in range(typecnt): - gmtoff, isdst, abbrind = ttinfo[i] - gmtoff = _get_supported_offset(gmtoff) - tti = _ttinfo() - tti.offset = gmtoff - tti.dstoffset = datetime.timedelta(0) - tti.delta = datetime.timedelta(seconds=gmtoff) - tti.isdst = isdst - tti.abbr = abbr[abbrind:abbr.find('\x00', abbrind)] - tti.isstd = (ttisstdcnt > i and isstd[i] != 0) - tti.isgmt = (ttisgmtcnt > i and isgmt[i] != 0) - out.ttinfo_list.append(tti) - - # Replace ttinfo indexes for ttinfo objects. - out.trans_idx = [out.ttinfo_list[idx] for idx in out.trans_idx] - - # Set standard, dst, and before ttinfos. before will be - # used when a given time is before any transitions, - # and will be set to the first non-dst ttinfo, or to - # the first dst, if all of them are dst. - out.ttinfo_std = None - out.ttinfo_dst = None - out.ttinfo_before = None - if out.ttinfo_list: - if not out.trans_list_utc: - out.ttinfo_std = out.ttinfo_first = out.ttinfo_list[0] - else: - for i in range(timecnt-1, -1, -1): - tti = out.trans_idx[i] - if not out.ttinfo_std and not tti.isdst: - out.ttinfo_std = tti - elif not out.ttinfo_dst and tti.isdst: - out.ttinfo_dst = tti - - if out.ttinfo_std and out.ttinfo_dst: - break - else: - if out.ttinfo_dst and not out.ttinfo_std: - out.ttinfo_std = out.ttinfo_dst - - for tti in out.ttinfo_list: - if not tti.isdst: - out.ttinfo_before = tti - break - else: - out.ttinfo_before = out.ttinfo_list[0] - - # Now fix transition times to become relative to wall time. - # - # I'm not sure about this. In my tests, the tz source file - # is setup to wall time, and in the binary file isstd and - # isgmt are off, so it should be in wall time. OTOH, it's - # always in gmt time. Let me know if you have comments - # about this. - lastdst = None - lastoffset = None - lastdstoffset = None - lastbaseoffset = None - out.trans_list = [] - - for i, tti in enumerate(out.trans_idx): - offset = tti.offset - dstoffset = 0 - - if lastdst is not None: - if tti.isdst: - if not lastdst: - dstoffset = offset - lastoffset - - if not dstoffset and lastdstoffset: - dstoffset = lastdstoffset - - tti.dstoffset = datetime.timedelta(seconds=dstoffset) - lastdstoffset = dstoffset - - # If a time zone changes its base offset during a DST transition, - # then you need to adjust by the previous base offset to get the - # transition time in local time. Otherwise you use the current - # base offset. Ideally, I would have some mathematical proof of - # why this is true, but I haven't really thought about it enough. - baseoffset = offset - dstoffset - adjustment = baseoffset - if (lastbaseoffset is not None and baseoffset != lastbaseoffset - and tti.isdst != lastdst): - # The base DST has changed - adjustment = lastbaseoffset - - lastdst = tti.isdst - lastoffset = offset - lastbaseoffset = baseoffset - - out.trans_list.append(out.trans_list_utc[i] + adjustment) - - out.trans_idx = tuple(out.trans_idx) - out.trans_list = tuple(out.trans_list) - out.trans_list_utc = tuple(out.trans_list_utc) - - return out - - def _find_last_transition(self, dt, in_utc=False): - # If there's no list, there are no transitions to find - if not self._trans_list: - return None - - timestamp = _datetime_to_timestamp(dt) - - # Find where the timestamp fits in the transition list - if the - # timestamp is a transition time, it's part of the "after" period. - trans_list = self._trans_list_utc if in_utc else self._trans_list - idx = bisect.bisect_right(trans_list, timestamp) - - # We want to know when the previous transition was, so subtract off 1 - return idx - 1 - - def _get_ttinfo(self, idx): - # For no list or after the last transition, default to _ttinfo_std - if idx is None or (idx + 1) >= len(self._trans_list): - return self._ttinfo_std - - # If there is a list and the time is before it, return _ttinfo_before - if idx < 0: - return self._ttinfo_before - - return self._trans_idx[idx] - - def _find_ttinfo(self, dt): - idx = self._resolve_ambiguous_time(dt) - - return self._get_ttinfo(idx) - - def fromutc(self, dt): - """ - The ``tzfile`` implementation of :py:func:`datetime.tzinfo.fromutc`. - - :param dt: - A :py:class:`datetime.datetime` object. - - :raises TypeError: - Raised if ``dt`` is not a :py:class:`datetime.datetime` object. - - :raises ValueError: - Raised if this is called with a ``dt`` which does not have this - ``tzinfo`` attached. - - :return: - Returns a :py:class:`datetime.datetime` object representing the - wall time in ``self``'s time zone. - """ - # These isinstance checks are in datetime.tzinfo, so we'll preserve - # them, even if we don't care about duck typing. - if not isinstance(dt, datetime.datetime): - raise TypeError("fromutc() requires a datetime argument") - - if dt.tzinfo is not self: - raise ValueError("dt.tzinfo is not self") - - # First treat UTC as wall time and get the transition we're in. - idx = self._find_last_transition(dt, in_utc=True) - tti = self._get_ttinfo(idx) - - dt_out = dt + datetime.timedelta(seconds=tti.offset) - - fold = self.is_ambiguous(dt_out, idx=idx) - - return enfold(dt_out, fold=int(fold)) - - def is_ambiguous(self, dt, idx=None): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - if idx is None: - idx = self._find_last_transition(dt) - - # Calculate the difference in offsets from current to previous - timestamp = _datetime_to_timestamp(dt) - tti = self._get_ttinfo(idx) - - if idx is None or idx <= 0: - return False - - od = self._get_ttinfo(idx - 1).offset - tti.offset - tt = self._trans_list[idx] # Transition time - - return timestamp < tt + od - - def _resolve_ambiguous_time(self, dt): - idx = self._find_last_transition(dt) - - # If we have no transitions, return the index - _fold = self._fold(dt) - if idx is None or idx == 0: - return idx - - # If it's ambiguous and we're in a fold, shift to a different index. - idx_offset = int(not _fold and self.is_ambiguous(dt, idx)) - - return idx - idx_offset - - def utcoffset(self, dt): - if dt is None: - return None - - if not self._ttinfo_std: - return ZERO - - return self._find_ttinfo(dt).delta - - def dst(self, dt): - if dt is None: - return None - - if not self._ttinfo_dst: - return ZERO - - tti = self._find_ttinfo(dt) - - if not tti.isdst: - return ZERO - - # The documentation says that utcoffset()-dst() must - # be constant for every dt. - return tti.dstoffset - - @tzname_in_python2 - def tzname(self, dt): - if not self._ttinfo_std or dt is None: - return None - return self._find_ttinfo(dt).abbr - - def __eq__(self, other): - if not isinstance(other, tzfile): - return NotImplemented - return (self._trans_list == other._trans_list and - self._trans_idx == other._trans_idx and - self._ttinfo_list == other._ttinfo_list) - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self._filename)) - - def __reduce__(self): - return self.__reduce_ex__(None) - - def __reduce_ex__(self, protocol): - return (self.__class__, (None, self._filename), self.__dict__) - - -class tzrange(tzrangebase): - """ - The ``tzrange`` object is a time zone specified by a set of offsets and - abbreviations, equivalent to the way the ``TZ`` variable can be specified - in POSIX-like systems, but using Python delta objects to specify DST - start, end and offsets. - - :param stdabbr: - The abbreviation for standard time (e.g. ``'EST'``). - - :param stdoffset: - An integer or :class:`datetime.timedelta` object or equivalent - specifying the base offset from UTC. - - If unspecified, +00:00 is used. - - :param dstabbr: - The abbreviation for DST / "Summer" time (e.g. ``'EDT'``). - - If specified, with no other DST information, DST is assumed to occur - and the default behavior or ``dstoffset``, ``start`` and ``end`` is - used. If unspecified and no other DST information is specified, it - is assumed that this zone has no DST. - - If this is unspecified and other DST information is *is* specified, - DST occurs in the zone but the time zone abbreviation is left - unchanged. - - :param dstoffset: - A an integer or :class:`datetime.timedelta` object or equivalent - specifying the UTC offset during DST. If unspecified and any other DST - information is specified, it is assumed to be the STD offset +1 hour. - - :param start: - A :class:`relativedelta.relativedelta` object or equivalent specifying - the time and time of year that daylight savings time starts. To - specify, for example, that DST starts at 2AM on the 2nd Sunday in - March, pass: - - ``relativedelta(hours=2, month=3, day=1, weekday=SU(+2))`` - - If unspecified and any other DST information is specified, the default - value is 2 AM on the first Sunday in April. - - :param end: - A :class:`relativedelta.relativedelta` object or equivalent - representing the time and time of year that daylight savings time - ends, with the same specification method as in ``start``. One note is - that this should point to the first time in the *standard* zone, so if - a transition occurs at 2AM in the DST zone and the clocks are set back - 1 hour to 1AM, set the ``hours`` parameter to +1. - - - **Examples:** - - .. testsetup:: tzrange - - from dateutil.tz import tzrange, tzstr - - .. doctest:: tzrange - - >>> tzstr('EST5EDT') == tzrange("EST", -18000, "EDT") - True - - >>> from dateutil.relativedelta import * - >>> range1 = tzrange("EST", -18000, "EDT") - >>> range2 = tzrange("EST", -18000, "EDT", -14400, - ... relativedelta(hours=+2, month=4, day=1, - ... weekday=SU(+1)), - ... relativedelta(hours=+1, month=10, day=31, - ... weekday=SU(-1))) - >>> tzstr('EST5EDT') == range1 == range2 - True - - """ - def __init__(self, stdabbr, stdoffset=None, - dstabbr=None, dstoffset=None, - start=None, end=None): - - global relativedelta - from dateutil import relativedelta - - self._std_abbr = stdabbr - self._dst_abbr = dstabbr - - try: - stdoffset = stdoffset.total_seconds() - except (TypeError, AttributeError): - pass - - try: - dstoffset = dstoffset.total_seconds() - except (TypeError, AttributeError): - pass - - if stdoffset is not None: - self._std_offset = datetime.timedelta(seconds=stdoffset) - else: - self._std_offset = ZERO - - if dstoffset is not None: - self._dst_offset = datetime.timedelta(seconds=dstoffset) - elif dstabbr and stdoffset is not None: - self._dst_offset = self._std_offset + datetime.timedelta(hours=+1) - else: - self._dst_offset = ZERO - - if dstabbr and start is None: - self._start_delta = relativedelta.relativedelta( - hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) - else: - self._start_delta = start - - if dstabbr and end is None: - self._end_delta = relativedelta.relativedelta( - hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) - else: - self._end_delta = end - - self._dst_base_offset_ = self._dst_offset - self._std_offset - self.hasdst = bool(self._start_delta) - - def transitions(self, year): - """ - For a given year, get the DST on and off transition times, expressed - always on the standard time side. For zones with no transitions, this - function returns ``None``. - - :param year: - The year whose transitions you would like to query. - - :return: - Returns a :class:`tuple` of :class:`datetime.datetime` objects, - ``(dston, dstoff)`` for zones with an annual DST transition, or - ``None`` for fixed offset zones. - """ - if not self.hasdst: - return None - - base_year = datetime.datetime(year, 1, 1) - - start = base_year + self._start_delta - end = base_year + self._end_delta - - return (start, end) - - def __eq__(self, other): - if not isinstance(other, tzrange): - return NotImplemented - - return (self._std_abbr == other._std_abbr and - self._dst_abbr == other._dst_abbr and - self._std_offset == other._std_offset and - self._dst_offset == other._dst_offset and - self._start_delta == other._start_delta and - self._end_delta == other._end_delta) - - @property - def _dst_base_offset(self): - return self._dst_base_offset_ - - -@six.add_metaclass(_TzStrFactory) -class tzstr(tzrange): - """ - ``tzstr`` objects are time zone objects specified by a time-zone string as - it would be passed to a ``TZ`` variable on POSIX-style systems (see - the `GNU C Library: TZ Variable`_ for more details). - - There is one notable exception, which is that POSIX-style time zones use an - inverted offset format, so normally ``GMT+3`` would be parsed as an offset - 3 hours *behind* GMT. The ``tzstr`` time zone object will parse this as an - offset 3 hours *ahead* of GMT. If you would like to maintain the POSIX - behavior, pass a ``True`` value to ``posix_offset``. - - The :class:`tzrange` object provides the same functionality, but is - specified using :class:`relativedelta.relativedelta` objects. rather than - strings. - - :param s: - A time zone string in ``TZ`` variable format. This can be a - :class:`bytes` (2.x: :class:`str`), :class:`str` (2.x: - :class:`unicode`) or a stream emitting unicode characters - (e.g. :class:`StringIO`). - - :param posix_offset: - Optional. If set to ``True``, interpret strings such as ``GMT+3`` or - ``UTC+3`` as being 3 hours *behind* UTC rather than ahead, per the - POSIX standard. - - .. caution:: - - Prior to version 2.7.0, this function also supported time zones - in the format: - - * ``EST5EDT,4,0,6,7200,10,0,26,7200,3600`` - * ``EST5EDT,4,1,0,7200,10,-1,0,7200,3600`` - - This format is non-standard and has been deprecated; this function - will raise a :class:`DeprecatedTZFormatWarning` until - support is removed in a future version. - - .. _`GNU C Library: TZ Variable`: - https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html - """ - def __init__(self, s, posix_offset=False): - global parser - from dateutil.parser import _parser as parser - - self._s = s - - res = parser._parsetz(s) - if res is None or res.any_unused_tokens: - raise ValueError("unknown string format") - - # Here we break the compatibility with the TZ variable handling. - # GMT-3 actually *means* the timezone -3. - if res.stdabbr in ("GMT", "UTC") and not posix_offset: - res.stdoffset *= -1 - - # We must initialize it first, since _delta() needs - # _std_offset and _dst_offset set. Use False in start/end - # to avoid building it two times. - tzrange.__init__(self, res.stdabbr, res.stdoffset, - res.dstabbr, res.dstoffset, - start=False, end=False) - - if not res.dstabbr: - self._start_delta = None - self._end_delta = None - else: - self._start_delta = self._delta(res.start) - if self._start_delta: - self._end_delta = self._delta(res.end, isend=1) - - self.hasdst = bool(self._start_delta) - - def _delta(self, x, isend=0): - from dateutil import relativedelta - kwargs = {} - if x.month is not None: - kwargs["month"] = x.month - if x.weekday is not None: - kwargs["weekday"] = relativedelta.weekday(x.weekday, x.week) - if x.week > 0: - kwargs["day"] = 1 - else: - kwargs["day"] = 31 - elif x.day: - kwargs["day"] = x.day - elif x.yday is not None: - kwargs["yearday"] = x.yday - elif x.jyday is not None: - kwargs["nlyearday"] = x.jyday - if not kwargs: - # Default is to start on first sunday of april, and end - # on last sunday of october. - if not isend: - kwargs["month"] = 4 - kwargs["day"] = 1 - kwargs["weekday"] = relativedelta.SU(+1) - else: - kwargs["month"] = 10 - kwargs["day"] = 31 - kwargs["weekday"] = relativedelta.SU(-1) - if x.time is not None: - kwargs["seconds"] = x.time - else: - # Default is 2AM. - kwargs["seconds"] = 7200 - if isend: - # Convert to standard time, to follow the documented way - # of working with the extra hour. See the documentation - # of the tzinfo class. - delta = self._dst_offset - self._std_offset - kwargs["seconds"] -= delta.seconds + delta.days * 86400 - return relativedelta.relativedelta(**kwargs) - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self._s)) - - -class _tzicalvtzcomp(object): - def __init__(self, tzoffsetfrom, tzoffsetto, isdst, - tzname=None, rrule=None): - self.tzoffsetfrom = datetime.timedelta(seconds=tzoffsetfrom) - self.tzoffsetto = datetime.timedelta(seconds=tzoffsetto) - self.tzoffsetdiff = self.tzoffsetto - self.tzoffsetfrom - self.isdst = isdst - self.tzname = tzname - self.rrule = rrule - - -class _tzicalvtz(_tzinfo): - def __init__(self, tzid, comps=[]): - super(_tzicalvtz, self).__init__() - - self._tzid = tzid - self._comps = comps - self._cachedate = [] - self._cachecomp = [] - self._cache_lock = _thread.allocate_lock() - - def _find_comp(self, dt): - if len(self._comps) == 1: - return self._comps[0] - - dt = dt.replace(tzinfo=None) - - try: - with self._cache_lock: - return self._cachecomp[self._cachedate.index( - (dt, self._fold(dt)))] - except ValueError: - pass - - lastcompdt = None - lastcomp = None - - for comp in self._comps: - compdt = self._find_compdt(comp, dt) - - if compdt and (not lastcompdt or lastcompdt < compdt): - lastcompdt = compdt - lastcomp = comp - - if not lastcomp: - # RFC says nothing about what to do when a given - # time is before the first onset date. We'll look for the - # first standard component, or the first component, if - # none is found. - for comp in self._comps: - if not comp.isdst: - lastcomp = comp - break - else: - lastcomp = comp[0] - - with self._cache_lock: - self._cachedate.insert(0, (dt, self._fold(dt))) - self._cachecomp.insert(0, lastcomp) - - if len(self._cachedate) > 10: - self._cachedate.pop() - self._cachecomp.pop() - - return lastcomp - - def _find_compdt(self, comp, dt): - if comp.tzoffsetdiff < ZERO and self._fold(dt): - dt -= comp.tzoffsetdiff - - compdt = comp.rrule.before(dt, inc=True) - - return compdt - - def utcoffset(self, dt): - if dt is None: - return None - - return self._find_comp(dt).tzoffsetto - - def dst(self, dt): - comp = self._find_comp(dt) - if comp.isdst: - return comp.tzoffsetdiff - else: - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return self._find_comp(dt).tzname - - def __repr__(self): - return "" % repr(self._tzid) - - __reduce__ = object.__reduce__ - - -class tzical(object): - """ - This object is designed to parse an iCalendar-style ``VTIMEZONE`` structure - as set out in `RFC 5545`_ Section 4.6.5 into one or more `tzinfo` objects. - - :param `fileobj`: - A file or stream in iCalendar format, which should be UTF-8 encoded - with CRLF endings. - - .. _`RFC 5545`: https://tools.ietf.org/html/rfc5545 - """ - def __init__(self, fileobj): - global rrule - from dateutil import rrule - - if isinstance(fileobj, string_types): - self._s = fileobj - # ical should be encoded in UTF-8 with CRLF - fileobj = open(fileobj, 'r') - else: - self._s = getattr(fileobj, 'name', repr(fileobj)) - fileobj = _nullcontext(fileobj) - - self._vtz = {} - - with fileobj as fobj: - self._parse_rfc(fobj.read()) - - def keys(self): - """ - Retrieves the available time zones as a list. - """ - return list(self._vtz.keys()) - - def get(self, tzid=None): - """ - Retrieve a :py:class:`datetime.tzinfo` object by its ``tzid``. - - :param tzid: - If there is exactly one time zone available, omitting ``tzid`` - or passing :py:const:`None` value returns it. Otherwise a valid - key (which can be retrieved from :func:`keys`) is required. - - :raises ValueError: - Raised if ``tzid`` is not specified but there are either more - or fewer than 1 zone defined. - - :returns: - Returns either a :py:class:`datetime.tzinfo` object representing - the relevant time zone or :py:const:`None` if the ``tzid`` was - not found. - """ - if tzid is None: - if len(self._vtz) == 0: - raise ValueError("no timezones defined") - elif len(self._vtz) > 1: - raise ValueError("more than one timezone available") - tzid = next(iter(self._vtz)) - - return self._vtz.get(tzid) - - def _parse_offset(self, s): - s = s.strip() - if not s: - raise ValueError("empty offset") - if s[0] in ('+', '-'): - signal = (-1, +1)[s[0] == '+'] - s = s[1:] - else: - signal = +1 - if len(s) == 4: - return (int(s[:2]) * 3600 + int(s[2:]) * 60) * signal - elif len(s) == 6: - return (int(s[:2]) * 3600 + int(s[2:4]) * 60 + int(s[4:])) * signal - else: - raise ValueError("invalid offset: " + s) - - def _parse_rfc(self, s): - lines = s.splitlines() - if not lines: - raise ValueError("empty string") - - # Unfold - i = 0 - while i < len(lines): - line = lines[i].rstrip() - if not line: - del lines[i] - elif i > 0 and line[0] == " ": - lines[i-1] += line[1:] - del lines[i] - else: - i += 1 - - tzid = None - comps = [] - invtz = False - comptype = None - for line in lines: - if not line: - continue - name, value = line.split(':', 1) - parms = name.split(';') - if not parms: - raise ValueError("empty property name") - name = parms[0].upper() - parms = parms[1:] - if invtz: - if name == "BEGIN": - if value in ("STANDARD", "DAYLIGHT"): - # Process component - pass - else: - raise ValueError("unknown component: "+value) - comptype = value - founddtstart = False - tzoffsetfrom = None - tzoffsetto = None - rrulelines = [] - tzname = None - elif name == "END": - if value == "VTIMEZONE": - if comptype: - raise ValueError("component not closed: "+comptype) - if not tzid: - raise ValueError("mandatory TZID not found") - if not comps: - raise ValueError( - "at least one component is needed") - # Process vtimezone - self._vtz[tzid] = _tzicalvtz(tzid, comps) - invtz = False - elif value == comptype: - if not founddtstart: - raise ValueError("mandatory DTSTART not found") - if tzoffsetfrom is None: - raise ValueError( - "mandatory TZOFFSETFROM not found") - if tzoffsetto is None: - raise ValueError( - "mandatory TZOFFSETFROM not found") - # Process component - rr = None - if rrulelines: - rr = rrule.rrulestr("\n".join(rrulelines), - compatible=True, - ignoretz=True, - cache=True) - comp = _tzicalvtzcomp(tzoffsetfrom, tzoffsetto, - (comptype == "DAYLIGHT"), - tzname, rr) - comps.append(comp) - comptype = None - else: - raise ValueError("invalid component end: "+value) - elif comptype: - if name == "DTSTART": - # DTSTART in VTIMEZONE takes a subset of valid RRULE - # values under RFC 5545. - for parm in parms: - if parm != 'VALUE=DATE-TIME': - msg = ('Unsupported DTSTART param in ' + - 'VTIMEZONE: ' + parm) - raise ValueError(msg) - rrulelines.append(line) - founddtstart = True - elif name in ("RRULE", "RDATE", "EXRULE", "EXDATE"): - rrulelines.append(line) - elif name == "TZOFFSETFROM": - if parms: - raise ValueError( - "unsupported %s parm: %s " % (name, parms[0])) - tzoffsetfrom = self._parse_offset(value) - elif name == "TZOFFSETTO": - if parms: - raise ValueError( - "unsupported TZOFFSETTO parm: "+parms[0]) - tzoffsetto = self._parse_offset(value) - elif name == "TZNAME": - if parms: - raise ValueError( - "unsupported TZNAME parm: "+parms[0]) - tzname = value - elif name == "COMMENT": - pass - else: - raise ValueError("unsupported property: "+name) - else: - if name == "TZID": - if parms: - raise ValueError( - "unsupported TZID parm: "+parms[0]) - tzid = value - elif name in ("TZURL", "LAST-MODIFIED", "COMMENT"): - pass - else: - raise ValueError("unsupported property: "+name) - elif name == "BEGIN" and value == "VTIMEZONE": - tzid = None - comps = [] - invtz = True - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self._s)) - - -if sys.platform != "win32": - TZFILES = ["/etc/localtime", "localtime"] - TZPATHS = ["/usr/share/zoneinfo", - "/usr/lib/zoneinfo", - "/usr/share/lib/zoneinfo", - "/etc/zoneinfo"] -else: - TZFILES = [] - TZPATHS = [] - - -def __get_gettz(): - tzlocal_classes = (tzlocal,) - if tzwinlocal is not None: - tzlocal_classes += (tzwinlocal,) - - class GettzFunc(object): - """ - Retrieve a time zone object from a string representation - - This function is intended to retrieve the :py:class:`tzinfo` subclass - that best represents the time zone that would be used if a POSIX - `TZ variable`_ were set to the same value. - - If no argument or an empty string is passed to ``gettz``, local time - is returned: - - .. code-block:: python3 - - >>> gettz() - tzfile('/etc/localtime') - - This function is also the preferred way to map IANA tz database keys - to :class:`tzfile` objects: - - .. code-block:: python3 - - >>> gettz('Pacific/Kiritimati') - tzfile('/usr/share/zoneinfo/Pacific/Kiritimati') - - On Windows, the standard is extended to include the Windows-specific - zone names provided by the operating system: - - .. code-block:: python3 - - >>> gettz('Egypt Standard Time') - tzwin('Egypt Standard Time') - - Passing a GNU ``TZ`` style string time zone specification returns a - :class:`tzstr` object: - - .. code-block:: python3 - - >>> gettz('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') - tzstr('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') - - :param name: - A time zone name (IANA, or, on Windows, Windows keys), location of - a ``tzfile(5)`` zoneinfo file or ``TZ`` variable style time zone - specifier. An empty string, no argument or ``None`` is interpreted - as local time. - - :return: - Returns an instance of one of ``dateutil``'s :py:class:`tzinfo` - subclasses. - - .. versionchanged:: 2.7.0 - - After version 2.7.0, any two calls to ``gettz`` using the same - input strings will return the same object: - - .. code-block:: python3 - - >>> tz.gettz('America/Chicago') is tz.gettz('America/Chicago') - True - - In addition to improving performance, this ensures that - `"same zone" semantics`_ are used for datetimes in the same zone. - - - .. _`TZ variable`: - https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html - - .. _`"same zone" semantics`: - https://blog.ganssle.io/articles/2018/02/aware-datetime-arithmetic.html - """ - def __init__(self): - - self.__instances = weakref.WeakValueDictionary() - self.__strong_cache_size = 8 - self.__strong_cache = OrderedDict() - self._cache_lock = _thread.allocate_lock() - - def __call__(self, name=None): - with self._cache_lock: - rv = self.__instances.get(name, None) - - if rv is None: - rv = self.nocache(name=name) - if not (name is None - or isinstance(rv, tzlocal_classes) - or rv is None): - # tzlocal is slightly more complicated than the other - # time zone providers because it depends on environment - # at construction time, so don't cache that. - # - # We also cannot store weak references to None, so we - # will also not store that. - self.__instances[name] = rv - else: - # No need for strong caching, return immediately - return rv - - self.__strong_cache[name] = self.__strong_cache.pop(name, rv) - - if len(self.__strong_cache) > self.__strong_cache_size: - self.__strong_cache.popitem(last=False) - - return rv - - def set_cache_size(self, size): - with self._cache_lock: - self.__strong_cache_size = size - while len(self.__strong_cache) > size: - self.__strong_cache.popitem(last=False) - - def cache_clear(self): - with self._cache_lock: - self.__instances = weakref.WeakValueDictionary() - self.__strong_cache.clear() - - @staticmethod - def nocache(name=None): - """A non-cached version of gettz""" - tz = None - if not name: - try: - name = os.environ["TZ"] - except KeyError: - pass - if name is None or name == ":": - for filepath in TZFILES: - if not os.path.isabs(filepath): - filename = filepath - for path in TZPATHS: - filepath = os.path.join(path, filename) - if os.path.isfile(filepath): - break - else: - continue - if os.path.isfile(filepath): - try: - tz = tzfile(filepath) - break - except (IOError, OSError, ValueError): - pass - else: - tz = tzlocal() - else: - try: - if name.startswith(":"): - name = name[1:] - except TypeError as e: - if isinstance(name, bytes): - new_msg = "gettz argument should be str, not bytes" - six.raise_from(TypeError(new_msg), e) - else: - raise - if os.path.isabs(name): - if os.path.isfile(name): - tz = tzfile(name) - else: - tz = None - else: - for path in TZPATHS: - filepath = os.path.join(path, name) - if not os.path.isfile(filepath): - filepath = filepath.replace(' ', '_') - if not os.path.isfile(filepath): - continue - try: - tz = tzfile(filepath) - break - except (IOError, OSError, ValueError): - pass - else: - tz = None - if tzwin is not None: - try: - tz = tzwin(name) - except (WindowsError, UnicodeEncodeError): - # UnicodeEncodeError is for Python 2.7 compat - tz = None - - if not tz: - from dateutil.zoneinfo import get_zonefile_instance - tz = get_zonefile_instance().get(name) - - if not tz: - for c in name: - # name is not a tzstr unless it has at least - # one offset. For short values of "name", an - # explicit for loop seems to be the fastest way - # To determine if a string contains a digit - if c in "0123456789": - try: - tz = tzstr(name) - except ValueError: - pass - break - else: - if name in ("GMT", "UTC"): - tz = UTC - elif name in time.tzname: - tz = tzlocal() - return tz - - return GettzFunc() - - -gettz = __get_gettz() -del __get_gettz - - -def datetime_exists(dt, tz=None): - """ - Given a datetime and a time zone, determine whether or not a given datetime - would fall in a gap. - - :param dt: - A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` - is provided.) - - :param tz: - A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If - ``None`` or not provided, the datetime's own time zone will be used. - - :return: - Returns a boolean value whether or not the "wall time" exists in - ``tz``. - - .. versionadded:: 2.7.0 - """ - if tz is None: - if dt.tzinfo is None: - raise ValueError('Datetime is naive and no time zone provided.') - tz = dt.tzinfo - - dt = dt.replace(tzinfo=None) - - # This is essentially a test of whether or not the datetime can survive - # a round trip to UTC. - dt_rt = dt.replace(tzinfo=tz).astimezone(UTC).astimezone(tz) - dt_rt = dt_rt.replace(tzinfo=None) - - return dt == dt_rt - - -def datetime_ambiguous(dt, tz=None): - """ - Given a datetime and a time zone, determine whether or not a given datetime - is ambiguous (i.e if there are two times differentiated only by their DST - status). - - :param dt: - A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` - is provided.) - - :param tz: - A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If - ``None`` or not provided, the datetime's own time zone will be used. - - :return: - Returns a boolean value whether or not the "wall time" is ambiguous in - ``tz``. - - .. versionadded:: 2.6.0 - """ - if tz is None: - if dt.tzinfo is None: - raise ValueError('Datetime is naive and no time zone provided.') - - tz = dt.tzinfo - - # If a time zone defines its own "is_ambiguous" function, we'll use that. - is_ambiguous_fn = getattr(tz, 'is_ambiguous', None) - if is_ambiguous_fn is not None: - try: - return tz.is_ambiguous(dt) - except Exception: - pass - - # If it doesn't come out and tell us it's ambiguous, we'll just check if - # the fold attribute has any effect on this particular date and time. - dt = dt.replace(tzinfo=tz) - wall_0 = enfold(dt, fold=0) - wall_1 = enfold(dt, fold=1) - - same_offset = wall_0.utcoffset() == wall_1.utcoffset() - same_dst = wall_0.dst() == wall_1.dst() - - return not (same_offset and same_dst) - - -def resolve_imaginary(dt): - """ - Given a datetime that may be imaginary, return an existing datetime. - - This function assumes that an imaginary datetime represents what the - wall time would be in a zone had the offset transition not occurred, so - it will always fall forward by the transition's change in offset. - - .. doctest:: - - >>> from dateutil import tz - >>> from datetime import datetime - >>> NYC = tz.gettz('America/New_York') - >>> print(tz.resolve_imaginary(datetime(2017, 3, 12, 2, 30, tzinfo=NYC))) - 2017-03-12 03:30:00-04:00 - - >>> KIR = tz.gettz('Pacific/Kiritimati') - >>> print(tz.resolve_imaginary(datetime(1995, 1, 1, 12, 30, tzinfo=KIR))) - 1995-01-02 12:30:00+14:00 - - As a note, :func:`datetime.astimezone` is guaranteed to produce a valid, - existing datetime, so a round-trip to and from UTC is sufficient to get - an extant datetime, however, this generally "falls back" to an earlier time - rather than falling forward to the STD side (though no guarantees are made - about this behavior). - - :param dt: - A :class:`datetime.datetime` which may or may not exist. - - :return: - Returns an existing :class:`datetime.datetime`. If ``dt`` was not - imaginary, the datetime returned is guaranteed to be the same object - passed to the function. - - .. versionadded:: 2.7.0 - """ - if dt.tzinfo is not None and not datetime_exists(dt): - - curr_offset = (dt + datetime.timedelta(hours=24)).utcoffset() - old_offset = (dt - datetime.timedelta(hours=24)).utcoffset() - - dt += curr_offset - old_offset - - return dt - - -def _datetime_to_timestamp(dt): - """ - Convert a :class:`datetime.datetime` object to an epoch timestamp in - seconds since January 1, 1970, ignoring the time zone. - """ - return (dt.replace(tzinfo=None) - EPOCH).total_seconds() - - -if sys.version_info >= (3, 6): - def _get_supported_offset(second_offset): - return second_offset -else: - def _get_supported_offset(second_offset): - # For python pre-3.6, round to full-minutes if that's not the case. - # Python's datetime doesn't accept sub-minute timezones. Check - # http://python.org/sf/1447945 or https://bugs.python.org/issue5288 - # for some information. - old_offset = second_offset - calculated_offset = 60 * ((second_offset + 30) // 60) - return calculated_offset - - -try: - # Python 3.7 feature - from contextlib import nullcontext as _nullcontext -except ImportError: - class _nullcontext(object): - """ - Class for wrapping contexts so that they are passed through in a - with statement. - """ - def __init__(self, context): - self.context = context - - def __enter__(self): - return self.context - - def __exit__(*args, **kwargs): - pass - -# vim:ts=4:sw=4:et diff --git a/venv/lib/python3.7/site-packages/dateutil/tz/win.py b/venv/lib/python3.7/site-packages/dateutil/tz/win.py deleted file mode 100644 index cde07ba..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/tz/win.py +++ /dev/null @@ -1,370 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module provides an interface to the native time zone data on Windows, -including :py:class:`datetime.tzinfo` implementations. - -Attempting to import this module on a non-Windows platform will raise an -:py:obj:`ImportError`. -""" -# This code was originally contributed by Jeffrey Harris. -import datetime -import struct - -from six.moves import winreg -from six import text_type - -try: - import ctypes - from ctypes import wintypes -except ValueError: - # ValueError is raised on non-Windows systems for some horrible reason. - raise ImportError("Running tzwin on non-Windows system") - -from ._common import tzrangebase - -__all__ = ["tzwin", "tzwinlocal", "tzres"] - -ONEWEEK = datetime.timedelta(7) - -TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" -TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones" -TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" - - -def _settzkeyname(): - handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - try: - winreg.OpenKey(handle, TZKEYNAMENT).Close() - TZKEYNAME = TZKEYNAMENT - except WindowsError: - TZKEYNAME = TZKEYNAME9X - handle.Close() - return TZKEYNAME - - -TZKEYNAME = _settzkeyname() - - -class tzres(object): - """ - Class for accessing ``tzres.dll``, which contains timezone name related - resources. - - .. versionadded:: 2.5.0 - """ - p_wchar = ctypes.POINTER(wintypes.WCHAR) # Pointer to a wide char - - def __init__(self, tzres_loc='tzres.dll'): - # Load the user32 DLL so we can load strings from tzres - user32 = ctypes.WinDLL('user32') - - # Specify the LoadStringW function - user32.LoadStringW.argtypes = (wintypes.HINSTANCE, - wintypes.UINT, - wintypes.LPWSTR, - ctypes.c_int) - - self.LoadStringW = user32.LoadStringW - self._tzres = ctypes.WinDLL(tzres_loc) - self.tzres_loc = tzres_loc - - def load_name(self, offset): - """ - Load a timezone name from a DLL offset (integer). - - >>> from dateutil.tzwin import tzres - >>> tzr = tzres() - >>> print(tzr.load_name(112)) - 'Eastern Standard Time' - - :param offset: - A positive integer value referring to a string from the tzres dll. - - .. note:: - - Offsets found in the registry are generally of the form - ``@tzres.dll,-114``. The offset in this case is 114, not -114. - - """ - resource = self.p_wchar() - lpBuffer = ctypes.cast(ctypes.byref(resource), wintypes.LPWSTR) - nchar = self.LoadStringW(self._tzres._handle, offset, lpBuffer, 0) - return resource[:nchar] - - def name_from_string(self, tzname_str): - """ - Parse strings as returned from the Windows registry into the time zone - name as defined in the registry. - - >>> from dateutil.tzwin import tzres - >>> tzr = tzres() - >>> print(tzr.name_from_string('@tzres.dll,-251')) - 'Dateline Daylight Time' - >>> print(tzr.name_from_string('Eastern Standard Time')) - 'Eastern Standard Time' - - :param tzname_str: - A timezone name string as returned from a Windows registry key. - - :return: - Returns the localized timezone string from tzres.dll if the string - is of the form `@tzres.dll,-offset`, else returns the input string. - """ - if not tzname_str.startswith('@'): - return tzname_str - - name_splt = tzname_str.split(',-') - try: - offset = int(name_splt[1]) - except: - raise ValueError("Malformed timezone string.") - - return self.load_name(offset) - - -class tzwinbase(tzrangebase): - """tzinfo class based on win32's timezones available in the registry.""" - def __init__(self): - raise NotImplementedError('tzwinbase is an abstract base class') - - def __eq__(self, other): - # Compare on all relevant dimensions, including name. - if not isinstance(other, tzwinbase): - return NotImplemented - - return (self._std_offset == other._std_offset and - self._dst_offset == other._dst_offset and - self._stddayofweek == other._stddayofweek and - self._dstdayofweek == other._dstdayofweek and - self._stdweeknumber == other._stdweeknumber and - self._dstweeknumber == other._dstweeknumber and - self._stdhour == other._stdhour and - self._dsthour == other._dsthour and - self._stdminute == other._stdminute and - self._dstminute == other._dstminute and - self._std_abbr == other._std_abbr and - self._dst_abbr == other._dst_abbr) - - @staticmethod - def list(): - """Return a list of all time zones known to the system.""" - with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - with winreg.OpenKey(handle, TZKEYNAME) as tzkey: - result = [winreg.EnumKey(tzkey, i) - for i in range(winreg.QueryInfoKey(tzkey)[0])] - return result - - def display(self): - """ - Return the display name of the time zone. - """ - return self._display - - def transitions(self, year): - """ - For a given year, get the DST on and off transition times, expressed - always on the standard time side. For zones with no transitions, this - function returns ``None``. - - :param year: - The year whose transitions you would like to query. - - :return: - Returns a :class:`tuple` of :class:`datetime.datetime` objects, - ``(dston, dstoff)`` for zones with an annual DST transition, or - ``None`` for fixed offset zones. - """ - - if not self.hasdst: - return None - - dston = picknthweekday(year, self._dstmonth, self._dstdayofweek, - self._dsthour, self._dstminute, - self._dstweeknumber) - - dstoff = picknthweekday(year, self._stdmonth, self._stddayofweek, - self._stdhour, self._stdminute, - self._stdweeknumber) - - # Ambiguous dates default to the STD side - dstoff -= self._dst_base_offset - - return dston, dstoff - - def _get_hasdst(self): - return self._dstmonth != 0 - - @property - def _dst_base_offset(self): - return self._dst_base_offset_ - - -class tzwin(tzwinbase): - """ - Time zone object created from the zone info in the Windows registry - - These are similar to :py:class:`dateutil.tz.tzrange` objects in that - the time zone data is provided in the format of a single offset rule - for either 0 or 2 time zone transitions per year. - - :param: name - The name of a Windows time zone key, e.g. "Eastern Standard Time". - The full list of keys can be retrieved with :func:`tzwin.list`. - """ - - def __init__(self, name): - self._name = name - - with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - tzkeyname = text_type("{kn}\\{name}").format(kn=TZKEYNAME, name=name) - with winreg.OpenKey(handle, tzkeyname) as tzkey: - keydict = valuestodict(tzkey) - - self._std_abbr = keydict["Std"] - self._dst_abbr = keydict["Dlt"] - - self._display = keydict["Display"] - - # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm - tup = struct.unpack("=3l16h", keydict["TZI"]) - stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 - dstoffset = stdoffset-tup[2] # + DaylightBias * -1 - self._std_offset = datetime.timedelta(minutes=stdoffset) - self._dst_offset = datetime.timedelta(minutes=dstoffset) - - # for the meaning see the win32 TIME_ZONE_INFORMATION structure docs - # http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx - (self._stdmonth, - self._stddayofweek, # Sunday = 0 - self._stdweeknumber, # Last = 5 - self._stdhour, - self._stdminute) = tup[4:9] - - (self._dstmonth, - self._dstdayofweek, # Sunday = 0 - self._dstweeknumber, # Last = 5 - self._dsthour, - self._dstminute) = tup[12:17] - - self._dst_base_offset_ = self._dst_offset - self._std_offset - self.hasdst = self._get_hasdst() - - def __repr__(self): - return "tzwin(%s)" % repr(self._name) - - def __reduce__(self): - return (self.__class__, (self._name,)) - - -class tzwinlocal(tzwinbase): - """ - Class representing the local time zone information in the Windows registry - - While :class:`dateutil.tz.tzlocal` makes system calls (via the :mod:`time` - module) to retrieve time zone information, ``tzwinlocal`` retrieves the - rules directly from the Windows registry and creates an object like - :class:`dateutil.tz.tzwin`. - - Because Windows does not have an equivalent of :func:`time.tzset`, on - Windows, :class:`dateutil.tz.tzlocal` instances will always reflect the - time zone settings *at the time that the process was started*, meaning - changes to the machine's time zone settings during the run of a program - on Windows will **not** be reflected by :class:`dateutil.tz.tzlocal`. - Because ``tzwinlocal`` reads the registry directly, it is unaffected by - this issue. - """ - def __init__(self): - with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - with winreg.OpenKey(handle, TZLOCALKEYNAME) as tzlocalkey: - keydict = valuestodict(tzlocalkey) - - self._std_abbr = keydict["StandardName"] - self._dst_abbr = keydict["DaylightName"] - - try: - tzkeyname = text_type('{kn}\\{sn}').format(kn=TZKEYNAME, - sn=self._std_abbr) - with winreg.OpenKey(handle, tzkeyname) as tzkey: - _keydict = valuestodict(tzkey) - self._display = _keydict["Display"] - except OSError: - self._display = None - - stdoffset = -keydict["Bias"]-keydict["StandardBias"] - dstoffset = stdoffset-keydict["DaylightBias"] - - self._std_offset = datetime.timedelta(minutes=stdoffset) - self._dst_offset = datetime.timedelta(minutes=dstoffset) - - # For reasons unclear, in this particular key, the day of week has been - # moved to the END of the SYSTEMTIME structure. - tup = struct.unpack("=8h", keydict["StandardStart"]) - - (self._stdmonth, - self._stdweeknumber, # Last = 5 - self._stdhour, - self._stdminute) = tup[1:5] - - self._stddayofweek = tup[7] - - tup = struct.unpack("=8h", keydict["DaylightStart"]) - - (self._dstmonth, - self._dstweeknumber, # Last = 5 - self._dsthour, - self._dstminute) = tup[1:5] - - self._dstdayofweek = tup[7] - - self._dst_base_offset_ = self._dst_offset - self._std_offset - self.hasdst = self._get_hasdst() - - def __repr__(self): - return "tzwinlocal()" - - def __str__(self): - # str will return the standard name, not the daylight name. - return "tzwinlocal(%s)" % repr(self._std_abbr) - - def __reduce__(self): - return (self.__class__, ()) - - -def picknthweekday(year, month, dayofweek, hour, minute, whichweek): - """ dayofweek == 0 means Sunday, whichweek 5 means last instance """ - first = datetime.datetime(year, month, 1, hour, minute) - - # This will work if dayofweek is ISO weekday (1-7) or Microsoft-style (0-6), - # Because 7 % 7 = 0 - weekdayone = first.replace(day=((dayofweek - first.isoweekday()) % 7) + 1) - wd = weekdayone + ((whichweek - 1) * ONEWEEK) - if (wd.month != month): - wd -= ONEWEEK - - return wd - - -def valuestodict(key): - """Convert a registry key's values to a dictionary.""" - dout = {} - size = winreg.QueryInfoKey(key)[1] - tz_res = None - - for i in range(size): - key_name, value, dtype = winreg.EnumValue(key, i) - if dtype == winreg.REG_DWORD or dtype == winreg.REG_DWORD_LITTLE_ENDIAN: - # If it's a DWORD (32-bit integer), it's stored as unsigned - convert - # that to a proper signed integer - if value & (1 << 31): - value = value - (1 << 32) - elif dtype == winreg.REG_SZ: - # If it's a reference to the tzres DLL, load the actual string - if value.startswith('@tzres'): - tz_res = tz_res or tzres() - value = tz_res.name_from_string(value) - - value = value.rstrip('\x00') # Remove trailing nulls - - dout[key_name] = value - - return dout diff --git a/venv/lib/python3.7/site-packages/dateutil/tzwin.py b/venv/lib/python3.7/site-packages/dateutil/tzwin.py deleted file mode 100644 index cebc673..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/tzwin.py +++ /dev/null @@ -1,2 +0,0 @@ -# tzwin has moved to dateutil.tz.win -from .tz.win import * diff --git a/venv/lib/python3.7/site-packages/dateutil/utils.py b/venv/lib/python3.7/site-packages/dateutil/utils.py deleted file mode 100644 index 44d9c99..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/utils.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers general convenience and utility functions for dealing with -datetimes. - -.. versionadded:: 2.7.0 -""" -from __future__ import unicode_literals - -from datetime import datetime, time - - -def today(tzinfo=None): - """ - Returns a :py:class:`datetime` representing the current day at midnight - - :param tzinfo: - The time zone to attach (also used to determine the current day). - - :return: - A :py:class:`datetime.datetime` object representing the current day - at midnight. - """ - - dt = datetime.now(tzinfo) - return datetime.combine(dt.date(), time(0, tzinfo=tzinfo)) - - -def default_tzinfo(dt, tzinfo): - """ - Sets the ``tzinfo`` parameter on naive datetimes only - - This is useful for example when you are provided a datetime that may have - either an implicit or explicit time zone, such as when parsing a time zone - string. - - .. doctest:: - - >>> from dateutil.tz import tzoffset - >>> from dateutil.parser import parse - >>> from dateutil.utils import default_tzinfo - >>> dflt_tz = tzoffset("EST", -18000) - >>> print(default_tzinfo(parse('2014-01-01 12:30 UTC'), dflt_tz)) - 2014-01-01 12:30:00+00:00 - >>> print(default_tzinfo(parse('2014-01-01 12:30'), dflt_tz)) - 2014-01-01 12:30:00-05:00 - - :param dt: - The datetime on which to replace the time zone - - :param tzinfo: - The :py:class:`datetime.tzinfo` subclass instance to assign to - ``dt`` if (and only if) it is naive. - - :return: - Returns an aware :py:class:`datetime.datetime`. - """ - if dt.tzinfo is not None: - return dt - else: - return dt.replace(tzinfo=tzinfo) - - -def within_delta(dt1, dt2, delta): - """ - Useful for comparing two datetimes that may a negilible difference - to be considered equal. - """ - delta = abs(delta) - difference = dt1 - dt2 - return -delta <= difference <= delta diff --git a/venv/lib/python3.7/site-packages/dateutil/zoneinfo/__init__.py b/venv/lib/python3.7/site-packages/dateutil/zoneinfo/__init__.py deleted file mode 100644 index 34f11ad..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/zoneinfo/__init__.py +++ /dev/null @@ -1,167 +0,0 @@ -# -*- coding: utf-8 -*- -import warnings -import json - -from tarfile import TarFile -from pkgutil import get_data -from io import BytesIO - -from dateutil.tz import tzfile as _tzfile - -__all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata"] - -ZONEFILENAME = "dateutil-zoneinfo.tar.gz" -METADATA_FN = 'METADATA' - - -class tzfile(_tzfile): - def __reduce__(self): - return (gettz, (self._filename,)) - - -def getzoneinfofile_stream(): - try: - return BytesIO(get_data(__name__, ZONEFILENAME)) - except IOError as e: # TODO switch to FileNotFoundError? - warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror)) - return None - - -class ZoneInfoFile(object): - def __init__(self, zonefile_stream=None): - if zonefile_stream is not None: - with TarFile.open(fileobj=zonefile_stream) as tf: - self.zones = {zf.name: tzfile(tf.extractfile(zf), filename=zf.name) - for zf in tf.getmembers() - if zf.isfile() and zf.name != METADATA_FN} - # deal with links: They'll point to their parent object. Less - # waste of memory - links = {zl.name: self.zones[zl.linkname] - for zl in tf.getmembers() if - zl.islnk() or zl.issym()} - self.zones.update(links) - try: - metadata_json = tf.extractfile(tf.getmember(METADATA_FN)) - metadata_str = metadata_json.read().decode('UTF-8') - self.metadata = json.loads(metadata_str) - except KeyError: - # no metadata in tar file - self.metadata = None - else: - self.zones = {} - self.metadata = None - - def get(self, name, default=None): - """ - Wrapper for :func:`ZoneInfoFile.zones.get`. This is a convenience method - for retrieving zones from the zone dictionary. - - :param name: - The name of the zone to retrieve. (Generally IANA zone names) - - :param default: - The value to return in the event of a missing key. - - .. versionadded:: 2.6.0 - - """ - return self.zones.get(name, default) - - -# The current API has gettz as a module function, although in fact it taps into -# a stateful class. So as a workaround for now, without changing the API, we -# will create a new "global" class instance the first time a user requests a -# timezone. Ugly, but adheres to the api. -# -# TODO: Remove after deprecation period. -_CLASS_ZONE_INSTANCE = [] - - -def get_zonefile_instance(new_instance=False): - """ - This is a convenience function which provides a :class:`ZoneInfoFile` - instance using the data provided by the ``dateutil`` package. By default, it - caches a single instance of the ZoneInfoFile object and returns that. - - :param new_instance: - If ``True``, a new instance of :class:`ZoneInfoFile` is instantiated and - used as the cached instance for the next call. Otherwise, new instances - are created only as necessary. - - :return: - Returns a :class:`ZoneInfoFile` object. - - .. versionadded:: 2.6 - """ - if new_instance: - zif = None - else: - zif = getattr(get_zonefile_instance, '_cached_instance', None) - - if zif is None: - zif = ZoneInfoFile(getzoneinfofile_stream()) - - get_zonefile_instance._cached_instance = zif - - return zif - - -def gettz(name): - """ - This retrieves a time zone from the local zoneinfo tarball that is packaged - with dateutil. - - :param name: - An IANA-style time zone name, as found in the zoneinfo file. - - :return: - Returns a :class:`dateutil.tz.tzfile` time zone object. - - .. warning:: - It is generally inadvisable to use this function, and it is only - provided for API compatibility with earlier versions. This is *not* - equivalent to ``dateutil.tz.gettz()``, which selects an appropriate - time zone based on the inputs, favoring system zoneinfo. This is ONLY - for accessing the dateutil-specific zoneinfo (which may be out of - date compared to the system zoneinfo). - - .. deprecated:: 2.6 - If you need to use a specific zoneinfofile over the system zoneinfo, - instantiate a :class:`dateutil.zoneinfo.ZoneInfoFile` object and call - :func:`dateutil.zoneinfo.ZoneInfoFile.get(name)` instead. - - Use :func:`get_zonefile_instance` to retrieve an instance of the - dateutil-provided zoneinfo. - """ - warnings.warn("zoneinfo.gettz() will be removed in future versions, " - "to use the dateutil-provided zoneinfo files, instantiate a " - "ZoneInfoFile object and use ZoneInfoFile.zones.get() " - "instead. See the documentation for details.", - DeprecationWarning) - - if len(_CLASS_ZONE_INSTANCE) == 0: - _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) - return _CLASS_ZONE_INSTANCE[0].zones.get(name) - - -def gettz_db_metadata(): - """ Get the zonefile metadata - - See `zonefile_metadata`_ - - :returns: - A dictionary with the database metadata - - .. deprecated:: 2.6 - See deprecation warning in :func:`zoneinfo.gettz`. To get metadata, - query the attribute ``zoneinfo.ZoneInfoFile.metadata``. - """ - warnings.warn("zoneinfo.gettz_db_metadata() will be removed in future " - "versions, to use the dateutil-provided zoneinfo files, " - "ZoneInfoFile object and query the 'metadata' attribute " - "instead. See the documentation for details.", - DeprecationWarning) - - if len(_CLASS_ZONE_INSTANCE) == 0: - _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) - return _CLASS_ZONE_INSTANCE[0].metadata diff --git a/venv/lib/python3.7/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 55b77a742fa285dd6dd60723c26c3f8a1685a24d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5597 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 CO8uVz diff --git a/venv/lib/python3.7/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-37.pyc b/venv/lib/python3.7/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-37.pyc deleted file mode 100644 index 8f62cdcb7bb581468312687f2f4cd54baf458546..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1870 zcmYjRPjA~c6elTJl4ZwD(=6-OV$)?LeDMfH6+!{{E$wrr$oC%%|rH1#o>G*rFt&9`6R zD^$Rl`ak=J=tq>1!}8<@bO#+GOh#_^fLE^4M?)c?aaFHq;r zjWVmkQLB(uz09IcYX#YWn4fSJ3>gK}m8Jgz{7)N@-&)ZydyHP-2mZZx zJexPvx!F2o4{;xY27Rhee!s)Iqd1{~8nPhH6cbsL1S(G1glFcY&p`wk z;pt{mMPk$U0~meiY!;<(OP20Vy?{v<01)&APlKbQzRFv1ltnEr25mJtI%+NMhu+eA z4;oz#0uq3Y&cT!)f*7Cz-Cvtxg^uxzJVOPv|4;J3zKi}wO-mClwVg+5sO@7OXMi)( zx~y>q*mG2x(^v=>yu8|LgVxUDd^^shg4nh%^Uo!d{j8mj)sSb~rx~Aamcg~fqGYXn z{K~(Q#8UNmnqU3Egt&-za$#w5CE);ldA0S{F0>|bZ$h@|zQ&JU8kQbFm`M3D@)9$UiyFzfG*E_j@hIe?@$+#T#hUTU)@j&e)&$LZP@RT8h_)h1 zwIhcH3)&H>5{xy^Xm8niZK-IWojw<7q(a}6Y#{h3m)c92ilCNJ=$cb-7FJVEM~T^L zqWao4DTGzy%5+d_%rx#p-y$(!N>`vfVjNb>#Tb;GY+|tj5sF3`=9{wDL6MsvkmKP7 zu45afk5};;CU^r@4}U~9@J0Bx23i9LL~MceDeMgVOa-sOl;=Sd=otQKPKa1n06R(y zho}V%vM2PmDPu5XN!}j;bs*ht!sL*16=#DWWl}~1wm^7EjVKG);~vXZ%(Fm5v1Byp zjsrRB=7RUYy!G}!^HOth@ulhAWO9v@q)@(H*GK1FbQ=is}q z_kmm$CPc;o416$v)JmNT=)ffiuI$D_m|lnrAU=aB4SkX0Ll4TcW<#{$U;*KEvkQ#4 z2txaBYw!lF(EAdWrWxVcB^6ssDwc39AzJpYeBhlx4AmFN@UASdcGYxNu7U6X1dCrC K*U752_VH^BkoedD diff --git a/venv/lib/python3.7/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz b/venv/lib/python3.7/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz deleted file mode 100644 index 89e83517b562451622cea7cbe1dbfac5c3d2513e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153315 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%0D!KtMVr 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

yja~WxFc`yfrj%BE^ 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%0Ay}5phF%Yq4Q1qkIf-;CS zmY1S27#~ygX!7-SX+B`GX3+PepKx+K6Z_AU(qoX};&|q#Dd*8m1u`URf)@p1Z}`>h zi=Ja|C%@ZO_mE{%vu}Eiefa`3{4;Jdbl2`V_6xqBV(Tz4DEo9hno}pxHy;ORvNT`p zOX42Ql>;ddaRmYeX-b^ED(O^Bn1sT6QTdkL=lWjF9>fEJdA@P&%js_Rv@zs`j*z!rK!;enO9)o z?rC~7{MK?FXu)o1FP~#i?qPjU@Q~F8BWtKalLCRZN0@pvvIkFe6+O@@xn+s_(f>PN zThM2|&tvEhvCw(a{FqHNGn3F4F&NsZdNdze;{M0-$6#3fce)AT|6_$>FdQw>m;O)f z=l|5cZiWhg@d$!JgKjSW=Y~-Ae{LB6=l?SWwxry_lSx&NZc*^+2^r}AFA}x?iLm`o zBF)ii$$!q<<*as(G*@+Co(+lEgEvYT5Ug^@~3we-v|L;o-u!?o4-Fud^>w}A zlMM2T;GuaQ^$+dQvb|AgvnlDi7G;2kc6a*o7Sl6GQt5}Fj~=zy*P+$}xA6j4QpM9N zal4AvKye^aBR2LzvJSiA8ku*<3BRTH0TUap4eED_ZXomYabtF2(LyV%_cC7c)r-KN z$~CcJg`Bm)NLmR;TzGrN0cvA84SF@xLdRFxpvX(ptAzBbDs)hLRGgckg3RmPd-F4W zEg=@)Drz31ww8N$fo|?zrrD?Y4X}5i#j^<9u6sPahO9B`0S>>)XMsN54eQR)R9g2w#Xu8U=W5$0i|f$)b2;ord1GX?Qlj4} zUMPq`db-dEq)g*J&J{;Hb-t$mSxp4o@5;>PAYiN}cBqMIx$IeuW=Dr3nx^25@tbq1 z!vLw~o#^rzYN0OVUfLH?k@tV*-QSHgm1~$s`O;1cKFBPS6|KNR-a-I@rv?(_&6-lu zjdo_pw>&c+#%VXYdf!|&=>3hjF{iqF&Z6- zz|4E+U7(>03HRwo<&|lnP7ck1?eWe#247UC-U@y4QQFh;`x=}NVg2rII3|2>-=Q z{*DmLA3eOWka%#o_{7k&EgSwP408tK^DegaoA3;%X{bL2zY^k+ z*X0gnu)nf(?o_%%N8@?i0{&E2(ALf^e!kK_B-ceNsCZ*8K%T$^&` z&o(L}fxFtsU2%y$TCS7n(#b!*$J?AH&$a zJCG~rRd6dVus?S{Dy3qkcomLUZ|@RS!t+(|VDqOUlCV(xl_DpV5c^n^7kmHWy8TYA z^)YE+CF=J|;D~bVM3>Z#2ltKGmS{DfPDbZiX3KV|r|q@Dc-Kqomp2*$63J{Y1ld)1 zhz*j8GVbpO#0@0k1&dMF1zz30@u|hZR{J!FwZ8Mq1r@QE#ss_*L2czqB> zRy6Or44|aZr_L9;w&orgZIQQC&-VH@n)5^mV5g~Kn|%(uiPjQ*di1V>@Xn*h9+yR( zJGS!=6XGAwexC;pyNrA6_V36a_iE1!I_+#>zY}Ng`^q`-Ve$3u~trWG^mW>NKD@$jqK)#`X~?37p8^B7c5;6+81RO=rJx z#*`TK(cfuOV|?g~Nt%xIMT^()R4e$3s~s+Wh3q(Y0%-TYq4sGm;>Z=x!XCHoV$;(x zNgGN|S_G4=XhpbS&BV4D%3s%Mg)CwYu72%aEqheQEJQ_1lV9~aFUzcy(=N6+XsC5I zRjhz0hrNWyW3YD70DoVDMsP}###5KqWALl}X2QP3X2R8(K#8!&VB=07qf(;Sb|45} zeCuN*NF|AW;Y}PJgiRl@L=tWBC0-7hC?Qf*TKooUkTH{!A^P2JC{0o(rl+bs83;K2 z2Za6Y)%+y(4oe!#fbkh+WPHy%r~=oSK*lq5d+9;iOkASq6>j3_hu>fb%+grNOwU@e zs|hq?#kK>2@Ys}T&N+kdij--lHd{(&jB#xdW}1;WdIc1_4OgY{bO-GK;-3}VUa&uN@*|Km1jo_Llji4dRvp+qWGA2O1h_#!`k3XJcryqfLBJpM6b+u+xBy8sOCVYa<1=wZuzT`w z++$6?CSoSaN6fvYS^FsW5roJK4-tC`>-bf1_&GNN-GA;*=aTgrxI2gWuma05?P2#2 zK55^Jq`+RW<6587VNp+=58PEtx$ETD0f9RFt+yleYJRrTndL{+RW^W9zv&j%bFHDS zf7jOafQ<6bmxc$xjm3xk1Hd=9FZ0jityuNgr|x%m)@6VU);v5K@OcDuhM>F-PI6(_ z7kR}mwt3Cr?Mt^4y6}q};2~WG@ISs0&9boYMqM0s!)9(L-sH~hdy4Kq>~SuN7~Hq5 z1xKA^cc7H|SzCSHA#H`G z<`&>y*#c>ws6wbj0(wZce zKMt+fqvw)d`augswd3PZ8~?y|JdH$^?UaVE48pcDqK%S z*-Sb4xtsLfd`wS$R9-(Qxq;Ms^D>tuFpuI*&5e54Z)`4>%|j^?q6s}BqP#HR*$F+a z*gc-^TK)th+OhI)tOxOXSiO)$`v?87QvQ(xM77ZY-z%WsD|+Vc6n;fSz{6E3fwHci zG2VmFQEP9SLvHSL#<)gv%|z$ngq3r52w=<-cw3}Kq7~`yv-wa>5mEFC73k)b<&LzZ zKRfNfWmW3;u|YOYl32JRrA)qER>BUL=@O+%`(9Ri&>{$6Rz656@^5$ZptE>EQf-c` zB$L;U=UvG6yvM-l%El$+<|=P{YU+fPUh8NV_I{2E{&17sjC#?=b$NPcJ%nn!`y0Ce z&%YjnoPI=2AdM!jDiK19HFVT1NHN|=?+;h!8pe3Tc}!eU#P1f?t9z2uf!Gf*k-Uu4 zCODTZNODb~RL!e2@;#h>4~tjS;YD`Qt=Hudbhwg9V%t_zH!Go4E`0pzOJcb;UZLiU7;hF5Tb0R+svn>~Drbw}th1Xlq zTM`Ro2&mP5$A&z)rhH;y06tc}4AFXzdbUADGfUFjg^$>{+c0r8Mz0|;e#BCN^}t+# zqxzaOp+=D7&wl79(nq-En8e0USSrX=UkfDEI5WK6k^QwF_K6e|w;YGqn3$!4P4%^2 zLQNUNTRXX5`#;`s;}IKEvQ!AEH!VT$T>9mHl|_6?#l|fsAQnPnaYU!0p21AW$7hgZ zmJK&vkM0-3U~$A&og_@r)Q}A?%73@?h*$`V#Sve1k|rTvia{RBQ|l4#(kG5# zp|W4;bCi{j04G(b5T*qwz#i}pJ|Vmb)226w0Q&n7*MJ{2uqr&Ozkpm8;RQ6EUrQRf z&0fMgerUwyi(RKaUx(z;oa#O88uDe|F1lAQTwXhQA!L3U=6xTF3a|6anLRGliA>m| z);J>nM*d3j#YNd>b>!DA_@)HDzro*csMJ~3_py`0zZiXDIf>=7I~XE`Gg+d8UnUU9 zJji^%9}g^qiq`GW0dx#X(%D=pnWCyv4tBWviQINt#t^yX8y>lI8n(X@RfIp$b9 z;_{;n?2#GtRtdJSOvanLciEHom4VyR)jTAdX?%p6dEYo$MqdySlM|4|kwiTWehNvw zw|hRK=0UQ(P1n1f0zTNFwD3Kh2X;O8b;3N&WK$BFE`0sh3Dg;paO+{plf37GF57IoGX=Sxx#y2y)PHH-&4?Pe$iimG6Bx)7B0`5>9S|8`jPwjTRQ+R2)8lFG^F zY<{4jK2^l%TKtz)`WF!!q4jh>7O580ak-f_e}|2 z+Zc@1s0FYP>EP4-vrf*v>Ti6{J31|L#UPayEkR8dhGIHo4!eUl1Y9Yx>;*%~Km1x* zwyeH4WE$tL*oN}oHur?LI{EfIv?^!Z85q1>I`GAr@uefTm%NHS?T$jb?HS5@O2G4= zR^`ahaabw6S|WDjTWT%^yK8J0P_bdJBQQGp$W`)TM#m2ejpwl$rh$G{=cM)bf^{-E zy$v;8IdP*EeE|);bugY(e@Me%BQy>B}LU|~T ziiJW%mESGl%{oKRpj`O(2uxdSTr2|OI64*zX;uD^1T-`TbWGVtgrS)HXt<%FNnwvv z(XdkRXk;JBhGHh5;mV>DcRyl5!%{`VPe7w#K$nz#6dH<2h>j~8uH4^^$%6J|816`m z{#sY?13E4m2C*y_3mU#E8g&Ai7z4U@0^2HAH%a%glJiC@U1nR!Uyfj%O1k@$pFe*D zI-{QW<8DGCiz-U{*ES($u3s)7K3R^|sA}-89Bg@GUWNa}wC(M!q)PeZ8=r&jo+gnP zxoZ)JTwQFsMyiNw*XHKcxnYWq!sJP}Ra*JMX)O8sfe@lsnt-wH4usd6rc>c>3d;Js zS6-uhI@BSus^{X9n-(3RJat8)f{qMxG_BPko+x$BMqu&CYBTvD(ZRs5lrdfsGdbI^ zUj3}+MAFx~SLKlvl-Uf9u@RV-9qN;Ce`DygQg#X&<;Cwf0 zb;^J1-OFj3J=i=;!ixBh61K+Z)D5Ay$N|QFH6P%-M5tekQC- zNy53HNm0ZxHXwdm^Cbx<;xI+gPhLw6lN+nOW;R99(XN0+o;@rH=M$>taxjXH`4XE{ zRwPB|FF{$T3$zr2m1zD6sFAivXn?QIBnj@~P>RD!l*=g6XBe4;qnxB^$MIR00W|)i zmZ?ZOMNyT-xNjDkghOkm&eXtQ+-De*gd^7%li|$BZL_bW_9+0Qv%bG8ivkT%s~33= z#$+t%5x>Qk#=24fr4y2HCPq>eU$YtzZ_o>}5)Hotokjx$h9ss$20HJQG?fxb1%#DA zNzy-r1|}(*c8T}`jY>m?Rk8ZYuU?hojv(2DmqIM*U@E5$5}Q6Yl0fi z%~gg^OarQCL)LIgd*jfP%JS1^Jv4nw4U}tU#j8qZSvNaog%K^Yl|u{qB@hzn%S&hUtgdj2{cTc@i zIN$l3VDl$`ECqirdZ@PN2DcU)&$GIoQvRee%rg(EC%;nW$cVx(OyDp6lF+hU@Mct+ z`7&otQ+eIC#Uy@}_j6#3vamavkCZ?u-Fr;cg9$IAq=u?KmsA!Ww6{C%`bowo>a$eN zdyPJG2EbFh^Q9EC=>C%2a~V5k_uy%5PC%E`|A6!3`FuTxZ|zr4nwr-s=k$zv!+D;# zH6K#WPk8l)Whhu*F!>)`5c?l&rL@0!8e^5k!{vYACF%eE{6|gqb|q|c$Q;s_-2Cx$ zyV81N$Q;(4+#Hg`?ye>NSQqVlo^NEkl0I?B+}uw6b`PXEi_v1_I3dHFq2aoqpC|bo ze=D2ywb7qP>7%Andi^3mNb-MT>YuuYo|pcLohP*mkAry2zw?%@JcBs~HQk)T^UEoL z+f(>50$!lLQ;WL+JXnP07=MrdV~+jGP;>!%baT$Mu*1GWYnn_a-TRC{U!LulS*{`JS3O2n-K>+pe!Z*R@+wEW9aQ#29g=>OUB+h zMyBDjpdFIAs?1mA)Eq*Z+BWjXwb00VEdc3UPqF=UchC6haSi`A2~8QSNhhN}S%+h1 zh<%ae9CwEG9G5_2o8-6pHc1`Ge`d+7OVFX{P1eCl9%N@Z-6nYiqFlK_@*FzS-|4_6 zpd-D(4>pzDphxURSGYdvt-MFnH~{<3ZpQCy^^Q+K!eKiCOkf}YI==v4EbA%{qs&3{=)RBo7lJkV{TDRLm?{z-zt@$dG2r4;GoaZe zxaMX6f8rNtAhW&Xr4L^i8wWIp$0qEaF^q5{Af-qdD&b?G4R?HK0ho~9Oe*cC(?qip zM$OC(0#0v%=m}t<^uctOi#~x$sJ^MIqK(^`TJA& z2m(IIYHM-hfx7V87i<0UD&76!{^)D>N%OhfeR7VukX2i|4k_#Qw3=s&u?eY?9;P+LOJjL>RNWe1vVuYkP(U+ zefEuo12A@v#0h&3y$fU0fN{U2AGs~@GjZ=7rp~v-auWA0vmU4Y{rZw8itNNw;L2*x zMmwjrkM8qUK=5^b;Z3_znsha6xWCeByq{0nMvdcsG)asH`f@kE>5}$>W`S?ZgO?L! ztKqqAo|f_qWdYd3JWDMq`t7=^GFecKEdurU)?v^nFQp8|pNZi;#%tIHM<#Ep0@73G zcO$SXCbBP{xZVCg-o7fTj-XjL5Hwh@K=1^2x8RTjcXtaC+#NQA0Ko~to#5^e+}+)s z;O?^7b0_D&>#lY0+dU8Gp=ZAOs=9hV?3p#)T~+OmC>miA?jOsHU?QZ8-t|aDY5e@_ zhi4_*j~g3Dlq1IsCjM%Y{ z+H+K`jFquh7P{W|)%1Rf0C=^rnK(=YbuD{5>K7~}aSyK5v|M^TG8FEDdL<*~C-792 z;CtNiQSOb|%|t!J6s!^RL?eI*1x3Waq7jgEg||r5Vi6W$-w4O!5ZV2R(i6~S0$=b4 zgLZ!dSd}PZvOa>}WgBR5sBNOz#rNM+OVsMt*$=va6%$p1?8I}!GS&GWfN=c*vepMK zEc?#8Pn*#Kd3NXf@Jj-k6=dGyK4uvxYBe0lxh1pYNP2-Hn2KF!YD?ql20aZD_rX2D zv)luj4bW%>R4C+>Q~`$D+mN+dz@H)80!MQasG)mk_LYCo$R6jTLq5;08a?y7?I7oq zoPb%nF6-BjcIv(vIGG!bv+jKfL4Dm7#r3B94#wiP4$CQg`vj4(z3|Fofl4sF$mxwYYQO^j_8wcTub!ac8-7S1kMkYt>vhVabR>_C9= z+fm|WDmDEP4@=__psfyyIeDe?2d~o8D{sWB;&U#Y+W2&yJW+a5e5m(ON7kb-Uzzoal-ZsqLY6No~;|f z?C~WPZm2V&hy1F@>i8cLNZoo78SJ1W?qP+|Lp#`WFfXsP>wT$R2ac-i_FKuD0~Pnq_yEc zK*-g?su6njMeFEfMfc7E!;}+@=)eL~R&mr6{x9Nlm^#zn4B=c;APvr7z1^wtP+>u~ zlG6T$ViF@qdLd!K5Q<*SND9R&4n>bGqUDgv|4o;i(nV0nAd_Eyj>v#!m{os{Sd4}< zL(nD~B=(J{o1l%)qatx)AS4!!kL_PE{Cgmma1ntK|Uy=>Qd!Q=~ z`WyP82iT;~1S(9S|=&J?0`8qVT_W@#6YsQUI)VK5qdjj{qwuAj1k@ zPyXxm+wGcXk*`2+Q2rD=>tee`LAfI=T4B2eXi@=W-G23$WePjkbzcS+Yh-_#n+sqh ze5Y4#RlD)yAh2G6%d)IvSKX17Y`Junq;dwcb`ATY9Ttcm}9K_Kd@`B|J_ z=UQX*^cwY6R;%?nnRf$?{jvmcno>wc!mM#fJ5O-x9#QvQTi$8gGq-EcBmN;7CdLK0bsC&w3x+~jo);ogkb;ogv&(H@FSD9p4+rx!x71eAf-U^Ax^LA`ph zay5k=TD;@<@bbMA0bdz|Foz@XKG?V@?XyiwWp|q(2Vss2(77aij{V9JglS5G_d(79 z)Xhp|OS}?BI_Z1u|Mh-W{Kc7dsi)KBIS3qaPc9KXiTGSW4$%QH12TU- z7%JlZt;OfD8yY6|#@KAj>#O>_lBesw#8k?;>SYSK;otT%VOAcyR5>B#U}@J{P){= zD$R=hXzwaye4Zl1cQDb8WQz;d2|gtBou?<<#Rx<%bh!_{rFDrE0#_%NDZbaAjD!UF zu!f|QvbgTi46VBJCcK|JdsEmyz@m1_{+%o*(ad%i7w42cB8_U3tb6%1)-w9tF>3%B z<$@u+(C5l_1g{7q2XV85VUyn7%e!)qdj0(!;!o&Al3!P4#PUP) zk_&dQBywS#I(aH&oD>hJOWAhb2C|9e`@PoJ?n+@O`K)`u3-z@R70+U=`(%kSUZ zP4hy{+);u`mSjHhx1($wJ5N2k^CX7Xw8zpEDGpN8V-~4B6bbSlz7Sb_XtJ@ZkK~md zA5e{E-7Z)x7@l??-?0#^(el{%YXj>nn*JWLTX3lk-{LP`G%nPaj+7b zYJ*ZH6q5xm4FOdP73Um>%7{j)Lq5hoeW1;r9olkV%jBw9cT~ybHZD1J#0HF~#-(PS zltBUTAYxZGV7MP>9Rl!K-kvm7=n-FMO_}aN0Q*KtXfvVf-3g;Q_8DT4cWF{dn4YT! zDL13ytn(OL-3Lbfyhis_oz!I0>0Xh`Aisfg(#dxZhJ>|M0_c03?LRQutVNFlG7PUj z5OZeT&FvaqFOqXn*s0G9+>cryQ;jG`$>}*6`LjRm4772MAMYntyMJk~K~vKlu)9}Z zBhvQ?j5U9ik?X?T&)q#fOfsogf|bc|jm2O;XxhHGW#SdZ%$B#OvE|w&j;ov+9&Owi zTKIRp8pS>sK_5nl!i(=cK4X?tsX$Y;)aY}H^Ta(aFrWWkAt8Wo#OW# z6z#p0*vlVR~F$u&csoM7LpQ*emvQck{M246#Hn)DvV^-B-3=fOE*)OcJE6M zWo2O=8N1SeN$S@CvIQ46z<*@%)KaJkry(u~H@=1{cUyhEMp4}77nQS5gf080Z&HQGX2RVxP+Zb1?2-Iy?DvLSCc~H}=`m8ov ztKV3|8>3?JN6z+&?n?@nWfDRpj)P|MS&B^}(Jt4G7B@F$y2TrR7kyk3;*++*cQ|@@ z&0L5EI;t&P)Ot()M2Q3)r=LIH%{?=VYg7X(g3)h9+=ZUWb@*^bEP%B-$lXs>>GG!` zv#0R|9wtag5UE7(T!8amo-qC~9*ect@X>Z}0&htZmrrHz0vo<)EtiEi1T#fe*JsXm zE*S?;6*HXIxRLlyEzv*6)H!Fi&aq&hX*DC+*Sc9(FA*(m;F|3poD5ZV+n02WJ`|s~ zmc*?#h?GTW8Rmmq4aFQzo4!MZ+Bxw;vK(=Tr5<_aHs$KNXc>?Xekf}l<59a^tL|U2Sic+k6Hgm=kt(7@GXm2}{_`b$D(N|;`fP-B z&W}DkP8xSk=U20Waz52)&Fvj|p4^F^rM!@Vm3+y#E*Mc!i7A*{m*2iJoKj_7$>Ho* z>8kbkv~q6fUQ+Hnq&S-jFD-KN**q@Tcv_HH35s0iFMmD#9AP*;vuVb6;~BNZ0x6`H)VqzhXz$ zq3=1i%6nZC5-&dTnJRfr`Ntw6AhJ&$l!S4?zW**bNsfTM=gXtiyIo{DF;@B>y@K4= zSKQP=Ndl#KCM+r{%tmGLR&c6uYG_Foc{&|*)U)uf%GA*4>QtEhX$P;9tl)GQXW_lH zi{7wlfx{a4pf^P}`sA-`qM98=M7_K^i+{a1+z$n60oEa6dxoT)>~}_*!vGOFxO64- zge43ZO5V4x_4ezIJ?u1BE~ol@#Sm=jRyjB`UXzf--V+)rVV!CTp?p8;?V*_KiNzYm zb+*a=b62R;Etu3#4RihJ$1iiC9f7ZN68Rvwc9|*-L03*)RGsLR41FBf6?gfe!o?*- zeJ$KHwPf+^obU%9sP1E})xt3s`XbNt)}Gxwxzsm=TKAEfR{PiWD$}5Tla8u*?4KE2 z>vZ=z9TVbHdz=t}qnl?-3TM=*a6SuGw|@9gL;Qu3?Juu^iy0-JdX}6v;*j2xnyH?z zb?fU6tE;bpyupej8Q&GtTTU^D^IFTj5hNskwv<~Vywt_MZo;P|jQX+Tx=Km7hC6uF zB+1r77d!77ZR8V2W)e18O6G5Y~7BBf@2+yvw=fV?37hqfDFxg4S_HraFWX{{LeNNhC%Oda^#08L%M#=S0`7_th? z-MTs5y#Z~xj;^b|U(|S-F39#j4UxJ9GM5=(pzOGqFuczPJHmVBo32OLJL8ZH%0`} zYW}SOGV^|c>j)YB`Kq)tt+gCWkm|2p2xosGvy(dVkvp`V z*;)j7?pRx}a@@_#YlT4L&Qa6FZ?^Iz{u6;YrJBpv;Djlh=C|;xc?8wb#kV-BCDy-l zCUl0w1SyQS*Mam;zquoeot%w8qnM zd-(z|on}4WUHuE-X+Mw7NcejPmDMx0veQmJkNGp?F;v~uDy^6EICE)|gPbNJBK%!| z->b;ON+s#9OD1x!;i=c)rFDq$*g86L<2nmrnnlXV_85sz_rp^%+{$8u!jHXM$UwTG z_Ip@We2rdG&C;My!5-A-RfP8%DQxVomEf6afhfC|KY8cB_cD>?a(9w&tZ`1JSf7 z@6M6@sD8**zD+4Mrr=1ew+G!z)304-(r?cHv8qF@EB-9eJ7Fj}Y`m`haBlxC=#;#6 zi_#$SwHFh)8-ckZ(FJuK#Y>)reATbn$nv5TPt`t@#QBg? z_*M$Jao(c)e(eks|FK0_GfY=VGRhE&l&Ms&EtTe_$FWQM%C}!G)&b@NwG!rcijSGv z5{$muYoterb!+#1V^(0 zt>66D6`-BpPtZew6bRx#@bnK*DLU_aU;T=1h#Qq(zTgXi^^16qu!az|1tfcjrWfV0x7dig?Hxq z6rEk7-{J!hWM87rA>lA#QfZM&RSL!!`O+mLenVjVILL%er9~-KDHUTBPtnOC_S@A& zJoXY|l&AH>IN=peDL$1JlT@Wnj8P*+r`IML6X7avjY-@{tk^g19Ow_waP}NA0RyL$ zm`aOpS7IIqFEG#4;F?RFxpRx1b*Pl=>i5VcJJwJs`Bhf53Jh22#Z?wMDjOD&WV0b0 zHXGKE5*$dpWy4wuyA1JvP4`yDh%D|M;;z_RovakLo(@4e35=0Ij-7u13j_$AAi#DZ zLYHPEG`9TKi6VgqvTB`zg~6Dfh%W!Mgfadcbc&O3Oa44su3vrxda49}NTM|x_y>eR zfbty#;z_jWGRW>PiQW+tN(f}Uh-XtAia`ye3|9DO5v1OqU%QPO^Xf0_wU@sZ-CL`7 z+m8Wmf^c5OvlqTg7YKAnI5Fr{S#PC8xnlgS2KorA0}xy!?76>#Hbce+8nU3v6H)lB zY(Y^FJ&3|T1|T3Hpwgk>#Jr};dM73NF~&cP0`4ul;qU}D6$O=)sC0~f90eS+7`(}E zL2T7Rf;<%3M{(Gu!j#+)2uAK~^K*w*0ZW?KI1} z0hqeT7d!)3lOUlm!*ysulL>I6w;pCjo2ebxx7Yt3Z%NByhv?6^X~n4FZ>{@eZv0)J z!S;QD#hd&^AXiT{yPwA2&=ppa-v_gA?c4)eZGltf0WrN^*je%$uy7M>!x1JU)E~(g zrBKk8z+8PUkhu8%NHdjJ&b!<~$8Jz){`h5?zosIjup+0}N>2GC=557)MIUHw!oefwXv$v^)UPgQlk?~teo%2ITCsJGuk;bO%z z59(-9O2UV~5;xXB89@uuekV_z@*hzOm&_uF1PrP1sgSFY=g?;?jn{~DPleKIT56ec5=f8DB5&Fxe$ya;y$Yr|bqff|@w>z0=x70bzDw!$UA(!yc>UaX_jze4C%XG9~ml$PL z#^_{Iorea6bhT*(+LcpMpUt^tm*Z8VflSvF-*~6TQ{Ga}4A0@mj$xo$n9nunCi?+P z+d4J1H6hp%us%&QFL$)R`B?EpD>SV?y6P5+z!niHde-yM_|aC4G~7{c6^x_sWKv+S z>-RxW^<`3cjt(O*g4aqjG57B+(pE!mhaOxx(3=GU>wP5$ ze<~)Y_{jt%e;OvIzf<6y4jeV9>pejr0|@^715DQ)qx^9%^y%LE7(0fG5z2%vHNP0D z955>=%X;xuYsaKA_)~e}*J+dvVve15%$`}n07Xql`1QPLx&c5%ep*n=7~By_G{~v= z3CurULe`>yRZ~lXrqgY%64D%lcz06IUx33Z`O2xgqAazoBvAjSXF1lr#RC!ZO`u;n?;C_s^b ze)D0>X=@vUdRqeKw9XF1Jgr`(r_J2CT6`MUtO0&KK@6$#VR&>{9YK zm?zcCB%_Tpk>WkSx$%kg6YtBY_(FW+lZSuqUbjSvg+<UeOS>xYYL zU(duj4Uf8uh$DwimGoAMjXTE3?oVn!GKmzMK#Y->M;sStJ0m&$vjC4@fb`VQDXdLX zHu(=KkKE8^qu&b-eIt0pV@X9S-P*c8iNkPrs~-jYxto5%bk;6VaIou5q<0R*_9Mon$I1Dzx0WxH4!an?)z z%I3{*F%+kbgPuk>86^%rF_sYu#74G2{GBdzoftGu4>6XNpg+7F=u-YfJ00kDN*n{A zi4ihrLI#@nfhH*8Ab|oB??EC8B&5WNI*d?3f(9fqV$cj%?t8OdQ3o>abcswV&%e+e z2wIIaL~r}oR|4#d4w`c8bWPf;+e5)8T5nY3|UlKzTKhp4| zaC2z&9`QUh4Rr1Lov56FsJ&jbTm94a{41+J#grdXh693n&*NE^xI(8=$_ichevz?yPzKV7lLBlr2kqOnS1~~&tfZT|I>C)s`M5nAo z8@L;V6fxdF?hHya%&ua8WonUOpBrB{Bt%P|yt%uUcJM3qmGHEjSRAtbb(76%0Y7Gw zc3xs_Zfbfw*@)rok}}O{lnd<*A(`1V@fYeq4EP={KG(y7zKGq-_eJs;UaafWx9@0W zg`v-j;m_7`nNEw4i~APwibcpMOfg;f^U*Q@xtbI4_Hq0-rgQpvI{|q{Q4d%_A-DxyK;0 zPmjQ%42(951Nil&Q4O|t-q)RADn#H6cX6gJUuNV)9e$-oLzm@6LpP|BD)(BCqdGk! z{2;nYww;di+JXg`8^mZlZfCR5^HN^r2iSG2*&G-!^fcT0S%xiu_#+Yi;lK*Vx@VC| zcJ4dikXsm9L3xiQZ_Wlt^6&j}MzgoS3}imvx0uU%mj6@V{8=}!flAAAEo4aiO88LQ za;@JOZS=`w9+c)l8Y~Pw`lK~FSsE?LmvZxS90YPv=DycG+UQFoE@)$qKO$;3N~4$U z8m@&O^IOLsN9)1Wp}KxnJuBIyn^K{w9kEpQBRKDM<8Nh#mwet}ZFuHJSwnA`0lr!N zvblwjCj#wY;Ih!S=cfSkY<-X3Rhe)&yI)tdTvm6gu{HYDi*i&%B!c_?nM2AviMDYu zMHFOmW~qA*u`bC7>{FJ*obS;@lq+GAL<~N9{5m;g!sR4oj)dfzQF9&y|E^l5*(mcu zI)RvzMI>caDLJ5^vW*Sessz&XX++Ho^z_G5a(iuUhy5h7p}!bymb9v*?j4vDQVC>c z{#kVZC*>`}+3F`lqbda0ae;as>|X*DP1aVsjU!j+kvLpXnI6+5YDAF5#7Q8fViJ<6hwe12bkmRV589jQ4A`&QQntt2 zQMTh-fbA<~`|R3hzazJ}ESjALzxto+kA0wsOZ-rF!gHxhY_rpVSv+8Wq6{hsN3qmG zq4Qq&53KVu#`zjM?Ru&q$zDGJCwWqHtIx1uZr7wD;z!ner=9lCzY%6BfmveeLJFDu z;G~~s#Xn+;D9z22Wqw0UtwLduMKq7R`5F7`Nn!tpFpyvXiE@-#IkU-j_PX9rrp4hP z$@0m!(fAv110@xM09V@smMb+Z zBtc*SFMM)0e0TA3cg_%1pkb70nG^cw-gBin%$K0av49s^fo^g7IB!4TsJ$<>pcs5T z@|NDg%bm05GU3Noz>m|D7sF533D&dtoUN$SlDRh}v$JsO(k;9g;mZ#3d@^bJ^kme1 zE*d)C0dW_HWfmmJ9no7as8&B|a;1hvxNy&qi4ZKOms99S$6ZJ(jF4KB#3H1KHA)EH)%ZHI-~Op2 zpu8&mi^efbyesfh{D?>y$C4eCh7yGXz)|3(R^;t4sH~AJ)@w8XfW$p z?mNi+A>fJ%Y&O3=7daT&`z(Vpv(1+i@qj_u;kfnU?xMu&zO8;xA0Lv^chA&`s(+3X z?-^3khMs|gT2puJYFj_Y`~|?J-AR$TY;}euYLpbQ1O4u>z`K+7D&0?dckv}5f_1*# zm((gH6Aq?F9aXnHVeC==Z!ELaRo2;S2eNC^b`&nGN9TZDF+elRb7K4zD8Yf!{~fc; zh3i!+$C-_5mV&yfoS!^_`mLT%YNEFU;W^zRXg|j5o0zjGTbcki4r%{uAh}FO!^!1 zQFl}AC<&7jt9+8?qgAc&*$FdXXp<6iR7JX>ISTa6i~z;H59{Efe>NH_k*x%o=lRO3 zq@u=x+}^F1);rucNPsTsT_&D4^vbv%&e!&^mZqq_wi|ioB_yT%8|Rc>OlJpH$i8`0 z?qrG|oJUe64%QpH(7Qm6V$9LJ%@mSMVHd(D_EL>`ls1g=nnS4KAA^*a4BMes4y!*V zkC(7>7HW87{jl3U^Y*DC zX~_sMbx!cs>5g%`Z%4dK-U!wihxoT^bV{*25ZKQqH#KAdtb^&63?mFT8nBAphjp*O zaoCX-OtJBJ=Vi?ja`C(x)h<$I$#oz!QBPF8f?!m%l?Rgcxl51@El}$A{Va#SruVxv zk*p9@gw~t3cL?*Q02vo>R0t5(9@Ec5MX&;YRlvH1xAblw6h<#po()SlXVQRwSzp_> z(DqU4Utr<@%QED?A7glZQzr-$Ul(~Sewl8UZ#m6V0!6S1{CaWMvukElMqi6H&U+SB z)>y*It)24A`UQg8d6}mG9-Xfu6SOi*Sl9IoD`^$Kg~SvYzba0sQJG;XuZNuev4!_{drVEmIr5F}zIo7PFoL{8*|~_e#Ahq?rh^9bMml<%<8xBXSycuthW+NtVpapBMhs z{xy?OUijWn9810`o+t*Lev5Xl%Y|d|RB!0}yl~FaI2N}v{V;LuMtAAZYNxX)X~w+p zRqw=G9eVxawdUGMnFEu%HR?m_e2@jg; z!+s+}eAf#gGhpG&kZpb|g1Hv_Y^{K`C1)kx0-q2cXwJYCr{4hbw#XJlI{zDL9yM9> z2Xesl2z*x6w76!~j+2G_HOqkc4TzU*Z8YGS3UE6P`u*GUx3CjvG=30MFPV66ebj+J z^1!ND&wtgJ_vm-7=iTg@bNo&gd1-n4$n=aYCq!TUwaFP@esZhoBck`7u!48ukHFjV zPVeK@loneoTL*DcFCC2#QrHrqU4}LK`cp#F)9w5W_K{|xcd1rxlpdcXDYtc4lZAA- zPCBHeVK8*evO!6O?+63xu$*b>OFXrw=anD7X+m;9NNzcXYLg;p@Ep3z}E}xkGk8NLDswmz> zDpk@gkBXwu?J_0Ye%)M}C|*f<68o?eK7(@5IUToSi#FK37DA#H!AEvNj;u}@HJ?nS z%D?6D846^1^;~=a`;r#;9?N0;+-6s&in=QU`>})lNUgTq$csXkN$YVNyg$jWoazfW zHq*}boLB-M3Yi=QmfA6kWmn4msZ@=(+yak#PEMH4fD52b_ zJnyuY{GP5Dp?dt5ZF2E3)DZ8qyT-`WfijAimju@E)#k6;Itjj(Z`3OXit&-UjzZ?w z*e`fhG0GO^be$#CZCUVI76XHu=e7LdcRzt>R3bY61x4& zV2wrQ#p!AhT|Eq=1q(@^CY6;eLPn@>Ay&RulbJFv1$Eb?~aK`IkJa{Srs=R~t(nMJ}YZA^CXW=B}fAh#D;zm2Mu4 z-(MB|VaHp;k-4oG?b4MPTqBe62&Y?IMnJX4r}l29*aU;$?1>c}&Fx94T6{ke-(piN zRYnIWSx{->y9%EF)FbZua|{WiulRnI@N8%Tw2Kuu??E2T%?KWk*K_VOzor;5Y_-(E zbkg&8p_!Io>6nI#bs;=~S=aWz$1Rgr?)eEH+%uq}Yp!mbz$PsOr5UJGSu#zb@iSo| zxV!ZpeE9m<-a9VCk(Nn|>FPJhx%lwu;cTmISs4G$_ag5PuyC}Mm3-N{k}XFdN|;O_l&R196`5!i*YT=a6U#~0XsSlX=OmTdpA zaNQjgYVEh;vYemUM%J>sFip!tx~}}%&19%QHO(3+=vi>9PM&sn#<(Ct<@jLbjd6RS zLF6;{jmv_)K6wPQJvY~RMEh&+-NgNl_2}zxp{LnD+*gjv0P^? zFYL`;f6#o@l_IjtSpP}6lL+3vUG{UYA4bJPpW_|AVL91Wfr|*%9o+4&V9b(2S1M{O z=TAd*I;sxhmF4?!3roMh9ECsE*hF5i>DQ0(ee*Bl{=i(n#%JYU#veswbQBeGR9%OR zdK6v2#76o8)yqHj06wFs;~I{78Z{=1fI^J7QZexWOfANa$)cqY(-i&I=8urxS*0Ln zf39ShFF+v%5&ec4fFLA3=z>bMk1La}%J(YZ06$9Hs3|Dtb&}uaW`|tA10MV|CrMC; z3x?!7Hs5Y#6uG^Bl)ygXH2F^8c zO^{r_*tZNYuMk;#{#wXi=uF`3K=Bb!sdxZn!GtD>PtW7sJ3alt2IUyLS@NsaTJX=> z)CV&xvj-sHY=*iq{F8McdOgPQ{6Lww>HS>5LljTgQ!Y5C;6)$uG~h10~ht)@SWeQY2od8|+ybu5EgDE*KrUX_zaV&+XqSkpb7 zvPfk%>f`zRb9gQ=6c+^|F>e~|#q7#0=8uH`x zxxIU8evtATSd2*=_4GHi;6>({An{4eb&f$o{%Pi^1vEtihFMVfm|B~o64^{&a@TY} zYpx%l(y^q19do>r3!tsbIwi2@nc4dy#r;a!8 z@!^hg5PUn{Q%s{W!E>}`z2EQ#Io?n;1RrIv6VA^t|7cKH*#`wHT6{SD5H-%#?Drd# z3JmZH&MM#-(w{omLBae(5lYfV?t3Fe&`SLu@k0#(9lr>LkQyAUO6rp+waf&6oZML< z$^y#2__8-}$(SnG4q%NF{T^_5Ne1|~9dHmYusgZC3idfY2KHN*aLQaINfk?EbJl_Enh>neIBWaGh%i0>)NR9He-45+|S!N zevmm}FO^3AasjEM+O@GcgM@#0|B+-R9d-6<1VRflw#64~~j z_dVFRHNWE&;nD1H8-p& zdU0SZCEGHmgnzjoY`u36vVSuv3_G(0vyGsC>H--0*J}VsF}t&0*fvsnx*ILcNO`Ns zW0=rnoe+REH!*(OZ@70E$DznR|K9kPogHK*j76Sg;zb z&r1T%YvPA*kzE^;VIo`6V(8%}$77NFQ*sc0l94y0WKe${_V?M`p zM(xLJVg_n#v!zA5_8?(#^pRN}?YnB&9=HBY%Nd8g>HDKD)^|Tz5Q$ndPK2B2W6otx z&UTybIW_tJl}_T|>~DNfFhiNK;;PP)WjS+R+<=6Vm#k}rmggs5fnJzqXsZz)<%x25 zscDXwCEbIWKpaZS#Dyb}WJ~47wkUN>(Jysu6cD)3`4PD)5C?3Xm?p^Gq&=8iRLQ&8 z0)$_v+$QG4jzvLphcU6^te~F@Vlh7#I=@m@1=f5vLC$;|N=m|pBfxh+;Z`{c`l_lXcw_N^j-#`(cp!(jDkvW7lQu6(l}QSl8SMCJ8cF%L5O{^n(w3ivtge zZZTKmjxkr{2NZjmyA*rt%VJ|9U1DSHq%ulqPA~}Hz(b}(%vB=k4pam*6|tw9sxF>}@*A@mp{mgW)^_uo(X|e-3yVKDUEO`(E?U z3D$ubP^a!N8lRGh{^PQjqzsq;{aos_m9jy0{uvP|lxJ#D6agO%6kb+>t~bS6h)LKj>c06RSTS#`zdtvf3&N$2A=)9O8N10RLx~v0NShV? zLhVw^P#RDAk9X=xix2Id;v!dWr3D&Kl<*r*=-r%_Yp9%-^KcqZys4d*DM9=aY^`8h z1?5gU<4=ROnTZ3onZE{Y$t6%3BVx-q8f{Z5UzW(*Juzmi@W?L(#M3sk%2PDh5)9a~ z;)3nKmn<8i(GiYnEVLCzLw5$x@ zcw!ls^=ZF8ndaxRFn!Fja3D@?aaZIV{b<*86)uaABm70?I5SfUU(`6uNEx_shmi(| zK9fJofzhj<9)zKHX~16iE7?oApnRW-dx&eTf$BCCumnpkuH6EstasmUFr)R8#%=AM zxf`4hU-kCZtP7knR*4=N2719T_)iT+aMr_9d9OxJ`9~K-=iwpspO?S_jV|hA6%OMH z(kRzYjw>T9(Rg)6aHtKnZ6%FHhBx;Chcq!M>i-k zudUC{%RJuIn%$aEY$8quFNSxqcA^EA&W0mb3bd(ag6B86r^pEMJ|8tbLbyNpQUk-x zJb&@QSw!HGVUO^4@o6>tzYuhAckiXlemBsh3`{!XKeZ3{*?_eKJWMY|`t$7M+Y-c| zQ_r&t#xG{CM943&k4Sx@@hi@Mq8V=Fm_YNh5fXRsV>ktbYB^vO)V z(~cEOrF%PemuM2$e_n;$m1|&ud%vdpGFSLX-Djm(Nf;LC<=XH z(Bu-Q@YAa zcj*zYDM23!O+K#%hKF1amcUH?nXjs7VPQ3L2AvRQZ>>PU+IO#g79Sc7zE${n#<$v= zVP~FDa$IQ8$t&~2ia({v3`P{jElL6cWwjHW*c&;nwHZnPB853?uXmmvi8ep{@CSP{Z^wcNj!}2<6l9>BNCTyDHrs#HNevYk9dssk)sWeYx?DOm)ZT2 zbMt+%sLcs00)LglsFtIB`iG4(Yrs=gUb``^;TTZagOr&1>_OIRZ^*5NhA&83JK>FJa!}6IrR1 zd@imzO#>GDa7d@tOeWH*2*;cg7B=SejuY3lyq*olZq}+-r!3ZmS?vCbvG`rRVKKg4 zW>WEvdg83f49T;1!vt<-t!?Al9`g$q1vajNO#X7GMHZGik-Z(quncT)50LY z=mCNF2&qkOQq>pu+8*+YeXu<;Q`yTgFUO77nxee{Q?f^3rK*?qZ z)x#WMUJ5ZVj*@0#7%OKyA}1{iy16@deVAKsh4n6K2Z7UgL{%ZD*8}QT5cb3jU}qaJ z_zQ4jhHDY$3P9a60p}b{>B{=R=sDdSNO3vXP1ntPu{ zJRki4e$Ns`06tJ)w-m@-fgX3^oRzkJ&Iv85f`Jv#B<-(6KE;<7e!E{E>B|rVPGm3( zv9F@rv*(-poby=R!_;io*s5}pBkliAPudNI91bI`FM)?V7>KP=MPvJeAL^4c3qaBI z;}+0_12ns*)>c=NTL&iG`!-b2uQOb~l|1TLJ>&_)inR5+t3if!@PE6NELlEHIYC*g z7PV`z%O|O>{b(n`s(Z?2`lpmZDqbKeG+w~$`*8a9(vZFv*H7y-IJev?sV9+5sNw?f zau3o4BfopdWCKhCa-43F)1FalL^h5Ulb+!$AYI2;d{4OMkdDPnwx^e4FmSyaIim07 z+2Yff)!uQUlUnX8?Z8KuX3I>2ZLedb@p*ftlQ}}uv~x5iadv6G4FNkY(vT;8Xj4LaX&5`MJIa$;U;G|%po34c6$ zAsf6F#!T#4V#)1UvIz2MUoJH`%`P>lIXp{jl3QjSl3Ub^<<=N9XzcN$a1sbx@pa8F zH8lD0j!}9S;swN3Ej*fd;Tp%!UF_kT?$H(Rw6H#O*X;6P-7Th{I+C5%2&`@ku2{G? z^?UvqKXr+|a>!ggAlus%Zk`qz3miK|xDnSfWBAMtRj%qno0nIAxn8FDW9G@{ZhaoG z*n5+Dr~))#Mj@zwof7m^2a|Tpp3(Yl($jbw$4c9UKYT_$5-D1U)8EjAL{~uU)_N}T z3~C_y@~{f_`!V2#2XKeXy8H4zT`y};lgcMs{}`Du1sdt+us=7AWuZ9aAv-vyXKO%+ z_!yy{JF&;q4E)pThJEfd_ZU?W_J$eVTQJxdi*yFy=6#vwa}Sp7_zf-kl;ItDbO3Zc zj*I@9g=j&dF<%rvLq*bc_OAZDcDVNd(zn-;hArs&AHe?X!$vAYGmJSeqMF4! z4*NF7F?F_DCM%9Z2c=d{EEaQFeEECrC(*d@_Y$5LU5qTRyEMKad=d@DTNLpBfzBTG ztGbj^nqg{Y@gL!fj)(sAbGQ(`N zM%BFsAQDsB!dQ9dhWPn&waf3!Qvex#9INv=;qN635=1{R8k-L<_I^XJt z7{A8>Id8uHIWI{EoB!3)S;sZ?#eG~9q*NF!&FDr#1c4DFB&0zaM5ViPf*=#5 zB&DSrqFyZ2&;32m^T)>bzCWMu_nvdvYuml|?3{`VA??QtbLHEMFZ3Gi zEDOy^DDMt42%uc{nu3#l+ikT@k5&zTffi!==Ghncw!WxOS03HVcV4X+1Tb_wmdndxYhfH0>{wJ`{;t{j%Bn_!+ysXso~xUkiiYE9@iEpO1Cy zyY6&Ha=O_Xxz@*q^3lJhGW{9J*W_MR<;+?0XRy7aMVJ9?WN}OU-!s^a&ZK~#Go^Su z!~L@<7v%pMmw$Z!v+c!6Tx!1YO6#Awp>&9~TvCA9nQIK5{=U}~M4k0`MxP|_Kv}yc zr<9x_PsK>+=3j!9yK{~WNIiosR*7LvprF=>>>qUNI&577|=47LhQo;6SB)@Hk4EeD({{ZF2q0Dae}j>o9&YHOWuKTSy%mr>)jj#`fi zND9w?9EnBwJQWzMieEXv?v|#MDxK-H-AH9w;V3ng`REjvIS>B)aWjKU1rcG#mHW-d z(v)sZ*!fIEjbKnLgpcJCWk!zFvmxvp!IRv@mT|?_hswj#wd7usERO*ss%nJ~Wp4|C z4^-HM3&dF#=2!F!J8KQ2xva62B=`9G$1V z?Uk@!epONB<(KsB{BcD4=r=8e{%L~vfA=V%|L$=nlN!k!I)GajNIs^^hW_J_R*7U1 z%zGCJXWTLOP?2ZJUkS?dWn}9i!;ceW!@I5qs(yk`(y#ww))v4gwkXAeHBQ(cqjK?3!HlAe zPRdbT;WBSd&BsGvG?|6tbDSt!CGR%~aB5frc)ydaC1WpvZ@m)|b6F-h-T?N%O7R5d z4j7_NfT+>ni=Ir(n5goIux_T9i{q2uEp2nAH^chMnF?mZEGE|ZEoG8wXX}kg+hdN* zVyXRVk*9Y`{;tB*qOVQkXninn`{P;X61)EUB}UDZIwxN^FV|7~D<*;Mx)bh;wu(cV z$tM-w?Y*#uU`e$9mT$)hZ{B5tF5||++rC429UB=>cxiqeT(xwxo&D^6;g>>lhZkjh z{B|yeiCqe5hkrLRbZ*iME+3i1sxgcO4*3|Lv!eY@aAa1(tpiiU4UbyZF0Lxa4iZ`v zNB*&r8>%j)%luSU98L7cefTer&PH{@&?DbG#J^-FzEkIbShZvX^g^y+W>3?84Cc1thH#`iu zJP`s=bHf-wAO8d}13{n4FyND%3b^n-0noCqvDut(Ng)8J?ZE(epRNE+wspWq4a|#6 z1uR&e0EkcaBBf<=*8++fFwQ@C^Gl~ z+_ztC|8)*Iez_mJ2-sZDU}3aL957(@@5mN-Nu(dXCREhHZ*AQE8cRnJ`^*`cJ~J6x>H6nQMP1oY+vF;#kRujFJST0MFCIl)v}I&U zqui%*2ED*yviIEuYa$MT9=w67}ET~`Trm9j4#LdghhN7 z4ntIW)uA3+Z&p_%=dI2)e0(`1_Hoq2SE1*3+D8Ewtm8O4TF5g~XJUeXyPQRMVrz5R zGo6L!xG7J0TwcL*^(qjGEJ)^>s*OmT*hd$)i zGbb`9uN_zGJ_W}8IA7>&7D#RU-}fp}cOO7wSlVBFX{MGMl2!Kn)fmFZry4dqoKQRU zRE1)FfF%7ZC(u7Eb!9AavSt82YR$@g*zivl^B9IbOz4L_`h;=ipNvTl{*Y>%?v(QR z9OAcc{Aj&-fi`txnkIE){o%03jHuAqZ7nF!-Cu9!l}z1`aj?u<*s{zDNC)96=%xnU z<_92%`rx;3`1r2e*Nt~RYjMTH9%EucV@~ErQP6uXcf*Cmh(#mjCMpF`~IXTpv8fw0f`NHw2Y7A9cFI5UGMO*)>!6*U$Zh+t- zAZ2~037v=f1AGpqKCMa{->8Rq2BD3(Povs;ufMtCRH~|+TPDRh@@iv-PkDzkzx#3B z_BqJ*>@Wx1nd#b<6QlKL<9J76Ks3x~Iy5o^L^O2(XN=@{XE4t0#IH+1Id2_}{rzjG z&n(!vqRIh-feS=nCcs@B#jZsHo0Bw|WPSuuE-5Bnzny@T9~21N}) zrF*uKn{ZwGpjfJK1J|yZ9MtI(tn2cnk9p#5{vo>S6!!sQdkO4CJ+{?Hk!kD=@5VUND{CsW%ze4-SnqMvuOdR z%*N#mwMPZLRv5jWhztYWVA-7G&4-861Tj0D8$J_s^!y}ZeCnB06^X;;;4T1&>-yv{#U z)AE7WB2v%8)wf7R48JVplb*+6wjFee{!Km@3fc1T6Bs(^+Oae>D7hHlVLT6TFz~2e zsR6wUCZM6Zx(y7+%qdIO{}4VelR)}v?k;k+<8!U_nmt*U!G?Q3xfdRZ7J(qMW>3M$ z?2b+rC8jbQ^e57y zOm^~_(tSV3ygsA*e!F_NwJhtd9`Y^P?2IBumG5SBn_H`Z>t?^Q=+0E`Zfh$jey%y# z2NT5xJ6d?9Osc82823$ZbqmdTviZ13FpTa+=;IbM4~;fqUX#ktXwto z=5W*a2e?M5^R)W}ZOE^bTAmwwWi!Rk_)865!k#?s`|{?v1B=cBd{R|MxaDsiC7huH zj%Vn8iF}csu-OVefjJe|Aa7^-Z&5*Zz>up?gF>`N&^iJUBzAH0GrVC(pVg!4K$>Oo z@{D_liLLBDHk12)Dj6_N8uRYfeS=3u=SyeEy8Gd}7!uC0oSR_r*uND00dDs8TQ-^02&56T zWjpm#Y^O3$;WIYmHc>`1a@4Iwb>oJBsWa-z!SUL;$m2#c(eWPRjTyE0;_E2Ei?7bE zvx-)S^Gxm$@R#-99C#srf|DQcJwAM2#s%yfO(qG94K1V(B@GWfw2phO1( zcM#0~2b4j;1cFcy&`yFt<)qNHffk$}?4&5$D8VtG0~E7BF%lGQRY5lo2r5A^_#aRM zfq)Tdyx0?EqF>!h)+xK?y6io+ z&xu8TzZM)ht@33?(hF-d!?f}G#op77w-M@vtZU>v0xKlt_>mXmu@v7QNs*N%kW;i> zJ|$mBhv;+_Q53KI8Fs5wAw=OabUwBt|lp+3qn>@Tz6%ZAoH#9x=5-7KEm z=-oSQdB72su73;3sYMB28lcVd4-+eRhWc~ex(|LUXw^rqx114tfhNdb?rR9X(2j4s zVwAfn*zC19oG=tTZolhu*dDXH8es7XTv@mFORPklS!AYI!a=Kj{BJ>#gqg8G^KICr zqMfXN4Fz?wz|TIo+C7K!r2F;G+z(qgR1``t{zPPyLLc5%;K3Zbt0q@DKV1Et9>gHe zV27IO*WpZ8gOFvRV>Xw-_2=B*hLmL7dRVwiI_U!4H^e3r-pa)3Y`@SMY^-`w(#Wqf z-*GfqJhoae;Q|vVIC$J`qkh2mRv>m&qvRpmiQYq4A%b)H_>G1PZ=FmwgV%?#lHnuk z1^tv>Nz_W8ej7)0?ZHZ)g*3lLHUCDoOpRjNWpCf4h{N)iEC!TbnyABH^}dl=SU5C|6#V(=P>=?9ZJ4w)@L=V!aSB<_WTQvGQlZ~?*af1n5iSxxxI%J4_b zP!fU=V$pbf8PdC)r18|q{)g~2e5gAv#4i+SDhKaihT4$EizE9P;Ah01?B|ECQA6DyK>R);O%>oBEYJP`yrQz^X=aoW!nq=w@98YNu3+bLuq5KH49V=;&))}TnNv5Uk~f@qs9E-SVSwfY!e%671{>GqGl1F_d@^Z zJ1tF#G)^Nhg+T|qn`4!AH^&L@$wDj}=``FnoSs#>5r4)>uUO%!5t+qdF6H&c(JJNQ z&~u19i`wKoG=vq!<^oqk;99Ez zP93gC9wyky;r=S_pd96&AAVFkaJc;DH||tj zQuc2IdIw9g53uf_5FwL-37McXD0A=%6G$I-vxDqXg{CNK1C;PKDj_3 zZf9(xP66G48`xDk7N7bzV6}0W&8X?+P-ehRvC~@2>}pwCuo%>lAl0UNhY2mmKI0#t z1&F9qCB&YhY_Xi`C7rjZ_V^6&&ib>SpfCK~5(8TUUpwM}_7#|%Ik4(;gnn$@Wp;(g zNc!&BUO0Qi6l@~5V{uCNZ(F8n3sL?=Y|a{`9e8UPKDdLr)dY$-%`#S|4W{@pMXs68 z4RonZfTIPXZN!92Vr!4THt;K9vX{f=3Jx4-10+x7rV+3S03*uZvctRQ-I0}@wuj}% zK5uJPJ<)cvHrtw8Sx4YIy?Pb3G(C6a-(l2*j_rqZvHk++)r`H3V>FLZJWjR~x2S)Y zXp2)+qKSr$I+1_7!8oN^MJ-jxUdmyOG^(FWRR4rO>d!sXo7Tl<-8_NmgYiA)OMaNS%Duqt*%qB1(5e)5|misT7E zOulwaf=UNQWPZ!QfNt-TOU@G*rXlnMm5b(Da2$iRyepy;sr^MJ-F)|yWg21Mop^k$ zSv82-!AZjf1K# zdlp>$siJDeO~<${40g#>BYf=q`{0-{wi9+cyVYb&P4L21Qo-O0UPMreMLU8T^)5Wd z!hwN*u25`cW+ZhKWfK#(+{l+Sy+b*v^tQCFWO8P*uq|OS0=6IDuzwSVZm<&vCc26W z_NuD>cx>qZ@%fzIiO7%)K})<5MU|;3*!lSKp^Cb1Fv~1A`Rzq6syFwpRc;X5Yz&w7 zWQfCiDyD2`Ml<)+*4HfCzF|2crD4Rp1BmKgqVlr zqfF^nY(Az}Qa+gQ@X1f#ERM5JB}cOz5sDXfLnke|^|9MByy;~(ySZw&D5k9p^6Bkh+P71;8NNanDNPm4 zD5c8LTa9|=i;G^t4f8Udb#oH>gn-+WutlO1<6}yT(r&{vGWMf6;}Ulrj}p~D5r?V$ zw*~gw!qeN)F0UN)Zbywp4$JG;1tZGq1?cOhWWM(r+ib`?^iO|?Y$mn~*R^*tW1uZD(`(sQr2B@3hlXTC0% zh&<%dhaQI9{7mlHIg=f$DHy`+i8Pt|X-Zo)AO=2VT6EZjFeC)K*95Dk;&EL*Mo-Y- z9r`k|sswW0=vDmj`^*r~RTfREx|Cdf-_2D|>XyYxTKU#>j^()_Ju%X4hdfh(4PF=a zdz7}Eh2<68-r=DE1j5e>HCBe##r@u=EoXD8dXP*8sbGg1tHbNkkhT(bzm%%8!Yt(= z6Oqtdc15^DB$6s=dgz0`B77(kIh`~;_90vm&KreHP9`nqhZ>v0>spYuevpZ4XfB=- zocA*_nFdnv1Zw;SUN?xe{R)|o{M8avJsxIR0GZGs53N^%M@1tI(nsK5%5aC51XK)=3Q3k%-tfBpFw4J?i9zzv0#MMryqiF695kPFmk$OtM!-++{4S(# zy94#VD}Q(&xd|bi;APIW$uZ;q@tip~LKZF_%Gb_fsq6Rl$PgOw%MP#!)OhFm6uNK-)lx#6dJ`5k{MNGGgWa%VtAkzhGW z`2C+w(upXRTuueJ%SR;RLr6O<)c+~`)ET+?mvmx?CASC^B9M$Ekak9>zYP2|IP4D& zWP%u)%L#|OAd!p^NIMkjuLM7hL2j~eYvBrhLS~Uc+S#H0>hRMvX3 zueSVQK5|n7GLZ+(HB^L;MIx6eA<}$MeT=QgmJC7S~7*QDR(4}58teX z-0sP<%9n_Qwz7uCp&=}yvt=iM^FT5 z{IssJ-M@-dIr@7&zb1~#-yGCUTWz-ed>!k1Wv!6ncjTRESMqHq@yWIG zZ6Pf*VdZpbp@25G#o<&N)wYFn{)J`?dYzkRh?mqpbEEmp-=f6%Km@Q;7%ox`+U%x_Nl;dVK8G42{xN=zgCucIxJJ@8Qus@tswdU~8KEuT@N^8t<)DZZ*zXS_Phc z#9kE!%}y@G^o?oOk!06&Jz2@)+|^_oas6zXQ%mui+jK$m_RB)sE9SSGh9=J^W6i5=K38n^o3<`E({6gET9{ig zz$%4V7izv?Y`W3a!p8_B`kGoWOCbM z6G59b*Rzuyl$&QY=>XdS{1#FXmtmijBD(f`CJw!SYG}6fQAdr6a^F>5eUUE))uDrI zX%J8-!_!!yQ{1z7ExOgjiA9#wwwj#+TG^pyIWWA|oVygep|o**cl2{CsegxrnrRUd zxy$i$_2W(DFjN2j5NfIgk=G(8@|M%*n#J?_W=XC05j4?(zzYOt{{bWjSV55VpCcCp zks#m&%hVIdwS$!?S#ibkKpYKXanSb<^ws|dVnG0_iOdQ8uMIVp7xssoV0BvXlatqz+sQ%QKOWDI%pHI_5-eZ?Jov(ZJ?de&6CG2af9z20>? z(=+55gIz4uAlTNB6DWShQY?YjoUs(t2R+ zasB1GT)fT+`nOJ$OPVUb=5(C#o&f*A1x=erEK3ee0!H~F%&0cZfMk92YUv*DG0s2Y z;25`&A~!~98u12ek1dqOB08akW``w+`#Uj3Vd?{0^(T+DzOpl;QeNFX&gdbFi+Fsu z-srA-1sEE9VrRBdbX7haBZb$5{gYoZ-Y1gB0cwQ(h>{mXA8YSs@lXEwZ81|# zi3ElRSn=6SzI;HW*^OaW;VX|_}+P@OHu3HeE~MW`)9ZLXI^pu zaQ$Z2fxQsoFj3FqzSD%pXjUZd02p+<;o%15{|oWR?k4fGe5Eo!-Qw3h9^MBT$=JKOfwuoq79TxaeW6; z#6xwPu@Mj5T&&moU#|GOzL@`+Dy-YfNykr^)g)CE8c>&)ikyPxay~ zq`A>m!C@-R2hyEElMd8AHMi7VMf`hRCG*e2#s)h$1HG+3xn3Xhb~TgehK-@qt)HVV z{T8S_YMf#=zBpMJ-=FJHMK+kxkUHPAn5Zp?4@x#fMGwvigohELlO0$B18N&wuWl^= zwu*>{gJ15MG1XTde+LIyyQah&iD4bKhdezp>yW4;m~b14%N3@f|T@vEFn6p9~nW-)kK%5U(gid{dtjeGfKdG~3VlqNtu z`b)aw?(-(~xx1QU{EZ!bB7$RccXjIzUnX4NX=rK*>>S${Assq7eHm5RJRgoelIp#b zF7|payS3D}DWG8*_*Z`x$Mk3ib76FWk3sC&2^Ox+yJ2L`hH#I6=o}KbUR~0Uk1$o_ zFyL@4$EuNnav2od0Tj%$0)y*BmRBYQK>Z7F2LaE(Al~}S;xQ=re~6hNs=cl%k}v?0 zM#16`uxcp}m?i)Q#=RgJ0c|b+6&iieX$)GQfP%0v?$F3K>Z7n!U+=w&XJr7b{kt=Z zr<`SgBp>K31TBMZU?B0JvkOd_1h;8-!F|s?u&_LqFB{uNdApTkcZfr#5Oa87a}+Gk zEDoOFy8PHinL}RP8b*S_`s}OQnUkkryPUwr4uFAJfA2Ob*Qp%Ky9frx^PrJ|t_qy z0s`c)|991OVt_+UHEp8x*s%0qAIJ+~1urjjV>CPaq|Xtdn@?xjdwbh+3!84ylZDHp z|FGwDZu&98^4yJxlSr&h?CvMJ_rA>c0xfP0skVTE>HZr8xNs;c%0SYfkkbSfeSB?!m;h{jlX~F~ zuK~cDY0l0DW!2nT7t*!wo#}p|2Pn;&I21d(n7?;IpT)G?ZV1jk3N+C4Im}yXP@p^U zjHpitpHBjQgJ-%^1{+0Yk#R{c|6D9_AyS$-pK+)O@b8)v@uw=wBnuJ?@Ap_`>` z#3;<<+q|!^oAYRS_w6kFT?%ZnzId3BKPG#?X$zxjd$v5i*tgpnHtj*R*6^L5dfvEa z(R;V}H8Ov!094w|AI09JJ?W=Z%HTou_UnFi><-7=M)4U0kU$CnOpiT0jwZGyD30 zp9Mx-^(>uAtektca!c&FZWLT4e+q)fN%<^NDMB^M+9)C6s@$fedaWA@GvlrivdL`P`m;~TsB-XC=@~%@;R~Vp1ckbiOLIZDQ1p>!}l2= z2>lPJf`A7EPgIAyN&5f*|}6Ci@yJ6;Bv4j8w6eXBGq5ENFDsB_bhs37Y(Z zi}y+3eP2U(%8R`Q(AGeN)-FJ? z9X(LOhxmecooh24Ed3s%Fg4%$uS#d|1cCYlOh{OE=SLEUan1;8!}tXx+|*Fz*T&9s z_O{xdx+#*)Qmj5_99d(ItFq8M*NgYQ-Q-%B( zpMa8xnec@ws6u%a!F~tZ9D-IAEFqBe4VSv z%FJUddUxf&Ko|^O=YfIbe}okmGWq#lj|xF<{$qS(0x4WogoKoLv4gf%E z6VNYh-9hLZC+z}3d%#drb^MM8!!R)Nbn|8;ig6>ur?lP=J3Y7F=pGy?d_rmG(Uhp7}?XHMO+XPBvN5XGAs;mRvQNDAZ;^$F)H;n9Hn&qA%%LM2b1IPV4b2yo&%cMcKDfV^fwuWU@IE9m3|X z5?e6xv-?aWrAx**PW1B3kX);2r|-nJ7LABJjkqy8k+pIe+zP`b`~FG3ey&hVohn7| z7lTh-zLPxKG`d9emZo+|T%Y+_J_||=N`1U4Z9^(sdD1IX!`!UkbiO??hAL~58^@IejrICfesQt{)HiHnh=W1c9BQp9>ED6km5<0f8s&715_Vpw-e45))5m`0mavog zg3>X10~ppzs>cAgY(NUi(?%PxICUje0X#@Qf3GAmi$a07AW{E)+!T+9U&DAfmtuEO zPt_ZMztQ0&c+AkoLhr|z8*B&X=t8A6@Up7Kje&)r-jVllBfU6^cfjv{xAvO2 zALniMJ~tw|MMdw;95sd5_10Io_wS)3ysD z>N(0)Fhz+ss4ESO_!p1*zleGu`YPbK^ix1Yxv({L_G(n(Xl+`-;#}ECrg*xsr#K8d zVfyZr;`?yc1Dj@-A&-C26Qe{otw>6nTgOVzTvWff#p}viHwi;j^1xi}j^g)?WTo}x z=pEN~z+-Z8!?cn{WQERS*CD;9WBco9@JWS1&{uwgpv`ompg|%B;M17V4Z?d|lG!%I zOV&SGOu#Wz%vnRhVX>Jp@-j7KIz%kO1plQc*ZmHYNy%cbRIl-Rf}KB2cGH~+hTI?Z zVhtZi6jVRb$JjGSvW-ffidVdz?IoMGnpx*%bV+jv!o1=CdB_?+{kKtvQggW0D0>#6 zV^#e?o2Hz+g3!#Hmn_RZSEV%GSz}wqBtEbpZDkb%ZH2WjI86WiW0!kJmRLaPR9bs*<7>x2yq(#U z$%<9upd1?UwK^}%nNlR-9tUrhObz<_w4yB1COKML%HwsV*Oz~7uO|mbBcVf6cbVR3 zn^+Fu2d@7E*X&}qzDKkhxUwJHN!1mu6B~ukJnUTgqvN3pZG-GLT9ec}YuvNaVC5tER zM6rA;)L>Wv2bxi zd3gS+dS@mCw99UA!s@@oWE<95&8C=bB=UY16cn|Zk?=A!l!TpaaBlft?}~X!1;JWJ zsde!uuBa{EwtaoTV9;1H>-KNN1Htb*n1i}^o)~oO ztk)=mTiEDW(3Xv4@ZR?rPmJ;1)=}}h9l0ki1O;1{BV*=l8HSN&8<@9_hV@t3wL7Ll z@kc?OgPER=(bkxTm+xkpUmeLX2r_n6dJNQCc?R44dg0mTIAbnp?j2>e5$VSviFyqn zwk{de9)2|N&OGq;%ZfoW3{`q~MfYuDw)by0eMd<82xq_-x!uBIc#IR8W8x@alKtbt z(8Sf5rjWET4D9y(GYv@;i?&=}`XIm6Y?j$ZM3JB5@^J0WVvRRzCi?hFLUQ@37hCt) zu4H2$L+Ijfm_vtIj>!kME7E%lKx7kmzVhq$eyLCII1 zZ3hhAnfU%*MJM=Kss*bG4?ArBJJf%96*ezb`b9hgJ*oQ+H#j`8v%3!@Wg245Ha`8f z_r&&;?QLDY=`r}YwJWKaORlf~F-8&aC zu<(Xc<{e{KC)aTK^gwuvA>OYMe8Y=&)b4qJX2-gGs0Vs&qV+;L-SY-m$k|w_Zi)n`~KIiHECLhuU2A9P&NJd?(xeVe=UC`ZB5&r7mL9}rL#i#LR(RLExy>FCp z0lyBwRQP2EaXoa4$S_Xq((9hida2xO{dB9!-S1fXc4g@oiSJ>|Cz2LwWi9h%!RhBa z>nAqxjvmDG<13@8*RK~R(Yxz+#BOjHwPJ{x4uzU|uBKZ9cg#A@1knB|F6}qi=~m9b zIG-$%)h*1{Xsg9fK$>r0V6LzzkPJXOV5@W-)-c)B|CpTAg^bj{4g^ENTgPBmN-+Vn z{7NJb4;2P13iJk#FLE&f={nJ0zYZ7?N+eTM4OtZM*8ovZ)%Sr-!7HYWi`C4nnrDQF z%D#!;3J&igBdAk{mEXOMRLS!vpzpMJ`76aE(LE8ZZ*F0A(-;#u)H2K4PX6Xk(Yq~PP1Kv>FExwiVqU0k#s_`7 zQvn?g#YeL$K_gValixhBKJ(Vk16ntOj6s>%=I&v$H=8?*L$1F~F3P1%KkF>|*gc~O z^;bKZJkgLf!VDXX!gE=Eyt}7OGTqD!AhNG>S4p*;3pfg7-MC2Io{_q#kh;Ahb+hfS z?mT2(A!S(+Vp-8*S#gDQ#c8WjevE!sE99A|6aF_Zk>>$Rfu0o&cL9;YCuH|0q(UUJ zI})j&M)jR@frTJ~1`_cY5`PpFOfe!u z!;Gys7_AdTeIS5NKh_j8uF;Tq+!2Q;)?qNn2Vy1l&Vk?+fX<^lgZdV>L4pM*^Qbzz z@R4DER@vbzc+f2aQ|F3lT~`&^i^jVSkk!YpPYV1r*<+6_&tZCD#Y~SLwoE zB!CG-g)wXY#eW0A>8;;=v8Vt@lFrbeyMI7M2>iX%RXCmWhxt&06|1Ff(|IXyXC$wR<1LuFWv@V2KrP z5Vmh`4m8i1EGXAaDH2MhBzjHj=lm38Ki!EbdqoXoiZxf3S!z_e(V;s@UhT&NBaVRb z6GF`uL1vlRs{ZHqVYIiJ_s%Y~Zu%kyf$z77e;DxJ;4=6m=B2vWTbrA3j2wpN3R^|} z4=vc2`dVH1Uw*1PMi#4zBz$ufpo{fSU|;xMSY=l}Ab83o(|-=WUSdVklzIc~AC3pD z0zyvlmlot4eSpko;Df2)Xi^5D`vzj&G=u%oj#wtsvV9bV7L*iQk;o__GDCKN5%XTQ z%CW9v80KsQSiiWZ%b(DyHEe!?&aEOdi;(^A9~Zwbt%sh62xU@+T`C@2iFLaxl7h4 zvBe4SM`kjsp{uC{_YrL_4;8}OEuQg?zIt0(Cp<751p&+Rss71{a5{6|*v6KkpesMdWg3N^Ic6{5)oD{aB7;7nfIgz~stv)(bABph z8z$r$Cgl5j>Hht=mW3b8&=pzeisfWSvrvxjlV`<=OyMDlJ)Md@IE7K+a!NfRN_j+$~~RRaGXDR&*-3jdP0uMbP{h)khe@3$zK!gRT=llZ(;{Jz+u$9|F8!g z4Zwax@7sO*Tsf{;pvK)Qygm z;=aHxs}i)XOXRh)Ljm?<^x}J^+Ja|Gbf$sLVi?(fPpPvMjYBDSTR&w5hH?^RbF2#EY?e&Svd{*W-RBmucLJu_ly# zsM0#!oA*d}S-25%t`stvnH-)-3>~}=`S$@SoXdnK0SPT9)&6hnBs`H0I`|0kF9InH zhfA#7d;1A_+=D+z0r{tTe*cY{b0HHQUgDGH$8jPo{b`F2`qN3@ymY?57K5ze^tt!{ z!zD@MiIG>*t0Cmbeq#9AedzH$rhW)~jd1IpD<0%Z{!)5D6XK`f8@E@4#B@doK4ZIp a$1xo%1ox9%9ceNF__ldZ2ky8&yz@WAsp(Gu diff --git a/venv/lib/python3.7/site-packages/dateutil/zoneinfo/rebuild.py b/venv/lib/python3.7/site-packages/dateutil/zoneinfo/rebuild.py deleted file mode 100644 index 78f0d1a..0000000 --- a/venv/lib/python3.7/site-packages/dateutil/zoneinfo/rebuild.py +++ /dev/null @@ -1,53 +0,0 @@ -import logging -import os -import tempfile -import shutil -import json -from subprocess import check_call -from tarfile import TarFile - -from dateutil.zoneinfo import METADATA_FN, ZONEFILENAME - - -def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None): - """Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar* - - filename is the timezone tarball from ``ftp.iana.org/tz``. - - """ - tmpdir = tempfile.mkdtemp() - zonedir = os.path.join(tmpdir, "zoneinfo") - moduledir = os.path.dirname(__file__) - try: - with TarFile.open(filename) as tf: - for name in zonegroups: - tf.extract(name, tmpdir) - filepaths = [os.path.join(tmpdir, n) for n in zonegroups] - try: - check_call(["zic", "-d", zonedir] + filepaths) - except OSError as e: - _print_on_nosuchfile(e) - raise - # write metadata file - with open(os.path.join(zonedir, METADATA_FN), 'w') as f: - json.dump(metadata, f, indent=4, sort_keys=True) - target = os.path.join(moduledir, ZONEFILENAME) - with TarFile.open(target, "w:%s" % format) as tf: - for entry in os.listdir(zonedir): - entrypath = os.path.join(zonedir, entry) - tf.add(entrypath, entry) - finally: - shutil.rmtree(tmpdir) - - -def _print_on_nosuchfile(e): - """Print helpful troubleshooting message - - e is an exception raised by subprocess.check_call() - - """ - if e.errno == 2: - logging.error( - "Could not find zic. Perhaps you need to install " - "libc-bin or some other package that provides it, " - "or it's not in your PATH?") diff --git a/venv/lib/python3.7/site-packages/easy_install.py b/venv/lib/python3.7/site-packages/easy_install.py deleted file mode 100644 index d87e984..0000000 --- a/venv/lib/python3.7/site-packages/easy_install.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Run the EasyInstall command""" - -if __name__ == '__main__': - from setuptools.command.easy_install import main - main() diff --git a/venv/lib/python3.7/site-packages/editor.py b/venv/lib/python3.7/site-packages/editor.py deleted file mode 100755 index 6fc73f1..0000000 --- a/venv/lib/python3.7/site-packages/editor.py +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env python -"""Tools for invoking editors programmatically.""" - -from __future__ import print_function - -import sys -import locale -import os.path -import subprocess -import tempfile -from distutils.spawn import find_executable - - -__all__ = [ - 'edit', - 'get_editor', - 'EditorError', -] - -__version__ = '1.0.4' - - -class EditorError(RuntimeError): - pass - - -def get_default_editors(): - # TODO: Make platform-specific - return [ - 'editor', - 'vim', - 'emacs', - 'nano', - ] - - -def get_editor_args(editor): - if editor in ['vim', 'gvim', 'vim.basic', 'vim.tiny']: - return ['-f', '-o'] - - elif editor == 'emacs': - return ['-nw'] - - elif editor == 'gedit': - return ['-w', '--new-window'] - - elif editor == 'nano': - return ['-R'] - - else: - return [] - - -def get_editor(): - # Get the editor from the environment. Prefer VISUAL to EDITOR - editor = os.environ.get('VISUAL') or os.environ.get('EDITOR') - if editor: - return editor - - # None found in the environment. Fallback to platform-specific defaults. - for ed in get_default_editors(): - path = find_executable(ed) - if path is not None: - return path - - raise EditorError("Unable to find a viable editor on this system." - "Please consider setting your $EDITOR variable") - - -def get_tty_filename(): - if sys.platform == 'win32': - return 'CON:' - return '/dev/tty' - - -def edit(filename=None, contents=None, use_tty=None, suffix=''): - editor = get_editor() - args = [editor] + get_editor_args(os.path.basename(os.path.realpath(editor))) - - if use_tty is None: - use_tty = sys.stdin.isatty() and not sys.stdout.isatty() - - if filename is None: - tmp = tempfile.NamedTemporaryFile(suffix=suffix) - filename = tmp.name - - if contents is not None: - # For python3 only. If str is passed instead of bytes, encode default - if hasattr(contents, 'encode'): - contents = contents.encode() - - with open(filename, mode='wb') as f: - f.write(contents) - - args += [filename] - - stdout = None - if use_tty: - stdout = open(get_tty_filename(), 'wb') - - proc = subprocess.Popen(args, close_fds=True, stdout=stdout) - proc.communicate() - - with open(filename, mode='rb') as f: - return f.read() - - -def _get_editor(ns): - print(get_editor()) - - -def _edit(ns): - contents = ns.contents - if contents is not None: - contents = contents.encode(locale.getpreferredencoding()) - print(edit(filename=ns.path, contents=contents)) - - -if __name__ == '__main__': - import argparse - ap = argparse.ArgumentParser() - sp = ap.add_subparsers() - - cmd = sp.add_parser('get-editor') - cmd.set_defaults(cmd=_get_editor) - - cmd = sp.add_parser('edit') - cmd.set_defaults(cmd=_edit) - cmd.add_argument('path', type=str, nargs='?') - cmd.add_argument('--contents', type=str) - - ns = ap.parse_args() - ns.cmd(ns) diff --git a/venv/lib/python3.7/site-packages/flask/__init__.py b/venv/lib/python3.7/site-packages/flask/__init__.py deleted file mode 100644 index 687475b..0000000 --- a/venv/lib/python3.7/site-packages/flask/__init__.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask - ~~~~~ - - A microframework based on Werkzeug. It's extensively documented - and follows best practice patterns. - - :copyright: 2010 Pallets - :license: BSD-3-Clause -""" -# utilities we import from Werkzeug and Jinja2 that are unused -# in the module but are exported as public interface. -from jinja2 import escape -from jinja2 import Markup -from werkzeug.exceptions import abort -from werkzeug.utils import redirect - -from . import json -from ._compat import json_available -from .app import Flask -from .app import Request -from .app import Response -from .blueprints import Blueprint -from .config import Config -from .ctx import after_this_request -from .ctx import copy_current_request_context -from .ctx import has_app_context -from .ctx import has_request_context -from .globals import _app_ctx_stack -from .globals import _request_ctx_stack -from .globals import current_app -from .globals import g -from .globals import request -from .globals import session -from .helpers import flash -from .helpers import get_flashed_messages -from .helpers import get_template_attribute -from .helpers import make_response -from .helpers import safe_join -from .helpers import send_file -from .helpers import send_from_directory -from .helpers import stream_with_context -from .helpers import url_for -from .json import jsonify -from .signals import appcontext_popped -from .signals import appcontext_pushed -from .signals import appcontext_tearing_down -from .signals import before_render_template -from .signals import got_request_exception -from .signals import message_flashed -from .signals import request_finished -from .signals import request_started -from .signals import request_tearing_down -from .signals import signals_available -from .signals import template_rendered -from .templating import render_template -from .templating import render_template_string - -__version__ = "1.1.1" diff --git a/venv/lib/python3.7/site-packages/flask/__main__.py b/venv/lib/python3.7/site-packages/flask/__main__.py deleted file mode 100644 index f61dbc0..0000000 --- a/venv/lib/python3.7/site-packages/flask/__main__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.__main__ - ~~~~~~~~~~~~~~ - - Alias for flask.run for the command line. - - :copyright: 2010 Pallets - :license: BSD-3-Clause -""" - -if __name__ == "__main__": - from .cli import main - - main(as_module=True) diff --git a/venv/lib/python3.7/site-packages/flask/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/flask/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b863322f57c79867dc4ae0aceae43eaa7f79a3b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2092 zcmbuAOH(5^5XWtd8EmkPF_4Fs;9K~a zRUkjZGJe({Q`vBgjb)K@z&Vy99#`XGp5=-2Y9e%)13ck7YBDUa0`a6OhEr^cxS*!P z5-SlGfy=B+JOx}~72;_%6INN3xTI#o8mkeP)m%8w=7}r7byg>y0bXDW#8u!$wn#jy zmcnJWOk4wAVJpOQz^iPPcpi9-tr6FO*V#Jp0`LagAYN2%xXCt&mw>m}7V$FhHrpm% z0p4Ld#H+x&Y?pWqc#rK7uLJM1ec}z^19m{{0ykKLcvBU^Lv~2KrCxt z-h^-2TjCb*JN6Fvm|giNpE8Zp$G?j%TpcCM4bh)?6$!s{!@$#VM~hJ2#rno=3nP6u zj@;j*zIl{sx8=G&*?r^6dn+Ro+)DM}`mvXWGP2UANkrtkomi>(&bV!9tea@z*}#)- zBCM452QRP)b@uvs@_{5gB>qzW?-n^St>%iPXsAXFTzZ zY=1%;Pb3oQXQ6M>1Sl`sv9{f!fh`wTz?t3iW}lysx@R|WanNC zskz7Tm7XwMB*`;V4Nb!to|(%7H+#>G6&}Vn`{eb^IyG7hW(B7##^yW)*Oiu2L;5^~e$kZ%>~*wT874|t$)Qp@Xr~r)PzuG3gyo--Vnj#s>o~xi7L1I1 z-U%q3wLwG2AsG znjRS!o_Sg+ph{it$9EW2y)9v4j5_kMP{Vye&wMw2s*Sw&WMT&ystl7cN)GtWj4IO! zqF}gaWn_cOXgKrWHa9Z82%>6&ZX^`c{Mm`Cj$#?cMl-;qFXODgFu_T{4L;^iTX6r< z_^R)4*saGoo45|5YjLLWE1+{AtadkgU%%|o=yB{Rf9XkWpp4Fgv7gcKLCL^`UL3+p zswdGi2iesHAdTN0J%zSnd-OUOJq?Eb1XK!M30=ZQ&a?NrjLsF58I&q^I9(ODArX2O zO*ND`lzEgo$^uB==}DDHZS*3VmQa>aR!~+^)=<__Hc(uYO%Ub`Q?0kqw2iWZvWv2Z zvX63r(m**xd4+NW!ivMHK!$Y_tu2uL6z8`P51bFq|H|k$*n#rz>9Gxy<0MF$K?LVO zspduc7+*eK1jqEpI#kZ#+*roE3HCBMN$8U`|+o6gcbHhd0R|6j-c13D>0 A*#H0l diff --git a/venv/lib/python3.7/site-packages/flask/__pycache__/__main__.cpython-37.pyc b/venv/lib/python3.7/site-packages/flask/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index ac2116a8ebf9f5cf0d72ecd5695b9fca09c11a6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 384 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 KLb)*W#{U73%l^v% diff --git a/venv/lib/python3.7/site-packages/flask/__pycache__/cli.cpython-37.pyc b/venv/lib/python3.7/site-packages/flask/__pycache__/cli.cpython-37.pyc deleted file mode 100644 index d1963d6fc921563b1d4f28dbbbd1b6fb9f13ea17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26171 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 IINthy14bx;TL1t6 diff --git a/venv/lib/python3.7/site-packages/flask/__pycache__/config.cpython-37.pyc b/venv/lib/python3.7/site-packages/flask/__pycache__/config.cpython-37.pyc deleted file mode 100644 index 5238c5405da935a17e537299700d65568952d008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10129 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 diff --git a/venv/lib/python3.7/site-packages/flask/__pycache__/ctx.cpython-37.pyc b/venv/lib/python3.7/site-packages/flask/__pycache__/ctx.cpython-37.pyc deleted file mode 100644 index d4ab1451460c91e9419096d891bac2e3ce3276a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14290 zcmdU0&2!x5eFm_fTrMe!k}S!wQ^cuCZ6mE^Cw7vJ?CQgk?Am4(nXct^-Cb}2EVciBDhsnJ|@SKO2MKIN{ur|^B+ zJ?);s_ZgIb#yyMjXQliz_?^;!9XITk zue@}{zUu^m7e`WUBk((3Kk^#(jrZQT{PoK>17{d{m7hVn#(K>hFAoQ<6ML;au^;w-W}+bOp1pDJciz6W-n#qY-49zgH}1cC=U(g9{kJyosH8mQ z_>srjTBxOk5w@b(>FnapYKtTAqIl-+Nfb*4(Hewk*hSHqo5N_^b35#1`pMzq8jk2q zoIC>-VKgn*Z06h(ZqChrYBuv;VaudF;JOHnmE1C}O74PNfv(E#qFcrHg1h7{I`Myd3v?F{3vhbJAVZ{O~)lt*Lmqof~~ z?7eNjvu*oYwLQo6Z0CXF2hL`ID{VLp_NCG8w(WrmAMPhMQm@;t7j=}s=`|Ym+OD_1 zW@CI^Z9z27o7-Mz7Y%r@J|$g?V-z389@;})UIg1rYGZlS_`p*UhUd7h=c3jt^_Q;b z`es}6V^3Y|)+SBe^Wvex*!wmgIgp_pqAoFQCu>zC{fir9U)DP`4u1H}5ONbow2ae% zv11&X2j+qGgsy0g{^O1p&kk>MU$lD3Mn9lMZ_615vHidahF;x%$KUltpKPbmgLE2g z*YCvjt{1nbde;~@%IQf(4SO9%VuxGyWH9hvyilLiq>CqwHSFJIYxHrYW#eznNdr3Q zhw&HJ1G~#l%^H_mE%vz88t2f5T5g<=ykKjbr+~+$qziv;sFM)a&o8|g_XaNx{J~|v z4<8PK%dZSa;j5!p{1+vBC1<#J9YJRauUw(1Eu4&n(dw)(QAo$D<~LCMz>1CCvN{bF znTOVa`NVvW>XK`%E*E!dmV*dx+!3w0kWUY`a;yTivSyTo*z&(q5?=U~Dd|$CZ7PD| z^c|wgd1{7tg)nVZ{7o5>5UP!EVT5SI(4{W53O}XG)f1cusS@)^jFBl#tN~~F0ah1tf zexd%(Kx=PNf8uPF(fK)Nn^e`25-7@V9uf`-x)2Bv5O<3Vg_!=O6X*-IJI*5-_vVad zTy3>Ddtow+TCMj{Ot)^1zBJeRbh!>e13&zpX+IVZe@wqd`wJ~ zPKH@D;d$oh=opfksF(HHBI{;^M%b>jTD{O62E2wozBhD&_e z2mxDD94zI5xzZX5Nt}qNjIn2~G-e0a-gY!fn#`#z8OhAddA{%M*ehqg!h;wd?mJf~K#}JWqhd+M8Ywg!Tua z3f!-(>CvW|=!MEl)q$utr9cVV5H%p1#CjjX%XG2lNYWBYb6SUZH|+#8cN@S;&_o}w z8RF^h$~=M4+X*%NL(Q?B)C8QSh@?y$o5;K7JqCo;01p z_Y9OC0j%Gac4~P=*A(X+pKEC~rfEw$%xGMML3n*;D(2RdH_;o$t4DReiTe?;sBvc5 zR2T4_c~cHQ(j$5mKeF&-0uVhDTdwuk{62!zVeX0XhvpBAADCN~Bst|rR-8YuJ~JK@ z%@&*ns<{ps1<2hd8WC|O(w+50?F~$AD7?;4Dc}eZLNeYo8#(HrNDcb-UZ{4Nx=0k)Ekq>(^oQRM8uOnmv=dfAoq!${+XE&5N38k>()EcaEEu*Jhz z0w$!qOT=m&W~H4D#Fy|Dsdz#qc9OQC>(H}hD(nEslD!`eVJ5=>P!~cLsFw=-!F1f1 z;Ow-@dVThu7IYoy_Fn(u^mr!0n6IXh?Vi^i29C-iPZHgZh0|ALEbF5KiG7nm#L*#(V(YP=%Q zNIIr2@`iNixzB6*4^T|dh;fcU$uf)ivbCI7mvBFm7p~`F4pFiy?JLya#bdZh%NrZ)n8LRCka=A6(te-y2#qB|txr{aq+RLY zQ~`M{t3(UqdH}52hf*GR5H5q6L`2LX_RbJiBc|i@vl%Sm_Uz4Y2-KO-w$k#&Xb7?n zv|K}E-)JXYY?Ek8?{(WXVG?6CjJNxUy8jP#mW*o_4O2t>%!^y%<}aUT_Zo~4jrK8>x3%X&>zp8f zB2!{mI-HWjw*BD|W5X2fz_P-?L(u66L#wA5c{8DUQ>1~4VOp|oAaEOLMiK{(la_|Q zlok`*`NVZ1trHv&s!jpS-=egZR7ut6C6&XCYb6bTnEIky z5`MnyF5q6-t+@vu>iDV2QPq_3{u$dT;)cGAB zVNwLfh>TiNj2Lf&V~5YG49Q-yBfkee9hwU5?QoC9wWt#pzNbTX(l01h8c!SmQqKZ< z0!N>s>=c#~F(w_%aPQNmr34pCcQ_Nw*%GVdWJUW32PwWr_xuOG3&!B7b|)3iFhq_5Cr@|{rj}_5uJYhfj8;KliM6iC5r8lG628W(y0@*N3NU3j1H{zv z;?$4k88Im=6m|8oOG^YiHoM~zd~>VQk71d@XR^L2KNbi=3Sshb3@lWzrpP4i=gp zUA`gOPZW_E_yF>tbePl@D~!(E4F`JB3dWF%uP$;DV_F|wMhPqq+IuSGdf8Md+rD@~vkKzE zBgx!M=$xjmwm_cqOf<`3#Z>knqY4_xg-!iE4BNByl!gz7A3e>_XTVbgPKU z)wgj<*x7LoHI6OyV9p|icKbJ!i)f#QWtmz9RddCvnCHyV^0XpAveOdz;Wy_U(F3{s z1LM%3Dd#Jot^Jbi_yZ}3E^OfjCX^XCnoCY~{Ij~DUa?{P$w zaJiJX$_wRkb*Y?JeA2;@eR827`jE?uRx-97}!`G(Q_4|DiJ9E4Ynbd@P(P2&AZcpG-y42qm z^iHt%0RD=snbjg_u|hw_Y>2k^d~{Jy4B5o`{=IjQAjt%g)SwgV1jlfZoi%;%-krBl z-2)$ifFu)ETtduipnWuIeE5q7PbdbJ!*CPhDl@(y4%uW*6H~YzH(vOv&Gp z8W4f?-joO=KPg$zSa=;a2mTlP39#mXtY50`Vuu0>alshy*%AIZNmdbm#Xd&Ct|qevryn2l@} z01otHCcRJB2|6Sc7(@++aP7?mDMK5_8whvu1U_7_EyD2h!U;P{EGs*hC{Y<32n7!e zvkM|K+G^D?|Y~;ZDk5| zYciImlnO(WcZmV9ItSTW9Am#s07&5}jQ?GbG}7H@i0UyA#1_!$$o^9a?0IT;@6jy2gRTW@$A|?1WyI2AZf;q z7EZDJaF!*gyNM(EBb>N|3qYR3Qf675BQWRG{U~>UwYZk$5}4=qS8+cNxP>SD{ejW{ z&Abs8b}OoF8jrATZd5(MvgeM~DgwUY?@{5C!hPdIqYnrtb(9Y9eyiMNeG3BgD{_BP z?o<=df4jCMu(Y|9ctwKau_sL8xOxdaR@@?@II)gTazPEI4-}9%akE78-}a($DWQ?a zXIp7nG`pQ_ypXzxi(OmUHS1C@pmro5S;jCfC9{QkgN@&2;hboS*jlfV3TF%8G)c2x#yW3lopd^{(^wBc}cM0>yw5%90))BrU^!1J=9;pGBp$>?+4N~TQPKsl5(Sy@xD8&pQ z;W5^;2Rrt~I+1V;L#&g5eoYou&{4D^j?S8n_5o3AH^Vk8avXz`?zWqK&S|bI`|)0? zPxhOj%m$;PUhvCS#}bs42LBWq2}d1-j!Q&Hd0>|#0HULrXSRoro-#!}a78YOMRr?H zWr-tW3u1^VSt@~Qu(C3YFNa%~@n*WPKhX_5h zEiw64ek!8AgNSNLMAao2QFCtYk@X2;X%bO2VbHt@A;6Tl+fn)0Hi=*Ru-Rz1sZlBn zV>=9Y31l=?h1G!$R*p1Opwwsa`9yr!h}&G$D`72#ts?8SlEmI|L8=h3Hp^sS__Vpe zrKlDcjwCLtTNrYh;$jIY!VXCFHtx-ZiSd%umO|qXGco6x@SaA<96dKD=9w2VdC#Pv z|A>aBR=^jO&FwinV}FUMDTBCx4LsHXHvEEIXdGBOMQEeAn^R4GYx3d1IxOqdd52_! zB((i1p5vD*R7JcPSFyHksfTg(a7hRrB`~^~%=8+~}nVMU;B^RJ5XNr7oG=uCEINR68?8V!ug6 zNZ!ruUwR@DK4TH^H${s&A-=-`U*(D03KU5Y%_zwPcrtNJP$B@zTiC_itODxvv71m< z%e9r9>;Vw9`okc|?#nEG7nLRXzTPTPlIF44_+2(5*|wZk`IGrM)h#5VQ7OVcs`(;p zgv`{kRRt|lwkk#bTE+D;jw3EQ!&q?^%3Sm(_yM6~YcE-+QQ#5);dc}ZRKW%c!X7YJ zc_{SNxNul}0;f!vs}fYM&0!%fxOtev21-=K92QYa73sb8IQJ-jkOu>{pauu|$5d(Y z5rC9y#Y@s^;UK4ejCKk;RTxF-Di{%$enV=>U(3QGgWZ-jru5+Kb^s5cThICqWhs@DxvJxvkh=~?SLxJuzC*FF^IkmiyQy=kg0%dX44gyoNpe z5xu643!_{Ck;v(bf7~@#rN4mPE%Uck&gac)4m>XiG|L>V-kY7^kfF?=Mb2?DziHx| zv)du!=@T>hazgoCg7N2eu-Go{19}%uRP2Mc1@$ckE!Z-*K02!nB*Wlo5Zb7fwPa+H zmQ9HgsGd*3dRnj*_9rQTny7^1Plt1w(ewJ_WmRqv}7g_k!KH`$PVYXm+ygc745e z@~I^8xU5t8cwZ8$agoFepcf&c;&e98B8$W)RPs~z%~DYRjUzgTQ~5dUo3*R?<$U>c zxl;aG^+mAD`SPM-soFWsS<7<7g2Z4f=SH$&rg|%#1r+8OUX)^ zp8pwonx)9^0+mO4nSwG?Owlwg&i%Wx?NIj4$f~w1*b3z>eVekKY~CK1uY!&PM0}mq gMK9o#XXwF%jqsEH<%_wM+vW4+i)Fi9S$X+?0MCK;8vp-Q_d7iJGon0(I03<<*PLwt+l(Z~i!N{iUpeS0DNPUznSmB2lZzN9!)4jj| zvop)?9ub(@b)^hd%p6jcO3F7Mz)DrhsmdYcACM|vbI8$$x%#BPpi`c=XLkuwl&iA9 zeD(D7$J@{QyidRHEH1V!{1!hr`uRsMS=JxvVfOQJ^EM9kUpR5AZ*iMDsol46byH{P z_FdcJ9&e=Hu+eXrdms0H-#7Qov^fm=fw>RT*09}goBLL}Fzoa@w)MWn+kD|mi!X>p zv2^V9&xi)fI(!jji(*+U9(%`je+6Yr{0z#@pv3L3@@2mArPV*nSNU07&+&8oJg(>Y z8oz++8h7qm-HYXK+YG-!8mWUG7dyr7o=8VRDpUN6Z~WS({L@G#d7;>}F4H+1MhAlF zJ;Av6LZta#yqa&H@?&&S|#?`;P%07wGROq_Xtu%>6 zro1$CxEorg-xB-=%KON&Dt z>Z6gsL*qS~9+ke67Gi`d8V{?X6b}obbQtSHd>O?DG4(O~Q4eq9P|G+83oB~%9d7qs zV>!24yPwhgVlDXnEQxb2ZcCZVa{o@0D8X5hu~8buLa|4CLJIZ>{}GI$^5M)JOwboh zicu~#2F?b#GzKo_O|znIo1xxLl11`}@kmEKQ*FEJRY4eL(NKh8)egg9&Wn`pJ7M^+ zh|=ksW*G834#WSjd=e8D^iR8`p|5f3v)nY#KOB&!<7r!>YB= zzfCmm}n&PFYt~x8PTtSqlx2P9BLbUbCLqaCiU28+%Xeu@yGBMMl|<)&akt z`-Gb_!z*p2KiiP7awUJ+;^{847X` z0^R9W$cod(l@<|a`G8#>7O74~k<^>0J=`D&UIwm{c#jQ5luhlP<@MO&Jk#Woz&wDj zB`ORP_&=wvsm>ufL^n13k1$QOmlr8#v(*A+(9qs`ale=~zL7NWVXyqK-6jC+$o!EK z5+~M28e5+)O+W%; ztlFoRZ9N1TV6B|eBWrCNr|LSD)4N*Phfn=Xp24?Yx2_Yq4oC7vkJ_WgJ*(_}6Z*X{ zOtM6WVefjH$5E5o;D?b{IM8+#`KTopC9je`Kqway;9!9s8nFe&-@rR#E6Xk~y|6=5ZM*ABiqLX_ zP8~We(&;bg#OO3`A~ux&YoI0$V=*G9BDHS|p zC6$mwgFr#ld{x(4Zpx>Mkn+L3d!Mj4g^~j#=R-ELB`&G)B1M`+JLnD{&?_1j&`OL9 z5(VPb=2`;Ox*dzV0uz7L9Y+D_Xp*|)I5oaDE=jc;eJ7m*eb@|)Bv`5%#% zq>?$|)^TMTxVG@-F}!l${zvR0er5g29>71j^JT!D$JVhsu^(IekSZab_Ti@?4yqqw z=K}BY%HQ5KxTsm`YVSut$g62(n&mtDAT8pv7z;4xE~DOvg=$g* zY>h~pixPl@&Gp480wTAaH*V-_*1=N`n6eUPI{&%TJ4FFzM%kxl4+US(uNP^k{=IOj zHbNsuLNgQ&4fQkv16XmY=G;eC4se{sp$G#;38JS$+Ut1yISxfJ&_bZ@*h_XB*K+IsH&p<1J{%11d5ls&rdte)^vrYPsQlVs zpW{`%O|a!A?rEY81C^>3hB3%dh2hh-(U_SJRsCk`h5592jdKox(76SpjK9#{{r zWNW6K1>Mn$dP$!dG>#qh8+_XwBa+fK!pO}l4{E#w+hxbtjwEYuT~&5CpC2KUHYY~3 zk})A#&rN7?(;Z+Q*HX7rVdkOQP)NV@WN@;n9b{Ca?r zJg91X5g`*$dDQlE^Q%_AF`ol`qR5(-eaXIP9BRp4g&2veZ*~ z1kFIg$m|Cph9;0flZFN{PyDgZ-Gi3=!Pwt-Ae2tsPa22+t-Y~h!1p_Vulbof2_~&c zTQ|ln?E`W<+#9#{n`_o&A$!G?1}OanK-b!D(HjB}-UYfnZXMf`1qiDJz^}=h5M&GV zmPFR!%epfTOh2oWj;RxjJN3JV|Ng)l1K0r zcqQONw^7ny0MRCRdEqD6c9~=huz>`Q7DoPU8R55GE@PL41QlvP%#$uG&+g2UO7*sx zBxm{3I=jXpa^w+($QpXIkzQAl;#1jT^$*SvVApImV`Y1gV^GknvRek%>s;22vNNr^ zaRXn!SH5ag3+X3_yx9n2vwNl;J_NgIrFXBq{s4(GBkJquiljk35YlkEkfd0nx@(HM z&$QSp|GJjA^Dantrg?sVkBSj9i5a9$pe#q&Zc?Cz33rhB%XX0rAO(&s`7?&;m48J7 z^#~)R9Y0UFNlBO-8OAa12=akGHt9i(E5$1PxcnhwcZFbkT939i>&#Sdl*f7A%jNDS zl3QwX-kaL|-mEc@W4pU7DOgvo&POJ|RIPc{swJ{w2z3gDN~|KuXR8Gy6+uHLuO=za zQ+bp(s5~UltJg>3zRwXF501>I{#6meHVv%1t+4q6Nke!K?W|6=4w#jF?NEy@lUheoWI>) zd2svANB!IP-w*HH-wr>%`QbJKge*k)`@8VXOk;nL>}I)10K&{YS!Azadne4c*r4XL zchXk7$ZDt>9Z6YW7U#nu`8=5t`7jX|8oL&OUGTekrjRO>Y*c7N0H?cv)P=WT|2|-| zge!aNEp{0>S2A;Wne7&lG?_X@V~ydRb&|>WVDBpzc0ksd;#ho;5)C13;N+@mitLL- z=1AETJjZ zYB`|fIbfis9fdFll)R+nGO<%`(;c}%zdd&oReM2mH_dmDk~01zyVPFibn4sWg5?G^ zK*<%eH8J|jxQoGv8PN-;6_-L$L^&00nfYz=&g8F(s-b zmBfbIL)}yVq(9J)5qj&XztB^Ml#)2;-dZ{w&5R~9Z{ARRJsd_JuHoC|_psx6e_G>i z1*m+5TmOoJd$Gp}_XWxQ*e6!+h)y2Ffzt!jyKxuwZoI>H;vVnu@E0!*d7nr4?DJhd zz-I*AjTi4aIe-A74T*>N^daQKjgQu-wMNd`b5@`4IcuNqpL^qj)$b9-H5E)RCNm)~ znb6Mj)Aov->kUk^0yJepP%{VGgj0EW1*y^KVumsWv{dpo!#E>dSXwCsg>flZYO-sf zsVofKnn{!QB$ee-WwW_Cp)Zb~AJa3e0H(olBC-?;4JY*V`J2Pf4^IWFG(>+PkKUNn zy^<-DF@b9IjZB$1!{W<(>)fz(vHIgXsTNr=qp~tO<3Qz>mj<|P3lY$1RbVr+U?MZiruhPZ1CLli+dki3T%6rinoxQw3tb80 zSm83Qa-@aX92EZyqOlmKQbk#TGH+h7OGHiQ^2Qcs*D^x{7AdlPDIlM)kBH~Jr$JVh zNL`cTf$#sVNd%MO5Y?2WKyNZL-<~zyF5a9EjHX)V7|WIudLhve*AUrOKBF28tx9T% z`#0()JHD9UPTE#J86%(P0JduMm`kLN<`U207K@VLqyCOf5HR0YO zR38}MbT;H?VuCeUdmA6W5%O-_t)C?Afk{$xn`nEi>W-0RJ@~dNOqRpfN=a2edlUvr zCApr}y&2$~jT-xPP_P^nUJu@Hp4!F7-^WKLFOSNsJj@ErE5zZ;Y9+r|z08i>SJ}$; z+nkh3#3H0zRHdzzH0*winRJN4BReF-pBke6Uz;8!j`6#O9cPpx=n p#RHp8bCiZ(=8{(eURjs63R0)S^VqfJ=fDMLl+wlEuf2$X#kglcR^RD+3sG&k!>h z0P1dVI50+ASt?m=oZYpPRB9`gIKxyN+i{%u5j#%hN2>BCsiZ0{r{csxB`&{`SV`=- zDwRJ3S*t7N$e*KQBdQt~}k8k6sIDJ|cbQbxYBr7XUajofCw zluxj(RAYQ|qBJ4rV~xqp$50nnbdA4zI^HAxKoaY*cHy+b$4igP`DEjX%_mDw%K22|_~z$IpTqgIJJWb-^Xbyl za()2kPRWt;gE)Vt^o*Pz!ug5P2{}L9cy{x-(sOeD7|u_YPRjWaoIhWBUe1r=e6}9Z0%lrI&t905s<38a&`LX3C*Nf|C<#=w*zG~f1+)tEVaF4s6 z``9X-cb{^f#`lZvm)vLE6CWo^7u;vv=WyjE_oVwgzF&4{-8p=};uhRf_yn7no zUvR(d7TvRWV&1*so_Alw*%#fn+zakYIJ@Y+?7o6hueqb4?!5a&eE)!Z(R~fy zZ@90!KY;H`?i=nUd|!Ukaxc4AKDOK|fIeBeg5Ou&1^ix+-&fs5_f3>raId-7@xAEU zx2?ib_iK3vf2)mZuu;6@HQJsZ$d!-ce|fodeY4&0HoayTICralz10aE{X|g}n6I_k z+kSoRPB`zJKlj2p=VrCh@IqDLe4}3Tnt?a(T)utv%!_BPG^(Az%YRB@UMeK|Q=PV3 z4ZZS~Uu^>lTp7D{qgC6$Nh+*wdic&%-G=ACcpj%Si}i+gdpiid%^R(%E9EoSJe~!( zoxfalZ+RbfydcD{>{2USY;~G0&X4QMo_nj>T=Q_}b~UUAtM%$igKgw5cj^sy!S`DP zA=mL6Da-tuYer7I$rDeKG4kKcr2sK@HFs(px$cYbb1q~)itlop}XU` zHG;%HumUTIPYs{o2^@OX2M2c&y@YFRWPH1qc-Kl;AA&Vt`0awd^jYHU($Cw?E5WT=SaVy|(}Q z1-4IMQkMS|z6ekBM*y$j6U^WcTI-2j0Q4Zyo)W4|cK_0wUg(5(JjZL^t^2JesZM?a zB~CqX{7$n8JUjK~X?)yz4V2?LE88q1v^tLmL8SAQ#T%Dyf4RJ{^loLSE)pb{ZjSmWL~q*|y(uJGBtFo~=}hagwkQ_Y29s-3s~{4QW5Q=7j?ksY#{6e-j1a>Sj1coYehd(^gHa5g2$T0M*WSRy?OD622bP=M$Y2yx z-QOj;w(fZ7y^qeUbk>~Bmg_meomQs-ybzDgiR#xRvWPa zlCha0h=MrIr?ofmK#;}3N>A9SMBerbIA7j3$F8uPgF|ejFw=s=Jqu%$*iB-L?2ReS-2U?Qo8_x- zFO$Ic(lQXL#^SWYnxnZP^%|DluKLwYGXdtE_wH0N(OP<>IEVz5&|t=3el%x8f}_Xe zfEtq+5QU`w9Pr_vR>yZGF4}-e%EWt2#~1B7>W*f2Y6Anu~pp;$d&lGx$88mo0@c&x@W-=y&756 z-MY6WWr*6S2|U|ug$|g?-MZ_!MWAQuQULm3J0gqv*>agRmdk}iDaTsMY-umvj)B1_ zu*<7{YqJ~``~XM^QaD(tnS@`&cZ57%C9Nm%32x!AJrP=;K*#x}^`6yyK4pc8jl6$8 z0kM&=zL8iJ?egR7P9lUbK{>Fa_pNVOxSn)VxNi6C`_@h}O!kuZ6A7!A1mef4KZ<6w z=yhr>48lFA5u|(wdr%gbS5xrkdqKMeHG%kq$nlA^mbwLe-1U4#dV+Zraa&E`93$kd zuGVXHuUXs1XjTJM;Z&QT`IfU;-9T-jgUJ*)jrxYyfS70j`8B8nAO;!KO>eX1Z=+0g zBXG9r;T>lM%Eq>{<<~<@M(4fTZ(esc>n;?Kttw!Y!3VLlwweKkOpQJ$slF=JZMQlO zieZj(K0_(+Fm^5=Q=JP=OJ6A}{b~s4Yt<$RpjxXDNG3^rR^_$BI;!Ve4W>S(7J^)7b;C5xzzpYB{0OzHu*BRsDf8< zOv7DPI-;wC{cS>AaY$0~$7DUMX^kJTEjz=H~R7@g@S!&bXL zaSLo32B4CI8E8z^F!cSGPyli=345xassp4#!at8|aV$r}@Z-1I&N9#vCFNmG75w+sVM0P;Bm{S<7T5ULKx!KdZpe-Ve0Sd4AYEw2ew1zSNV zrKsolXL0cG5z4bp*og_iGm)CGC!Qpnaz7euV;{W92TtJtn*gGEH}L>N17Qru1hgL8 zcQE|+>c9*E{s-A-H9?bfD8R6<*!vEwv7%9|<#ABPe)1g1%yq$>K67}FfI zs;Dgxd6&JK813YsR4pifMRU1Ry(?p>xuW6fPHSZydJmLXkOcXkzK;s4jSilG@+H#| zuz-3nS4mb-x>{&+PbE}@7wM(|?19%(I}#Ei{egeRSRr3PD@4A21!XNx>av9z@dSpeV}dKsn_mEAyy3LPJDt& ztGKEG(bD?*s!{)qQc_#*V< zreEeXZNM;|o0Y=FJK<(y_B5n^>$MB#HHZ8mbc`@JTU#8?dK|w7Ty&9I>m$$zZLz#cB~FcM;WTU3W4eqEiS;a$SgV2@ zLD@oO(F6d+fykg#k_V%_rW`dbQF=s2_svU1^{9#dpVdx7NdY29Iu}W+;QQ)gWU3IU zbAaU0-cMMcg9I3*`q|6+Qz}gpCIAH6RJ9^zAAP zGgr9JV3;{i4V+PVXGe+uHtrvQVH zd<}a^~k85#1G#8 zG7Ekk4U1xAhc?usWDjZ))T85JQhNswAlbPo`eL71m| zt_R56v5Qs@P`NpL10pw%?;O6z@lBYfdeXuJ81{f_;-iW8tsklJHfyf+Tzak}~|AcHrR(JS2Xom)2y)ro&);1LlLCpB_@wA_JfL~-(WwfijkY-Rd6*v2&rS9Rw_%Fg!F2%_|}~kL_)h-r~k|eHtJ~HWo=D}7x3m4XhLm74IqjLeihE8 zyUK}eBoN%VeprJF<$J3hBr23P(>sw_Q4Q3Q+9*`Nr`VaQM$Cr+0<_D>sKx< zUw?b4eCzGEmn#)fu_~3@3%A}~xK&=d^wt8e0pqPEgo9Y*^g>Ccniz;hP($FrmmzK* zN=A%=1eT0hW3UHB6Yiun0D?hmw-N3Vkl^c?7Z!(D1l8Ay_O6Mqf*TO7o{Dg&>a9%cayeS@k95~RmU6#uG#j*%8}*)x-=*vgEd z&+I+A`JlJ+d6^wj<2(X?RluU8U@ZDo5e=QzN?;K1krI**#eng^X#)o!4rZfLSYkR| zmG-Mlm6qsAlxLW+3Qtg)1iA>B&Ron;h_24U2-4vrjHX{j#DbNmj(s0EMiC4?Xt%%^ zi0_?=s(?DFZz)NCsc96<_#~q-0OM1f+GV0e6T_U4#_4F@pVp(W$I*7;2Iw$wI&Dmk zs2&+lamhyAq$h*tGYRl!QG zfx|Ii(c0*=*&kt=FiV_HSZ~zB?ExbKdz^*Y$vTx4IjBU9G%Jy=aZn=x0P3fiGu&C< zTdRW>wuhl%^RLBVnKPA~c21pAL_N?`**X+P4KgLbuuGHopLG`WQ0ZFX0(bXJq+t-$ zQ@7$|F_@tY;TbkW9lwR(d!5F62=mBWL6CWWWgsdENP{wPCY``cTtPpB?V!kOWXp5I z{UQ|TTl546Md)jP7gdu-?;@ zR*L-?n$rSIk)4uUtT<9ov`vAQz=xuF3#Pk-aH3QtDw0@10E*a?=}7Dh2|3nkB)}SS69F>*U7^@ON9q<);RiJyRksf8OM3r8FX9zM!S!YV*D83q(yA`Mo zrYqmanCf=tRmjy0>%5SM`K2s%PZ;nV0}|$f5#nlI>N*rHs2WU0LyRCmY8*@Ivwo+c zMUra0Z0L8M^O~+d5>3U#i^0LGD?zIPkBdAGdWrPoqH|jUak}R~DW)C#cX);_HK1t? zO7z`&74;1(TX69WscI?(16l^WXSy~-@qu@8E~5rkuC;;?N|QK)L}!Rp`|CG3OB{(& z>AsqXj#Q_yqzP;uQcH__6>!-$Qpxp#x~~;~MT{zxUWu?|%wu4*4qe|K{gxc8dbe6{sC=1A z(1ur?_q5uGfXWN!I4Uf};Fcx>phedPx}rXShygrok+vnAhgMzKsi~& z^i(x1bw3%3dzjgvG$HYP!A6jQim}W{Hm`W3wRVS@TBHEL&dd+s1|;O&^I+VeBcgGQ zdVFXE#Fx@f6ic~?JQurv^U}cL&|w!is*&=;Hk6-AgIaZ~2;TU@|IJ9#JQIr;zGrd^ zWB$;)Ne}TRbNUFXsSy^Y8iYZ1iu64;-!-X0>(rT6%cV?NjZ;6P88l85k$2CEWe}T} z`o?J|>ZD_)9GMg%KWR0pr74J`nim!OEb(k%#y1HD8NviS{VpC2-o?SXkxry-iG*dch>4}`8Tioh_Jln(rmv473I)#^B2r`Y zvGK!lHlk;##KB}9cMc}AxXOP|A&Q2?lAEZx#)ugI_|3@X6?_5?Lx@z8bz8-x)>A!6 z9VsNL@1r1-I5G3!_OAIYXAZp3&`kkXO(X+Th0I=MUtm&bW+S${j{PVfX;hQ2Kzcl& zDBs+MD~bBDi?lyFbLd~88f4t|%9s`I6SYVg>>`s5xmfd+at*m2zPQ|B95YLV+;!kU z20KNvNN8Nh&@h5l2gIrT{0;*!pI--gRU=*VM^5T4!-w8ziNr5BCwElZ!jJrjWDz+# zJI|mT$VXx4#@$HOKs?IBLHA9cuBW9KA64!Ig?YInxAlqNuPzhy{!Vcw)q|rzX zg)zyyWDVkXF69LO%)=~A#Jdl6f{ah30NbTW1A|P!elBW$@2ol!uV8?`ZMd6Ng6AQB z8D!tj=v>`sW+ZWS44*6b1oJpBit8rUEck+nqP zrXNUpf@^;(37;@it5VhPV*XG?y+hdrsU>;AMiw$KZ9G<_dc+5O&@gZN$a!MeRy!-` zeSvt2Du}cPopda^79K;=7Q%{>(t=-{0GNONX*F%|%V5t)I0jiwDku@A+kprWK;g97 ztB-3PQqnbElzO2LRG8zth9s?+RzIZAYx>gFDpH9d1JX;kJfs_#T2*=TOV|RtrYivE zmWO7#;@}20>MMgk`V@TzrV&SE)(Q0BSzQlOU8QQ~aKR}eA!mI{A#hNOKEt!Z(an?c z1HLm{r=4yt$6TqSfzqu|yK(t2@>Q5YZJyUZ$yu-I6f(d#x+(*>*5=|&7&?tXp~5oq z78TY5BtN_ZO7CY)fu%ymKZ+}oqYL3CK6(Eb%cKHePR-XtWzvlC395VoB$=`*|2>w? z==%3g&M~?E9nM7w6di#egP=+!{IB4#MJc{-LULk8c{J-X86}8QbnP&?k@io7$=#HT ziP^N*Aln#JDx=gVmVYfA3)6!vNMsHncLBoY7_yV0`i^zANUyrb6#x$44Qi`>`g-IC+F-qfzbj6gB3fa+s)!WOSnk z41s_GE^iwH#aXAB!!qW!c+A!Fh=NKLOzu$5LW;z)9^bkbh}pBpKoScM&@sJ2c_alS zRS^_S2rRTnYmR}%s80~nn;_dcLp-MqKn2Vw?e5WhWD)K_GC0oHVU{KeH^ZZl`4WH_ zfT|)VOutn|A(D^;q*w`HH{wBD1%gJDzn$7SL&)?$G24MP3_T|`VPysU8?dLT1t4C6 zr7b3lw6YIxGD%HeO=D8cz}-VO173{G@LH&2)~B5PRZ%DLTc8dM5pY6U5k89X85&Cr z1N0d^%+eGh!W13|66utFdiL><8k*Cr5FkWZ`;sCZ?4uZ|1R*B!Gr+gEQ_OM)CY6mF z5gGGpDWW7a1Fa1{b!5NRBr^q_(BMV(;Gj#I25x)C=+#x85mLa&oWX(}wAWO8SZjX! zy;Y+{(7tgR_yb0Jmg3b!zNHaJ7+sH+XnR_n-{*4xqQv%w(D7(Q$I(Hw>w5N}ejWpe zyg4)91`iSOjrt}cDDi2kmc}gkv>s~Us`AHgs`)gx0@^tYn?H^mN?G(^FGSS_+5 z6RS8(?}0+GZAtpiUTjo1SKR9BzlLi6Cn~eL&yP|V1__bofe0RBa@;07G&$A)(FYT1 z`P1XpkJ}%nz~FaIDBT$S@om|f4|x4nbR0>t;3L6P-W znDxIarE>l!;rQ-EFZlrZ6^~o(Kj)@oc%(!)>5eh0A)LYzf{C7u+=Mw@_df`y-L%}Z zd&zL-z8(DYUUK(?4*t_1Em3Nn|nPk?1Sj z9ra}M8nQaa!_Tchb)T5{1N3ry_vr`Ly0eo*FHfMC&qyzSOZV~w?mzp0_NHKAOt_D^N01?cJPqlO?H@zl$8>qFInx7GAYa4=_Ora=KGvIF zFO*M77EBh`uZG#(&kN*ZDl-PxR*@USQm4Z+Ve!7z8#@X}@buYU3U~il=b+#Wc{4{F z=Qdy1nMqjNi@oXH^X{<$E(VwgUqt`&9BVxPE4@6%4x`<~wfhP8@i(m18_KGHvy^lxq-2AnU2C()~%`?+r=ccxLpDb(;X zYDoGQbPZ~hlYY^R^4Co*)9bIePi@$&3pKsE`vv!D=InqDrompGseT7j@iue;CDn{q zfLcveR&^QUtk%Gal_)z^QZH02OG&s*c)p{BEg@vHq{2kLSW)Gb2e$+F^|0aw?#=o{ zQX;O&7IoEXEsI)AgWxroP_*dQ2|8^$SWwl_@&&1d-V*BiqR>IPg2HZc98itUPcY&6 zz$;^!D^S4d5tT8%1qII_)IhjgINxh@!FrTAXrWSh{|wP5&l=Z1U{ZclWu8byRC4h! zvT79EqBjCGXlYh@v(?rN+dekvGS!vbQhnILPLi+ZINVB$1l zXQ9dX6<9<9$Nb4!Ibk{;KwlI$6T-4UAB-8sv58Lx_{0Yj8ufIW^=$SD|te z2hh3jU($(XA?)0><+pAKBqpj@5bQun(qKwe0zH+{2u%pdus-@*5W7O80=OR3D@&Wz zJ&ekVqCul$XS}DcBS3TAvKOMk*VMvL4Ff!P6_CBjRDVshQ)SlhbQ#(5!luE3J9Gx zQg*O{i}nIYNi9BuX^RzGBu+zFKEqmqNvtW49FQ6jQ2y26NgXOXNKgo<0tO!8+oyI7 zH7~3qJg+%I)Sm9xO)NiyrrVSiT+9%a(dUSW<)R#Xdi9~Q5b1f*KE~jS0s^T@FZ<m_Lo%H=ZpJQykDyg|iBK)1|w1_+7hh-_@UV*VQy zl{Gaf6cFa^H%ACVBW?g-T;YDjRBUF26U_+PSF9i!Ub=xvJkg2; zEL|~=BQ^pC1*?fGsbv8KQ<%86rPD;{MH!iX1&=N{!siwuyV0YX$tdxu9O$7SE(H_;#3+D}_qzyAA8Ae1hwOVhumsd2A*T`8SEyu^92tU24 zjo2igG_ow>Hxb(tCJ-Oj(~=aSM}=E8FfMKCi~qt{Jt4zeOg2n=6Nk8vK1n zQItS*QCJ;plk#m?N%LD+M8Zj7vK#i*!wVwEql#n>q2`FT9tp>g5@~c_h0j4u*=PkA z{b+1PKw^?N!8C`pI9(Hy6SrFahVTHUkvyuhc!CL(GNVdp6&u|5EiM`lpjHEK+z}!2 zIgNk}+vjj#WVZl_V@~!~Aj{}L-RfavK7cehj!bpM7(NO((f?LFh$Oml8V#y&LvkFg z={-qI%tNbvI_P0^ReDi12j(yuM3bkQ!O-J58XU>w1-F1+2ic$*62dz4)Qe6^G!vCW z673_i(GW;tB?pWS3jvp z8)Q@XbcghtgN3bYI}Myji_h#+FH7>5)z`s)mPVqYsS;LJMITF=H&;XN=ES#g)np+&J@= zz7bIsM`_TNL9h?WVn#M_`zs=`Xih{Uk@dPEvZ+<;1b8rgsf3!PWKuho3m-`eDrbIE zsuMgf_4DPj+ODcx7PoBoSWLw`+rsuF;TdK3bbs+3*)E7MBd`db7U?IE1`Jg$5>FVH z$SF~Dv=u{yc$k%Vx-ys>(JX?YAQp~Nn1v0YwMZ?Bsbs8(da=WpzyJ_QFf^KdrPzHn z0;kiApi$dYNOB)(k)*)MF=S46$2#HanOFN`)u2|dmr_fMU%uK;*VmfhzulZDRE{PH=;jCRjqa2we8X$5g?IY4zp{*N z1+u1R{fwSGrGv_JgTxL3y()y@Fml_?o(#^&|3(rJ{K?n;#Jb&2>G(!Nd5EyuMuXcnF-JnJo-K=69F(T1 zl3}YiuMF=3x=}v|hjcf8?+h_c^dS1Xj(YqJRyOZ*4=jHghkl;v*{B++(LUYNzQe02 z5=4KDTrKFQ*0B$dS~Zx9be4X01-3HzWItzcg)}X(@Fc(8zs}mYMWX*258T_KpXQ=e z*XyU1^4UN5PP5Jn3!;lIFjo_4V(J>%KtBg6*o5`f^(2j}pM=_1nu28=b8pF31d?VF zpjJoP1H3yq#C%GV%Af|UFGw0_p) z0r)LkFJ&?J!~^3qTcw|Q`?i2snvr#y;%{&2HJWPSA0f03I~v) z2NK{|scG$R;xb4mF7Qi-1`{M=5~W<^0_y8dYAMqnkGK9!wmzoNJ+{hGkeS#|v0Z_r zA5Buw6GzrxB7E%Sp1@B(7YU5tU{vK-P{dl{o>O^5R`Q6dOd!*Z*>F>cvZRnhm$j!7 zDP+Q7SBWuX$l(sl<&h~jm6$;eUD|#knPp}jcAH?X99OHRSpsJh+<^j5vgASDL!DE| ztwSyz%J9g4S=^n$J!an7@}zAezGKfMXYeeqP9@X$J`BjDjUN@zzZLmbY$Z+6@K(d{-%og<8`wn+Sj4zOS17a@P zjcBXBQ9pZ;bxBGeD||hc*#@-(s^mr;Om@wiGgP~0$&|UwB{S$qncbLUBOpoSw|`~! zz3X4TUS53r#?^&evmao?1x@_JOKQYyC98;9BcEu?eg_RvG ze;qYSSU6>Mk4Kaciv=@{np{2colKvRI&4KERhF=26xd_x>We11} z>md0NxJ~kiaHqVTwx?|W0qzW?NU>#EQU5Vc5Hn67(wJcESR%%V95bhv8^f(5O$zJQ z6T!=Jj?}1itSCpcII)dQiEtO|%5nEgVUFAa(YL1%eanaAt2VZpTi4Od3EtCjJ9~E$ z>+$Ueh_Qu;U9N(|d|T~ngC`}{W-MCeyj1)34X99gnf6=JDySr+LM@h-3yps4=tt!j z(Iu!n2uvaE7_)=o4ZC!4K7;aPKM?Hp(w5B?kpyg9R8%yheN+M@QZ%aAwNBdj{+N`i zGWZ^Ria9c}MIzyen8+Spr878`NCU*>h*X9+);l+EynX5FfM*TOv=KIvxnx)y{f#l} zT|zQ?H5`2NRd=)16iosCvfEk*S6C$Dy6O2)&Nrz7DlE~&k^PBaj$nH_3_vWMlH($4 zmFZ6q#nwR0gTcQ6W5t<3z&$N!*LnH|pt8%J?th2Xjx6C=Mk{r_bd43)piLOcF^u z7nG7FM=;)XB*t(XurRlqmnV>94rMPJEFtYDiS13G)a{Nx;5K6193_Ps8c^Y|&4(oN zoDV0-;=y{+X3xTgCrHp?OW0j5iS1NW^3P8oK?j?o96?DW@JPatZXc;WvI$wb``fql z4#1>9nJJvjIIC?y;iB4C+d{a4eoN>Ohz`@M3yW24brfUPim$2Iyqa-zX~yai5*MDV z>w@-#cshB!O7z$B2`UFk2W?P$gJGuw5(+>CmNcMR#BD5j(uB5(3~p$OQb;>wm$*?Y ziKkrV*(RFAnXEK0bE*m%W-TH89`1LA14hA3CnKMk@z!c^of9X66DBOk2NbJ{{4s=A zbqr`j{;v^FdJ9jr+XRssS^l~KVPa~XNi2z+Loo<;!Yhfr$f$gyw;VX>GN8H6jAIB+ z*~o+-3_8{HJm$aX6>iZoJJYRVVFtU6Z)4+Z1$7{4;L0)JfV@Tb!6w0VY}N}KKLbYq zhr$2bxYy6LH`cfv0PKAjs1$;D|#17C?^PZDTZ#u9lrf@a-NdOdCpB?Vvccg;eJX@FqgYZ zXS&~d6A7Ox?OXLjQM;Ujn;Md!n2k}0jG2io3y*~H%_W*LV6sLRlMzBoW}=a7n!Knd z)xr+s2zJMbXhCYBH^)qf{sAT&biJk?h(>*-G`(bK=!T5ha`zWbBDxqo1B*syX`qqK zI`+DUvyO>2_^FdvWd1F}|FJ=p|K`F?=f!j9%|^APa^_~hLCRpU-kgwm5V2_h@PQ59 zrxQrF09Hf{&nc)LZY)|toUP~{w^FaJk#U47$X;A3q!pFYG0@MI)&5nOgU#By2OlI28uMMD8RLM1k9Ixb^ynj3+sYk-`WlOP?*@l3-fFa{A}r;@g9 zr~H4679v4`Z5{_Xo_G(2Fl{jVG5@cCVJ92Z!5xSMYUpI|6a`6SXPyIvrO3LWjUR(H zo({)E8~>8h#-WGbzz$FLI_!KbglI7Ta~B$Wh%C+ZNxl+8C>ZC+?^O5X$S1V$iTwsW zPwh@C@dELI_Jf~?C`yC!e-)X9Ga`x(;7$fJeF@$}L+}1iv6!%?Ow~ss z`(3Z_xc@V_*q?yQo?Fz)z8n21MX8uAMd5HMIl_AdQNy6CxHbFZ*JWpB<*-bvZ9ig4 z&Cjy2*Lk?e7M=(?E1EO|Y_?sy15#58Z{YtNOZ`0_{yq=lm?fD0KjGo$dH6d#knj3` zmj_Z?A>E%8mT1VjpNrszhn#Sd?3GqDq2&cQ0~q)o?s^c?av(*e$So531w3xiD23CD z4zr2$!9*I4u_JaGOqVXQ89R$3^rd7rO{dynnG*iL#BkW7G#EJGdtNHwr#^b>Q#4pnVlSnmbK-3m z{+BU-Ntcwr8jHfchSVQqmS8zH*UU0C$M9@ZT))$Tq$!Se?szIbrY+hx@HLUfmGz2K zYF$QCQggv*X2ReV6-oR=@BF9IwM=8fni9D7U;?SixA;N|smg2_3&lrLDX1z)i?T{r zDuQ<~TC7NqGXobe#Dlt8*Dlp)#y)6AbR_5~3M(1}scr=?oY=y|=3cGXz-a0E`?5M# zs?i95!HKti&;y|7`5Y!9q9b=CVI`~;^+Fc^GH9tgi73B^1to$aZedtoSt?Ax#ltiZ z+LJ!^+8esHTz3{j>tp{|Qv*&+@Rv1Ltoc@BaeN{}~SbMA`or_%4mJMNAUD z9!CFAki+q_T~?LB|1bBkzCiR}6)BcZ=T}nw_N`S zmp@@&WC>hAhxXwJ^~3Gzv!M4&$TiTLV@CuD775)1u|kvmC{{EUi&eYa@lHLhMqUl4 zDW~2h1e1a~s%-X4N?Da1s2NHi)nPKhVW?KZ;s^IglS;JGMD0q9kw&e9T`FJ!s4}cm z>;={+%WS1WDi*N?$h;|m96*Pa(%6qm@2m?2i<1?v7BE|BP|@M85a<@LLqkBo0MDe0 zmtMP2`(>AElsf$5H)YKge1h{h^z1f#YwKWiWq9Lgu9XwLWcxVIVJwzqWpOzfrjVa+ zmB(aL?*vsE(OCWwD!`r$c~Mx<5{)%Qn7HvM!HXr9{HkqrpEU8$DZZzk)GYe2@FndY7V1RG-c~M$kS&JX#}sM zNANDf6b(}-a~W)Yj5;;1C@icev3n)fOUE`dmwx{yYNn-zcL)JuWrPqHxTY0Q=`OY{ z{r9|@MD`NiM}03NzeJro1-AYRFY?dFGv zWTK3hP*oemIAHv@0L1?fJp3*X0{|kM#s3Z5_-R5wZ7`cg>?$MIYWNxb;l7%&@+DT^M5B*-P#Ao7i`; zUC0U(?oXRV?bt+veqJ%|l(T4xZ}Wl!QQzs$nBUxTgK`I3)Hmw>e*&b~)}BP9`1*h5 z8Qo2CD>jM}U*Pcm8VB$oPPl2k1OuV_;9qhg-90`6M}s*8E-HWg<~+KBj~K1Q3Rm`E z?_0eS2lnB>wFh9!f_=Mteia6sb;7i7RB8uR}Pnixnr>`M&lPVk`H!QkkOqH%FTqW0NU53h(|C1*UvC?fincP0(*Crr z-O&FZ61^N7E5n#JT^l&*4WjEu7GV{j7C5s=!jX+ks{(?{NZri96pwx1qOAyE%cq zQP_%+{P*g6+80L3(TmY41Ea!RAA*z#wF``bWt{lH2kU#meVkDki5DND%OUbm`x~iO z##BE8QQcH8^ct+JsKwJJH4gSH(!tncO@P*4<5VzMrlyl3O(80<`n7tu7nTskyMAM# z{MM!S%a`6;c z%~wXmJ1Tnpp|(d!xuye%9>Vo9^r&Eg8aqu$P>CrDr8(-u!@;HZMma@QOl}zMGG)~c z-6|D2s&QXA^*EIDeZX-HU=`?eBx4JxHCXIhw8Tdb*1)f+?2s5ng^!@C+(81K8c7FL zE56ifCbWcIZp|Kn(lz3j3|}|}wo63VBI*QUk9@#{8(?=Vg0<+K4gd{UsRkAkoAZV?#r{JBCAotI1qY%IPW%s%8HKBy)JIuLb-SIwWk8w0!e zJpqgY)FYX4w8F|kR>ox5!YfnJUqPMP&F1lay~kT8<=vx3M%Br=h9#>1qqufBV%o>L zg;6YOB z*ko9W1Xlm!=ooa-Kg5>=d<1h6M^zFssT4uMG0W~jbbm&MN9!-_O_5j^-6f5@J}9Sl zqWjz^?C*WhZ=m|fmL0FB;v%i)^iT#qshuoE{HP?DQ+oeb89fiStNJ+UY*K+G>;Dhj=kFKq9uKfAdd zYq;1Rj?ABxjR~v8;KSh+ICv2t&7_DN%q+z9Z6LZ940sN2oi!HM@MXD$-Nz7|l5P0* zR|jvYcTe4mZt8fDSv$h4JL$9D)^7kYq$EaNfC2a)}W`DJa_zm<^^31aP=uw{&s4z)J=v?Fs*c z_`Of~;R*P(!HG`zD<=kxzs`w=l=@JnV?W_{=Wgktp+AuC%0a_0xj1UHmB3Ln7%+ma zlSBL&9vmJ59tMh~;wAm8L25t6zU<{FlSB0I8rg{$8poICVNrj@k3gS6KWn_9!tt<8DBc|me+A7P#TV%s^8bhjiWUEldH7#E41|uHi5ueg zapRu?iSi=xY%;|^JAZg0J(Zf6n#xS%CUV&)veQ1x4H*fMUd#*^Wh5MiF@TSKn7?5o zi){JXTd{-?5tv5T&>0M(p158ktPU^4)WlBxOWh5z2!})-yJFHh=sm{hg66a^*7;Ie zZ=QFWoy`@nK}-`An(jiFGm_dihd zD;#oS!^-;n9bt*ra`;@qC+Ol3;?05d%D}6D1fK0FZZ*fKC-!-SEI>pyxjr^{5ij?C zeBZkF2Ck;@$*kJQ;y#Di?hKxT2N+Kx&jhjDBhix$6UqJXGIqH^ogZGtyMZXznmK2uW$bH2CRTz?5q`+;UrO_^lyfQpT+I?XHKb(?zZg%Ql_P2`|f zNHtR7ylmB>?*sm!@t$|M;EhVg!ZMtR>f~izglK@a_dD|NY8C0B+j|Iy3t!6h_9{t-bJ3dM z5&4Bh7)lq=Y3U&BIXX>n;8pTe8UTYMik{d+t(JV?;@ zuk!5w^6)b}?BIY^5>)lL=3BkjGN*zM7=MWasMR8=E&^S$BBYcS!}z>Uo>n>EAA9p>RN9**#E6o*nKz!E5y;1uttl~(Eh7Vod{AOe8? zCu~-U*XUqZh`-Lu&+<^<;qyEcc{t0%B_3|_u*}0(cyM|6E)NfQ_(>jqnFmJIRk)A= zHgVPqR~4oq!yF?L5`}tEdiJ6U$-Ykf1s~zSSi|r?CKEDSM1QMa`+xJgyc6|!Dx1wt z<)?AHk$oZiHS1XRNdBq(DR}|7;vtFr*Q~E*Pi70*bJ^qB`RwtTCuY88J&_&%f1tE; A*8l(j diff --git a/venv/lib/python3.7/site-packages/flask/__pycache__/logging.cpython-37.pyc b/venv/lib/python3.7/site-packages/flask/__pycache__/logging.cpython-37.pyc deleted file mode 100644 index dfc5dceed11adeb2fa125f61d2161bbc94b9f785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3091 zcmZuzOK%&=5uP3nUn5esl`OJ(cYruD0hxAou|5!j5ZJQU2?WQ0oHf9}AzRZ;a-`u5 z-QAQ-uH-}3K$1g_x#T1rlVeV~wA((KVeh9?=u=#l1jhg`k)`UzS^&%50cun-mgQZ zDr-q&+Uz%(r|PmU8*jX?SU;3a8NTuQYpQbIQsD*bw^jRm9kXk4?Sfq}>}<(4B(BSK zc@6yyS=skG*OyPiQ6kJyH_681I30(t-+jWc7iF`Bj>i+*?Lue zQlonO{{HUmPj5d+#N4RxYuM#=Sbj|$m@JuFHHfFPOxq_|3-_`}Bu{nrYVkEI#OhkT zoGW7^+O~Rp3?ATbzK_Owdfj@5OtK$(`=0d=No`;J0|z{cQ_1Z_@o8o(7qgkpW;zyD zaiw*pxv^S_DIZ}-QV@X7!p2$J<-Z+q!OP1-jwd!;L^eKFTO3euoAKfB#Ej#vJIf4* zTRg)l`Xn}r!&1C93)3}LLSQ)ThVB#`yU6A|%FW{* z_6};DKvTr$b(J2+I!p5kFw1KNX#etb6E9u!&D}e8I=eHAXSd_jSj5=v&*sbQ-tx1! zxVdas=*<@S#)mpkycmieFVt&jBZ@M5Xf43Mg1^~CbLyRY7vA5{pRre;oHD&**7)o274;T2ERu}b*%>lFff zPO>{z_Tfrqk3@D#KfGr<+5IWm{;{+D#q~1=TfDz|N9+rac`tp5-0Cn&(yF_tC z_%-&iYkfcT^$)PRy!XeOw}b)AQ`Ipq_|03+f>h9yym<50G?ViLvmT9=F=C9#CBhVC zmz>2hIrR=bix@hp%zlP((FSf@Z8@Zu|K3$mEDb^IUTZ>fE|3{Nvl+uv3=C|+<~nq89JszMd#1Dz|(wZ(;$TsXZyh`je} zAyvCVZZuD$-mo-{PDb>7SLp$yc7i-Q5GIaj`&6uA*IzaZWB_Zw>W0hzZW6|&ri2oq zD*5J@)SqpZ)t0#Y?H9uqKbT)l%M;}5D4WCoWc}usSt6aw&NjFB$s~>@fDWEd!RRix zQD6&Hx-J1rgD!)oDA#6^%@d?LebpR8D-`3EVqFkmKsx4))m5E!O_ZKDL8p7JBIuuB z?s6(`oCuu)GLr{1%4-EOdDX>7k<<-%c8}^tUUhzVjF^XT*5jg#<=09oSuuJi=vM$t zk?23gW&Mz}Dd4=C`RxdwVE70u-u@2K=0|9}b}I;3=wD|63o7e=&2O=m-@uCA#M{nB zULOo(77Ye@I2erP7N1gsfhLl5_G+RC{c|+^^%JF!mTEqRLs4inmAbq>PO<}39ryL& zJ_QQ9+V4f0{uRl#fWRXcGN7@%c{y|#I(6PL%6+gnPHSuzMPY}y%o!Cp6B?}HxBOP6 O)oy$g!n{_{SpOCg`+z3^ diff --git a/venv/lib/python3.7/site-packages/flask/__pycache__/sessions.cpython-37.pyc b/venv/lib/python3.7/site-packages/flask/__pycache__/sessions.cpython-37.pyc deleted file mode 100644 index 1c8ce94365c10d8d433d0acb9b29961a8854a32a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12188 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 diff --git a/venv/lib/python3.7/site-packages/flask/__pycache__/signals.cpython-37.pyc b/venv/lib/python3.7/site-packages/flask/__pycache__/signals.cpython-37.pyc deleted file mode 100644 index baaa38621c990cee3adfe5e8acaf93e6570f0618..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2369 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 diff --git a/venv/lib/python3.7/site-packages/flask/__pycache__/wrappers.cpython-37.pyc b/venv/lib/python3.7/site-packages/flask/__pycache__/wrappers.cpython-37.pyc deleted file mode 100644 index c754c57d71d7644eef17468811455c7a6cd57f12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4256 zcmai2+iu*(878^hqgDsYt>Yv`I%!d-TSRNSMG9jP6h73k)!OSuQsIIZ&AIQSPCrpP)(&c{MfmP1F`Q zUpHQuZ_H!!TQjwejc*|mBCPS^<1f4*6r80oB^ z5LM+YZaNKa!C@AhWjQU;<_&JYGLB8BgLad*bi0don|E}(S7eH_#4UJcNs?Uep9q;9 z1auX_gurVakGteW4SDu`Q&*d>6SwiJ)@>e)4A+FCw1AK~$u{vp^g& zPwr(pY06yKge1idXI@H!70VLlDK_#UT8$`jx3+}GH{vKfV%le= zDwE0MJAZQTJsI!ZAMd!2?vEerJe*9JA4k(*j~$4kp|gH|#CTv8x!fuS4ota(h0jEN zzCQP!yBLuYIE5nGOJ{dTNlF5vVVjE&O1llu54?DLS1|E~u@5de=*o3!?VH#l%D`Iu zn;ch1XG-B$#q3*Qgm~MbSV64&@q9Okyfla-b{M2HZCGN9GIq#NE`nRZAc(bHQ6!8G zQEW@4GV>9!SXBWlSS*=WivS|PV@Q`jZapeO91_HHUnF|D84*#0&xbP+6>0*pJ}tud zFbKn15LTT`#&G;(Qh1&egah(UCPP;OnDS1w>5Kg!$!ZT!3d6U1=3=cfd^Piwxoi0U zMQLt%jhltB4_fkC(RvLs;MN<9H*}QQa6xnNF}Z-?u?qE)n%Hibi9`Z5a&ssNj3tHb zc+ikPq!-dKZ%LJeL3;5f@@_5SOAIb!Xx&^~sIFt0<5!cMJziX%10{pRlj(ILt_|*`p56^u z_#*c=e}`j? z(?M9aCC&H#fpDPktWIv_*#s#Epa3BJ4>Eij%LB#2;6PBe>(o3eWh&$O37P}kNhG+4 zNM`0e6CeckaOd$ORyh~Es|A(Z3ykaL|$}k z0y6pfKnY}EBgD?^4DZdo1L0O0Pk?pcq7;3AHCd)AY=Bs#bt@9Tkd$fv=Pal#_fAIE zyCh3o%*e$t`u|Y!aLAq^_5sxX%!~E}AC1_};f)$3^;uJ8NfJwKc#m^nE3Edmx}Vk_ ztd11Jk_xo*r`ZYUYE%Y4Q=pTWJ#r*=PF>6o0}$GY6)1h_fI~`@#(S5(wZeC_f~7?Y z_KOb!;i_OEN}OMGQ}H~#K1=7}sl$2A^@JENjMv5+I)a;HU{D8oYBVYFA#eJCB=J@X zQugKRZZ(eZN1vI$M!zD-hPn8#x^)cCkE^kj;G43TiXs>~edL-qw)yy8oc6y1_hMe_6Ia%EqHVYND`0Nt+9APu{u{T_;<(CMt% zmTh$!dQaoQYO&De+O##kD}7gUF4bSEOP2;}`5}oX$xgr86gk7Wa&G*P?n?UR#cA87jw3PqyPW_ diff --git a/venv/lib/python3.7/site-packages/flask/_compat.py b/venv/lib/python3.7/site-packages/flask/_compat.py deleted file mode 100644 index 76c442c..0000000 --- a/venv/lib/python3.7/site-packages/flask/_compat.py +++ /dev/null @@ -1,145 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask._compat - ~~~~~~~~~~~~~ - - Some py2/py3 compatibility support based on a stripped down - version of six so we don't have to depend on a specific version - of it. - - :copyright: 2010 Pallets - :license: BSD-3-Clause -""" -import sys - -PY2 = sys.version_info[0] == 2 -_identity = lambda x: x - -try: # Python 2 - text_type = unicode - string_types = (str, unicode) - integer_types = (int, long) -except NameError: # Python 3 - text_type = str - string_types = (str,) - integer_types = (int,) - -if not PY2: - iterkeys = lambda d: iter(d.keys()) - itervalues = lambda d: iter(d.values()) - iteritems = lambda d: iter(d.items()) - - from inspect import getfullargspec as getargspec - from io import StringIO - import collections.abc as collections_abc - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - implements_to_string = _identity - -else: - iterkeys = lambda d: d.iterkeys() - itervalues = lambda d: d.itervalues() - iteritems = lambda d: d.iteritems() - - from inspect import getargspec - from cStringIO import StringIO - import collections as collections_abc - - exec("def reraise(tp, value, tb=None):\n raise tp, value, tb") - - def implements_to_string(cls): - cls.__unicode__ = cls.__str__ - cls.__str__ = lambda x: x.__unicode__().encode("utf-8") - return cls - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a - # dummy metaclass for one level of class instantiation that replaces - # itself with the actual metaclass. - class metaclass(type): - def __new__(metacls, name, this_bases, d): - return meta(name, bases, d) - - return type.__new__(metaclass, "temporary_class", (), {}) - - -# Certain versions of pypy have a bug where clearing the exception stack -# breaks the __exit__ function in a very peculiar way. The second level of -# exception blocks is necessary because pypy seems to forget to check if an -# exception happened until the next bytecode instruction? -# -# Relevant PyPy bugfix commit: -# https://bitbucket.org/pypy/pypy/commits/77ecf91c635a287e88e60d8ddb0f4e9df4003301 -# According to ronan on #pypy IRC, it is released in PyPy2 2.3 and later -# versions. -# -# Ubuntu 14.04 has PyPy 2.2.1, which does exhibit this bug. -BROKEN_PYPY_CTXMGR_EXIT = False -if hasattr(sys, "pypy_version_info"): - - class _Mgr(object): - def __enter__(self): - return self - - def __exit__(self, *args): - if hasattr(sys, "exc_clear"): - # Python 3 (PyPy3) doesn't have exc_clear - sys.exc_clear() - - try: - try: - with _Mgr(): - raise AssertionError() - except: # noqa: B001 - # We intentionally use a bare except here. See the comment above - # regarding a pypy bug as to why. - raise - except TypeError: - BROKEN_PYPY_CTXMGR_EXIT = True - except AssertionError: - pass - - -try: - from os import fspath -except ImportError: - # Backwards compatibility as proposed in PEP 0519: - # https://www.python.org/dev/peps/pep-0519/#backwards-compatibility - def fspath(path): - return path.__fspath__() if hasattr(path, "__fspath__") else path - - -class _DeprecatedBool(object): - def __init__(self, name, version, value): - self.message = "'{}' is deprecated and will be removed in version {}.".format( - name, version - ) - self.value = value - - def _warn(self): - import warnings - - warnings.warn(self.message, DeprecationWarning, stacklevel=2) - - def __eq__(self, other): - self._warn() - return other == self.value - - def __ne__(self, other): - self._warn() - return other != self.value - - def __bool__(self): - self._warn() - return self.value - - __nonzero__ = __bool__ - - -json_available = _DeprecatedBool("flask.json_available", "2.0.0", True) diff --git a/venv/lib/python3.7/site-packages/flask/app.py b/venv/lib/python3.7/site-packages/flask/app.py deleted file mode 100644 index e596fe5..0000000 --- a/venv/lib/python3.7/site-packages/flask/app.py +++ /dev/null @@ -1,2466 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.app - ~~~~~~~~~ - - This module implements the central WSGI application object. - - :copyright: 2010 Pallets - :license: BSD-3-Clause -""" -import os -import sys -import warnings -from datetime import timedelta -from functools import update_wrapper -from itertools import chain -from threading import Lock - -from werkzeug.datastructures import Headers -from werkzeug.datastructures import ImmutableDict -from werkzeug.exceptions import BadRequest -from werkzeug.exceptions import BadRequestKeyError -from werkzeug.exceptions import default_exceptions -from werkzeug.exceptions import HTTPException -from werkzeug.exceptions import InternalServerError -from werkzeug.exceptions import MethodNotAllowed -from werkzeug.routing import BuildError -from werkzeug.routing import Map -from werkzeug.routing import RequestRedirect -from werkzeug.routing import RoutingException -from werkzeug.routing import Rule -from werkzeug.wrappers import BaseResponse - -from . import cli -from . import json -from ._compat import integer_types -from ._compat import reraise -from ._compat import string_types -from ._compat import text_type -from .config import Config -from .config import ConfigAttribute -from .ctx import _AppCtxGlobals -from .ctx import AppContext -from .ctx import RequestContext -from .globals import _request_ctx_stack -from .globals import g -from .globals import request -from .globals import session -from .helpers import _endpoint_from_view_func -from .helpers import _PackageBoundObject -from .helpers import find_package -from .helpers import get_debug_flag -from .helpers import get_env -from .helpers import get_flashed_messages -from .helpers import get_load_dotenv -from .helpers import locked_cached_property -from .helpers import url_for -from .json import jsonify -from .logging import create_logger -from .sessions import SecureCookieSessionInterface -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 _default_template_ctx_processor -from .templating import DispatchingJinjaLoader -from .templating import Environment -from .wrappers import Request -from .wrappers import Response - -# a singleton sentinel value for parameter defaults -_sentinel = object() - - -def _make_timedelta(value): - if not isinstance(value, timedelta): - return timedelta(seconds=value) - return value - - -def setupmethod(f): - """Wraps a method so that it performs a check in debug mode if the - first request was already handled. - """ - - def wrapper_func(self, *args, **kwargs): - if self.debug and self._got_first_request: - raise AssertionError( - "A setup function was called after the " - "first request was handled. This usually indicates a bug " - "in the application where a module was not imported " - "and decorators or other functionality was called too late.\n" - "To fix this make sure to import all your view modules, " - "database models and everything related at a central place " - "before the application starts serving requests." - ) - return f(self, *args, **kwargs) - - return update_wrapper(wrapper_func, f) - - -class Flask(_PackageBoundObject): - """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 should be served - at `static_url_path`. Defaults to the ``'static'`` - folder in the root path of the application. - :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: Flask by default will automatically calculate the path - to the root of the application. In certain situations - this cannot be achieved (for instance if the package - is a Python 3 namespace package) and needs to be - manually defined. - """ - - #: 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 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") - - #: The secure cookie uses this for the name of the session cookie. - #: - #: This attribute can also be configured from the config with the - #: ``SESSION_COOKIE_NAME`` configuration key. Defaults to ``'session'`` - session_cookie_name = ConfigAttribute("SESSION_COOKIE_NAME") - - #: 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 - ) - - #: A :class:`~datetime.timedelta` which is used as default cache_timeout - #: for the :func:`send_file` functions. The default is 12 hours. - #: - #: This attribute can also be configured from the config with the - #: ``SEND_FILE_MAX_AGE_DEFAULT`` configuration key. This configuration - #: variable can also be set with an integer value used as seconds. - #: Defaults to ``timedelta(hours=12)`` - send_file_max_age_default = ConfigAttribute( - "SEND_FILE_MAX_AGE_DEFAULT", get_converter=_make_timedelta - ) - - #: Enable this if you want to use the X-Sendfile feature. Keep in - #: mind that the server has to support this. This only affects files - #: sent with the :func:`send_file` method. - #: - #: .. versionadded:: 0.2 - #: - #: This attribute can also be configured from the config with the - #: ``USE_X_SENDFILE`` configuration key. Defaults to ``False``. - use_x_sendfile = ConfigAttribute("USE_X_SENDFILE") - - #: The JSON encoder class to use. Defaults to :class:`~flask.json.JSONEncoder`. - #: - #: .. versionadded:: 0.10 - json_encoder = json.JSONEncoder - - #: The JSON decoder class to use. Defaults to :class:`~flask.json.JSONDecoder`. - #: - #: .. versionadded:: 0.10 - json_decoder = json.JSONDecoder - - #: 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 = {"extensions": ["jinja2.ext.autoescape", "jinja2.ext.with_"]} - - #: Default configuration parameters. - default_config = ImmutableDict( - { - "ENV": None, - "DEBUG": None, - "TESTING": False, - "PROPAGATE_EXCEPTIONS": None, - "PRESERVE_CONTEXT_ON_EXCEPTION": 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": timedelta(hours=12), - "TRAP_BAD_REQUEST_ERRORS": None, - "TRAP_HTTP_EXCEPTIONS": False, - "EXPLAIN_TEMPLATE_LOADING": False, - "PREFERRED_URL_SCHEME": "http", - "JSON_AS_ASCII": True, - "JSON_SORT_KEYS": True, - "JSONIFY_PRETTYPRINT_REGULAR": False, - "JSONIFY_MIMETYPE": "application/json", - "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 test client that is used with when `test_client` is used. - #: - #: .. versionadded:: 0.7 - test_client_class = 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 = None - - #: the session interface to use. By default an instance of - #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. - #: - #: .. versionadded:: 0.8 - session_interface = SecureCookieSessionInterface() - - # TODO remove the next three attrs when Sphinx :inherited-members: works - # https://github.com/sphinx-doc/sphinx/issues/741 - - #: The name of the package or module that this app belongs to. Do not - #: change this once it is set by the constructor. - import_name = None - - #: Location of the template files to be added to the template lookup. - #: ``None`` if templates should not be added. - template_folder = None - - #: Absolute path to the package on the filesystem. Used to look up - #: resources contained in the package. - root_path = None - - def __init__( - self, - import_name, - static_url_path=None, - static_folder="static", - static_host=None, - host_matching=False, - subdomain_matching=False, - template_folder="templates", - instance_path=None, - instance_relative_config=False, - root_path=None, - ): - _PackageBoundObject.__init__( - self, import_name, template_folder=template_folder, root_path=root_path - ) - - self.static_url_path = static_url_path - self.static_folder = static_folder - - 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) - - #: A dictionary of all view functions registered. The keys will - #: be function names which are also used to generate URLs and - #: the values are the function objects themselves. - #: To register a view function, use the :meth:`route` decorator. - self.view_functions = {} - - #: A dictionary of all registered error handlers. The key is ``None`` - #: for error handlers active on the application, otherwise the key is - #: the name of the blueprint. Each key points to another dictionary - #: where the key is the status code of the http exception. The - #: special key ``None`` points to a list of tuples where the first item - #: is the class for the instance check and the second the error handler - #: function. - #: - #: To register an error handler, use the :meth:`errorhandler` - #: decorator. - self.error_handler_spec = {} - - #: A list of functions that are called when :meth:`url_for` raises a - #: :exc:`~werkzeug.routing.BuildError`. Each function registered here - #: is called with `error`, `endpoint` and `values`. If a function - #: returns ``None`` or raises a :exc:`BuildError` the next function is - #: tried. - #: - #: .. versionadded:: 0.9 - self.url_build_error_handlers = [] - - #: A dictionary with lists of functions that will be called at the - #: beginning of each request. The key of the dictionary is the name of - #: the blueprint this function is active for, or ``None`` for all - #: requests. To register a function, use the :meth:`before_request` - #: decorator. - self.before_request_funcs = {} - - #: A list of functions that will be called at the beginning of the - #: first request to this instance. To register a function, use the - #: :meth:`before_first_request` decorator. - #: - #: .. versionadded:: 0.8 - self.before_first_request_funcs = [] - - #: A dictionary with lists of functions that should be called after - #: each request. The key of the dictionary is the name of the blueprint - #: this function is active for, ``None`` for all requests. This can for - #: example be used to close database connections. To register a function - #: here, use the :meth:`after_request` decorator. - self.after_request_funcs = {} - - #: A dictionary with lists of functions that are called after - #: each request, even if an exception has occurred. The key of the - #: dictionary is the name of the blueprint this function is active for, - #: ``None`` for all requests. These functions are not allowed to modify - #: the request, and their return values are ignored. If an exception - #: occurred while processing the request, it gets passed to each - #: teardown_request function. To register a function here, use the - #: :meth:`teardown_request` decorator. - #: - #: .. versionadded:: 0.7 - self.teardown_request_funcs = {} - - #: 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 = [] - - #: A dictionary with lists of functions that are called before the - #: :attr:`before_request_funcs` functions. The key of the dictionary is - #: the name of the blueprint this function is active for, or ``None`` - #: for all requests. To register a function, use - #: :meth:`url_value_preprocessor`. - #: - #: .. versionadded:: 0.7 - self.url_value_preprocessors = {} - - #: A dictionary with lists of functions that can be used as URL value - #: preprocessors. The key ``None`` here is used for application wide - #: callbacks, otherwise the key is the name of the blueprint. - #: Each of these functions has the chance to modify the dictionary - #: of URL values before they are used as the keyword arguments of the - #: view function. For each function registered this one should also - #: provide a :meth:`url_defaults` function that adds the parameters - #: automatically again that were removed that way. - #: - #: .. versionadded:: 0.7 - self.url_default_functions = {} - - #: A dictionary with list of functions that are called without argument - #: to populate the template context. The key of the dictionary is the - #: name of the blueprint this function is active for, ``None`` for all - #: requests. Each returns a dictionary that the template context is - #: updated with. To register a function here, use the - #: :meth:`context_processor` decorator. - self.template_context_processors = {None: [_default_template_ctx_processor]} - - #: A list of shell context processor functions that should be run - #: when a shell context is created. - #: - #: .. versionadded:: 0.11 - self.shell_context_processors = [] - - #: all the attached blueprints in a dictionary by name. Blueprints - #: can be attached multiple times so this dictionary does not tell - #: you how often they got attached. - #: - #: .. versionadded:: 0.7 - self.blueprints = {} - self._blueprint_order = [] - - #: a place where extensions can store application specific state. For - #: example this is where an extension could store database engines and - #: similar things. For backwards compatibility extensions should register - #: themselves like this:: - #: - #: if not hasattr(app, 'extensions'): - #: app.extensions = {} - #: app.extensions['extensionname'] = SomeObject() - #: - #: 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 = {} - - #: 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 - self._before_request_lock = Lock() - - # 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" - self.add_url_rule( - self.static_url_path + "/", - endpoint="static", - host=static_host, - view_func=self.send_static_file, - ) - - # 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 - - @locked_cached_property - def name(self): - """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 - - @property - def propagate_exceptions(self): - """Returns the value of the ``PROPAGATE_EXCEPTIONS`` configuration - value in case it's set, otherwise a sensible default is returned. - - .. versionadded:: 0.7 - """ - rv = self.config["PROPAGATE_EXCEPTIONS"] - if rv is not None: - return rv - return self.testing or self.debug - - @property - def preserve_context_on_exception(self): - """Returns the value of the ``PRESERVE_CONTEXT_ON_EXCEPTION`` - configuration value in case it's set, otherwise a sensible default - is returned. - - .. versionadded:: 0.7 - """ - rv = self.config["PRESERVE_CONTEXT_ON_EXCEPTION"] - if rv is not None: - return rv - return self.debug - - @locked_cached_property - def logger(self): - """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) - - @locked_cached_property - def jinja_env(self): - """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): - """This attribute is set to ``True`` if the application started - handling the first request. - - .. versionadded:: 0.8 - """ - return self._got_first_request - - def make_config(self, instance_relative=False): - """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["ENV"] = get_env() - defaults["DEBUG"] = get_debug_flag() - return self.config_class(root_path, defaults) - - def auto_find_instance_path(self): - """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", self.name + "-instance") - - def open_instance_resource(self, resource, mode="rb"): - """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) - - @property - def templates_auto_reload(self): - """Reload templates when they are changed. Used by - :meth:`create_jinja_environment`. - - This attribute can be configured with :data:`TEMPLATES_AUTO_RELOAD`. If - not set, it will be enabled in debug mode. - - .. versionadded:: 1.0 - This property was added but the underlying config and behavior - already existed. - """ - rv = self.config["TEMPLATES_AUTO_RELOAD"] - return rv if rv is not None else self.debug - - @templates_auto_reload.setter - def templates_auto_reload(self, value): - self.config["TEMPLATES_AUTO_RELOAD"] = value - - def create_jinja_environment(self): - """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: - options["auto_reload"] = self.templates_auto_reload - - rv = self.jinja_environment(self, **options) - rv.globals.update( - url_for=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.filters["tojson"] = json.tojson_filter - return rv - - def create_global_jinja_loader(self): - """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): - """Returns ``True`` if autoescaping should be active for the given - template name. If no template name is given, returns `True`. - - .. versionadded:: 0.5 - """ - if filename is None: - return True - return filename.endswith((".html", ".htm", ".xml", ".xhtml")) - - def update_template_context(self, context): - """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. - """ - funcs = self.template_context_processors[None] - reqctx = _request_ctx_stack.top - if reqctx is not None: - bp = reqctx.request.blueprint - if bp is not None and bp in self.template_context_processors: - funcs = chain(funcs, self.template_context_processors[bp]) - orig_ctx = context.copy() - for func in funcs: - context.update(func()) - # make sure the original values win. This makes it possible to - # easier add new variables in context processors without breaking - # existing views. - context.update(orig_ctx) - - def make_shell_context(self): - """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 - - #: What environment the app is running in. Flask and extensions may - #: enable behaviors based on the environment, such as enabling debug - #: mode. This maps to the :data:`ENV` config key. This is set by the - #: :envvar:`FLASK_ENV` environment variable and may not behave as - #: expected if set in code. - #: - #: **Do not enable development when deploying in production.** - #: - #: Default: ``'production'`` - env = ConfigAttribute("ENV") - - @property - def debug(self): - """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. This is - enabled when :attr:`env` is ``'development'`` and is overridden - by the ``FLASK_DEBUG`` environment variable. It may not behave as - expected if set in code. - - **Do not enable debug mode when deploying in production.** - - Default: ``True`` if :attr:`env` is ``'development'``, or - ``False`` otherwise. - """ - return self.config["DEBUG"] - - @debug.setter - def debug(self, value): - self.config["DEBUG"] = value - self.jinja_env.auto_reload = self.templates_auto_reload - - def run(self, host=None, port=None, debug=None, load_dotenv=True, **options): - """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 :ref:`deployment` 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. - - If set, the :envvar:`FLASK_ENV` and :envvar:`FLASK_DEBUG` - environment variables will override :attr:`env` and - :attr:`debug`. - - Threaded mode is enabled by default. - - .. versionchanged:: 0.10 - The default port is now picked from the ``SERVER_NAME`` - variable. - """ - # Change this into a no-op if the server is invoked from the - # command line. Have a look at cli.py for more information. - if os.environ.get("FLASK_RUN_FROM_CLI") == "true": - from .debughelpers import explain_ignored_app_run - - explain_ignored_app_run() - return - - if get_load_dotenv(load_dotenv): - cli.load_dotenv() - - # if set, let env vars override previous values - if "FLASK_ENV" in os.environ: - self.env = get_env() - self.debug = get_debug_flag() - elif "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) - - _host = "127.0.0.1" - _port = 5000 - server_name = self.config.get("SERVER_NAME") - sn_host, sn_port = None, None - - if server_name: - sn_host, _, sn_port = server_name.partition(":") - - host = host or sn_host or _host - # pick the first value that's not None (0 is allowed) - port = int(next((p for p in (port, sn_port) if p is not None), _port)) - - options.setdefault("use_reloader", self.debug) - options.setdefault("use_debugger", self.debug) - options.setdefault("threaded", True) - - cli.show_server_banner(self.env, self.debug, self.name, False) - - from werkzeug.serving import run_simple - - try: - run_simple(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=True, **kwargs): - """Creates a test client for this application. For information - about unit testing head over to :ref:`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(self, self.response_class, use_cookies=use_cookies, **kwargs) - - def test_cli_runner(self, **kwargs): - """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) - - def open_session(self, request): - """Creates or opens a new session. Default implementation stores all - session data in a signed cookie. This requires that the - :attr:`secret_key` is set. Instead of overriding this method - we recommend replacing the :class:`session_interface`. - - .. deprecated: 1.0 - Will be removed in 1.1. Use ``session_interface.open_session`` - instead. - - :param request: an instance of :attr:`request_class`. - """ - - warnings.warn( - DeprecationWarning( - '"open_session" is deprecated and will be removed in 1.1. Use' - ' "session_interface.open_session" instead.' - ) - ) - return self.session_interface.open_session(self, request) - - def save_session(self, session, response): - """Saves the session if it needs updates. For the default - implementation, check :meth:`open_session`. Instead of overriding this - method we recommend replacing the :class:`session_interface`. - - .. deprecated: 1.0 - Will be removed in 1.1. Use ``session_interface.save_session`` - instead. - - :param session: the session to be saved (a - :class:`~werkzeug.contrib.securecookie.SecureCookie` - object) - :param response: an instance of :attr:`response_class` - """ - - warnings.warn( - DeprecationWarning( - '"save_session" is deprecated and will be removed in 1.1. Use' - ' "session_interface.save_session" instead.' - ) - ) - return self.session_interface.save_session(self, session, response) - - def make_null_session(self): - """Creates a new instance of a missing session. Instead of overriding - this method we recommend replacing the :class:`session_interface`. - - .. deprecated: 1.0 - Will be removed in 1.1. Use ``session_interface.make_null_session`` - instead. - - .. versionadded:: 0.7 - """ - - warnings.warn( - DeprecationWarning( - '"make_null_session" is deprecated and will be removed in 1.1. Use' - ' "session_interface.make_null_session" instead.' - ) - ) - return self.session_interface.make_null_session(self) - - @setupmethod - def register_blueprint(self, blueprint, **options): - """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. - - .. versionadded:: 0.7 - """ - first_registration = False - - if blueprint.name in self.blueprints: - assert self.blueprints[blueprint.name] is blueprint, ( - "A name collision occurred between blueprints %r and %r. Both" - ' share the same name "%s". Blueprints that are created on the' - " fly need unique names." - % (blueprint, self.blueprints[blueprint.name], blueprint.name) - ) - else: - self.blueprints[blueprint.name] = blueprint - self._blueprint_order.append(blueprint) - first_registration = True - - blueprint.register(self, options, first_registration) - - def iter_blueprints(self): - """Iterates over all blueprints by the order they were registered. - - .. versionadded:: 0.11 - """ - return iter(self._blueprint_order) - - @setupmethod - def add_url_rule( - self, - rule, - endpoint=None, - view_func=None, - provide_automatic_options=None, - **options - ): - """Connects a URL rule. Works exactly like the :meth:`route` - decorator. If a view_func is provided it will be registered with the - endpoint. - - Basically this example:: - - @app.route('/') - def index(): - pass - - Is equivalent to the following:: - - def index(): - pass - app.add_url_rule('/', 'index', index) - - If the view_func is not provided you will need to connect the endpoint - to a view function like so:: - - app.view_functions['index'] = index - - Internally :meth:`route` invokes :meth:`add_url_rule` so if you want - to customize the behavior via subclassing you only need to change - this method. - - For more information refer to :ref:`url-route-registrations`. - - .. versionchanged:: 0.2 - `view_func` parameter added. - - .. versionchanged:: 0.6 - ``OPTIONS`` is added automatically as method. - - :param rule: the URL rule as string - :param endpoint: the endpoint for the registered URL rule. Flask - itself assumes the name of the view function as - endpoint - :param view_func: the function to call when serving a request to the - provided endpoint - :param provide_automatic_options: controls whether the ``OPTIONS`` - method should be added automatically. This can also be controlled - by setting the ``view_func.provide_automatic_options = False`` - before adding the rule. - :param options: the options to be forwarded to the underlying - :class:`~werkzeug.routing.Rule` object. A change - to Werkzeug is handling of method options. methods - is a list of methods this rule should be limited - to (``GET``, ``POST`` etc.). By default a rule - just listens for ``GET`` (and implicitly ``HEAD``). - Starting with Flask 0.6, ``OPTIONS`` is implicitly - added and handled by the standard request handling. - """ - if endpoint is None: - endpoint = _endpoint_from_view_func(view_func) - 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, string_types): - raise TypeError( - "Allowed methods have to be iterables of strings, " - 'for example: @app.route(..., methods=["POST"])' - ) - methods = set(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 - - 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 endpoint function: %s" % endpoint - ) - self.view_functions[endpoint] = view_func - - def route(self, rule, **options): - """A decorator that is used to register a view function for a - given URL rule. This does the same thing as :meth:`add_url_rule` - but is intended for decorator usage:: - - @app.route('/') - def index(): - return 'Hello World' - - For more information refer to :ref:`url-route-registrations`. - - :param rule: the URL rule as string - :param endpoint: the endpoint for the registered URL rule. Flask - itself assumes the name of the view function as - endpoint - :param options: the options to be forwarded to the underlying - :class:`~werkzeug.routing.Rule` object. A change - to Werkzeug is handling of method options. methods - is a list of methods this rule should be limited - to (``GET``, ``POST`` etc.). By default a rule - just listens for ``GET`` (and implicitly ``HEAD``). - Starting with Flask 0.6, ``OPTIONS`` is implicitly - added and handled by the standard request handling. - """ - - def decorator(f): - endpoint = options.pop("endpoint", None) - self.add_url_rule(rule, endpoint, f, **options) - return f - - return decorator - - @setupmethod - def endpoint(self, endpoint): - """A decorator to register a function as an endpoint. - Example:: - - @app.endpoint('example.endpoint') - def example(): - return "example" - - :param endpoint: the name of the endpoint - """ - - def decorator(f): - self.view_functions[endpoint] = f - return f - - return decorator - - @staticmethod - def _get_exc_class_and_code(exc_class_or_code): - """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. - """ - if isinstance(exc_class_or_code, integer_types): - exc_class = default_exceptions[exc_class_or_code] - else: - exc_class = exc_class_or_code - - assert issubclass(exc_class, Exception) - - if issubclass(exc_class, HTTPException): - return exc_class, exc_class.code - else: - return exc_class, None - - @setupmethod - def errorhandler(self, code_or_exception): - """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 - - .. 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): - self._register_error_handler(None, code_or_exception, f) - return f - - return decorator - - @setupmethod - def register_error_handler(self, code_or_exception, f): - """Alternative error attach function to the :meth:`errorhandler` - decorator that is more straightforward to use for non decorator - usage. - - .. versionadded:: 0.7 - """ - self._register_error_handler(None, code_or_exception, f) - - @setupmethod - def _register_error_handler(self, key, code_or_exception, f): - """ - :type key: None|str - :type code_or_exception: int|T<=Exception - :type f: callable - """ - if isinstance(code_or_exception, HTTPException): # old broken behavior - raise ValueError( - "Tried to register a handler for an exception instance {0!r}." - " Handlers can only be registered for exception classes or" - " HTTP error codes.".format(code_or_exception) - ) - - try: - exc_class, code = self._get_exc_class_and_code(code_or_exception) - except KeyError: - raise KeyError( - "'{0}' is not a recognized HTTP error code. Use a subclass of" - " HTTPException with that code instead.".format(code_or_exception) - ) - - handlers = self.error_handler_spec.setdefault(key, {}).setdefault(code, {}) - handlers[exc_class] = f - - @setupmethod - def template_filter(self, name=None): - """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): - self.add_template_filter(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_filter(self, f, name=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=None): - """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): - self.add_template_test(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_test(self, f, name=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=None): - """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): - self.add_template_global(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_global(self, f, name=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 before_request(self, f): - """Registers 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. - - 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. - """ - self.before_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def before_first_request(self, f): - """Registers a function to be run before the first request to this - instance of the application. - - The function will be called without any arguments and its return - value is ignored. - - .. versionadded:: 0.8 - """ - self.before_first_request_funcs.append(f) - return f - - @setupmethod - def after_request(self, f): - """Register a function to be run after each request. - - Your function must take one parameter, an instance of - :attr:`response_class` and return a new response object or the - same (see :meth:`process_response`). - - As of Flask 0.7 this function might not be executed at the end of the - request in case an unhandled exception occurred. - """ - self.after_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def teardown_request(self, f): - """Register a function to be run at the end of each request, - regardless of whether there was an exception or not. These functions - are executed when the request context is popped, even if not an - actual request was performed. - - Example:: - - ctx = app.test_request_context() - ctx.push() - ... - ctx.pop() - - When ``ctx.pop()`` is executed in the above example, the teardown - functions are called just before the request context moves from the - stack of active contexts. This becomes relevant if you are using - such constructs in tests. - - Generally teardown functions must take every necessary step to avoid - that they will fail. If they do execute code that might fail they - will have to surround the execution of these code by try/except - statements and log occurring errors. - - When a teardown function was called because of an exception it will - be passed an error object. - - The return values of teardown functions are ignored. - - .. admonition:: Debug Note - - In debug mode Flask will not tear down a request on an exception - immediately. Instead it will keep it alive so that the interactive - debugger can still access it. This behavior can be controlled - by the ``PRESERVE_CONTEXT_ON_EXCEPTION`` configuration variable. - """ - self.teardown_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def teardown_appcontext(self, f): - """Registers a function to be called when the application context - ends. These functions are typically also called when the request - context is popped. - - Example:: - - ctx = app.app_context() - ctx.push() - ... - ctx.pop() - - When ``ctx.pop()`` is executed in the above example, the teardown - functions are called just before the app context moves from the - stack of active contexts. This becomes relevant if you are using - such constructs in tests. - - 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. - - The return values of teardown functions are ignored. - - .. versionadded:: 0.9 - """ - self.teardown_appcontext_funcs.append(f) - return f - - @setupmethod - def context_processor(self, f): - """Registers a template context processor function.""" - self.template_context_processors[None].append(f) - return f - - @setupmethod - def shell_context_processor(self, f): - """Registers a shell context processor function. - - .. versionadded:: 0.11 - """ - self.shell_context_processors.append(f) - return f - - @setupmethod - def url_value_preprocessor(self, f): - """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. - """ - self.url_value_preprocessors.setdefault(None, []).append(f) - return f - - @setupmethod - def url_defaults(self, f): - """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. - """ - self.url_default_functions.setdefault(None, []).append(f) - return f - - def _find_error_handler(self, e): - """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)) - - for name, c in ( - (request.blueprint, code), - (None, code), - (request.blueprint, None), - (None, None), - ): - handler_map = self.error_handler_spec.setdefault(name, {}).get(c) - - if not handler_map: - continue - - for cls in exc_class.__mro__: - handler = handler_map.get(cls) - - if handler is not None: - return handler - - def handle_http_exception(self, e): - """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 - ``HTTPExcpetion`` 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 handler(e) - - def trap_http_exception(self, e): - """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): - """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 - """ - exc_type, exc_value, tb = sys.exc_info() - assert exc_value is e - # ensure not to trash sys.exc_info() at that point in case someone - # wants the traceback preserved in handle_http_exception. Of course - # we cannot prevent users from trashing it themselves in a custom - # trap_http_exception method so that's their fault then. - - if isinstance(e, BadRequestKeyError): - if self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"]: - e.show_exception = True - - # Werkzeug < 0.15 doesn't add the KeyError to the 400 - # message, add it in manually. - # TODO: clean up once Werkzeug >= 0.15.5 is required - if e.args[0] not in e.get_description(): - e.description = "KeyError: '{}'".format(*e.args) - elif not hasattr(BadRequestKeyError, "show_exception"): - e.args = () - - 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: - reraise(exc_type, exc_value, tb) - return handler(e) - - def handle_exception(self, e): - """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 :attr:`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``. - - .. note:: - Prior to Werkzeug 1.0.0, ``InternalServerError`` will not - always have an ``original_exception`` attribute. Use - ``getattr(e, "original_exception", None)`` to simulate the - behavior for compatibility. - - .. 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_type, exc_value, tb = sys.exc_info() - got_request_exception.send(self, exception=e) - - if self.propagate_exceptions: - # if we want to repropagate the exception, we can attempt to - # raise it with the whole traceback in case we can do that - # (the function was actually called from the except part) - # otherwise, we just raise the error again - if exc_value is e: - reraise(exc_type, exc_value, tb) - else: - raise e - - self.log_exception((exc_type, exc_value, tb)) - server_error = InternalServerError() - # TODO: pass as param when Werkzeug>=1.0.0 is required - # TODO: also remove note about this from docstring and docs - server_error.original_exception = e - handler = self._find_error_handler(server_error) - - if handler is not None: - server_error = handler(server_error) - - return self.finalize_request(server_error, from_error_handler=True) - - def log_exception(self, exc_info): - """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( - "Exception on %s [%s]" % (request.path, request.method), exc_info=exc_info - ) - - def raise_routing_exception(self, request): - """Exceptions that are recording during routing are reraised with - this method. During debug we are not reraising redirect requests - for non ``GET``, ``HEAD``, or ``OPTIONS`` requests and we're raising - a different error instead to help debug situations. - - :internal: - """ - if ( - not self.debug - or not isinstance(request.routing_exception, RequestRedirect) - or request.method in ("GET", "HEAD", "OPTIONS") - ): - raise request.routing_exception - - from .debughelpers import FormDataRoutingRedirect - - raise FormDataRoutingRedirect(request) - - def dispatch_request(self): - """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_stack.top.request - if req.routing_exception is not None: - self.raise_routing_exception(req) - rule = req.url_rule - # 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 - return self.view_functions[rule.endpoint](**req.view_args) - - def full_dispatch_request(self): - """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.try_trigger_before_first_request_functions() - try: - request_started.send(self) - 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, from_error_handler=False): - """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, 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 try_trigger_before_first_request_functions(self): - """Called before each request and will ensure that it triggers - the :attr:`before_first_request_funcs` and only exactly once per - application instance (which means process usually). - - :internal: - """ - if self._got_first_request: - return - with self._before_request_lock: - if self._got_first_request: - return - for func in self.before_first_request_funcs: - func() - self._got_first_request = True - - def make_default_options_response(self): - """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_stack.top.url_adapter - if hasattr(adapter, "allowed_methods"): - methods = adapter.allowed_methods() - else: - # fallback for Werkzeug < 0.7 - methods = [] - try: - adapter.match(method="--") - except MethodNotAllowed as e: - methods = e.valid_methods - except HTTPException: - pass - rv = self.response_class() - rv.allow.update(methods) - return rv - - def should_ignore_error(self, error): - """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 make_response(self, rv): - """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`` (``unicode`` in Python 2) - A response object is created with the string encoded to UTF-8 - as the body. - - ``bytes`` (``str`` in Python 2) - A response object is created with the bytes as the body. - - ``dict`` - A dictionary that will be jsonify'd before being returned. - - ``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:: 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 - # 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 - # 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( - "The view function 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, (text_type, bytes, bytearray)): - # 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) - status = headers = None - elif isinstance(rv, dict): - rv = jsonify(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) - except TypeError as e: - new_error = TypeError( - "{e}\nThe view function did not return a valid" - " response. The return type must be a string, dict, tuple," - " Response instance, or WSGI callable, but it was a" - " {rv.__class__.__name__}.".format(e=e, rv=rv) - ) - reraise(TypeError, new_error, sys.exc_info()[2]) - else: - raise TypeError( - "The view function did not return a valid" - " response. The return type must be a string, dict, tuple," - " Response instance, or WSGI callable, but it was a" - " {rv.__class__.__name__}.".format(rv=rv) - ) - - # prefer the status if it was provided - if status is not None: - if isinstance(status, (text_type, bytes, bytearray)): - rv.status = status - else: - rv.status_code = status - - # extend existing headers with provided headers - if headers: - rv.headers.extend(headers) - - return rv - - def create_url_adapter(self, request): - """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. - subdomain = ( - (self.url_map.default_subdomain or None) - if not self.subdomain_matching - else 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"], - ) - - def inject_url_defaults(self, endpoint, values): - """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 - """ - funcs = self.url_default_functions.get(None, ()) - if "." in endpoint: - bp = endpoint.rsplit(".", 1)[0] - funcs = chain(funcs, self.url_default_functions.get(bp, ())) - for func in funcs: - func(endpoint, values) - - def handle_url_build_error(self, error, endpoint, values): - """Handle :class:`~werkzeug.routing.BuildError` on :meth:`url_for`. - """ - exc_type, exc_value, tb = sys.exc_info() - for handler in self.url_build_error_handlers: - try: - rv = handler(error, endpoint, values) - if rv is not None: - return rv - except BuildError as e: - # make error available outside except block (py3) - error = e - - # At this point we want to reraise the exception. If the error is - # still the same one we can reraise it with the original traceback, - # otherwise we raise it from here. - if error is exc_value: - reraise(exc_type, exc_value, tb) - raise error - - def preprocess_request(self): - """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. - """ - - bp = _request_ctx_stack.top.request.blueprint - - funcs = self.url_value_preprocessors.get(None, ()) - if bp is not None and bp in self.url_value_preprocessors: - funcs = chain(funcs, self.url_value_preprocessors[bp]) - for func in funcs: - func(request.endpoint, request.view_args) - - funcs = self.before_request_funcs.get(None, ()) - if bp is not None and bp in self.before_request_funcs: - funcs = chain(funcs, self.before_request_funcs[bp]) - for func in funcs: - rv = func() - if rv is not None: - return rv - - def process_response(self, 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_stack.top - bp = ctx.request.blueprint - funcs = ctx._after_request_functions - if bp is not None and bp in self.after_request_funcs: - funcs = chain(funcs, reversed(self.after_request_funcs[bp])) - if None in self.after_request_funcs: - funcs = chain(funcs, reversed(self.after_request_funcs[None])) - for handler in funcs: - response = handler(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=_sentinel): - """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] - funcs = reversed(self.teardown_request_funcs.get(None, ())) - bp = _request_ctx_stack.top.request.blueprint - if bp is not None and bp in self.teardown_request_funcs: - funcs = chain(funcs, reversed(self.teardown_request_funcs[bp])) - for func in funcs: - func(exc) - request_tearing_down.send(self, exc=exc) - - def do_teardown_appcontext(self, exc=_sentinel): - """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): - func(exc) - appcontext_tearing_down.send(self, exc=exc) - - def app_context(self): - """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): - """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, **kwargs): - """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 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, start_response): - """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 = 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 self.should_ignore_error(error): - error = None - ctx.auto_pop(error) - - def __call__(self, environ, start_response): - """The WSGI server calls the Flask application object as the - WSGI application. This calls :meth:`wsgi_app` which can be - wrapped to applying middleware.""" - return self.wsgi_app(environ, start_response) - - def __repr__(self): - return "<%s %r>" % (self.__class__.__name__, self.name) diff --git a/venv/lib/python3.7/site-packages/flask/blueprints.py b/venv/lib/python3.7/site-packages/flask/blueprints.py deleted file mode 100644 index 8978104..0000000 --- a/venv/lib/python3.7/site-packages/flask/blueprints.py +++ /dev/null @@ -1,569 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.blueprints - ~~~~~~~~~~~~~~~~ - - Blueprints are the recommended way to implement larger or more - pluggable applications in Flask 0.7 and later. - - :copyright: 2010 Pallets - :license: BSD-3-Clause -""" -from functools import update_wrapper - -from .helpers import _endpoint_from_view_func -from .helpers import _PackageBoundObject - -# a singleton sentinel value for parameter defaults -_sentinel = object() - - -class BlueprintSetupState(object): - """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, app, options, first_registration): - #: 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 - - #: 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, endpoint=None, view_func=None, **options): - """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) - defaults = self.url_defaults - if "defaults" in options: - defaults = dict(defaults, **options.pop("defaults")) - self.app.add_url_rule( - rule, - "%s.%s" % (self.blueprint.name, endpoint), - view_func, - defaults=defaults, - **options - ) - - -class Blueprint(_PackageBoundObject): - """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 :ref:`blueprints` for more information. - - .. 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 - - :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 this - based on ``import_name``. In certain situations this automatic - detection can fail, so the path can be specified manually - instead. - """ - - warn_on_modifications = False - _got_registered_once = False - - #: Blueprint local JSON decoder class to use. - #: Set to ``None`` to use the app's :class:`~flask.app.Flask.json_encoder`. - json_encoder = None - #: Blueprint local JSON decoder class to use. - #: Set to ``None`` to use the app's :class:`~flask.app.Flask.json_decoder`. - json_decoder = None - - # TODO remove the next three attrs when Sphinx :inherited-members: works - # https://github.com/sphinx-doc/sphinx/issues/741 - - #: The name of the package or module that this app belongs to. Do not - #: change this once it is set by the constructor. - import_name = None - - #: Location of the template files to be added to the template lookup. - #: ``None`` if templates should not be added. - template_folder = None - - #: Absolute path to the package on the filesystem. Used to look up - #: resources contained in the package. - root_path = None - - def __init__( - self, - name, - import_name, - static_folder=None, - static_url_path=None, - template_folder=None, - url_prefix=None, - subdomain=None, - url_defaults=None, - root_path=None, - cli_group=_sentinel, - ): - _PackageBoundObject.__init__( - self, import_name, template_folder, root_path=root_path - ) - self.name = name - self.url_prefix = url_prefix - self.subdomain = subdomain - self.static_folder = static_folder - self.static_url_path = static_url_path - self.deferred_functions = [] - if url_defaults is None: - url_defaults = {} - self.url_values_defaults = url_defaults - self.cli_group = cli_group - - def record(self, func): - """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. - """ - if self._got_registered_once and self.warn_on_modifications: - from warnings import warn - - warn( - Warning( - "The blueprint was already registered once " - "but is getting modified now. These changes " - "will not show up." - ) - ) - self.deferred_functions.append(func) - - def record_once(self, func): - """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): - if state.first_registration: - func(state) - - return self.record(update_wrapper(wrapper, func)) - - def make_setup_state(self, app, options, first_registration=False): - """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) - - def register(self, app, options, first_registration=False): - """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`. - :param first_registration: Whether this is the first time this - blueprint has been registered on the application. - """ - self._got_registered_once = True - state = self.make_setup_state(app, options, first_registration) - - if self.has_static_folder: - state.add_url_rule( - self.static_url_path + "/", - view_func=self.send_static_file, - endpoint="static", - ) - - for deferred in self.deferred_functions: - deferred(state) - - cli_resolved_group = options.get("cli_group", self.cli_group) - - if not self.cli.commands: - return - - if cli_resolved_group is None: - app.cli.commands.update(self.cli.commands) - elif cli_resolved_group is _sentinel: - self.cli.name = self.name - app.cli.add_command(self.cli) - else: - self.cli.name = cli_resolved_group - app.cli.add_command(self.cli) - - def route(self, rule, **options): - """Like :meth:`Flask.route` but for a blueprint. The endpoint for the - :func:`url_for` function is prefixed with the name of the blueprint. - """ - - def decorator(f): - endpoint = options.pop("endpoint", f.__name__) - self.add_url_rule(rule, endpoint, f, **options) - return f - - return decorator - - def add_url_rule(self, rule, endpoint=None, view_func=None, **options): - """Like :meth:`Flask.add_url_rule` but for a blueprint. The endpoint for - the :func:`url_for` function is prefixed with the name of the blueprint. - """ - if endpoint: - assert "." not in endpoint, "Blueprint endpoints should not contain dots" - if view_func and hasattr(view_func, "__name__"): - assert ( - "." not in view_func.__name__ - ), "Blueprint view function name should not contain dots" - self.record(lambda s: s.add_url_rule(rule, endpoint, view_func, **options)) - - def endpoint(self, endpoint): - """Like :meth:`Flask.endpoint` but for a blueprint. This does not - prefix the endpoint with the blueprint name, this has to be done - explicitly by the user of this method. If the endpoint is prefixed - with a `.` it will be registered to the current blueprint, otherwise - it's an application independent endpoint. - """ - - def decorator(f): - def register_endpoint(state): - state.app.view_functions[endpoint] = f - - self.record_once(register_endpoint) - return f - - return decorator - - def app_template_filter(self, name=None): - """Register a custom template filter, available application wide. Like - :meth:`Flask.template_filter` but for a blueprint. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def decorator(f): - self.add_app_template_filter(f, name=name) - return f - - return decorator - - def add_app_template_filter(self, f, name=None): - """Register a custom template filter, available application wide. Like - :meth:`Flask.add_template_filter` but for a blueprint. Works exactly - like the :meth:`app_template_filter` decorator. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def register_template(state): - state.app.jinja_env.filters[name or f.__name__] = f - - self.record_once(register_template) - - def app_template_test(self, name=None): - """Register a custom template test, available application wide. Like - :meth:`Flask.template_test` but for a blueprint. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def decorator(f): - self.add_app_template_test(f, name=name) - return f - - return decorator - - def add_app_template_test(self, f, name=None): - """Register a custom template test, available application wide. Like - :meth:`Flask.add_template_test` but for a blueprint. Works exactly - like the :meth:`app_template_test` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def register_template(state): - state.app.jinja_env.tests[name or f.__name__] = f - - self.record_once(register_template) - - def app_template_global(self, name=None): - """Register a custom template global, available application wide. Like - :meth:`Flask.template_global` but for a blueprint. - - .. versionadded:: 0.10 - - :param name: the optional name of the global, otherwise the - function name will be used. - """ - - def decorator(f): - self.add_app_template_global(f, name=name) - return f - - return decorator - - def add_app_template_global(self, f, name=None): - """Register a custom template global, available application wide. Like - :meth:`Flask.add_template_global` but for a blueprint. Works exactly - like the :meth:`app_template_global` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the global, otherwise the - function name will be used. - """ - - def register_template(state): - state.app.jinja_env.globals[name or f.__name__] = f - - self.record_once(register_template) - - def before_request(self, f): - """Like :meth:`Flask.before_request` but for a blueprint. This function - is only executed before each request that is handled by a function of - that blueprint. - """ - self.record_once( - lambda s: s.app.before_request_funcs.setdefault(self.name, []).append(f) - ) - return f - - def before_app_request(self, f): - """Like :meth:`Flask.before_request`. Such a function is executed - before each request, even if outside of a blueprint. - """ - self.record_once( - lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) - ) - return f - - def before_app_first_request(self, f): - """Like :meth:`Flask.before_first_request`. Such a function is - executed before the first request to the application. - """ - self.record_once(lambda s: s.app.before_first_request_funcs.append(f)) - return f - - def after_request(self, f): - """Like :meth:`Flask.after_request` but for a blueprint. This function - is only executed after each request that is handled by a function of - that blueprint. - """ - self.record_once( - lambda s: s.app.after_request_funcs.setdefault(self.name, []).append(f) - ) - return f - - def after_app_request(self, f): - """Like :meth:`Flask.after_request` but for a blueprint. Such a function - is executed after each request, even if outside of the blueprint. - """ - self.record_once( - lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) - ) - return f - - def teardown_request(self, f): - """Like :meth:`Flask.teardown_request` but for a blueprint. This - function is only executed when tearing down requests handled by a - function of that blueprint. Teardown request functions are executed - when the request context is popped, even when no actual request was - performed. - """ - self.record_once( - lambda s: s.app.teardown_request_funcs.setdefault(self.name, []).append(f) - ) - return f - - def teardown_app_request(self, f): - """Like :meth:`Flask.teardown_request` but for a blueprint. Such a - function is executed when tearing down each request, even if outside of - the blueprint. - """ - self.record_once( - lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) - ) - return f - - def context_processor(self, f): - """Like :meth:`Flask.context_processor` but for a blueprint. This - function is only executed for requests handled by a blueprint. - """ - self.record_once( - lambda s: s.app.template_context_processors.setdefault( - self.name, [] - ).append(f) - ) - return f - - def app_context_processor(self, f): - """Like :meth:`Flask.context_processor` but for a blueprint. Such a - function is executed each request, even if outside of the blueprint. - """ - self.record_once( - lambda s: s.app.template_context_processors.setdefault(None, []).append(f) - ) - return f - - def app_errorhandler(self, code): - """Like :meth:`Flask.errorhandler` but for a blueprint. This - handler is used for all requests, even if outside of the blueprint. - """ - - def decorator(f): - self.record_once(lambda s: s.app.errorhandler(code)(f)) - return f - - return decorator - - def url_value_preprocessor(self, f): - """Registers a function as URL value preprocessor for this - blueprint. It's called before the view functions are called and - can modify the url values provided. - """ - self.record_once( - lambda s: s.app.url_value_preprocessors.setdefault(self.name, []).append(f) - ) - return f - - def url_defaults(self, f): - """Callback function for URL defaults for this blueprint. It's called - with the endpoint and values and should update the values passed - in place. - """ - self.record_once( - lambda s: s.app.url_default_functions.setdefault(self.name, []).append(f) - ) - return f - - def app_url_value_preprocessor(self, f): - """Same as :meth:`url_value_preprocessor` but application wide. - """ - self.record_once( - lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) - ) - return f - - def app_url_defaults(self, f): - """Same as :meth:`url_defaults` but application wide. - """ - self.record_once( - lambda s: s.app.url_default_functions.setdefault(None, []).append(f) - ) - return f - - def errorhandler(self, code_or_exception): - """Registers an error handler that becomes active for this blueprint - only. Please be aware that routing does not happen local to a - blueprint so an error handler for 404 usually is not handled by - a blueprint unless it is caused inside a view function. Another - special case is the 500 internal server error which is always looked - up from the application. - - Otherwise works as the :meth:`~flask.Flask.errorhandler` decorator - of the :class:`~flask.Flask` object. - """ - - def decorator(f): - self.record_once( - lambda s: s.app._register_error_handler(self.name, code_or_exception, f) - ) - return f - - return decorator - - def register_error_handler(self, code_or_exception, f): - """Non-decorator version of the :meth:`errorhandler` error attach - function, akin to the :meth:`~flask.Flask.register_error_handler` - application-wide function of the :class:`~flask.Flask` object but - for error handlers limited to this blueprint. - - .. versionadded:: 0.11 - """ - self.record_once( - lambda s: s.app._register_error_handler(self.name, code_or_exception, f) - ) diff --git a/venv/lib/python3.7/site-packages/flask/cli.py b/venv/lib/python3.7/site-packages/flask/cli.py deleted file mode 100644 index 1158545..0000000 --- a/venv/lib/python3.7/site-packages/flask/cli.py +++ /dev/null @@ -1,970 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.cli - ~~~~~~~~~ - - A simple command line application to run flask apps. - - :copyright: 2010 Pallets - :license: BSD-3-Clause -""" -from __future__ import print_function - -import ast -import inspect -import os -import platform -import re -import sys -import traceback -from functools import update_wrapper -from operator import attrgetter -from threading import Lock -from threading import Thread - -import click -from werkzeug.utils import import_string - -from ._compat import getargspec -from ._compat import itervalues -from ._compat import reraise -from ._compat import text_type -from .globals import current_app -from .helpers import get_debug_flag -from .helpers import get_env -from .helpers import get_load_dotenv - -try: - import dotenv -except ImportError: - dotenv = None - -try: - import ssl -except ImportError: - ssl = None - - -class NoAppException(click.UsageError): - """Raised if an application cannot be found or loaded.""" - - -def find_best_app(script_info, 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 itervalues(module.__dict__) if isinstance(v, Flask)] - - if len(matches) == 1: - return matches[0] - elif len(matches) > 1: - raise NoAppException( - 'Detected multiple Flask applications in module "{module}". Use ' - '"FLASK_APP={module}:name" to specify the correct ' - "one.".format(module=module.__name__) - ) - - # 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 = call_factory(script_info, app_factory) - - if isinstance(app, Flask): - return app - except TypeError: - if not _called_with_wrong_args(app_factory): - raise - raise NoAppException( - 'Detected factory "{factory}" in module "{module}", but ' - "could not call it without arguments. Use " - "\"FLASK_APP='{module}:{factory}(args)'\" to specify " - "arguments.".format(factory=attr_name, module=module.__name__) - ) - - raise NoAppException( - 'Failed to find Flask application or factory in module "{module}". ' - 'Use "FLASK_APP={module}:name to specify one.'.format(module=module.__name__) - ) - - -def call_factory(script_info, app_factory, arguments=()): - """Takes an app factory, a ``script_info` object and optionally a tuple - of arguments. Checks for the existence of a script_info argument and calls - the app_factory depending on that and the arguments provided. - """ - args_spec = getargspec(app_factory) - arg_names = args_spec.args - arg_defaults = args_spec.defaults - - if "script_info" in arg_names: - return app_factory(*arguments, script_info=script_info) - elif arguments: - return app_factory(*arguments) - elif not arguments and len(arg_names) == 1 and arg_defaults is None: - return app_factory(script_info) - - return app_factory() - - -def _called_with_wrong_args(factory): - """Check whether calling a function raised a ``TypeError`` because - the call failed or because something in the factory raised the - error. - - :param factory: the factory 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 factory.__code__: - # in the factory, it was called successfully - return False - - tb = tb.tb_next - - # didn't reach the factory - return True - finally: - # explicitly delete tb as it is circular referenced - # https://docs.python.org/2/library/sys.html#sys.exc_info - del tb - - -def find_app_by_string(script_info, module, app_name): - """Checks if the given string is a variable name or a function. If it is a - function, it checks for specified arguments and whether it takes a - ``script_info`` argument and calls the function with the appropriate - arguments. - """ - from . import Flask - - match = re.match(r"^ *([^ ()]+) *(?:\((.*?) *,? *\))? *$", app_name) - - if not match: - raise NoAppException( - '"{name}" is not a valid variable name or function ' - "expression.".format(name=app_name) - ) - - name, args = match.groups() - - try: - attr = getattr(module, name) - except AttributeError as e: - raise NoAppException(e.args[0]) - - if inspect.isfunction(attr): - if args: - try: - args = ast.literal_eval("({args},)".format(args=args)) - except (ValueError, SyntaxError) as e: - raise NoAppException( - "Could not parse the arguments in " - '"{app_name}".'.format(e=e, app_name=app_name) - ) - else: - args = () - - try: - app = call_factory(script_info, attr, args) - except TypeError as e: - if not _called_with_wrong_args(attr): - raise - - raise NoAppException( - '{e}\nThe factory "{app_name}" in module "{module}" could not ' - "be called with the specified arguments.".format( - e=e, app_name=app_name, module=module.__name__ - ) - ) - else: - app = attr - - if isinstance(app, Flask): - return app - - raise NoAppException( - "A valid Flask application was not obtained from " - '"{module}:{app_name}".'.format(module=module.__name__, app_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(script_info, module_name, app_name, raise_if_not_found=True): - __traceback_hide__ = True # noqa: F841 - - 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()[-1].tb_next: - raise NoAppException( - 'While importing "{name}", an ImportError was raised:' - "\n\n{tb}".format(name=module_name, tb=traceback.format_exc()) - ) - elif raise_if_not_found: - raise NoAppException('Could not import "{name}".'.format(name=module_name)) - else: - return - - module = sys.modules[module_name] - - if app_name is None: - return find_best_app(script_info, module) - else: - return find_app_by_string(script_info, module, app_name) - - -def get_version(ctx, param, value): - if not value or ctx.resilient_parsing: - return - - import werkzeug - from . import __version__ - - message = "Python %(python)s\nFlask %(flask)s\nWerkzeug %(werkzeug)s" - click.echo( - message - % { - "python": platform.python_version(), - "flask": __version__, - "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 DispatchingApp(object): - """Special application that dispatches to a Flask application which - is imported by name in a background thread. If an error happens - it is recorded and shown as part of the WSGI handling which in case - of the Werkzeug debugger means that it shows up in the browser. - """ - - def __init__(self, loader, use_eager_loading=False): - self.loader = loader - self._app = None - self._lock = Lock() - self._bg_loading_exc_info = None - if use_eager_loading: - self._load_unlocked() - else: - self._load_in_background() - - def _load_in_background(self): - def _load_app(): - __traceback_hide__ = True # noqa: F841 - with self._lock: - try: - self._load_unlocked() - except Exception: - self._bg_loading_exc_info = sys.exc_info() - - t = Thread(target=_load_app, args=()) - t.start() - - def _flush_bg_loading_exception(self): - __traceback_hide__ = True # noqa: F841 - exc_info = self._bg_loading_exc_info - if exc_info is not None: - self._bg_loading_exc_info = None - reraise(*exc_info) - - def _load_unlocked(self): - __traceback_hide__ = True # noqa: F841 - self._app = rv = self.loader() - self._bg_loading_exc_info = None - return rv - - def __call__(self, environ, start_response): - __traceback_hide__ = True # noqa: F841 - if self._app is not None: - return self._app(environ, start_response) - self._flush_bg_loading_exception() - with self._lock: - if self._app is not None: - rv = self._app - else: - rv = self._load_unlocked() - return rv(environ, start_response) - - -class ScriptInfo(object): - """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=None, create_app=None, set_debug_flag=True): - #: Optionally the import path for the Flask application. - self.app_import_path = app_import_path or os.environ.get("FLASK_APP") - #: 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 = {} - self.set_debug_flag = set_debug_flag - self._loaded_app = None - - def load_app(self): - """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. - """ - __traceback_hide__ = True # noqa: F841 - - if self._loaded_app is not None: - return self._loaded_app - - app = None - - if self.create_app is not None: - app = call_factory(self, 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(self, import_name, name) - else: - for path in ("wsgi.py", "app.py"): - import_name = prepare_import(path) - app = locate_app(self, import_name, None, raise_if_not_found=False) - - if app: - break - - if not app: - raise NoAppException( - "Could not locate a Flask application. You did not provide " - 'the "FLASK_APP" environment variable, and a "wsgi.py" or ' - '"app.py" module was not found 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. If callbacks are registered directly - to the ``app.cli`` object then they are wrapped with this function - by default unless it's disabled. - """ - - @click.pass_context - def decorator(__ctx, *args, **kwargs): - with __ctx.ensure_object(ScriptInfo).load_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) - - -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. - - For information as of why this is useful 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 based on the active - environment - - .. 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=True, - create_app=None, - add_version_option=True, - load_dotenv=True, - set_debug_flag=True, - **extra - ): - params = list(extra.pop("params", None) or ()) - - if add_version_option: - params.append(version_option) - - AppGroup.__init__(self, 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 - try: - import pkg_resources - except ImportError: - self._loaded_plugin_commands = True - return - - for ep in pkg_resources.iter_entry_points("flask.commands"): - self.add_command(ep.load(), ep.name) - self._loaded_plugin_commands = True - - def get_command(self, ctx, name): - self._load_plugin_commands() - - # We load built-in commands first as these should always be the - # same no matter what the app does. If the app does want to - # override this it needs to make a custom instance of this group - # and not attach the default commands. - # - # This also means that the script stays functional in case the - # application completely fails. - rv = AppGroup.get_command(self, ctx, name) - if rv is not None: - return rv - - info = ctx.ensure_object(ScriptInfo) - try: - rv = info.load_app().cli.get_command(ctx, name) - if rv is not None: - return rv - except NoAppException: - pass - - def list_commands(self, ctx): - self._load_plugin_commands() - - # The commands available is the list of both the application (if - # available) plus the builtin commands. - rv = set(click.Group.list_commands(self, ctx)) - info = ctx.ensure_object(ScriptInfo) - try: - rv.update(info.load_app().cli.list_commands(ctx)) - except Exception: - # Here we intentionally swallow all exceptions as we don't - # want the help page to break if the app does not exist. - # If someone attempts to use the command we try to create - # the app again and this will give us the error. - # However, we will not do so silently because that would confuse - # users. - traceback.print_exc() - return sorted(rv) - - def main(self, *args, **kwargs): - # Set a global flag that indicates that we were invoked from the - # command line interface. This is detected by Flask.run to make the - # call into a no-op. This is necessary to avoid ugly errors when the - # script that is loaded here also attempts to start a server. - os.environ["FLASK_RUN_FROM_CLI"] = "true" - - if get_load_dotenv(self.load_dotenv): - load_dotenv() - - obj = kwargs.get("obj") - - if obj is None: - obj = ScriptInfo( - create_app=self.create_app, set_debug_flag=self.set_debug_flag - ) - - kwargs["obj"] = obj - kwargs.setdefault("auto_envvar_prefix", "FLASK") - return super(FlaskGroup, self).main(*args, **kwargs) - - -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=None): - """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. - - Changes the current working directory to the location of the first file - found, with the assumption that it is in the top level project directory - and will be where the Python path should import local packages from. - - 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:: 1.1.0 - Returns ``False`` when python-dotenv is not installed, or when - the given path isn't a file. - - .. versionadded:: 1.0 - """ - if dotenv is None: - 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 - - # if the given path specifies the actual file then return True, - # else False - if path is not None: - if os.path.isfile(path): - return dotenv.load_dotenv(path) - - return False - - new_dir = None - - for name in (".env", ".flaskenv"): - path = dotenv.find_dotenv(name, usecwd=True) - - if not path: - continue - - if new_dir is None: - new_dir = os.path.dirname(path) - - dotenv.load_dotenv(path) - - if new_dir and os.getcwd() != new_dir: - os.chdir(new_dir) - - return new_dir is not None # at least one file was located and loaded - - -def show_server_banner(env, debug, app_import_path, eager_loading): - """Show extra startup messages the first time the server is run, - ignoring the reloader. - """ - if os.environ.get("WERKZEUG_RUN_MAIN") == "true": - return - - if app_import_path is not None: - message = ' * Serving Flask app "{0}"'.format(app_import_path) - - if not eager_loading: - message += " (lazy loading)" - - click.echo(message) - - click.echo(" * Environment: {0}".format(env)) - - if env == "production": - click.secho( - " WARNING: This is a development server. " - "Do not use it in a production deployment.", - fg="red", - ) - click.secho(" Use a production WSGI server instead.", dim=True) - - if debug is not None: - click.echo(" * Debug mode: {0}".format("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): - if ssl is None: - raise click.BadParameter( - 'Using "--cert" requires Python to be compiled with SSL support.', - ctx, - param, - ) - - try: - return self.path_type(value, param, ctx) - except click.BadParameter: - value = click.STRING(value, param, ctx).lower() - - if value == "adhoc": - try: - import OpenSSL # noqa: F401 - except ImportError: - raise click.BadParameter( - "Using ad-hoc certificates requires pyOpenSSL.", ctx, param - ) - - return value - - obj = import_string(value, silent=True) - - if sys.version_info < (2, 7, 9): - if obj: - return obj - else: - 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" - - if sys.version_info < (2, 7, 9): - is_context = cert and not isinstance(cert, (text_type, bytes)) - 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(SeparatedPathType, self).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." -) -@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( - "--eager-loading/--lazy-loader", - default=None, - help="Enable or disable eager loading. By default eager " - "loading is enabled if the reloader is disabled.", -) -@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" - " are separated by '{}'.".format(os.path.pathsep) - ), -) -@pass_script_info -def run_command( - info, host, port, reload, debugger, eager_loading, with_threads, cert, extra_files -): - """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 if - FLASK_ENV=development or FLASK_DEBUG=1. - """ - debug = get_debug_flag() - - if reload is None: - reload = debug - - if debugger is None: - debugger = debug - - if eager_loading is None: - eager_loading = not reload - - show_server_banner(get_env(), debug, info.app_import_path, eager_loading) - app = DispatchingApp(info.load_app, use_eager_loading=eager_loading) - - from werkzeug.serving import run_simple - - run_simple( - host, - port, - app, - use_reloader=reload, - use_debugger=debugger, - threaded=with_threads, - ssl_context=cert, - extra_files=extra_files, - ) - - -@click.command("shell", short_help="Run a shell in the app context.") -@with_appcontext -def shell_command(): - """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 it's configuration. - - This is useful for executing small snippets of management code - without having to manually configure the application. - """ - import code - from .globals import _app_ctx_stack - - app = _app_ctx_stack.top.app - banner = "Python %s on %s\nApp: %s [%s]\nInstance: %s" % ( - sys.version, - sys.platform, - app.import_name, - app.env, - app.instance_path, - ) - ctx = {} - - # 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, "r") as f: - eval(compile(f.read(), startup, "exec"), ctx) - - ctx.update(app.make_shell_context()) - - 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", "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, all_methods): - """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")) - - if sort in ("endpoint", "rule"): - rules = sorted(rules, key=attrgetter(sort)) - elif sort == "methods": - rules = sorted(rules, key=lambda rule: sorted(rule.methods)) - - rule_methods = [", ".join(sorted(rule.methods - ignored_methods)) for rule in rules] - - headers = ("Endpoint", "Methods", "Rule") - widths = ( - max(len(rule.endpoint) for rule in rules), - max(len(methods) for methods in rule_methods), - max(len(rule.rule) for rule in rules), - ) - widths = [max(len(h), w) for h, w in zip(headers, widths)] - row = "{{0:<{0}}} {{1:<{1}}} {{2:<{2}}}".format(*widths) - - click.echo(row.format(*headers).strip()) - click.echo(row.format(*("-" * width for width in widths))) - - for rule, methods in zip(rules, rule_methods): - click.echo(row.format(rule.endpoint, methods, rule.rule).rstrip()) - - -cli = FlaskGroup( - help="""\ -A general utility script for Flask applications. - -Provides commands from Flask, extensions, and the application. Loads the -application defined in the FLASK_APP environment variable, or from a wsgi.py -file. Setting the FLASK_ENV environment variable to 'development' will enable -debug mode. - -\b - {prefix}{cmd} FLASK_APP=hello.py - {prefix}{cmd} FLASK_ENV=development - {prefix}flask run -""".format( - cmd="export" if os.name == "posix" else "set", - prefix="$ " if os.name == "posix" else "> ", - ) -) - - -def main(as_module=False): - cli.main(prog_name="python -m flask" if as_module else None) - - -if __name__ == "__main__": - main(as_module=True) diff --git a/venv/lib/python3.7/site-packages/flask/config.py b/venv/lib/python3.7/site-packages/flask/config.py deleted file mode 100644 index 809de33..0000000 --- a/venv/lib/python3.7/site-packages/flask/config.py +++ /dev/null @@ -1,269 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.config - ~~~~~~~~~~~~ - - Implements the configuration related objects. - - :copyright: 2010 Pallets - :license: BSD-3-Clause -""" -import errno -import os -import types - -from werkzeug.utils import import_string - -from . import json -from ._compat import iteritems -from ._compat import string_types - - -class ConfigAttribute(object): - """Makes an attribute forward to the config""" - - def __init__(self, name, get_converter=None): - self.__name__ = name - self.get_converter = get_converter - - def __get__(self, obj, type=None): - 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, value): - 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, defaults=None): - dict.__init__(self, defaults or {}) - self.root_path = root_path - - def from_envvar(self, variable_name, silent=False): - """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: bool. ``True`` if able to load config, ``False`` otherwise. - """ - rv = os.environ.get(variable_name) - if not rv: - if silent: - return False - raise RuntimeError( - "The environment variable %r is not set " - "and as such configuration could not be " - "loaded. Set this variable and make it " - "point to a configuration file" % variable_name - ) - return self.from_pyfile(rv, silent=silent) - - def from_pyfile(self, filename, silent=False): - """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. - - .. 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 IOError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): - return False - e.strerror = "Unable to load configuration file (%s)" % e.strerror - raise - self.from_object(d) - return True - - def from_object(self, obj): - """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, string_types): - obj = import_string(obj) - for key in dir(obj): - if key.isupper(): - self[key] = getattr(obj, key) - - def from_json(self, filename, silent=False): - """Updates the values in the config from a JSON file. This function - behaves as if the JSON object was a dictionary and passed to the - :meth:`from_mapping` function. - - :param filename: the filename of the JSON file. 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. - - .. versionadded:: 0.11 - """ - filename = os.path.join(self.root_path, filename) - - try: - with open(filename) as json_file: - obj = json.loads(json_file.read()) - except IOError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR): - return False - e.strerror = "Unable to load configuration file (%s)" % e.strerror - raise - return self.from_mapping(obj) - - def from_mapping(self, *mapping, **kwargs): - """Updates the config like :meth:`update` ignoring items with non-upper - keys. - - .. versionadded:: 0.11 - """ - mappings = [] - if len(mapping) == 1: - if hasattr(mapping[0], "items"): - mappings.append(mapping[0].items()) - else: - mappings.append(mapping[0]) - elif len(mapping) > 1: - raise TypeError( - "expected at most 1 positional argument, got %d" % len(mapping) - ) - mappings.append(kwargs.items()) - for mapping in mappings: - for (key, value) in mapping: - if key.isupper(): - self[key] = value - return True - - def get_namespace(self, namespace, lowercase=True, trim_namespace=True): - """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 iteritems(self): - 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): - return "<%s %s>" % (self.__class__.__name__, dict.__repr__(self)) diff --git a/venv/lib/python3.7/site-packages/flask/ctx.py b/venv/lib/python3.7/site-packages/flask/ctx.py deleted file mode 100644 index 172f6a0..0000000 --- a/venv/lib/python3.7/site-packages/flask/ctx.py +++ /dev/null @@ -1,475 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.ctx - ~~~~~~~~~ - - Implements the objects required to keep the context. - - :copyright: 2010 Pallets - :license: BSD-3-Clause -""" -import sys -from functools import update_wrapper - -from werkzeug.exceptions import HTTPException - -from ._compat import BROKEN_PYPY_CTXMGR_EXIT -from ._compat import reraise -from .globals import _app_ctx_stack -from .globals import _request_ctx_stack -from .signals import appcontext_popped -from .signals import appcontext_pushed - - -# a singleton sentinel value for parameter defaults -_sentinel = object() - - -class _AppCtxGlobals(object): - """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 - """ - - def get(self, name, default=None): - """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, default=_sentinel): - """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 raise 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, default=None): - """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): - return item in self.__dict__ - - def __iter__(self): - return iter(self.__dict__) - - def __repr__(self): - top = _app_ctx_stack.top - if top is not None: - return "" % top.app.name - return object.__repr__(self) - - -def after_this_request(f): - """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 - """ - _request_ctx_stack.top._after_request_functions.append(f) - return f - - -def copy_current_request_context(f): - """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 - """ - top = _request_ctx_stack.top - if top is None: - raise RuntimeError( - "This decorator can only be used at local scopes " - "when a request context is on the stack. For instance within " - "view functions." - ) - reqctx = top.copy() - - def wrapper(*args, **kwargs): - with reqctx: - return f(*args, **kwargs) - - return update_wrapper(wrapper, f) - - -def has_request_context(): - """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 _request_ctx_stack.top is not None - - -def has_app_context(): - """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 _app_ctx_stack.top is not None - - -class AppContext(object): - """The application context binds an application object implicitly - to the current thread or greenlet, similar to how the - :class:`RequestContext` binds request information. The application - context is also implicitly created if a request context is created - but the application is not on top of the individual application - context. - """ - - def __init__(self, app): - self.app = app - self.url_adapter = app.create_url_adapter(None) - self.g = app.app_ctx_globals_class() - - # Like request context, app contexts can be pushed multiple times - # but there a basic "refcount" is enough to track them. - self._refcnt = 0 - - def push(self): - """Binds the app context to the current context.""" - self._refcnt += 1 - if hasattr(sys, "exc_clear"): - sys.exc_clear() - _app_ctx_stack.push(self) - appcontext_pushed.send(self.app) - - def pop(self, exc=_sentinel): - """Pops the app context.""" - try: - self._refcnt -= 1 - if self._refcnt <= 0: - if exc is _sentinel: - exc = sys.exc_info()[1] - self.app.do_teardown_appcontext(exc) - finally: - rv = _app_ctx_stack.pop() - assert rv is self, "Popped wrong app context. (%r instead of %r)" % (rv, self) - appcontext_popped.send(self.app) - - def __enter__(self): - self.push() - return self - - def __exit__(self, exc_type, exc_value, tb): - self.pop(exc_value) - - if BROKEN_PYPY_CTXMGR_EXIT and exc_type is not None: - reraise(exc_type, exc_value, tb) - - -class RequestContext(object): - """The request context contains all request relevant information. It is - created at the beginning of the request and pushed to the - `_request_ctx_stack` and removed at the end of it. 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 - for you. In debug mode the request context is kept around if - exceptions happen so that interactive debuggers have a chance to - introspect the data. With 0.4 this can also be forced for requests - that did not fail and outside of ``DEBUG`` mode. By setting - ``'flask._preserve_context'`` to ``True`` on the WSGI environment the - context will not pop itself at the end of the request. This is used by - the :meth:`~flask.Flask.test_client` for example to implement the - deferred cleanup functionality. - - You might find this helpful for unittests where you need the - information from the context local around for a little longer. Make - sure to properly :meth:`~werkzeug.LocalStack.pop` the stack yourself in - that situation, otherwise your unittests will leak memory. - """ - - def __init__(self, app, environ, request=None, session=None): - self.app = app - if request is None: - request = app.request_class(environ) - self.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 = None - self.session = session - - # Request contexts can be pushed multiple times and interleaved with - # other request contexts. Now only if the last level is popped we - # get rid of them. Additionally if an application context is missing - # one is created implicitly so for each level we add this information - self._implicit_app_ctx_stack = [] - - # indicator if the context was preserved. Next time another context - # is pushed the preserved context is popped. - self.preserved = False - - # remembers the exception for pop if there is one in case the context - # preservation kicks in. - self._preserved_exc = None - - # 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 = [] - - @property - def g(self): - return _app_ctx_stack.top.g - - @g.setter - def g(self, value): - _app_ctx_stack.top.g = value - - def copy(self): - """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): - """Can be overridden by a subclass to hook into the matching - of the request. - """ - try: - result = self.url_adapter.match(return_rule=True) - self.request.url_rule, self.request.view_args = result - except HTTPException as e: - self.request.routing_exception = e - - def push(self): - """Binds the request context to the current context.""" - # If an exception occurs in debug mode or if context preservation is - # activated under exception situations exactly one context stays - # on the stack. The rationale is that you want to access that - # information under debug situations. However if someone forgets to - # pop that context again we want to make sure that on the next push - # it's invalidated, otherwise we run at risk that something leaks - # memory. This is usually only a problem in test suite since this - # functionality is not active in production environments. - top = _request_ctx_stack.top - if top is not None and top.preserved: - top.pop(top._preserved_exc) - - # Before we push the request context we have to ensure that there - # is an application context. - app_ctx = _app_ctx_stack.top - if app_ctx is None or app_ctx.app != self.app: - app_ctx = self.app.app_context() - app_ctx.push() - self._implicit_app_ctx_stack.append(app_ctx) - else: - self._implicit_app_ctx_stack.append(None) - - if hasattr(sys, "exc_clear"): - sys.exc_clear() - - _request_ctx_stack.push(self) - - # 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) - - if self.url_adapter is not None: - self.match_request() - - def pop(self, exc=_sentinel): - """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. - """ - app_ctx = self._implicit_app_ctx_stack.pop() - - try: - clear_request = False - if not self._implicit_app_ctx_stack: - self.preserved = False - self._preserved_exc = None - if exc is _sentinel: - exc = sys.exc_info()[1] - self.app.do_teardown_request(exc) - - # If this interpreter supports clearing the exception information - # we do that now. This will only go into effect on Python 2.x, - # on 3.x it disappears automatically at the end of the exception - # stack. - if hasattr(sys, "exc_clear"): - sys.exc_clear() - - request_close = getattr(self.request, "close", None) - if request_close is not None: - request_close() - clear_request = True - finally: - rv = _request_ctx_stack.pop() - - # 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: - rv.request.environ["werkzeug.request"] = None - - # Get rid of the app as well if necessary. - if app_ctx is not None: - app_ctx.pop(exc) - - assert rv is self, "Popped wrong request context. (%r instead of %r)" % ( - rv, - self, - ) - - def auto_pop(self, exc): - if self.request.environ.get("flask._preserve_context") or ( - exc is not None and self.app.preserve_context_on_exception - ): - self.preserved = True - self._preserved_exc = exc - else: - self.pop(exc) - - def __enter__(self): - self.push() - return self - - def __exit__(self, exc_type, exc_value, tb): - # do not pop the request stack if we are in debug mode and an - # exception happened. This will allow the debugger to still - # access the request object in the interactive shell. Furthermore - # the context can be force kept alive for the test client. - # See flask.testing for how this works. - self.auto_pop(exc_value) - - if BROKEN_PYPY_CTXMGR_EXIT and exc_type is not None: - reraise(exc_type, exc_value, tb) - - def __repr__(self): - return "<%s '%s' [%s] of %s>" % ( - self.__class__.__name__, - self.request.url, - self.request.method, - self.app.name, - ) diff --git a/venv/lib/python3.7/site-packages/flask/debughelpers.py b/venv/lib/python3.7/site-packages/flask/debughelpers.py deleted file mode 100644 index e475bd1..0000000 --- a/venv/lib/python3.7/site-packages/flask/debughelpers.py +++ /dev/null @@ -1,183 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.debughelpers - ~~~~~~~~~~~~~~~~~~ - - Various helpers to make the development experience better. - - :copyright: 2010 Pallets - :license: BSD-3-Clause -""" -import os -from warnings import warn - -from ._compat import implements_to_string -from ._compat import text_type -from .app import Flask -from .blueprints import Blueprint -from .globals import _request_ctx_stack - - -class UnexpectedUnicodeError(AssertionError, UnicodeError): - """Raised in places where we want some better error reporting for - unexpected unicode or binary data. - """ - - -@implements_to_string -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 = [ - 'You tried to access the file "%s" in the request.files ' - "dictionary but it does not exist. The mimetype for the request " - 'is "%s" 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.' - % (key, request.mimetype) - ] - if form_matches: - buf.append( - "\n\nThe browser instead transmitted some file names. " - "This was submitted: %s" % ", ".join('"%s"' % x for x in form_matches) - ) - self.msg = "".join(buf) - - def __str__(self): - return self.msg - - -class FormDataRoutingRedirect(AssertionError): - """This exception is raised by Flask in debug mode if it detects a - redirect caused by the routing system when the request method is not - GET, HEAD or OPTIONS. Reasoning: form data will be dropped. - """ - - def __init__(self, request): - exc = request.routing_exception - buf = [ - "A request was sent to this URL (%s) but a redirect was " - 'issued automatically by the routing system to "%s".' - % (request.url, exc.new_url) - ] - - # In case just a slash was appended we can be extra helpful - if request.base_url + "/" == exc.new_url.split("?")[0]: - buf.append( - " The URL was defined with a trailing slash so " - "Flask will automatically redirect to the URL " - "with the trailing slash if it was accessed " - "without one." - ) - - buf.append( - " Make sure to directly send your %s-request to this URL " - "since we can't make browsers or HTTP clients redirect " - "with form data reliably or without user interaction." % request.method - ) - buf.append("\n\nNote: this exception is only raised in debug mode") - AssertionError.__init__(self, "".join(buf).encode("utf-8")) - - -def attach_enctype_error_multidict(request): - """Since Flask 0.8 we're monkeypatching the files object in case a - request is detected that does not use multipart form data but the files - object is accessed. - """ - oldcls = request.files.__class__ - - class newcls(oldcls): - def __getitem__(self, key): - try: - return oldcls.__getitem__(self, key) - except KeyError: - if key not in request.form: - raise - raise DebugFilesKeyError(request, key) - - newcls.__name__ = oldcls.__name__ - newcls.__module__ = oldcls.__module__ - request.files.__class__ = newcls - - -def _dump_loader_info(loader): - yield "class: %s.%s" % (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, text_type)) for x in value): - continue - yield "%s:" % key - for item in value: - yield " - %s" % item - continue - elif not isinstance(value, (str, text_type, int, float, bool)): - continue - yield "%s: %r" % (key, value) - - -def explain_template_loading_attempts(app, template, attempts): - """This should help developers understand what failed""" - info = ['Locating template "%s":' % template] - total_found = 0 - blueprint = None - reqctx = _request_ctx_stack.top - if reqctx is not None and reqctx.request.blueprint is not None: - blueprint = reqctx.request.blueprint - - for idx, (loader, srcobj, triple) in enumerate(attempts): - if isinstance(srcobj, Flask): - src_info = 'application "%s"' % srcobj.import_name - elif isinstance(srcobj, Blueprint): - src_info = 'blueprint "%s" (%s)' % (srcobj.name, srcobj.import_name) - else: - src_info = repr(srcobj) - - info.append("% 5d: trying loader of %s" % (idx + 1, src_info)) - - for line in _dump_loader_info(loader): - info.append(" %s" % line) - - if triple is None: - detail = "no match" - else: - detail = "found (%r)" % (triple[1] or "") - total_found += 1 - info.append(" -> %s" % 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 to the blueprint "%s".' % blueprint - ) - info.append(" Maybe you did not place a template in the right folder?") - info.append(" See http://flask.pocoo.org/docs/blueprints/#templates") - - app.logger.info("\n".join(info)) - - -def explain_ignored_app_run(): - if os.environ.get("WERKZEUG_RUN_MAIN") != "true": - warn( - Warning( - "Silently ignoring app.run() because the " - "application is run from the flask command line " - "executable. Consider putting app.run() behind an " - 'if __name__ == "__main__" guard to silence this ' - "warning." - ), - stacklevel=3, - ) diff --git a/venv/lib/python3.7/site-packages/flask/globals.py b/venv/lib/python3.7/site-packages/flask/globals.py deleted file mode 100644 index 6d32dcf..0000000 --- a/venv/lib/python3.7/site-packages/flask/globals.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.globals - ~~~~~~~~~~~~~ - - Defines all the global objects that are proxies to the current - active context. - - :copyright: 2010 Pallets - :license: BSD-3-Clause -""" -from functools import partial - -from werkzeug.local import LocalProxy -from werkzeug.local import LocalStack - - -_request_ctx_err_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.\ -""" -_app_ctx_err_msg = """\ -Working outside of application context. - -This typically means that you attempted to use functionality that needed -to interface with the current application object in some way. To solve -this, set up an application context with app.app_context(). See the -documentation for more information.\ -""" - - -def _lookup_req_object(name): - top = _request_ctx_stack.top - if top is None: - raise RuntimeError(_request_ctx_err_msg) - return getattr(top, name) - - -def _lookup_app_object(name): - top = _app_ctx_stack.top - if top is None: - raise RuntimeError(_app_ctx_err_msg) - return getattr(top, name) - - -def _find_app(): - top = _app_ctx_stack.top - if top is None: - raise RuntimeError(_app_ctx_err_msg) - return top.app - - -# context locals -_request_ctx_stack = LocalStack() -_app_ctx_stack = LocalStack() -current_app = LocalProxy(_find_app) -request = LocalProxy(partial(_lookup_req_object, "request")) -session = LocalProxy(partial(_lookup_req_object, "session")) -g = LocalProxy(partial(_lookup_app_object, "g")) diff --git a/venv/lib/python3.7/site-packages/flask/helpers.py b/venv/lib/python3.7/site-packages/flask/helpers.py deleted file mode 100644 index 3f401a5..0000000 --- a/venv/lib/python3.7/site-packages/flask/helpers.py +++ /dev/null @@ -1,1153 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.helpers - ~~~~~~~~~~~~~ - - Implements various helpers. - - :copyright: 2010 Pallets - :license: BSD-3-Clause -""" -import io -import mimetypes -import os -import pkgutil -import posixpath -import socket -import sys -import unicodedata -from functools import update_wrapper -from threading import RLock -from time import time -from zlib import adler32 - -from jinja2 import FileSystemLoader -from werkzeug.datastructures import Headers -from werkzeug.exceptions import BadRequest -from werkzeug.exceptions import NotFound -from werkzeug.exceptions import RequestedRangeNotSatisfiable -from werkzeug.routing import BuildError -from werkzeug.urls import url_quote -from werkzeug.wsgi import wrap_file - -from ._compat import fspath -from ._compat import PY2 -from ._compat import string_types -from ._compat import text_type -from .globals import _app_ctx_stack -from .globals import _request_ctx_stack -from .globals import current_app -from .globals import request -from .globals import session -from .signals import message_flashed - -# sentinel -_missing = object() - - -# what separators does this operating system provide that are not a slash? -# this is used by the send_from_directory function to ensure that nobody is -# able to access files from outside the filesystem. -_os_alt_seps = list( - sep for sep in [os.path.sep, os.path.altsep] if sep not in (None, "/") -) - - -def get_env(): - """Get the environment the app is running in, indicated by the - :envvar:`FLASK_ENV` environment variable. The default is - ``'production'``. - """ - return os.environ.get("FLASK_ENV") or "production" - - -def get_debug_flag(): - """Get whether debug mode should be enabled for the app, indicated - by the :envvar:`FLASK_DEBUG` environment variable. The default is - ``True`` if :func:`.get_env` returns ``'development'``, or ``False`` - otherwise. - """ - val = os.environ.get("FLASK_DEBUG") - - if not val: - return get_env() == "development" - - return val.lower() not in ("0", "false", "no") - - -def get_load_dotenv(default=True): - """Get whether the user has disabled loading 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 _endpoint_from_view_func(view_func): - """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 stream_with_context(generator_or_function): - """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) - except TypeError: - - def decorator(*args, **kwargs): - gen = generator_or_function(*args, **kwargs) - return stream_with_context(gen) - - return update_wrapper(decorator, generator_or_function) - - def generator(): - ctx = _request_ctx_stack.top - if ctx is None: - raise RuntimeError( - "Attempted to stream with context but " - "there was no context in the first place to keep around." - ) - 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: - for item in gen: - yield item - 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): - """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) - - -def url_for(endpoint, **values): - """Generates a URL to the given endpoint with the method provided. - - Variable arguments that are unknown to the target endpoint are appended - to the generated URL as query arguments. If the value of a query argument - is ``None``, the whole pair is skipped. In case blueprints are active - you can shortcut references to the same blueprint by prefixing the - local endpoint with a dot (``.``). - - This will reference the index function local to the current blueprint:: - - url_for('.index') - - For more information, head over to the :ref:`Quickstart `. - - Configuration values ``APPLICATION_ROOT`` and ``SERVER_NAME`` are only used when - generating URLs outside of a request context. - - To integrate applications, :class:`Flask` has a hook to intercept URL build - errors through :attr:`Flask.url_build_error_handlers`. The `url_for` - function results in a :exc:`~werkzeug.routing.BuildError` when the current - app does not have a URL for the given endpoint and values. When it does, the - :data:`~flask.current_app` calls its :attr:`~Flask.url_build_error_handlers` if - it is not ``None``, which can return a string to use as the result of - `url_for` (instead of `url_for`'s default to raise the - :exc:`~werkzeug.routing.BuildError` exception) or re-raise the exception. - An example:: - - def external_url_handler(error, endpoint, values): - "Looks up an external URL when `url_for` cannot build a URL." - # This is an example of hooking the build_error_handler. - # Here, lookup_url is some utility function you've built - # which looks up the endpoint in some external URL registry. - url = lookup_url(endpoint, **values) - if url is None: - # External lookup did not have a URL. - # Re-raise the BuildError, in context of original traceback. - exc_type, exc_value, tb = sys.exc_info() - if exc_value is error: - raise exc_type, exc_value, tb - else: - raise error - # url_for will use this result, instead of raising BuildError. - return url - - app.url_build_error_handlers.append(external_url_handler) - - Here, `error` is the instance of :exc:`~werkzeug.routing.BuildError`, and - `endpoint` and `values` are the arguments passed into `url_for`. Note - that this is for building URLs outside the current application, and not for - handling 404 NotFound errors. - - .. versionadded:: 0.10 - The `_scheme` parameter was added. - - .. versionadded:: 0.9 - The `_anchor` and `_method` parameters were added. - - .. versionadded:: 0.9 - Calls :meth:`Flask.handle_build_error` on - :exc:`~werkzeug.routing.BuildError`. - - :param endpoint: the endpoint of the URL (name of the function) - :param values: the variable arguments of the URL rule - :param _external: if set to ``True``, an absolute URL is generated. Server - address can be changed via ``SERVER_NAME`` configuration variable which - falls back to the `Host` header, then to the IP and port of the request. - :param _scheme: a string specifying the desired URL scheme. The `_external` - parameter must be set to ``True`` or a :exc:`ValueError` is raised. The default - behavior uses the same scheme as the current request, or - ``PREFERRED_URL_SCHEME`` from the :ref:`app configuration ` if no - request context is available. As of Werkzeug 0.10, this also can be set - to an empty string to build protocol-relative URLs. - :param _anchor: if provided this is added as anchor to the URL. - :param _method: if provided this explicitly specifies an HTTP method. - """ - appctx = _app_ctx_stack.top - reqctx = _request_ctx_stack.top - - if appctx is None: - raise RuntimeError( - "Attempted to generate a URL without the application context being" - " pushed. This has to be executed when application context is" - " available." - ) - - # If request specific information is available we have some extra - # features that support "relative" URLs. - if reqctx is not None: - url_adapter = reqctx.url_adapter - blueprint_name = request.blueprint - - if endpoint[:1] == ".": - if blueprint_name is not None: - endpoint = blueprint_name + endpoint - else: - endpoint = endpoint[1:] - - external = values.pop("_external", False) - - # Otherwise go with the url adapter from the appctx and make - # the URLs external by default. - else: - url_adapter = appctx.url_adapter - - if url_adapter is None: - raise RuntimeError( - "Application was not able to create a URL adapter for request" - " independent URL generation. You might be able to fix this by" - " setting the SERVER_NAME config variable." - ) - - external = values.pop("_external", True) - - anchor = values.pop("_anchor", None) - method = values.pop("_method", None) - scheme = values.pop("_scheme", None) - appctx.app.inject_url_defaults(endpoint, values) - - # This is not the best way to deal with this but currently the - # underlying Werkzeug router does not support overriding the scheme on - # a per build call basis. - old_scheme = None - if scheme is not None: - if not external: - raise ValueError("When specifying _scheme, _external must be True") - old_scheme = url_adapter.url_scheme - url_adapter.url_scheme = scheme - - try: - try: - rv = url_adapter.build( - endpoint, values, method=method, force_external=external - ) - finally: - if old_scheme is not None: - url_adapter.url_scheme = old_scheme - except BuildError as error: - # We need to inject the values again so that the app callback can - # deal with that sort of stuff. - values["_external"] = external - values["_anchor"] = anchor - values["_method"] = method - values["_scheme"] = scheme - return appctx.app.handle_url_build_error(error, endpoint, values) - - if anchor is not None: - rv += "#" + url_quote(anchor) - return rv - - -def get_template_attribute(template_name, attribute): - """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, category="message"): - """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 - message_flashed.send( - current_app._get_current_object(), message=message, category=category - ) - - -def get_flashed_messages(with_categories=False, category_filter=()): - """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 :ref:`message-flashing-pattern` 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: whitelist of categories to limit return values - """ - flashes = _request_ctx_stack.top.flashes - if flashes is None: - _request_ctx_stack.top.flashes = flashes = ( - session.pop("_flashes") if "_flashes" in session else [] - ) - 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 send_file( - filename_or_fp, - mimetype=None, - as_attachment=False, - attachment_filename=None, - add_etags=True, - cache_timeout=None, - conditional=False, - last_modified=None, -): - """Sends the contents of a file to the client. This will use the - most efficient method available and configured. By default it will - try to use the WSGI server's file_wrapper support. Alternatively - you can set the application's :attr:`~Flask.use_x_sendfile` attribute - to ``True`` to directly emit an ``X-Sendfile`` header. This however - requires support of the underlying webserver for ``X-Sendfile``. - - By default it will try to guess the mimetype for you, but you can - also explicitly provide one. For extra security you probably want - to send certain files as attachment (HTML for instance). The mimetype - guessing requires a `filename` or an `attachment_filename` to be - provided. - - ETags will also be attached automatically if a `filename` is provided. You - can turn this off by setting `add_etags=False`. - - If `conditional=True` and `filename` is provided, this method will try to - upgrade the response stream to support range requests. This will allow - the request to be answered with partial content response. - - Please never pass filenames to this function from user sources; - you should use :func:`send_from_directory` instead. - - .. versionadded:: 0.2 - - .. versionadded:: 0.5 - The `add_etags`, `cache_timeout` and `conditional` parameters were - added. The default behavior is now to attach etags. - - .. versionchanged:: 0.7 - mimetype guessing and etag support for file objects was - deprecated because it was unreliable. Pass a filename if you are - able to, otherwise attach an etag yourself. This functionality - will be removed in Flask 1.0 - - .. versionchanged:: 0.9 - cache_timeout pulls its default from application config, when None. - - .. versionchanged:: 0.12 - The filename is no longer automatically inferred from file objects. If - you want to use automatic mimetype and etag support, pass a filepath via - `filename_or_fp` or `attachment_filename`. - - .. versionchanged:: 0.12 - The `attachment_filename` is preferred over `filename` for MIME-type - detection. - - .. versionchanged:: 1.0 - UTF-8 filenames, as specified in `RFC 2231`_, are supported. - - .. _RFC 2231: https://tools.ietf.org/html/rfc2231#section-4 - - .. versionchanged:: 1.0.3 - Filenames are encoded with ASCII instead of Latin-1 for broader - compatibility with WSGI servers. - - .. versionchanged:: 1.1 - Filename may be a :class:`~os.PathLike` object. - - .. versionadded:: 1.1 - Partial content supports :class:`~io.BytesIO`. - - :param filename_or_fp: the filename of the file to send. - This is relative to the :attr:`~Flask.root_path` - if a relative path is specified. - Alternatively a file object might be provided in - which case ``X-Sendfile`` might not work and fall - back to the traditional method. Make sure that the - file pointer is positioned at the start of data to - send before calling :func:`send_file`. - :param mimetype: the mimetype of the file if provided. If a file path is - given, auto detection happens as fallback, otherwise an - error will be raised. - :param as_attachment: set to ``True`` if you want to send this file with - a ``Content-Disposition: attachment`` header. - :param attachment_filename: the filename for the attachment if it - differs from the file's filename. - :param add_etags: set to ``False`` to disable attaching of etags. - :param conditional: set to ``True`` to enable conditional responses. - - :param cache_timeout: the timeout in seconds for the headers. When ``None`` - (default), this value is set by - :meth:`~Flask.get_send_file_max_age` of - :data:`~flask.current_app`. - :param last_modified: set the ``Last-Modified`` header to this value, - a :class:`~datetime.datetime` or timestamp. - If a file was passed, this overrides its mtime. - """ - mtime = None - fsize = None - - if hasattr(filename_or_fp, "__fspath__"): - filename_or_fp = fspath(filename_or_fp) - - if isinstance(filename_or_fp, string_types): - filename = filename_or_fp - if not os.path.isabs(filename): - filename = os.path.join(current_app.root_path, filename) - file = None - if attachment_filename is None: - attachment_filename = os.path.basename(filename) - else: - file = filename_or_fp - filename = None - - if mimetype is None: - if attachment_filename is not None: - mimetype = ( - mimetypes.guess_type(attachment_filename)[0] - or "application/octet-stream" - ) - - if mimetype is None: - raise ValueError( - "Unable to infer MIME-type because no filename is available. " - "Please set either `attachment_filename`, pass a filepath to " - "`filename_or_fp` or set your own MIME-type via `mimetype`." - ) - - headers = Headers() - if as_attachment: - if attachment_filename is None: - raise TypeError("filename unavailable, required for sending as attachment") - - if not isinstance(attachment_filename, text_type): - attachment_filename = attachment_filename.decode("utf-8") - - try: - attachment_filename = attachment_filename.encode("ascii") - except UnicodeEncodeError: - filenames = { - "filename": unicodedata.normalize("NFKD", attachment_filename).encode( - "ascii", "ignore" - ), - "filename*": "UTF-8''%s" % url_quote(attachment_filename, safe=b""), - } - else: - filenames = {"filename": attachment_filename} - - headers.add("Content-Disposition", "attachment", **filenames) - - if current_app.use_x_sendfile and filename: - if file is not None: - file.close() - headers["X-Sendfile"] = filename - fsize = os.path.getsize(filename) - headers["Content-Length"] = fsize - data = None - else: - if file is None: - file = open(filename, "rb") - mtime = os.path.getmtime(filename) - fsize = os.path.getsize(filename) - headers["Content-Length"] = fsize - elif isinstance(file, io.BytesIO): - try: - fsize = file.getbuffer().nbytes - except AttributeError: - # Python 2 doesn't have getbuffer - fsize = len(file.getvalue()) - headers["Content-Length"] = fsize - data = wrap_file(request.environ, file) - - rv = current_app.response_class( - data, mimetype=mimetype, headers=headers, direct_passthrough=True - ) - - if last_modified is not None: - rv.last_modified = last_modified - elif mtime is not None: - rv.last_modified = mtime - - rv.cache_control.public = True - if cache_timeout is None: - cache_timeout = current_app.get_send_file_max_age(filename) - if cache_timeout is not None: - rv.cache_control.max_age = cache_timeout - rv.expires = int(time() + cache_timeout) - - if add_etags and filename is not None: - from warnings import warn - - try: - rv.set_etag( - "%s-%s-%s" - % ( - os.path.getmtime(filename), - os.path.getsize(filename), - adler32( - filename.encode("utf-8") - if isinstance(filename, text_type) - else filename - ) - & 0xFFFFFFFF, - ) - ) - except OSError: - warn( - "Access %s failed, maybe it does not exist, so ignore etags in " - "headers" % filename, - stacklevel=2, - ) - - if conditional: - try: - rv = rv.make_conditional(request, accept_ranges=True, complete_length=fsize) - except RequestedRangeNotSatisfiable: - if file is not None: - file.close() - raise - # make sure we don't send x-sendfile for servers that - # ignore the 304 status code for x-sendfile. - if rv.status_code == 304: - rv.headers.pop("x-sendfile", None) - return rv - - -def safe_join(directory, *pathnames): - """Safely join `directory` and zero or more untrusted `pathnames` - components. - - Example usage:: - - @app.route('/wiki/') - def wiki_page(filename): - filename = safe_join(app.config['WIKI_FOLDER'], filename) - with open(filename, 'rb') as fd: - content = fd.read() # Read and process the file content... - - :param directory: the trusted base directory. - :param pathnames: the untrusted pathnames relative to that directory. - :raises: :class:`~werkzeug.exceptions.NotFound` if one or more passed - paths fall out of its boundaries. - """ - - parts = [directory] - - for filename in pathnames: - if filename != "": - filename = posixpath.normpath(filename) - - if ( - any(sep in filename for sep in _os_alt_seps) - or os.path.isabs(filename) - or filename == ".." - or filename.startswith("../") - ): - raise NotFound() - - parts.append(filename) - - return posixpath.join(*parts) - - -def send_from_directory(directory, filename, **options): - """Send a file from a given directory with :func:`send_file`. This - is a secure way to quickly expose static files from an upload folder - or something similar. - - Example usage:: - - @app.route('/uploads/') - def download_file(filename): - return send_from_directory(app.config['UPLOAD_FOLDER'], - filename, as_attachment=True) - - .. admonition:: Sending files and Performance - - It is strongly recommended to activate either ``X-Sendfile`` support in - your webserver or (if no authentication happens) to tell the webserver - to serve files for the given path on its own without calling into the - web application for improved performance. - - .. versionadded:: 0.5 - - :param directory: the directory where all the files are stored. - :param filename: the filename relative to that directory to - download. - :param options: optional keyword arguments that are directly - forwarded to :func:`send_file`. - """ - filename = fspath(filename) - directory = fspath(directory) - filename = safe_join(directory, filename) - if not os.path.isabs(filename): - filename = os.path.join(current_app.root_path, filename) - try: - if not os.path.isfile(filename): - raise NotFound() - except (TypeError, ValueError): - raise BadRequest() - options.setdefault("conditional", True) - return send_file(filename, **options) - - -def get_root_path(import_name): - """Returns the path to a package or cwd if that cannot be found. This - returns the path of a package or the folder that contains a module. - - Not to be confused with the package path returned by :func:`find_package`. - """ - # 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__"): - 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() - - # For .egg, zipimporter does not have get_filename until Python 2.7. - # Some other loaders might exhibit the same behavior. - 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 filepath it might be because we are a - # namespace package. In this case we pick the root path from the - # first module that is contained in our package. - if filepath is None: - raise RuntimeError( - "No root path can be found for the provided " - 'module "%s". 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." % import_name - ) - - # filepath is import_name.py for a module, or __init__.py for a package. - return os.path.dirname(os.path.abspath(filepath)) - - -def _matching_loader_thinks_module_is_package(loader, mod_name): - """Given the loader that loaded a module and the module this function - attempts to figure out if the given module is actually a package. - """ - # If the loader can tell us if something is a package, we can - # directly ask the loader. - if hasattr(loader, "is_package"): - return loader.is_package(mod_name) - # importlib's namespace loaders do not have this functionality but - # all the modules it loads are packages, so we can take advantage of - # this information. - elif ( - loader.__class__.__module__ == "_frozen_importlib" - and loader.__class__.__name__ == "NamespaceLoader" - ): - return True - # Otherwise we need to fail with an error that explains what went - # wrong. - raise AttributeError( - ( - "%s.is_package() method is missing but is required by Flask of " - "PEP 302 import hooks. If you do not use import hooks and " - "you encounter this error please file a bug against Flask." - ) - % loader.__class__.__name__ - ) - - -def _find_package_path(root_mod_name): - """Find the path where the module's root exists in""" - if sys.version_info >= (3, 4): - import importlib.util - - try: - spec = importlib.util.find_spec(root_mod_name) - if 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 `spec` being `None` - except (ImportError, ValueError): - pass # handled below - else: - # namespace package - if spec.origin in {"namespace", None}: - return os.path.dirname(next(iter(spec.submodule_search_locations))) - # a package (with __init__.py) - elif spec.submodule_search_locations: - return os.path.dirname(os.path.dirname(spec.origin)) - # just a normal module - else: - return os.path.dirname(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() - else: - # For .egg, zipimporter does not have get_filename until Python 2.7. - 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 - # archive filename is dropped in call to dirname below. - filename = loader.archive - else: - # At least one loader is missing both get_filename and archive: - # Google App Engine's HardenedModulesHook - # - # Fall back to imports. - __import__(root_mod_name) - filename = sys.modules[root_mod_name].__file__ - package_path = os.path.abspath(os.path.dirname(filename)) - - # In case the root module is a package we need to chop of the - # rightmost part. This needs to go through a helper function - # because of python 3.3 namespace packages. - 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): - """Finds a package and returns the prefix (or None if the package is - not installed) as well as the folder that contains the package or - module as a tuple. The package path returned is the module that would - have to be added to the pythonpath in order to make it possible to - import the module. The prefix is the path below which a UNIX like - folder structure exists (lib, share etc.). - """ - root_mod_name, _, _ = import_name.partition(".") - package_path = _find_package_path(root_mod_name) - site_parent, site_folder = os.path.split(package_path) - py_prefix = os.path.abspath(sys.prefix) - if package_path.startswith(py_prefix): - return py_prefix, package_path - elif site_folder.lower() == "site-packages": - parent, folder = os.path.split(site_parent) - # Windows like installations - if folder.lower() == "lib": - base_dir = parent - # UNIX like installations - elif os.path.basename(parent).lower() == "lib": - base_dir = os.path.dirname(parent) - else: - base_dir = site_parent - return base_dir, package_path - return None, package_path - - -class locked_cached_property(object): - """A decorator that converts a function into a lazy property. The - function wrapped is called the first time to retrieve the result - and then that calculated result is used the next time you access - the value. Works like the one in Werkzeug but has a lock for - thread safety. - """ - - def __init__(self, func, name=None, doc=None): - self.__name__ = name or func.__name__ - self.__module__ = func.__module__ - self.__doc__ = doc or func.__doc__ - self.func = func - self.lock = RLock() - - def __get__(self, obj, type=None): - if obj is None: - return self - with self.lock: - value = obj.__dict__.get(self.__name__, _missing) - if value is _missing: - value = self.func(obj) - obj.__dict__[self.__name__] = value - return value - - -class _PackageBoundObject(object): - #: The name of the package or module that this app belongs to. Do not - #: change this once it is set by the constructor. - import_name = None - - #: Location of the template files to be added to the template lookup. - #: ``None`` if templates should not be added. - template_folder = None - - #: Absolute path to the package on the filesystem. Used to look up - #: resources contained in the package. - root_path = None - - def __init__(self, import_name, template_folder=None, root_path=None): - self.import_name = import_name - self.template_folder = template_folder - - if root_path is None: - root_path = get_root_path(self.import_name) - - self.root_path = root_path - self._static_folder = None - self._static_url_path = None - - # circular import - from .cli import AppGroup - - #: The Click command group for registration of CLI commands - #: on the application and associated blueprints. These commands - #: are accessible via the :command:`flask` command once the - #: application has been discovered and blueprints registered. - self.cli = AppGroup() - - @property - def static_folder(self): - """The absolute path to the configured static folder.""" - if self._static_folder is not None: - return os.path.join(self.root_path, self._static_folder) - - @static_folder.setter - def static_folder(self, value): - self._static_folder = value - - @property - def static_url_path(self): - """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 ("/" + basename).rstrip("/") - - @static_url_path.setter - def static_url_path(self, value): - if value is not None: - value = value.rstrip("/") - - self._static_url_path = value - - @property - def has_static_folder(self): - """This is ``True`` if the package bound object's container has a - folder for static files. - - .. versionadded:: 0.5 - """ - return self.static_folder is not None - - @locked_cached_property - def jinja_loader(self): - """The Jinja loader for this package bound object. - - .. versionadded:: 0.5 - """ - if self.template_folder is not None: - return FileSystemLoader(os.path.join(self.root_path, self.template_folder)) - - def get_send_file_max_age(self, filename): - """Provides default cache_timeout for the :func:`send_file` functions. - - By default, this function returns ``SEND_FILE_MAX_AGE_DEFAULT`` from - the configuration of :data:`~flask.current_app`. - - Static file functions such as :func:`send_from_directory` use this - function, and :func:`send_file` calls this function on - :data:`~flask.current_app` when the given cache_timeout is ``None``. If a - cache_timeout is given in :func:`send_file`, that timeout is used; - otherwise, this method is called. - - This allows subclasses to change the behavior when sending files based - on the filename. For example, to set the cache timeout for .js files - to 60 seconds:: - - class MyFlask(flask.Flask): - def get_send_file_max_age(self, name): - if name.lower().endswith('.js'): - return 60 - return flask.Flask.get_send_file_max_age(self, name) - - .. versionadded:: 0.9 - """ - return total_seconds(current_app.send_file_max_age_default) - - def send_static_file(self, filename): - """Function used internally to send static files from the static - folder to the browser. - - .. versionadded:: 0.5 - """ - if not self.has_static_folder: - raise RuntimeError("No static folder for this object") - # Ensure get_send_file_max_age is called in all cases. - # Here, we ensure get_send_file_max_age is called for Blueprints. - cache_timeout = self.get_send_file_max_age(filename) - return send_from_directory( - self.static_folder, filename, cache_timeout=cache_timeout - ) - - def open_resource(self, resource, mode="rb"): - """Opens a resource from the application's resource folder. To see - how this works, consider the following folder structure:: - - /myapplication.py - /schema.sql - /static - /style.css - /templates - /layout.html - /index.html - - If you want to open the :file:`schema.sql` file you would do the - following:: - - with app.open_resource('schema.sql') as f: - contents = f.read() - do_something_with(contents) - - :param resource: the name of the resource. To access resources within - subfolders use forward slashes as separator. - :param mode: Open 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 total_seconds(td): - """Returns the total seconds from a timedelta object. - - :param timedelta td: the timedelta to be converted in seconds - - :returns: number of seconds - :rtype: int - """ - return td.days * 60 * 60 * 24 + td.seconds - - -def is_ip(value): - """Determine if the given string is an IP address. - - Python 2 on Windows doesn't provide ``inet_pton``, so this only - checks IPv4 addresses in that environment. - - :param value: value to check - :type value: str - - :return: True if string is an IP address - :rtype: bool - """ - if PY2 and os.name == "nt": - try: - socket.inet_aton(value) - return True - except socket.error: - return False - - for family in (socket.AF_INET, socket.AF_INET6): - try: - socket.inet_pton(family, value) - except socket.error: - pass - else: - return True - - return False diff --git a/venv/lib/python3.7/site-packages/flask/json/__init__.py b/venv/lib/python3.7/site-packages/flask/json/__init__.py deleted file mode 100644 index a141068..0000000 --- a/venv/lib/python3.7/site-packages/flask/json/__init__.py +++ /dev/null @@ -1,376 +0,0 @@ -# -*- coding: utf-8 -*- -""" -flask.json -~~~~~~~~~~ - -:copyright: 2010 Pallets -:license: BSD-3-Clause -""" -import codecs -import io -import uuid -from datetime import date -from datetime import datetime - -from itsdangerous import json as _json -from jinja2 import Markup -from werkzeug.http import http_date - -from .._compat import PY2 -from .._compat import text_type -from ..globals import current_app -from ..globals import request - -try: - import dataclasses -except ImportError: - dataclasses = None - -# Figure out if simplejson escapes slashes. This behavior was changed -# from one version to another without reason. -_slash_escape = "\\/" not in _json.dumps("/") - - -__all__ = [ - "dump", - "dumps", - "load", - "loads", - "htmlsafe_dump", - "htmlsafe_dumps", - "JSONDecoder", - "JSONEncoder", - "jsonify", -] - - -def _wrap_reader_for_text(fp, encoding): - if isinstance(fp.read(0), bytes): - fp = io.TextIOWrapper(io.BufferedReader(fp), encoding) - return fp - - -def _wrap_writer_for_text(fp, encoding): - try: - fp.write("") - except TypeError: - fp = io.TextIOWrapper(fp, encoding) - return fp - - -class JSONEncoder(_json.JSONEncoder): - """The default Flask JSON encoder. This one extends the default - encoder by also supporting ``datetime``, ``UUID``, ``dataclasses``, - and ``Markup`` objects. - - ``datetime`` objects are serialized as RFC 822 datetime strings. - This is the same as the HTTP date format. - - In order to support more data types, override the :meth:`default` - method. - """ - - def default(self, o): - """Implement this method in a subclass such that it returns a - serializable object for ``o``, or calls the base implementation (to - raise a :exc:`TypeError`). - - For example, to support arbitrary iterators, you could implement - default like this:: - - def default(self, o): - try: - iterable = iter(o) - except TypeError: - pass - else: - return list(iterable) - return JSONEncoder.default(self, o) - """ - if isinstance(o, datetime): - return http_date(o.utctimetuple()) - if isinstance(o, date): - return http_date(o.timetuple()) - if isinstance(o, uuid.UUID): - return str(o) - if dataclasses and dataclasses.is_dataclass(o): - return dataclasses.asdict(o) - if hasattr(o, "__html__"): - return text_type(o.__html__()) - return _json.JSONEncoder.default(self, o) - - -class JSONDecoder(_json.JSONDecoder): - """The default JSON decoder. This one does not change the behavior from - the default simplejson decoder. Consult the :mod:`json` documentation - for more information. This decoder is not only used for the load - functions of this module but also :attr:`~flask.Request`. - """ - - -def _dump_arg_defaults(kwargs, app=None): - """Inject default arguments for dump functions.""" - if app is None: - app = current_app - - if app: - bp = app.blueprints.get(request.blueprint) if request else None - kwargs.setdefault( - "cls", bp.json_encoder if bp and bp.json_encoder else app.json_encoder - ) - - if not app.config["JSON_AS_ASCII"]: - kwargs.setdefault("ensure_ascii", False) - - kwargs.setdefault("sort_keys", app.config["JSON_SORT_KEYS"]) - else: - kwargs.setdefault("sort_keys", True) - kwargs.setdefault("cls", JSONEncoder) - - -def _load_arg_defaults(kwargs, app=None): - """Inject default arguments for load functions.""" - if app is None: - app = current_app - - if app: - bp = app.blueprints.get(request.blueprint) if request else None - kwargs.setdefault( - "cls", bp.json_decoder if bp and bp.json_decoder else app.json_decoder - ) - else: - kwargs.setdefault("cls", JSONDecoder) - - -def detect_encoding(data): - """Detect which UTF codec was used to encode the given bytes. - - The latest JSON standard (:rfc:`8259`) suggests that only UTF-8 is - accepted. Older documents allowed 8, 16, or 32. 16 and 32 can be big - or little endian. Some editors or libraries may prepend a BOM. - - :param data: Bytes in unknown UTF encoding. - :return: UTF encoding name - """ - head = data[:4] - - if head[:3] == codecs.BOM_UTF8: - return "utf-8-sig" - - if b"\x00" not in head: - return "utf-8" - - if head in (codecs.BOM_UTF32_BE, codecs.BOM_UTF32_LE): - return "utf-32" - - if head[:2] in (codecs.BOM_UTF16_BE, codecs.BOM_UTF16_LE): - return "utf-16" - - if len(head) == 4: - if head[:3] == b"\x00\x00\x00": - return "utf-32-be" - - if head[::2] == b"\x00\x00": - return "utf-16-be" - - if head[1:] == b"\x00\x00\x00": - return "utf-32-le" - - if head[1::2] == b"\x00\x00": - return "utf-16-le" - - if len(head) == 2: - return "utf-16-be" if head.startswith(b"\x00") else "utf-16-le" - - return "utf-8" - - -def dumps(obj, app=None, **kwargs): - """Serialize ``obj`` to a JSON-formatted string. If there is an - app context pushed, use the current app's configured encoder - (:attr:`~flask.Flask.json_encoder`), or fall back to the default - :class:`JSONEncoder`. - - Takes the same arguments as the built-in :func:`json.dumps`, and - does some extra configuration based on the application. If the - simplejson package is installed, it is preferred. - - :param obj: Object to serialize to JSON. - :param app: App instance to use to configure the JSON encoder. - Uses ``current_app`` if not given, and falls back to the default - encoder when not in an app context. - :param kwargs: Extra arguments passed to :func:`json.dumps`. - - .. versionchanged:: 1.0.3 - - ``app`` can be passed directly, rather than requiring an app - context for configuration. - """ - _dump_arg_defaults(kwargs, app=app) - encoding = kwargs.pop("encoding", None) - rv = _json.dumps(obj, **kwargs) - if encoding is not None and isinstance(rv, text_type): - rv = rv.encode(encoding) - return rv - - -def dump(obj, fp, app=None, **kwargs): - """Like :func:`dumps` but writes into a file object.""" - _dump_arg_defaults(kwargs, app=app) - encoding = kwargs.pop("encoding", None) - if encoding is not None: - fp = _wrap_writer_for_text(fp, encoding) - _json.dump(obj, fp, **kwargs) - - -def loads(s, app=None, **kwargs): - """Deserialize an object from a JSON-formatted string ``s``. If - there is an app context pushed, use the current app's configured - decoder (:attr:`~flask.Flask.json_decoder`), or fall back to the - default :class:`JSONDecoder`. - - Takes the same arguments as the built-in :func:`json.loads`, and - does some extra configuration based on the application. If the - simplejson package is installed, it is preferred. - - :param s: JSON string to deserialize. - :param app: App instance to use to configure the JSON decoder. - Uses ``current_app`` if not given, and falls back to the default - encoder when not in an app context. - :param kwargs: Extra arguments passed to :func:`json.dumps`. - - .. versionchanged:: 1.0.3 - - ``app`` can be passed directly, rather than requiring an app - context for configuration. - """ - _load_arg_defaults(kwargs, app=app) - if isinstance(s, bytes): - encoding = kwargs.pop("encoding", None) - if encoding is None: - encoding = detect_encoding(s) - s = s.decode(encoding) - return _json.loads(s, **kwargs) - - -def load(fp, app=None, **kwargs): - """Like :func:`loads` but reads from a file object.""" - _load_arg_defaults(kwargs, app=app) - if not PY2: - fp = _wrap_reader_for_text(fp, kwargs.pop("encoding", None) or "utf-8") - return _json.load(fp, **kwargs) - - -def htmlsafe_dumps(obj, **kwargs): - """Works exactly like :func:`dumps` but is safe for use in `` - - - - -

- -
-
-

Console Locked

-

- The console is locked and needs to be unlocked by entering the PIN. - You can find the PIN printed out on the standard output of your - shell that runs the server. -

-

PIN: - - -

-
-
- - -""" - -PAGE_HTML = ( - HEADER - + u"""\ -

%(exception_type)s

-
-

%(exception)s

-
-

Traceback (most recent call last)

-%(summary)s -
-
- The debugger caught an exception in your WSGI application. You can now - look at the traceback which led to the error. - If you enable JavaScript you can also use additional features such as code - execution (if the evalex feature is enabled), automatic pasting of the - exceptions and much more. -
-""" - + FOOTER - + """ - -""" -) - -CONSOLE_HTML = ( - HEADER - + u"""\ -

Interactive Console

-
-In this console you can execute Python expressions in the context of the -application. The initial namespace was created by the debugger automatically. -
-
The Console requires JavaScript.
-""" - + FOOTER -) - -SUMMARY_HTML = u"""\ -
- %(title)s -
    %(frames)s
- %(description)s -
-""" - -FRAME_HTML = u"""\ -
-

File "%(filename)s", - line %(lineno)s, - in %(function_name)s

-
%(lines)s
-
-""" - -SOURCE_LINE_HTML = u"""\ - - %(lineno)s - %(code)s - -""" - - -def render_console_html(secret, evalex_trusted=True): - return CONSOLE_HTML % { - "evalex": "true", - "evalex_trusted": "true" if evalex_trusted else "false", - "console": "true", - "title": "Console", - "secret": secret, - "traceback_id": -1, - } - - -def get_current_traceback( - ignore_system_exceptions=False, show_hidden_frames=False, skip=0 -): - """Get the current exception info as `Traceback` object. Per default - calling this method will reraise system exceptions such as generator exit, - system exit or others. This behavior can be disabled by passing `False` - to the function as first parameter. - """ - exc_type, exc_value, tb = sys.exc_info() - if ignore_system_exceptions and exc_type in system_exceptions: - reraise(exc_type, exc_value, tb) - for _ in range_type(skip): - if tb.tb_next is None: - break - tb = tb.tb_next - tb = Traceback(exc_type, exc_value, tb) - if not show_hidden_frames: - tb.filter_hidden_frames() - return tb - - -class Line(object): - """Helper for the source renderer.""" - - __slots__ = ("lineno", "code", "in_frame", "current") - - def __init__(self, lineno, code): - self.lineno = lineno - self.code = code - self.in_frame = False - self.current = False - - @property - def classes(self): - rv = ["line"] - if self.in_frame: - rv.append("in-frame") - if self.current: - rv.append("current") - return rv - - def render(self): - return SOURCE_LINE_HTML % { - "classes": u" ".join(self.classes), - "lineno": self.lineno, - "code": escape(self.code), - } - - -class Traceback(object): - """Wraps a traceback.""" - - def __init__(self, exc_type, exc_value, tb): - self.exc_type = exc_type - self.exc_value = exc_value - self.tb = tb - - exception_type = exc_type.__name__ - if exc_type.__module__ not in {"builtins", "__builtin__", "exceptions"}: - exception_type = exc_type.__module__ + "." + exception_type - self.exception_type = exception_type - - self.groups = [] - memo = set() - while True: - self.groups.append(Group(exc_type, exc_value, tb)) - memo.add(id(exc_value)) - if PY2: - break - exc_value = exc_value.__cause__ or exc_value.__context__ - if exc_value is None or id(exc_value) in memo: - break - exc_type = type(exc_value) - tb = exc_value.__traceback__ - self.groups.reverse() - self.frames = [frame for group in self.groups for frame in group.frames] - - def filter_hidden_frames(self): - """Remove the frames according to the paste spec.""" - for group in self.groups: - group.filter_hidden_frames() - - self.frames[:] = [frame for group in self.groups for frame in group.frames] - - @property - def is_syntax_error(self): - """Is it a syntax error?""" - return isinstance(self.exc_value, SyntaxError) - - @property - def exception(self): - """String representation of the final exception.""" - return self.groups[-1].exception - - def log(self, logfile=None): - """Log the ASCII traceback into a file object.""" - if logfile is None: - logfile = sys.stderr - tb = self.plaintext.rstrip() + u"\n" - logfile.write(to_native(tb, "utf-8", "replace")) - - def paste(self): - """Create a paste and return the paste id.""" - data = json.dumps( - { - "description": "Werkzeug Internal Server Error", - "public": False, - "files": {"traceback.txt": {"content": self.plaintext}}, - } - ).encode("utf-8") - try: - from urllib2 import urlopen - except ImportError: - from urllib.request import urlopen - rv = urlopen("https://api.github.com/gists", data=data) - resp = json.loads(rv.read().decode("utf-8")) - rv.close() - return {"url": resp["html_url"], "id": resp["id"]} - - def render_summary(self, include_title=True): - """Render the traceback for the interactive console.""" - title = "" - classes = ["traceback"] - if not self.frames: - classes.append("noframe-traceback") - frames = [] - else: - library_frames = sum(frame.is_library for frame in self.frames) - mark_lib = 0 < library_frames < len(self.frames) - frames = [group.render(mark_lib=mark_lib) for group in self.groups] - - if include_title: - if self.is_syntax_error: - title = u"Syntax Error" - else: - title = u"Traceback (most recent call last):" - - if self.is_syntax_error: - description_wrapper = u"
%s
" - else: - description_wrapper = u"
%s
" - - return SUMMARY_HTML % { - "classes": u" ".join(classes), - "title": u"

%s

" % title if title else u"", - "frames": u"\n".join(frames), - "description": description_wrapper % escape(self.exception), - } - - def render_full(self, evalex=False, secret=None, evalex_trusted=True): - """Render the Full HTML page with the traceback info.""" - exc = escape(self.exception) - return PAGE_HTML % { - "evalex": "true" if evalex else "false", - "evalex_trusted": "true" if evalex_trusted else "false", - "console": "false", - "title": exc, - "exception": exc, - "exception_type": escape(self.exception_type), - "summary": self.render_summary(include_title=False), - "plaintext": escape(self.plaintext), - "plaintext_cs": re.sub("-{2,}", "-", self.plaintext), - "traceback_id": self.id, - "secret": secret, - } - - @cached_property - def plaintext(self): - return u"\n".join([group.render_text() for group in self.groups]) - - @property - def id(self): - return id(self) - - -class Group(object): - """A group of frames for an exception in a traceback. On Python 3, - if the exception has a ``__cause__`` or ``__context__``, there are - multiple exception groups. - """ - - def __init__(self, exc_type, exc_value, tb): - self.exc_type = exc_type - self.exc_value = exc_value - self.info = None - if not PY2: - if exc_value.__cause__ is not None: - self.info = ( - u"The above exception was the direct cause of the" - u" following exception" - ) - elif exc_value.__context__ is not None: - self.info = ( - u"During handling of the above exception, another" - u" exception occurred" - ) - - self.frames = [] - while tb is not None: - self.frames.append(Frame(exc_type, exc_value, tb)) - tb = tb.tb_next - - def filter_hidden_frames(self): - new_frames = [] - hidden = False - - for frame in self.frames: - hide = frame.hide - if hide in ("before", "before_and_this"): - new_frames = [] - hidden = False - if hide == "before_and_this": - continue - elif hide in ("reset", "reset_and_this"): - hidden = False - if hide == "reset_and_this": - continue - elif hide in ("after", "after_and_this"): - hidden = True - if hide == "after_and_this": - continue - elif hide or hidden: - continue - new_frames.append(frame) - - # if we only have one frame and that frame is from the codeop - # module, remove it. - if len(new_frames) == 1 and self.frames[0].module == "codeop": - del self.frames[:] - - # if the last frame is missing something went terrible wrong :( - elif self.frames[-1] in new_frames: - self.frames[:] = new_frames - - @property - def exception(self): - """String representation of the exception.""" - buf = traceback.format_exception_only(self.exc_type, self.exc_value) - rv = "".join(buf).strip() - return to_unicode(rv, "utf-8", "replace") - - def render(self, mark_lib=True): - out = [] - if self.info is not None: - out.append(u'
  • %s:
    ' % self.info) - for frame in self.frames: - out.append( - u"%s" - % ( - u' title="%s"' % escape(frame.info) if frame.info else u"", - frame.render(mark_lib=mark_lib), - ) - ) - return u"\n".join(out) - - def render_text(self): - out = [] - if self.info is not None: - out.append(u"\n%s:\n" % self.info) - out.append(u"Traceback (most recent call last):") - for frame in self.frames: - out.append(frame.render_text()) - out.append(self.exception) - return u"\n".join(out) - - -class Frame(object): - """A single frame in a traceback.""" - - def __init__(self, exc_type, exc_value, tb): - self.lineno = tb.tb_lineno - self.function_name = tb.tb_frame.f_code.co_name - self.locals = tb.tb_frame.f_locals - self.globals = tb.tb_frame.f_globals - - fn = inspect.getsourcefile(tb) or inspect.getfile(tb) - if fn[-4:] in (".pyo", ".pyc"): - fn = fn[:-1] - # if it's a file on the file system resolve the real filename. - if os.path.isfile(fn): - fn = os.path.realpath(fn) - self.filename = to_unicode(fn, get_filesystem_encoding()) - self.module = self.globals.get("__name__", self.locals.get("__name__")) - self.loader = self.globals.get("__loader__", self.locals.get("__loader__")) - self.code = tb.tb_frame.f_code - - # support for paste's traceback extensions - self.hide = self.locals.get("__traceback_hide__", False) - info = self.locals.get("__traceback_info__") - if info is not None: - info = to_unicode(info, "utf-8", "replace") - self.info = info - - def render(self, mark_lib=True): - """Render a single frame in a traceback.""" - return FRAME_HTML % { - "id": self.id, - "filename": escape(self.filename), - "lineno": self.lineno, - "function_name": escape(self.function_name), - "lines": self.render_line_context(), - "library": "library" if mark_lib and self.is_library else "", - } - - @cached_property - def is_library(self): - return any( - self.filename.startswith(path) for path in sysconfig.get_paths().values() - ) - - def render_text(self): - return u' File "%s", line %s, in %s\n %s' % ( - self.filename, - self.lineno, - self.function_name, - self.current_line.strip(), - ) - - def render_line_context(self): - before, current, after = self.get_context_lines() - rv = [] - - def render_line(line, cls): - line = line.expandtabs().rstrip() - stripped_line = line.strip() - prefix = len(line) - len(stripped_line) - rv.append( - '
    %s%s
    ' - % (cls, " " * prefix, escape(stripped_line) or " ") - ) - - for line in before: - render_line(line, "before") - render_line(current, "current") - for line in after: - render_line(line, "after") - - return "\n".join(rv) - - def get_annotated_lines(self): - """Helper function that returns lines with extra information.""" - lines = [Line(idx + 1, x) for idx, x in enumerate(self.sourcelines)] - - # find function definition and mark lines - if hasattr(self.code, "co_firstlineno"): - lineno = self.code.co_firstlineno - 1 - while lineno > 0: - if _funcdef_re.match(lines[lineno].code): - break - lineno -= 1 - try: - offset = len(inspect.getblock([x.code + "\n" for x in lines[lineno:]])) - except TokenError: - offset = 0 - for line in lines[lineno : lineno + offset]: - line.in_frame = True - - # mark current line - try: - lines[self.lineno - 1].current = True - except IndexError: - pass - - return lines - - def eval(self, code, mode="single"): - """Evaluate code in the context of the frame.""" - if isinstance(code, string_types): - if PY2 and isinstance(code, text_type): # noqa - code = UTF8_COOKIE + code.encode("utf-8") - code = compile(code, "", mode) - return eval(code, self.globals, self.locals) - - @cached_property - def sourcelines(self): - """The sourcecode of the file as list of unicode strings.""" - # get sourcecode from loader or file - source = None - if self.loader is not None: - try: - if hasattr(self.loader, "get_source"): - source = self.loader.get_source(self.module) - elif hasattr(self.loader, "get_source_by_code"): - source = self.loader.get_source_by_code(self.code) - except Exception: - # we munch the exception so that we don't cause troubles - # if the loader is broken. - pass - - if source is None: - try: - with open( - to_native(self.filename, get_filesystem_encoding()), mode="rb" - ) as f: - source = f.read() - except IOError: - return [] - - # already unicode? return right away - if isinstance(source, text_type): - return source.splitlines() - - # yes. it should be ascii, but we don't want to reject too many - # characters in the debugger if something breaks - charset = "utf-8" - if source.startswith(UTF8_COOKIE): - source = source[3:] - else: - for idx, match in enumerate(_line_re.finditer(source)): - match = _coding_re.search(match.group()) - if match is not None: - charset = match.group(1) - break - if idx > 1: - break - - # on broken cookies we fall back to utf-8 too - charset = to_native(charset) - try: - codecs.lookup(charset) - except LookupError: - charset = "utf-8" - - return source.decode(charset, "replace").splitlines() - - def get_context_lines(self, context=5): - before = self.sourcelines[self.lineno - context - 1 : self.lineno - 1] - past = self.sourcelines[self.lineno : self.lineno + context] - return (before, self.current_line, past) - - @property - def current_line(self): - try: - return self.sourcelines[self.lineno - 1] - except IndexError: - return u"" - - @cached_property - def console(self): - return Console(self.globals, self.locals) - - @property - def id(self): - return id(self) diff --git a/venv/lib/python3.7/site-packages/werkzeug/exceptions.py b/venv/lib/python3.7/site-packages/werkzeug/exceptions.py deleted file mode 100644 index 82e99c2..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/exceptions.py +++ /dev/null @@ -1,829 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.exceptions - ~~~~~~~~~~~~~~~~~~~ - - This module implements a number of Python exceptions you can raise from - within your views to trigger a standard non-200 response. - - - Usage Example - ------------- - - :: - - from werkzeug.wrappers import BaseRequest - from werkzeug.wsgi import responder - from werkzeug.exceptions import HTTPException, NotFound - - def view(request): - raise NotFound() - - @responder - def application(environ, start_response): - request = BaseRequest(environ) - try: - return view(request) - except HTTPException as e: - return e - - - As you can see from this example those exceptions are callable WSGI - applications. Because of Python 2.4 compatibility those do not extend - from the response objects but only from the python exception class. - - As a matter of fact they are not Werkzeug response objects. However you - can get a response object by calling ``get_response()`` on a HTTP - exception. - - Keep in mind that you have to pass an environment to ``get_response()`` - because some errors fetch additional information from the WSGI - environment. - - If you want to hook in a different exception page to say, a 404 status - code, you can add a second except for a specific subclass of an error:: - - @responder - def application(environ, start_response): - request = BaseRequest(environ) - try: - return view(request) - except NotFound, e: - return not_found(request) - except HTTPException, e: - return e - - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import sys -from datetime import datetime - -from ._compat import implements_to_string -from ._compat import integer_types -from ._compat import iteritems -from ._compat import text_type -from ._internal import _get_environ -from .utils import escape - - -@implements_to_string -class HTTPException(Exception): - """Baseclass for all HTTP exceptions. This exception can be called as WSGI - application to render a default error page or you can catch the subclasses - of it independently and render nicer error messages. - """ - - code = None - description = None - - def __init__(self, description=None, response=None): - super(HTTPException, self).__init__() - if description is not None: - self.description = description - self.response = response - - @classmethod - def wrap(cls, exception, name=None): - """Create an exception that is a subclass of the calling HTTP - exception and the ``exception`` argument. - - The first argument to the class will be passed to the - wrapped ``exception``, the rest to the HTTP exception. If - ``e.args`` is not empty and ``e.show_exception`` is ``True``, - the wrapped exception message is added to the HTTP error - description. - - .. versionchanged:: 0.15.5 - The ``show_exception`` attribute controls whether the - description includes the wrapped exception message. - - .. versionchanged:: 0.15.0 - The description includes the wrapped exception message. - """ - - class newcls(cls, exception): - _description = cls.description - show_exception = False - - def __init__(self, arg=None, *args, **kwargs): - super(cls, self).__init__(*args, **kwargs) - - if arg is None: - exception.__init__(self) - else: - exception.__init__(self, arg) - - @property - def description(self): - if self.show_exception: - return "{}\n{}: {}".format( - self._description, exception.__name__, exception.__str__(self) - ) - - return self._description - - @description.setter - def description(self, value): - self._description = value - - newcls.__module__ = sys._getframe(1).f_globals.get("__name__") - name = name or cls.__name__ + exception.__name__ - newcls.__name__ = newcls.__qualname__ = name - return newcls - - @property - def name(self): - """The status name.""" - from .http import HTTP_STATUS_CODES - - return HTTP_STATUS_CODES.get(self.code, "Unknown Error") - - def get_description(self, environ=None): - """Get the description.""" - return u"

    %s

    " % escape(self.description).replace("\n", "
    ") - - def get_body(self, environ=None): - """Get the HTML body.""" - return text_type( - ( - u'\n' - u"%(code)s %(name)s\n" - u"

    %(name)s

    \n" - u"%(description)s\n" - ) - % { - "code": self.code, - "name": escape(self.name), - "description": self.get_description(environ), - } - ) - - def get_headers(self, environ=None): - """Get a list of headers.""" - return [("Content-Type", "text/html; charset=utf-8")] - - def get_response(self, environ=None): - """Get a response object. If one was passed to the exception - it's returned directly. - - :param environ: the optional environ for the request. This - can be used to modify the response depending - on how the request looked like. - :return: a :class:`Response` object or a subclass thereof. - """ - from .wrappers.response import Response - - if self.response is not None: - return self.response - if environ is not None: - environ = _get_environ(environ) - headers = self.get_headers(environ) - return Response(self.get_body(environ), self.code, headers) - - def __call__(self, environ, start_response): - """Call the exception as WSGI application. - - :param environ: the WSGI environment. - :param start_response: the response callable provided by the WSGI - server. - """ - response = self.get_response(environ) - return response(environ, start_response) - - def __str__(self): - code = self.code if self.code is not None else "???" - return "%s %s: %s" % (code, self.name, self.description) - - def __repr__(self): - code = self.code if self.code is not None else "???" - return "<%s '%s: %s'>" % (self.__class__.__name__, code, self.name) - - -class BadRequest(HTTPException): - """*400* `Bad Request` - - Raise if the browser sends something to the application the application - or server cannot handle. - """ - - code = 400 - description = ( - "The browser (or proxy) sent a request that this server could " - "not understand." - ) - - -class ClientDisconnected(BadRequest): - """Internal exception that is raised if Werkzeug detects a disconnected - client. Since the client is already gone at that point attempting to - send the error message to the client might not work and might ultimately - result in another exception in the server. Mainly this is here so that - it is silenced by default as far as Werkzeug is concerned. - - Since disconnections cannot be reliably detected and are unspecified - by WSGI to a large extent this might or might not be raised if a client - is gone. - - .. versionadded:: 0.8 - """ - - -class SecurityError(BadRequest): - """Raised if something triggers a security error. This is otherwise - exactly like a bad request error. - - .. versionadded:: 0.9 - """ - - -class BadHost(BadRequest): - """Raised if the submitted host is badly formatted. - - .. versionadded:: 0.11.2 - """ - - -class Unauthorized(HTTPException): - """*401* ``Unauthorized`` - - Raise if the user is not authorized to access a resource. - - The ``www_authenticate`` argument should be used to set the - ``WWW-Authenticate`` header. This is used for HTTP basic auth and - other schemes. Use :class:`~werkzeug.datastructures.WWWAuthenticate` - to create correctly formatted values. Strictly speaking a 401 - response is invalid if it doesn't provide at least one value for - this header, although real clients typically don't care. - - :param description: Override the default message used for the body - of the response. - :param www-authenticate: A single value, or list of values, for the - WWW-Authenticate header. - - .. versionchanged:: 0.15.3 - If the ``www_authenticate`` argument is not set, the - ``WWW-Authenticate`` header is not set. - - .. versionchanged:: 0.15.3 - The ``response`` argument was restored. - - .. versionchanged:: 0.15.1 - ``description`` was moved back as the first argument, restoring - its previous position. - - .. versionchanged:: 0.15.0 - ``www_authenticate`` was added as the first argument, ahead of - ``description``. - """ - - code = 401 - description = ( - "The server could not verify that you are authorized to access" - " the URL requested. You either supplied the wrong credentials" - " (e.g. a bad password), or your browser doesn't understand" - " how to supply the credentials required." - ) - - def __init__(self, description=None, response=None, www_authenticate=None): - HTTPException.__init__(self, description, response) - - if www_authenticate is not None: - if not isinstance(www_authenticate, (tuple, list)): - www_authenticate = (www_authenticate,) - - self.www_authenticate = www_authenticate - - def get_headers(self, environ=None): - headers = HTTPException.get_headers(self, environ) - if self.www_authenticate: - headers.append( - ("WWW-Authenticate", ", ".join([str(x) for x in self.www_authenticate])) - ) - return headers - - -class Forbidden(HTTPException): - """*403* `Forbidden` - - Raise if the user doesn't have the permission for the requested resource - but was authenticated. - """ - - code = 403 - description = ( - "You don't have the permission to access the requested" - " resource. It is either read-protected or not readable by the" - " server." - ) - - -class NotFound(HTTPException): - """*404* `Not Found` - - Raise if a resource does not exist and never existed. - """ - - code = 404 - description = ( - "The requested URL was not found on the server. If you entered" - " the URL manually please check your spelling and try again." - ) - - -class MethodNotAllowed(HTTPException): - """*405* `Method Not Allowed` - - Raise if the server used a method the resource does not handle. For - example `POST` if the resource is view only. Especially useful for REST. - - The first argument for this exception should be a list of allowed methods. - Strictly speaking the response would be invalid if you don't provide valid - methods in the header which you can do with that list. - """ - - code = 405 - description = "The method is not allowed for the requested URL." - - def __init__(self, valid_methods=None, description=None): - """Takes an optional list of valid http methods - starting with werkzeug 0.3 the list will be mandatory.""" - HTTPException.__init__(self, description) - self.valid_methods = valid_methods - - def get_headers(self, environ=None): - headers = HTTPException.get_headers(self, environ) - if self.valid_methods: - headers.append(("Allow", ", ".join(self.valid_methods))) - return headers - - -class NotAcceptable(HTTPException): - """*406* `Not Acceptable` - - Raise if the server can't return any content conforming to the - `Accept` headers of the client. - """ - - code = 406 - - description = ( - "The resource identified by the request is only capable of" - " generating response entities which have content" - " characteristics not acceptable according to the accept" - " headers sent in the request." - ) - - -class RequestTimeout(HTTPException): - """*408* `Request Timeout` - - Raise to signalize a timeout. - """ - - code = 408 - description = ( - "The server closed the network connection because the browser" - " didn't finish the request within the specified time." - ) - - -class Conflict(HTTPException): - """*409* `Conflict` - - Raise to signal that a request cannot be completed because it conflicts - with the current state on the server. - - .. versionadded:: 0.7 - """ - - code = 409 - description = ( - "A conflict happened while processing the request. The" - " resource might have been modified while the request was being" - " processed." - ) - - -class Gone(HTTPException): - """*410* `Gone` - - Raise if a resource existed previously and went away without new location. - """ - - code = 410 - description = ( - "The requested URL is no longer available on this server and" - " there is no forwarding address. If you followed a link from a" - " foreign page, please contact the author of this page." - ) - - -class LengthRequired(HTTPException): - """*411* `Length Required` - - Raise if the browser submitted data but no ``Content-Length`` header which - is required for the kind of processing the server does. - """ - - code = 411 - description = ( - "A request with this method requires a valid Content-" - "Length header." - ) - - -class PreconditionFailed(HTTPException): - """*412* `Precondition Failed` - - Status code used in combination with ``If-Match``, ``If-None-Match``, or - ``If-Unmodified-Since``. - """ - - code = 412 - description = ( - "The precondition on the request for the URL failed positive evaluation." - ) - - -class RequestEntityTooLarge(HTTPException): - """*413* `Request Entity Too Large` - - The status code one should return if the data submitted exceeded a given - limit. - """ - - code = 413 - description = "The data value transmitted exceeds the capacity limit." - - -class RequestURITooLarge(HTTPException): - """*414* `Request URI Too Large` - - Like *413* but for too long URLs. - """ - - code = 414 - description = ( - "The length of the requested URL exceeds the capacity limit for" - " this server. The request cannot be processed." - ) - - -class UnsupportedMediaType(HTTPException): - """*415* `Unsupported Media Type` - - The status code returned if the server is unable to handle the media type - the client transmitted. - """ - - code = 415 - description = ( - "The server does not support the media type transmitted in the request." - ) - - -class RequestedRangeNotSatisfiable(HTTPException): - """*416* `Requested Range Not Satisfiable` - - The client asked for an invalid part of the file. - - .. versionadded:: 0.7 - """ - - code = 416 - description = "The server cannot provide the requested range." - - def __init__(self, length=None, units="bytes", description=None): - """Takes an optional `Content-Range` header value based on ``length`` - parameter. - """ - HTTPException.__init__(self, description) - self.length = length - self.units = units - - def get_headers(self, environ=None): - headers = HTTPException.get_headers(self, environ) - if self.length is not None: - headers.append(("Content-Range", "%s */%d" % (self.units, self.length))) - return headers - - -class ExpectationFailed(HTTPException): - """*417* `Expectation Failed` - - The server cannot meet the requirements of the Expect request-header. - - .. versionadded:: 0.7 - """ - - code = 417 - description = "The server could not meet the requirements of the Expect header" - - -class ImATeapot(HTTPException): - """*418* `I'm a teapot` - - The server should return this if it is a teapot and someone attempted - to brew coffee with it. - - .. versionadded:: 0.7 - """ - - code = 418 - description = "This server is a teapot, not a coffee machine" - - -class UnprocessableEntity(HTTPException): - """*422* `Unprocessable Entity` - - Used if the request is well formed, but the instructions are otherwise - incorrect. - """ - - code = 422 - description = ( - "The request was well-formed but was unable to be followed due" - " to semantic errors." - ) - - -class Locked(HTTPException): - """*423* `Locked` - - Used if the resource that is being accessed is locked. - """ - - code = 423 - description = "The resource that is being accessed is locked." - - -class FailedDependency(HTTPException): - """*424* `Failed Dependency` - - Used if the method could not be performed on the resource - because the requested action depended on another action and that action failed. - """ - - code = 424 - description = ( - "The method could not be performed on the resource because the" - " requested action depended on another action and that action" - " failed." - ) - - -class PreconditionRequired(HTTPException): - """*428* `Precondition Required` - - The server requires this request to be conditional, typically to prevent - the lost update problem, which is a race condition between two or more - clients attempting to update a resource through PUT or DELETE. By requiring - each client to include a conditional header ("If-Match" or "If-Unmodified- - Since") with the proper value retained from a recent GET request, the - server ensures that each client has at least seen the previous revision of - the resource. - """ - - code = 428 - description = ( - "This request is required to be conditional; try using" - ' "If-Match" or "If-Unmodified-Since".' - ) - - -class _RetryAfter(HTTPException): - """Adds an optional ``retry_after`` parameter which will set the - ``Retry-After`` header. May be an :class:`int` number of seconds or - a :class:`~datetime.datetime`. - """ - - def __init__(self, description=None, response=None, retry_after=None): - super(_RetryAfter, self).__init__(description, response) - self.retry_after = retry_after - - def get_headers(self, environ=None): - headers = super(_RetryAfter, self).get_headers(environ) - - if self.retry_after: - if isinstance(self.retry_after, datetime): - from .http import http_date - - value = http_date(self.retry_after) - else: - value = str(self.retry_after) - - headers.append(("Retry-After", value)) - - return headers - - -class TooManyRequests(_RetryAfter): - """*429* `Too Many Requests` - - The server is limiting the rate at which this user receives - responses, and this request exceeds that rate. (The server may use - any convenient method to identify users and their request rates). - The server may include a "Retry-After" header to indicate how long - the user should wait before retrying. - - :param retry_after: If given, set the ``Retry-After`` header to this - value. May be an :class:`int` number of seconds or a - :class:`~datetime.datetime`. - - .. versionchanged:: 1.0 - Added ``retry_after`` parameter. - """ - - code = 429 - description = "This user has exceeded an allotted request count. Try again later." - - -class RequestHeaderFieldsTooLarge(HTTPException): - """*431* `Request Header Fields Too Large` - - The server refuses to process the request because the header fields are too - large. One or more individual fields may be too large, or the set of all - headers is too large. - """ - - code = 431 - description = "One or more header fields exceeds the maximum size." - - -class UnavailableForLegalReasons(HTTPException): - """*451* `Unavailable For Legal Reasons` - - This status code indicates that the server is denying access to the - resource as a consequence of a legal demand. - """ - - code = 451 - description = "Unavailable for legal reasons." - - -class InternalServerError(HTTPException): - """*500* `Internal Server Error` - - Raise if an internal server error occurred. This is a good fallback if an - unknown error occurred in the dispatcher. - - .. versionchanged:: 1.0.0 - Added the :attr:`original_exception` attribute. - """ - - code = 500 - description = ( - "The server encountered an internal error and was unable to" - " complete your request. Either the server is overloaded or" - " there is an error in the application." - ) - - def __init__(self, description=None, response=None, original_exception=None): - #: The original exception that caused this 500 error. Can be - #: used by frameworks to provide context when handling - #: unexpected errors. - self.original_exception = original_exception - super(InternalServerError, self).__init__( - description=description, response=response - ) - - -class NotImplemented(HTTPException): - """*501* `Not Implemented` - - Raise if the application does not support the action requested by the - browser. - """ - - code = 501 - description = "The server does not support the action requested by the browser." - - -class BadGateway(HTTPException): - """*502* `Bad Gateway` - - If you do proxying in your application you should return this status code - if you received an invalid response from the upstream server it accessed - in attempting to fulfill the request. - """ - - code = 502 - description = ( - "The proxy server received an invalid response from an upstream server." - ) - - -class ServiceUnavailable(_RetryAfter): - """*503* `Service Unavailable` - - Status code you should return if a service is temporarily - unavailable. - - :param retry_after: If given, set the ``Retry-After`` header to this - value. May be an :class:`int` number of seconds or a - :class:`~datetime.datetime`. - - .. versionchanged:: 1.0 - Added ``retry_after`` parameter. - """ - - code = 503 - description = ( - "The server is temporarily unable to service your request due" - " to maintenance downtime or capacity problems. Please try" - " again later." - ) - - -class GatewayTimeout(HTTPException): - """*504* `Gateway Timeout` - - Status code you should return if a connection to an upstream server - times out. - """ - - code = 504 - description = "The connection to an upstream server timed out." - - -class HTTPVersionNotSupported(HTTPException): - """*505* `HTTP Version Not Supported` - - The server does not support the HTTP protocol version used in the request. - """ - - code = 505 - description = ( - "The server does not support the HTTP protocol version used in the request." - ) - - -default_exceptions = {} -__all__ = ["HTTPException"] - - -def _find_exceptions(): - for _name, obj in iteritems(globals()): - try: - is_http_exception = issubclass(obj, HTTPException) - except TypeError: - is_http_exception = False - if not is_http_exception or obj.code is None: - continue - __all__.append(obj.__name__) - old_obj = default_exceptions.get(obj.code, None) - if old_obj is not None and issubclass(obj, old_obj): - continue - default_exceptions[obj.code] = obj - - -_find_exceptions() -del _find_exceptions - - -class Aborter(object): - """When passed a dict of code -> exception items it can be used as - callable that raises exceptions. If the first argument to the - callable is an integer it will be looked up in the mapping, if it's - a WSGI application it will be raised in a proxy exception. - - The rest of the arguments are forwarded to the exception constructor. - """ - - def __init__(self, mapping=None, extra=None): - if mapping is None: - mapping = default_exceptions - self.mapping = dict(mapping) - if extra is not None: - self.mapping.update(extra) - - def __call__(self, code, *args, **kwargs): - if not args and not kwargs and not isinstance(code, integer_types): - raise HTTPException(response=code) - if code not in self.mapping: - raise LookupError("no exception for %r" % code) - raise self.mapping[code](*args, **kwargs) - - -def abort(status, *args, **kwargs): - """Raises an :py:exc:`HTTPException` for the given status code or WSGI - application. - - If a status code is given, it will be looked up in the list of - exceptions and will raise that exception. If passed a WSGI application, - it will wrap it in a proxy WSGI exception and raise that:: - - abort(404) # 404 Not Found - abort(Response('Hello World')) - - """ - return _aborter(status, *args, **kwargs) - - -_aborter = Aborter() - -#: An exception that is used to signal both a :exc:`KeyError` and a -#: :exc:`BadRequest`. Used by many of the datastructures. -BadRequestKeyError = BadRequest.wrap(KeyError) diff --git a/venv/lib/python3.7/site-packages/werkzeug/filesystem.py b/venv/lib/python3.7/site-packages/werkzeug/filesystem.py deleted file mode 100644 index d016cae..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/filesystem.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.filesystem - ~~~~~~~~~~~~~~~~~~~ - - Various utilities for the local filesystem. - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import codecs -import sys -import warnings - -# We do not trust traditional unixes. -has_likely_buggy_unicode_filesystem = ( - sys.platform.startswith("linux") or "bsd" in sys.platform -) - - -def _is_ascii_encoding(encoding): - """Given an encoding this figures out if the encoding is actually ASCII (which - is something we don't actually want in most cases). This is necessary - because ASCII comes under many names such as ANSI_X3.4-1968. - """ - if encoding is None: - return False - try: - return codecs.lookup(encoding).name == "ascii" - except LookupError: - return False - - -class BrokenFilesystemWarning(RuntimeWarning, UnicodeWarning): - """The warning used by Werkzeug to signal a broken filesystem. Will only be - used once per runtime.""" - - -_warned_about_filesystem_encoding = False - - -def get_filesystem_encoding(): - """Returns the filesystem encoding that should be used. Note that this is - different from the Python understanding of the filesystem encoding which - might be deeply flawed. Do not use this value against Python's unicode APIs - because it might be different. See :ref:`filesystem-encoding` for the exact - behavior. - - The concept of a filesystem encoding in generally is not something you - should rely on. As such if you ever need to use this function except for - writing wrapper code reconsider. - """ - global _warned_about_filesystem_encoding - rv = sys.getfilesystemencoding() - if has_likely_buggy_unicode_filesystem and not rv or _is_ascii_encoding(rv): - if not _warned_about_filesystem_encoding: - warnings.warn( - "Detected a misconfigured UNIX filesystem: Will use" - " UTF-8 as filesystem encoding instead of {0!r}".format(rv), - BrokenFilesystemWarning, - ) - _warned_about_filesystem_encoding = True - return "utf-8" - return rv diff --git a/venv/lib/python3.7/site-packages/werkzeug/formparser.py b/venv/lib/python3.7/site-packages/werkzeug/formparser.py deleted file mode 100644 index ffdb9b0..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/formparser.py +++ /dev/null @@ -1,584 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.formparser - ~~~~~~~~~~~~~~~~~~~ - - This module implements the form parsing. It supports url-encoded forms - as well as non-nested multipart uploads. - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import codecs -import re -from functools import update_wrapper -from itertools import chain -from itertools import repeat -from itertools import tee - -from . import exceptions -from ._compat import BytesIO -from ._compat import text_type -from ._compat import to_native -from .datastructures import FileStorage -from .datastructures import Headers -from .datastructures import MultiDict -from .http import parse_options_header -from .urls import url_decode_stream -from .wsgi import get_content_length -from .wsgi import get_input_stream -from .wsgi import make_line_iter - -# there are some platforms where SpooledTemporaryFile is not available. -# In that case we need to provide a fallback. -try: - from tempfile import SpooledTemporaryFile -except ImportError: - from tempfile import TemporaryFile - - SpooledTemporaryFile = None - - -#: an iterator that yields empty strings -_empty_string_iter = repeat("") - -#: a regular expression for multipart boundaries -_multipart_boundary_re = re.compile("^[ -~]{0,200}[!-~]$") - -#: supported http encodings that are also available in python we support -#: for multipart messages. -_supported_multipart_encodings = frozenset(["base64", "quoted-printable"]) - - -def default_stream_factory( - total_content_length, filename, content_type, content_length=None -): - """The stream factory that is used per default.""" - max_size = 1024 * 500 - if SpooledTemporaryFile is not None: - return SpooledTemporaryFile(max_size=max_size, mode="wb+") - if total_content_length is None or total_content_length > max_size: - return TemporaryFile("wb+") - return BytesIO() - - -def parse_form_data( - environ, - stream_factory=None, - charset="utf-8", - errors="replace", - max_form_memory_size=None, - max_content_length=None, - cls=None, - silent=True, -): - """Parse the form data in the environ and return it as tuple in the form - ``(stream, form, files)``. You should only call this method if the - transport method is `POST`, `PUT`, or `PATCH`. - - If the mimetype of the data transmitted is `multipart/form-data` the - files multidict will be filled with `FileStorage` objects. If the - mimetype is unknown the input stream is wrapped and returned as first - argument, else the stream is empty. - - This is a shortcut for the common usage of :class:`FormDataParser`. - - Have a look at :ref:`dealing-with-request-data` for more details. - - .. versionadded:: 0.5 - The `max_form_memory_size`, `max_content_length` and - `cls` parameters were added. - - .. versionadded:: 0.5.1 - The optional `silent` flag was added. - - :param environ: the WSGI environment to be used for parsing. - :param stream_factory: An optional callable that returns a new read and - writeable file descriptor. This callable works - the same as :meth:`~BaseResponse._get_file_stream`. - :param charset: The character set for URL and url encoded form data. - :param errors: The encoding error behavior. - :param max_form_memory_size: the maximum number of bytes to be accepted for - in-memory stored form data. If the data - exceeds the value specified an - :exc:`~exceptions.RequestEntityTooLarge` - exception is raised. - :param max_content_length: If this is provided and the transmitted data - is longer than this value an - :exc:`~exceptions.RequestEntityTooLarge` - exception is raised. - :param cls: an optional dict class to use. If this is not specified - or `None` the default :class:`MultiDict` is used. - :param silent: If set to False parsing errors will not be caught. - :return: A tuple in the form ``(stream, form, files)``. - """ - return FormDataParser( - stream_factory, - charset, - errors, - max_form_memory_size, - max_content_length, - cls, - silent, - ).parse_from_environ(environ) - - -def exhaust_stream(f): - """Helper decorator for methods that exhausts the stream on return.""" - - def wrapper(self, stream, *args, **kwargs): - try: - return f(self, stream, *args, **kwargs) - finally: - exhaust = getattr(stream, "exhaust", None) - if exhaust is not None: - exhaust() - else: - while 1: - chunk = stream.read(1024 * 64) - if not chunk: - break - - return update_wrapper(wrapper, f) - - -class FormDataParser(object): - """This class implements parsing of form data for Werkzeug. By itself - it can parse multipart and url encoded form data. It can be subclassed - and extended but for most mimetypes it is a better idea to use the - untouched stream and expose it as separate attributes on a request - object. - - .. versionadded:: 0.8 - - :param stream_factory: An optional callable that returns a new read and - writeable file descriptor. This callable works - the same as :meth:`~BaseResponse._get_file_stream`. - :param charset: The character set for URL and url encoded form data. - :param errors: The encoding error behavior. - :param max_form_memory_size: the maximum number of bytes to be accepted for - in-memory stored form data. If the data - exceeds the value specified an - :exc:`~exceptions.RequestEntityTooLarge` - exception is raised. - :param max_content_length: If this is provided and the transmitted data - is longer than this value an - :exc:`~exceptions.RequestEntityTooLarge` - exception is raised. - :param cls: an optional dict class to use. If this is not specified - or `None` the default :class:`MultiDict` is used. - :param silent: If set to False parsing errors will not be caught. - """ - - def __init__( - self, - stream_factory=None, - charset="utf-8", - errors="replace", - max_form_memory_size=None, - max_content_length=None, - cls=None, - silent=True, - ): - if stream_factory is None: - stream_factory = default_stream_factory - self.stream_factory = stream_factory - self.charset = charset - self.errors = errors - self.max_form_memory_size = max_form_memory_size - self.max_content_length = max_content_length - if cls is None: - cls = MultiDict - self.cls = cls - self.silent = silent - - def get_parse_func(self, mimetype, options): - return self.parse_functions.get(mimetype) - - def parse_from_environ(self, environ): - """Parses the information from the environment as form data. - - :param environ: the WSGI environment to be used for parsing. - :return: A tuple in the form ``(stream, form, files)``. - """ - content_type = environ.get("CONTENT_TYPE", "") - content_length = get_content_length(environ) - mimetype, options = parse_options_header(content_type) - return self.parse(get_input_stream(environ), mimetype, content_length, options) - - def parse(self, stream, mimetype, content_length, options=None): - """Parses the information from the given stream, mimetype, - content length and mimetype parameters. - - :param stream: an input stream - :param mimetype: the mimetype of the data - :param content_length: the content length of the incoming data - :param options: optional mimetype parameters (used for - the multipart boundary for instance) - :return: A tuple in the form ``(stream, form, files)``. - """ - if ( - self.max_content_length is not None - and content_length is not None - and content_length > self.max_content_length - ): - raise exceptions.RequestEntityTooLarge() - if options is None: - options = {} - - parse_func = self.get_parse_func(mimetype, options) - if parse_func is not None: - try: - return parse_func(self, stream, mimetype, content_length, options) - except ValueError: - if not self.silent: - raise - - return stream, self.cls(), self.cls() - - @exhaust_stream - def _parse_multipart(self, stream, mimetype, content_length, options): - parser = MultiPartParser( - self.stream_factory, - self.charset, - self.errors, - max_form_memory_size=self.max_form_memory_size, - cls=self.cls, - ) - boundary = options.get("boundary") - if boundary is None: - raise ValueError("Missing boundary") - if isinstance(boundary, text_type): - boundary = boundary.encode("ascii") - form, files = parser.parse(stream, boundary, content_length) - return stream, form, files - - @exhaust_stream - def _parse_urlencoded(self, stream, mimetype, content_length, options): - if ( - self.max_form_memory_size is not None - and content_length is not None - and content_length > self.max_form_memory_size - ): - raise exceptions.RequestEntityTooLarge() - form = url_decode_stream(stream, self.charset, errors=self.errors, cls=self.cls) - return stream, form, self.cls() - - #: mapping of mimetypes to parsing functions - parse_functions = { - "multipart/form-data": _parse_multipart, - "application/x-www-form-urlencoded": _parse_urlencoded, - "application/x-url-encoded": _parse_urlencoded, - } - - -def is_valid_multipart_boundary(boundary): - """Checks if the string given is a valid multipart boundary.""" - return _multipart_boundary_re.match(boundary) is not None - - -def _line_parse(line): - """Removes line ending characters and returns a tuple (`stripped_line`, - `is_terminated`). - """ - if line[-2:] in ["\r\n", b"\r\n"]: - return line[:-2], True - elif line[-1:] in ["\r", "\n", b"\r", b"\n"]: - return line[:-1], True - return line, False - - -def parse_multipart_headers(iterable): - """Parses multipart headers from an iterable that yields lines (including - the trailing newline symbol). The iterable has to be newline terminated. - - The iterable will stop at the line where the headers ended so it can be - further consumed. - - :param iterable: iterable of strings that are newline terminated - """ - result = [] - for line in iterable: - line = to_native(line) - line, line_terminated = _line_parse(line) - if not line_terminated: - raise ValueError("unexpected end of line in multipart header") - if not line: - break - elif line[0] in " \t" and result: - key, value = result[-1] - result[-1] = (key, value + "\n " + line[1:]) - else: - parts = line.split(":", 1) - if len(parts) == 2: - result.append((parts[0].strip(), parts[1].strip())) - - # we link the list to the headers, no need to create a copy, the - # list was not shared anyways. - return Headers(result) - - -_begin_form = "begin_form" -_begin_file = "begin_file" -_cont = "cont" -_end = "end" - - -class MultiPartParser(object): - def __init__( - self, - stream_factory=None, - charset="utf-8", - errors="replace", - max_form_memory_size=None, - cls=None, - buffer_size=64 * 1024, - ): - self.charset = charset - self.errors = errors - self.max_form_memory_size = max_form_memory_size - self.stream_factory = ( - default_stream_factory if stream_factory is None else stream_factory - ) - self.cls = MultiDict if cls is None else cls - - # make sure the buffer size is divisible by four so that we can base64 - # decode chunk by chunk - assert buffer_size % 4 == 0, "buffer size has to be divisible by 4" - # also the buffer size has to be at least 1024 bytes long or long headers - # will freak out the system - assert buffer_size >= 1024, "buffer size has to be at least 1KB" - - self.buffer_size = buffer_size - - def _fix_ie_filename(self, filename): - """Internet Explorer 6 transmits the full file name if a file is - uploaded. This function strips the full path if it thinks the - filename is Windows-like absolute. - """ - if filename[1:3] == ":\\" or filename[:2] == "\\\\": - return filename.split("\\")[-1] - return filename - - def _find_terminator(self, iterator): - """The terminator might have some additional newlines before it. - There is at least one application that sends additional newlines - before headers (the python setuptools package). - """ - for line in iterator: - if not line: - break - line = line.strip() - if line: - return line - return b"" - - def fail(self, message): - raise ValueError(message) - - def get_part_encoding(self, headers): - transfer_encoding = headers.get("content-transfer-encoding") - if ( - transfer_encoding is not None - and transfer_encoding in _supported_multipart_encodings - ): - return transfer_encoding - - def get_part_charset(self, headers): - # Figure out input charset for current part - content_type = headers.get("content-type") - if content_type: - mimetype, ct_params = parse_options_header(content_type) - return ct_params.get("charset", self.charset) - return self.charset - - def start_file_streaming(self, filename, headers, total_content_length): - if isinstance(filename, bytes): - filename = filename.decode(self.charset, self.errors) - filename = self._fix_ie_filename(filename) - content_type = headers.get("content-type") - try: - content_length = int(headers["content-length"]) - except (KeyError, ValueError): - content_length = 0 - container = self.stream_factory( - total_content_length=total_content_length, - filename=filename, - content_type=content_type, - content_length=content_length, - ) - return filename, container - - def in_memory_threshold_reached(self, bytes): - raise exceptions.RequestEntityTooLarge() - - def validate_boundary(self, boundary): - if not boundary: - self.fail("Missing boundary") - if not is_valid_multipart_boundary(boundary): - self.fail("Invalid boundary: %s" % boundary) - if len(boundary) > self.buffer_size: # pragma: no cover - # this should never happen because we check for a minimum size - # of 1024 and boundaries may not be longer than 200. The only - # situation when this happens is for non debug builds where - # the assert is skipped. - self.fail("Boundary longer than buffer size") - - def parse_lines(self, file, boundary, content_length, cap_at_buffer=True): - """Generate parts of - ``('begin_form', (headers, name))`` - ``('begin_file', (headers, name, filename))`` - ``('cont', bytestring)`` - ``('end', None)`` - - Always obeys the grammar - parts = ( begin_form cont* end | - begin_file cont* end )* - """ - next_part = b"--" + boundary - last_part = next_part + b"--" - - iterator = chain( - make_line_iter( - file, - limit=content_length, - buffer_size=self.buffer_size, - cap_at_buffer=cap_at_buffer, - ), - _empty_string_iter, - ) - - terminator = self._find_terminator(iterator) - - if terminator == last_part: - return - elif terminator != next_part: - self.fail("Expected boundary at start of multipart data") - - while terminator != last_part: - headers = parse_multipart_headers(iterator) - - disposition = headers.get("content-disposition") - if disposition is None: - self.fail("Missing Content-Disposition header") - disposition, extra = parse_options_header(disposition) - transfer_encoding = self.get_part_encoding(headers) - name = extra.get("name") - filename = extra.get("filename") - - # if no content type is given we stream into memory. A list is - # used as a temporary container. - if filename is None: - yield _begin_form, (headers, name) - - # otherwise we parse the rest of the headers and ask the stream - # factory for something we can write in. - else: - yield _begin_file, (headers, name, filename) - - buf = b"" - for line in iterator: - if not line: - self.fail("unexpected end of stream") - - if line[:2] == b"--": - terminator = line.rstrip() - if terminator in (next_part, last_part): - break - - if transfer_encoding is not None: - if transfer_encoding == "base64": - transfer_encoding = "base64_codec" - try: - line = codecs.decode(line, transfer_encoding) - except Exception: - self.fail("could not decode transfer encoded chunk") - - # we have something in the buffer from the last iteration. - # this is usually a newline delimiter. - if buf: - yield _cont, buf - buf = b"" - - # If the line ends with windows CRLF we write everything except - # the last two bytes. In all other cases however we write - # everything except the last byte. If it was a newline, that's - # fine, otherwise it does not matter because we will write it - # the next iteration. this ensures we do not write the - # final newline into the stream. That way we do not have to - # truncate the stream. However we do have to make sure that - # if something else than a newline is in there we write it - # out. - if line[-2:] == b"\r\n": - buf = b"\r\n" - cutoff = -2 - else: - buf = line[-1:] - cutoff = -1 - yield _cont, line[:cutoff] - - else: # pragma: no cover - raise ValueError("unexpected end of part") - - # if we have a leftover in the buffer that is not a newline - # character we have to flush it, otherwise we will chop of - # certain values. - if buf not in (b"", b"\r", b"\n", b"\r\n"): - yield _cont, buf - - yield _end, None - - def parse_parts(self, file, boundary, content_length): - """Generate ``('file', (name, val))`` and - ``('form', (name, val))`` parts. - """ - in_memory = 0 - - for ellt, ell in self.parse_lines(file, boundary, content_length): - if ellt == _begin_file: - headers, name, filename = ell - is_file = True - guard_memory = False - filename, container = self.start_file_streaming( - filename, headers, content_length - ) - _write = container.write - - elif ellt == _begin_form: - headers, name = ell - is_file = False - container = [] - _write = container.append - guard_memory = self.max_form_memory_size is not None - - elif ellt == _cont: - _write(ell) - # if we write into memory and there is a memory size limit we - # count the number of bytes in memory and raise an exception if - # there is too much data in memory. - if guard_memory: - in_memory += len(ell) - if in_memory > self.max_form_memory_size: - self.in_memory_threshold_reached(in_memory) - - elif ellt == _end: - if is_file: - container.seek(0) - yield ( - "file", - (name, FileStorage(container, filename, name, headers=headers)), - ) - else: - part_charset = self.get_part_charset(headers) - yield ( - "form", - (name, b"".join(container).decode(part_charset, self.errors)), - ) - - def parse(self, file, boundary, content_length): - formstream, filestream = tee( - self.parse_parts(file, boundary, content_length), 2 - ) - form = (p[1] for p in formstream if p[0] == "form") - files = (p[1] for p in filestream if p[0] == "file") - return self.cls(form), self.cls(files) diff --git a/venv/lib/python3.7/site-packages/werkzeug/http.py b/venv/lib/python3.7/site-packages/werkzeug/http.py deleted file mode 100644 index b428cee..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/http.py +++ /dev/null @@ -1,1305 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.http - ~~~~~~~~~~~~~ - - Werkzeug comes with a bunch of utilities that help Werkzeug to deal with - HTTP data. Most of the classes and functions provided by this module are - used by the wrappers, but they are useful on their own, too, especially if - the response and request objects are not used. - - This covers some of the more HTTP centric features of WSGI, some other - utilities such as cookie handling are documented in the `werkzeug.utils` - module. - - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import base64 -import re -import warnings -from datetime import datetime -from datetime import timedelta -from hashlib import md5 -from time import gmtime -from time import time - -from ._compat import integer_types -from ._compat import iteritems -from ._compat import PY2 -from ._compat import string_types -from ._compat import text_type -from ._compat import to_bytes -from ._compat import to_unicode -from ._compat import try_coerce_native -from ._internal import _cookie_parse_impl -from ._internal import _cookie_quote -from ._internal import _make_cookie_domain - -try: - from email.utils import parsedate_tz -except ImportError: - from email.Utils import parsedate_tz - -try: - from urllib.request import parse_http_list as _parse_list_header - from urllib.parse import unquote_to_bytes as _unquote -except ImportError: - from urllib2 import parse_http_list as _parse_list_header - from urllib2 import unquote as _unquote - -_cookie_charset = "latin1" -_basic_auth_charset = "utf-8" -# for explanation of "media-range", etc. see Sections 5.3.{1,2} of RFC 7231 -_accept_re = re.compile( - r""" - ( # media-range capturing-parenthesis - [^\s;,]+ # type/subtype - (?:[ \t]*;[ \t]* # ";" - (?: # parameter non-capturing-parenthesis - [^\s;,q][^\s;,]* # token that doesn't start with "q" - | # or - q[^\s;,=][^\s;,]* # token that is more than just "q" - ) - )* # zero or more parameters - ) # end of media-range - (?:[ \t]*;[ \t]*q= # weight is a "q" parameter - (\d*(?:\.\d+)?) # qvalue capturing-parentheses - [^,]* # "extension" accept params: who cares? - )? # accept params are optional - """, - re.VERBOSE, -) -_token_chars = frozenset( - "!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~" -) -_etag_re = re.compile(r'([Ww]/)?(?:"(.*?)"|(.*?))(?:\s*,\s*|$)') -_unsafe_header_chars = set('()<>@,;:"/[]?={} \t') -_option_header_piece_re = re.compile( - r""" - ;\s*,?\s* # newlines were replaced with commas - (?P - "[^"\\]*(?:\\.[^"\\]*)*" # quoted string - | - [^\s;,=*]+ # token - ) - (?:\*(?P\d+))? # *1, optional continuation index - \s* - (?: # optionally followed by =value - (?: # equals sign, possibly with encoding - \*\s*=\s* # * indicates extended notation - (?: # optional encoding - (?P[^\s]+?) - '(?P[^\s]*?)' - )? - | - =\s* # basic notation - ) - (?P - "[^"\\]*(?:\\.[^"\\]*)*" # quoted string - | - [^;,]+ # token - )? - )? - \s* - """, - flags=re.VERBOSE, -) -_option_header_start_mime_type = re.compile(r",\s*([^;,\s]+)([;,]\s*.+)?") - -_entity_headers = frozenset( - [ - "allow", - "content-encoding", - "content-language", - "content-length", - "content-location", - "content-md5", - "content-range", - "content-type", - "expires", - "last-modified", - ] -) -_hop_by_hop_headers = frozenset( - [ - "connection", - "keep-alive", - "proxy-authenticate", - "proxy-authorization", - "te", - "trailer", - "transfer-encoding", - "upgrade", - ] -) - - -HTTP_STATUS_CODES = { - 100: "Continue", - 101: "Switching Protocols", - 102: "Processing", - 103: "Early Hints", # see RFC 8297 - 200: "OK", - 201: "Created", - 202: "Accepted", - 203: "Non Authoritative Information", - 204: "No Content", - 205: "Reset Content", - 206: "Partial Content", - 207: "Multi Status", - 208: "Already Reported", # see RFC 5842 - 226: "IM Used", # see RFC 3229 - 300: "Multiple Choices", - 301: "Moved Permanently", - 302: "Found", - 303: "See Other", - 304: "Not Modified", - 305: "Use Proxy", - 306: "Switch Proxy", # unused - 307: "Temporary Redirect", - 308: "Permanent Redirect", - 400: "Bad Request", - 401: "Unauthorized", - 402: "Payment Required", # unused - 403: "Forbidden", - 404: "Not Found", - 405: "Method Not Allowed", - 406: "Not Acceptable", - 407: "Proxy Authentication Required", - 408: "Request Timeout", - 409: "Conflict", - 410: "Gone", - 411: "Length Required", - 412: "Precondition Failed", - 413: "Request Entity Too Large", - 414: "Request URI Too Long", - 415: "Unsupported Media Type", - 416: "Requested Range Not Satisfiable", - 417: "Expectation Failed", - 418: "I'm a teapot", # see RFC 2324 - 421: "Misdirected Request", # see RFC 7540 - 422: "Unprocessable Entity", - 423: "Locked", - 424: "Failed Dependency", - 425: "Too Early", # see RFC 8470 - 426: "Upgrade Required", - 428: "Precondition Required", # see RFC 6585 - 429: "Too Many Requests", - 431: "Request Header Fields Too Large", - 449: "Retry With", # proprietary MS extension - 451: "Unavailable For Legal Reasons", - 500: "Internal Server Error", - 501: "Not Implemented", - 502: "Bad Gateway", - 503: "Service Unavailable", - 504: "Gateway Timeout", - 505: "HTTP Version Not Supported", - 506: "Variant Also Negotiates", # see RFC 2295 - 507: "Insufficient Storage", - 508: "Loop Detected", # see RFC 5842 - 510: "Not Extended", - 511: "Network Authentication Failed", # see RFC 6585 -} - - -def wsgi_to_bytes(data): - """coerce wsgi unicode represented bytes to real ones""" - if isinstance(data, bytes): - return data - return data.encode("latin1") # XXX: utf8 fallback? - - -def bytes_to_wsgi(data): - assert isinstance(data, bytes), "data must be bytes" - if isinstance(data, str): - return data - else: - return data.decode("latin1") - - -def quote_header_value(value, extra_chars="", allow_token=True): - """Quote a header value if necessary. - - .. versionadded:: 0.5 - - :param value: the value to quote. - :param extra_chars: a list of extra characters to skip quoting. - :param allow_token: if this is enabled token values are returned - unchanged. - """ - if isinstance(value, bytes): - value = bytes_to_wsgi(value) - value = str(value) - if allow_token: - token_chars = _token_chars | set(extra_chars) - if set(value).issubset(token_chars): - return value - return '"%s"' % value.replace("\\", "\\\\").replace('"', '\\"') - - -def unquote_header_value(value, is_filename=False): - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - .. versionadded:: 0.5 - - :param value: the header value to unquote. - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != "\\\\": - return value.replace("\\\\", "\\").replace('\\"', '"') - return value - - -def dump_options_header(header, options): - """The reverse function to :func:`parse_options_header`. - - :param header: the header to dump - :param options: a dict of options to append. - """ - segments = [] - if header is not None: - segments.append(header) - for key, value in iteritems(options): - if value is None: - segments.append(key) - else: - segments.append("%s=%s" % (key, quote_header_value(value))) - return "; ".join(segments) - - -def dump_header(iterable, allow_token=True): - """Dump an HTTP header again. This is the reversal of - :func:`parse_list_header`, :func:`parse_set_header` and - :func:`parse_dict_header`. This also quotes strings that include an - equals sign unless you pass it as dict of key, value pairs. - - >>> dump_header({'foo': 'bar baz'}) - 'foo="bar baz"' - >>> dump_header(('foo', 'bar baz')) - 'foo, "bar baz"' - - :param iterable: the iterable or dict of values to quote. - :param allow_token: if set to `False` tokens as values are disallowed. - See :func:`quote_header_value` for more details. - """ - if isinstance(iterable, dict): - items = [] - for key, value in iteritems(iterable): - if value is None: - items.append(key) - else: - items.append( - "%s=%s" % (key, quote_header_value(value, allow_token=allow_token)) - ) - else: - items = [quote_header_value(x, allow_token=allow_token) for x in iterable] - return ", ".join(items) - - -def dump_csp_header(header): - """Dump a Content Security Policy header. - - These are structured into policies such as "default-src 'self'; - script-src 'self'". - - .. versionadded:: 1.0.0 - Support for Content Security Policy headers was added. - - """ - return "; ".join("%s %s" % (key, value) for key, value in iteritems(header)) - - -def parse_list_header(value): - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -def parse_dict_header(value, cls=dict): - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict (or any other mapping object created from - the type with a dict like interface provided by the `cls` argument): - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - .. versionchanged:: 0.9 - Added support for `cls` argument. - - :param value: a string with a dict header. - :param cls: callable to use for storage of parsed results. - :return: an instance of `cls` - """ - result = cls() - if not isinstance(value, text_type): - # XXX: validate - value = bytes_to_wsgi(value) - for item in _parse_list_header(value): - if "=" not in item: - result[item] = None - continue - name, value = item.split("=", 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -def parse_options_header(value, multiple=False): - """Parse a ``Content-Type`` like header into a tuple with the content - type and the options: - - >>> parse_options_header('text/html; charset=utf8') - ('text/html', {'charset': 'utf8'}) - - This should not be used to parse ``Cache-Control`` like headers that use - a slightly different format. For these headers use the - :func:`parse_dict_header` function. - - .. versionchanged:: 0.15 - :rfc:`2231` parameter continuations are handled. - - .. versionadded:: 0.5 - - :param value: the header to parse. - :param multiple: Whether try to parse and return multiple MIME types - :return: (mimetype, options) or (mimetype, options, mimetype, options, …) - if multiple=True - """ - if not value: - return "", {} - - result = [] - - value = "," + value.replace("\n", ",") - while value: - match = _option_header_start_mime_type.match(value) - if not match: - break - result.append(match.group(1)) # mimetype - options = {} - # Parse options - rest = match.group(2) - continued_encoding = None - while rest: - optmatch = _option_header_piece_re.match(rest) - if not optmatch: - break - option, count, encoding, language, option_value = optmatch.groups() - # Continuations don't have to supply the encoding after the - # first line. If we're in a continuation, track the current - # encoding to use for subsequent lines. Reset it when the - # continuation ends. - if not count: - continued_encoding = None - else: - if not encoding: - encoding = continued_encoding - continued_encoding = encoding - option = unquote_header_value(option) - if option_value is not None: - option_value = unquote_header_value(option_value, option == "filename") - if encoding is not None: - option_value = _unquote(option_value).decode(encoding) - if count: - # Continuations append to the existing value. For - # simplicity, this ignores the possibility of - # out-of-order indices, which shouldn't happen anyway. - options[option] = options.get(option, "") + option_value - else: - options[option] = option_value - rest = rest[optmatch.end() :] - result.append(options) - if multiple is False: - return tuple(result) - value = rest - - return tuple(result) if result else ("", {}) - - -def parse_accept_header(value, cls=None): - """Parses an HTTP Accept-* header. This does not implement a complete - valid algorithm but one that supports at least value and quality - extraction. - - Returns a new :class:`Accept` object (basically a list of ``(value, quality)`` - tuples sorted by the quality with some additional accessor methods). - - The second parameter can be a subclass of :class:`Accept` that is created - with the parsed values and returned. - - :param value: the accept header string to be parsed. - :param cls: the wrapper class for the return value (can be - :class:`Accept` or a subclass thereof) - :return: an instance of `cls`. - """ - if cls is None: - cls = Accept - - if not value: - return cls(None) - - result = [] - for match in _accept_re.finditer(value): - quality = match.group(2) - if not quality: - quality = 1 - else: - quality = max(min(float(quality), 1), 0) - result.append((match.group(1), quality)) - return cls(result) - - -def parse_cache_control_header(value, on_update=None, cls=None): - """Parse a cache control header. The RFC differs between response and - request cache control, this method does not. It's your responsibility - to not use the wrong control statements. - - .. versionadded:: 0.5 - The `cls` was added. If not specified an immutable - :class:`~werkzeug.datastructures.RequestCacheControl` is returned. - - :param value: a cache control header to be parsed. - :param on_update: an optional callable that is called every time a value - on the :class:`~werkzeug.datastructures.CacheControl` - object is changed. - :param cls: the class for the returned object. By default - :class:`~werkzeug.datastructures.RequestCacheControl` is used. - :return: a `cls` object. - """ - if cls is None: - cls = RequestCacheControl - if not value: - return cls(None, on_update) - return cls(parse_dict_header(value), on_update) - - -def parse_csp_header(value, on_update=None, cls=None): - """Parse a Content Security Policy header. - - .. versionadded:: 1.0.0 - Support for Content Security Policy headers was added. - - :param value: a csp header to be parsed. - :param on_update: an optional callable that is called every time a value - on the object is changed. - :param cls: the class for the returned object. By default - :class:`~werkzeug.datastructures.ContentSecurityPolicy` is used. - :return: a `cls` object. - """ - - if cls is None: - cls = ContentSecurityPolicy - items = [] - for policy in value.split(";"): - policy = policy.strip() - # Ignore badly formatted policies (no space) - if " " in policy: - directive, value = policy.strip().split(" ", 1) - items.append((directive.strip(), value.strip())) - return cls(items, on_update) - - -def parse_set_header(value, on_update=None): - """Parse a set-like header and return a - :class:`~werkzeug.datastructures.HeaderSet` object: - - >>> hs = parse_set_header('token, "quoted value"') - - The return value is an object that treats the items case-insensitively - and keeps the order of the items: - - >>> 'TOKEN' in hs - True - >>> hs.index('quoted value') - 1 - >>> hs - HeaderSet(['token', 'quoted value']) - - To create a header from the :class:`HeaderSet` again, use the - :func:`dump_header` function. - - :param value: a set header to be parsed. - :param on_update: an optional callable that is called every time a - value on the :class:`~werkzeug.datastructures.HeaderSet` - object is changed. - :return: a :class:`~werkzeug.datastructures.HeaderSet` - """ - if not value: - return HeaderSet(None, on_update) - return HeaderSet(parse_list_header(value), on_update) - - -def parse_authorization_header(value): - """Parse an HTTP basic/digest authorization header transmitted by the web - browser. The return value is either `None` if the header was invalid or - not given, otherwise an :class:`~werkzeug.datastructures.Authorization` - object. - - :param value: the authorization header to parse. - :return: a :class:`~werkzeug.datastructures.Authorization` object or `None`. - """ - if not value: - return - value = wsgi_to_bytes(value) - try: - auth_type, auth_info = value.split(None, 1) - auth_type = auth_type.lower() - except ValueError: - return - if auth_type == b"basic": - try: - username, password = base64.b64decode(auth_info).split(b":", 1) - except Exception: - return - return Authorization( - "basic", - { - "username": to_unicode(username, _basic_auth_charset), - "password": to_unicode(password, _basic_auth_charset), - }, - ) - elif auth_type == b"digest": - auth_map = parse_dict_header(auth_info) - for key in "username", "realm", "nonce", "uri", "response": - if key not in auth_map: - return - if "qop" in auth_map: - if not auth_map.get("nc") or not auth_map.get("cnonce"): - return - return Authorization("digest", auth_map) - - -def parse_www_authenticate_header(value, on_update=None): - """Parse an HTTP WWW-Authenticate header into a - :class:`~werkzeug.datastructures.WWWAuthenticate` object. - - :param value: a WWW-Authenticate header to parse. - :param on_update: an optional callable that is called every time a value - on the :class:`~werkzeug.datastructures.WWWAuthenticate` - object is changed. - :return: a :class:`~werkzeug.datastructures.WWWAuthenticate` object. - """ - if not value: - return WWWAuthenticate(on_update=on_update) - try: - auth_type, auth_info = value.split(None, 1) - auth_type = auth_type.lower() - except (ValueError, AttributeError): - return WWWAuthenticate(value.strip().lower(), on_update=on_update) - return WWWAuthenticate(auth_type, parse_dict_header(auth_info), on_update) - - -def parse_if_range_header(value): - """Parses an if-range header which can be an etag or a date. Returns - a :class:`~werkzeug.datastructures.IfRange` object. - - .. versionadded:: 0.7 - """ - if not value: - return IfRange() - date = parse_date(value) - if date is not None: - return IfRange(date=date) - # drop weakness information - return IfRange(unquote_etag(value)[0]) - - -def parse_range_header(value, make_inclusive=True): - """Parses a range header into a :class:`~werkzeug.datastructures.Range` - object. If the header is missing or malformed `None` is returned. - `ranges` is a list of ``(start, stop)`` tuples where the ranges are - non-inclusive. - - .. versionadded:: 0.7 - """ - if not value or "=" not in value: - return None - - ranges = [] - last_end = 0 - units, rng = value.split("=", 1) - units = units.strip().lower() - - for item in rng.split(","): - item = item.strip() - if "-" not in item: - return None - if item.startswith("-"): - if last_end < 0: - return None - try: - begin = int(item) - except ValueError: - return None - end = None - last_end = -1 - elif "-" in item: - begin, end = item.split("-", 1) - begin = begin.strip() - end = end.strip() - if not begin.isdigit(): - return None - begin = int(begin) - if begin < last_end or last_end < 0: - return None - if end: - if not end.isdigit(): - return None - end = int(end) + 1 - if begin >= end: - return None - else: - end = None - last_end = end - ranges.append((begin, end)) - - return Range(units, ranges) - - -def parse_content_range_header(value, on_update=None): - """Parses a range header into a - :class:`~werkzeug.datastructures.ContentRange` object or `None` if - parsing is not possible. - - .. versionadded:: 0.7 - - :param value: a content range header to be parsed. - :param on_update: an optional callable that is called every time a value - on the :class:`~werkzeug.datastructures.ContentRange` - object is changed. - """ - if value is None: - return None - try: - units, rangedef = (value or "").strip().split(None, 1) - except ValueError: - return None - - if "/" not in rangedef: - return None - rng, length = rangedef.split("/", 1) - if length == "*": - length = None - elif length.isdigit(): - length = int(length) - else: - return None - - if rng == "*": - return ContentRange(units, None, None, length, on_update=on_update) - elif "-" not in rng: - return None - - start, stop = rng.split("-", 1) - try: - start = int(start) - stop = int(stop) + 1 - except ValueError: - return None - - if is_byte_range_valid(start, stop, length): - return ContentRange(units, start, stop, length, on_update=on_update) - - -def quote_etag(etag, weak=False): - """Quote an etag. - - :param etag: the etag to quote. - :param weak: set to `True` to tag it "weak". - """ - if '"' in etag: - raise ValueError("invalid etag") - etag = '"%s"' % etag - if weak: - etag = "W/" + etag - return etag - - -def unquote_etag(etag): - """Unquote a single etag: - - >>> unquote_etag('W/"bar"') - ('bar', True) - >>> unquote_etag('"bar"') - ('bar', False) - - :param etag: the etag identifier to unquote. - :return: a ``(etag, weak)`` tuple. - """ - if not etag: - return None, None - etag = etag.strip() - weak = False - if etag.startswith(("W/", "w/")): - weak = True - etag = etag[2:] - if etag[:1] == etag[-1:] == '"': - etag = etag[1:-1] - return etag, weak - - -def parse_etags(value): - """Parse an etag header. - - :param value: the tag header to parse - :return: an :class:`~werkzeug.datastructures.ETags` object. - """ - if not value: - return ETags() - strong = [] - weak = [] - end = len(value) - pos = 0 - while pos < end: - match = _etag_re.match(value, pos) - if match is None: - break - is_weak, quoted, raw = match.groups() - if raw == "*": - return ETags(star_tag=True) - elif quoted: - raw = quoted - if is_weak: - weak.append(raw) - else: - strong.append(raw) - pos = match.end() - return ETags(strong, weak) - - -def generate_etag(data): - """Generate an etag for some data.""" - return md5(data).hexdigest() - - -def parse_date(value): - """Parse one of the following date formats into a datetime object: - - .. sourcecode:: text - - Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 - Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 - Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format - - If parsing fails the return value is `None`. - - :param value: a string with a supported date format. - :return: a :class:`datetime.datetime` object. - """ - if value: - t = parsedate_tz(value.strip()) - if t is not None: - try: - year = t[0] - # unfortunately that function does not tell us if two digit - # years were part of the string, or if they were prefixed - # with two zeroes. So what we do is to assume that 69-99 - # refer to 1900, and everything below to 2000 - if year >= 0 and year <= 68: - year += 2000 - elif year >= 69 and year <= 99: - year += 1900 - return datetime(*((year,) + t[1:7])) - timedelta(seconds=t[-1] or 0) - except (ValueError, OverflowError): - return None - - -def _dump_date(d, delim): - """Used for `http_date` and `cookie_date`.""" - if d is None: - d = gmtime() - elif isinstance(d, datetime): - d = d.utctimetuple() - elif isinstance(d, (integer_types, float)): - d = gmtime(d) - return "%s, %02d%s%s%s%s %02d:%02d:%02d GMT" % ( - ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")[d.tm_wday], - d.tm_mday, - delim, - ( - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - )[d.tm_mon - 1], - delim, - str(d.tm_year), - d.tm_hour, - d.tm_min, - d.tm_sec, - ) - - -def cookie_date(expires=None): - """Formats the time to ensure compatibility with Netscape's cookie - standard. - - Accepts a floating point number expressed in seconds since the epoch in, a - datetime object or a timetuple. All times in UTC. The :func:`parse_date` - function can be used to parse such a date. - - Outputs a string in the format ``Wdy, DD-Mon-YYYY HH:MM:SS GMT``. - - :param expires: If provided that date is used, otherwise the current. - """ - return _dump_date(expires, "-") - - -def http_date(timestamp=None): - """Formats the time to match the RFC1123 date format. - - Accepts a floating point number expressed in seconds since the epoch in, a - datetime object or a timetuple. All times in UTC. The :func:`parse_date` - function can be used to parse such a date. - - Outputs a string in the format ``Wdy, DD Mon YYYY HH:MM:SS GMT``. - - :param timestamp: If provided that date is used, otherwise the current. - """ - return _dump_date(timestamp, " ") - - -def parse_age(value=None): - """Parses a base-10 integer count of seconds into a timedelta. - - If parsing fails, the return value is `None`. - - :param value: a string consisting of an integer represented in base-10 - :return: a :class:`datetime.timedelta` object or `None`. - """ - if not value: - return None - try: - seconds = int(value) - except ValueError: - return None - if seconds < 0: - return None - try: - return timedelta(seconds=seconds) - except OverflowError: - return None - - -def dump_age(age=None): - """Formats the duration as a base-10 integer. - - :param age: should be an integer number of seconds, - a :class:`datetime.timedelta` object, or, - if the age is unknown, `None` (default). - """ - if age is None: - return - if isinstance(age, timedelta): - # do the equivalent of Python 2.7's timedelta.total_seconds(), - # but disregarding fractional seconds - age = age.seconds + (age.days * 24 * 3600) - - age = int(age) - if age < 0: - raise ValueError("age cannot be negative") - - return str(age) - - -def is_resource_modified( - environ, etag=None, data=None, last_modified=None, ignore_if_range=True -): - """Convenience method for conditional requests. - - :param environ: the WSGI environment of the request to be checked. - :param etag: the etag for the response for comparison. - :param data: or alternatively the data of the response to automatically - generate an etag using :func:`generate_etag`. - :param last_modified: an optional date of the last modification. - :param ignore_if_range: If `False`, `If-Range` header will be taken into - account. - :return: `True` if the resource was modified, otherwise `False`. - - .. versionchanged:: 1.0.0 - The check is run for methods other than ``GET`` and ``HEAD``. - """ - if etag is None and data is not None: - etag = generate_etag(data) - elif data is not None: - raise TypeError("both data and etag given") - - unmodified = False - if isinstance(last_modified, string_types): - last_modified = parse_date(last_modified) - - # ensure that microsecond is zero because the HTTP spec does not transmit - # that either and we might have some false positives. See issue #39 - if last_modified is not None: - last_modified = last_modified.replace(microsecond=0) - - if_range = None - if not ignore_if_range and "HTTP_RANGE" in environ: - # https://tools.ietf.org/html/rfc7233#section-3.2 - # A server MUST ignore an If-Range header field received in a request - # that does not contain a Range header field. - if_range = parse_if_range_header(environ.get("HTTP_IF_RANGE")) - - if if_range is not None and if_range.date is not None: - modified_since = if_range.date - else: - modified_since = parse_date(environ.get("HTTP_IF_MODIFIED_SINCE")) - - if modified_since and last_modified and last_modified <= modified_since: - unmodified = True - - if etag: - etag, _ = unquote_etag(etag) - if if_range is not None and if_range.etag is not None: - unmodified = parse_etags(if_range.etag).contains(etag) - else: - if_none_match = parse_etags(environ.get("HTTP_IF_NONE_MATCH")) - if if_none_match: - # https://tools.ietf.org/html/rfc7232#section-3.2 - # "A recipient MUST use the weak comparison function when comparing - # entity-tags for If-None-Match" - unmodified = if_none_match.contains_weak(etag) - - # https://tools.ietf.org/html/rfc7232#section-3.1 - # "Origin server MUST use the strong comparison function when - # comparing entity-tags for If-Match" - if_match = parse_etags(environ.get("HTTP_IF_MATCH")) - if if_match: - unmodified = not if_match.is_strong(etag) - - return not unmodified - - -def remove_entity_headers(headers, allowed=("expires", "content-location")): - """Remove all entity headers from a list or :class:`Headers` object. This - operation works in-place. `Expires` and `Content-Location` headers are - by default not removed. The reason for this is :rfc:`2616` section - 10.3.5 which specifies some entity headers that should be sent. - - .. versionchanged:: 0.5 - added `allowed` parameter. - - :param headers: a list or :class:`Headers` object. - :param allowed: a list of headers that should still be allowed even though - they are entity headers. - """ - allowed = set(x.lower() for x in allowed) - headers[:] = [ - (key, value) - for key, value in headers - if not is_entity_header(key) or key.lower() in allowed - ] - - -def remove_hop_by_hop_headers(headers): - """Remove all HTTP/1.1 "Hop-by-Hop" headers from a list or - :class:`Headers` object. This operation works in-place. - - .. versionadded:: 0.5 - - :param headers: a list or :class:`Headers` object. - """ - headers[:] = [ - (key, value) for key, value in headers if not is_hop_by_hop_header(key) - ] - - -def is_entity_header(header): - """Check if a header is an entity header. - - .. versionadded:: 0.5 - - :param header: the header to test. - :return: `True` if it's an entity header, `False` otherwise. - """ - return header.lower() in _entity_headers - - -def is_hop_by_hop_header(header): - """Check if a header is an HTTP/1.1 "Hop-by-Hop" header. - - .. versionadded:: 0.5 - - :param header: the header to test. - :return: `True` if it's an HTTP/1.1 "Hop-by-Hop" header, `False` otherwise. - """ - return header.lower() in _hop_by_hop_headers - - -def parse_cookie(header, charset="utf-8", errors="replace", cls=None): - """Parse a cookie from a string or WSGI environ. - - The same key can be provided multiple times, the values are stored - in-order. The default :class:`MultiDict` will have the first value - first, and all values can be retrieved with - :meth:`MultiDict.getlist`. - - :param header: The cookie header as a string, or a WSGI environ dict - with a ``HTTP_COOKIE`` key. - :param charset: The charset for the cookie values. - :param errors: The error behavior for the charset decoding. - :param cls: A dict-like class to store the parsed cookies in. - Defaults to :class:`MultiDict`. - - .. versionchanged:: 1.0.0 - Returns a :class:`MultiDict` instead of a - ``TypeConversionDict``. - - .. versionchanged:: 0.5 - Returns a :class:`TypeConversionDict` instead of a regular dict. - The ``cls`` parameter was added. - """ - if isinstance(header, dict): - header = header.get("HTTP_COOKIE", "") - elif header is None: - header = "" - - # On Python 3, PEP 3333 sends headers through the environ as latin1 - # decoded strings. Encode strings back to bytes for parsing. - if isinstance(header, text_type): - header = header.encode("latin1", "replace") - - if cls is None: - cls = MultiDict - - def _parse_pairs(): - for key, val in _cookie_parse_impl(header): - key = to_unicode(key, charset, errors, allow_none_charset=True) - if not key: - continue - val = to_unicode(val, charset, errors, allow_none_charset=True) - yield try_coerce_native(key), val - - return cls(_parse_pairs()) - - -def dump_cookie( - key, - value="", - max_age=None, - expires=None, - path="/", - domain=None, - secure=False, - httponly=False, - charset="utf-8", - sync_expires=True, - max_size=4093, - samesite=None, -): - """Creates a new Set-Cookie header without the ``Set-Cookie`` prefix - The parameters are the same as in the cookie Morsel object in the - Python standard library but it accepts unicode data, too. - - On Python 3 the return value of this function will be a unicode - string, on Python 2 it will be a native string. In both cases the - return value is usually restricted to ascii as the vast majority of - values are properly escaped, but that is no guarantee. If a unicode - string is returned it's tunneled through latin1 as required by - PEP 3333. - - The return value is not ASCII safe if the key contains unicode - characters. This is technically against the specification but - happens in the wild. It's strongly recommended to not use - non-ASCII values for the keys. - - :param max_age: should be a number of seconds, or `None` (default) if - the cookie should last only as long as the client's - browser session. Additionally `timedelta` objects - are accepted, too. - :param expires: should be a `datetime` object or unix timestamp. - :param path: limits the cookie to a given path, per default it will - span the whole domain. - :param domain: Use this if you want to set a cross-domain cookie. For - example, ``domain=".example.com"`` will set a cookie - that is readable by the domain ``www.example.com``, - ``foo.example.com`` etc. Otherwise, a cookie will only - be readable by the domain that set it. - :param secure: The cookie will only be available via HTTPS - :param httponly: disallow JavaScript to access the cookie. This is an - extension to the cookie standard and probably not - supported by all browsers. - :param charset: the encoding for unicode values. - :param sync_expires: automatically set expires if max_age is defined - but expires not. - :param max_size: Warn if the final header value exceeds this size. The - default, 4093, should be safely `supported by most browsers - `_. Set to 0 to disable this check. - :param samesite: Limits the scope of the cookie such that it will - only be attached to requests if those requests are same-site. - - .. _`cookie`: http://browsercookielimits.squawky.net/ - - .. versionchanged:: 1.0.0 - The string ``'None'`` is accepted for ``samesite``. - """ - key = to_bytes(key, charset) - value = to_bytes(value, charset) - - if path is not None: - from .urls import iri_to_uri - - path = iri_to_uri(path, charset) - domain = _make_cookie_domain(domain) - if isinstance(max_age, timedelta): - max_age = (max_age.days * 60 * 60 * 24) + max_age.seconds - if expires is not None: - if not isinstance(expires, string_types): - expires = cookie_date(expires) - elif max_age is not None and sync_expires: - expires = to_bytes(cookie_date(time() + max_age)) - - if samesite is not None: - samesite = samesite.title() - - if samesite not in {"Strict", "Lax", "None"}: - raise ValueError("SameSite must be 'Strict', 'Lax', or 'None'.") - - buf = [key + b"=" + _cookie_quote(value)] - - # XXX: In theory all of these parameters that are not marked with `None` - # should be quoted. Because stdlib did not quote it before I did not - # want to introduce quoting there now. - for k, v, q in ( - (b"Domain", domain, True), - (b"Expires", expires, False), - (b"Max-Age", max_age, False), - (b"Secure", secure, None), - (b"HttpOnly", httponly, None), - (b"Path", path, False), - (b"SameSite", samesite, False), - ): - if q is None: - if v: - buf.append(k) - continue - - if v is None: - continue - - tmp = bytearray(k) - if not isinstance(v, (bytes, bytearray)): - v = to_bytes(text_type(v), charset) - if q: - v = _cookie_quote(v) - tmp += b"=" + v - buf.append(bytes(tmp)) - - # The return value will be an incorrectly encoded latin1 header on - # Python 3 for consistency with the headers object and a bytestring - # on Python 2 because that's how the API makes more sense. - rv = b"; ".join(buf) - if not PY2: - rv = rv.decode("latin1") - - # Warn if the final value of the cookie is larger than the limit. If the - # cookie is too large, then it may be silently ignored by the browser, - # which can be quite hard to debug. - cookie_size = len(rv) - - if max_size and cookie_size > max_size: - value_size = len(value) - warnings.warn( - 'The "{key}" cookie is too large: the value was {value_size} bytes' - " but the header required {extra_size} extra bytes. The final size" - " was {cookie_size} bytes but the limit is {max_size} bytes." - " Browsers may silently ignore cookies larger than this.".format( - key=key, - value_size=value_size, - extra_size=cookie_size - value_size, - cookie_size=cookie_size, - max_size=max_size, - ), - stacklevel=2, - ) - - return rv - - -def is_byte_range_valid(start, stop, length): - """Checks if a given byte content range is valid for the given length. - - .. versionadded:: 0.7 - """ - if (start is None) != (stop is None): - return False - elif start is None: - return length is None or length >= 0 - elif length is None: - return 0 <= start < stop - elif start >= stop: - return False - return 0 <= start < length - - -# circular dependencies -from .datastructures import Accept -from .datastructures import Authorization -from .datastructures import ContentRange -from .datastructures import ContentSecurityPolicy -from .datastructures import ETags -from .datastructures import HeaderSet -from .datastructures import IfRange -from .datastructures import MultiDict -from .datastructures import Range -from .datastructures import RequestCacheControl -from .datastructures import WWWAuthenticate diff --git a/venv/lib/python3.7/site-packages/werkzeug/local.py b/venv/lib/python3.7/site-packages/werkzeug/local.py deleted file mode 100644 index 626b87b..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/local.py +++ /dev/null @@ -1,420 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.local - ~~~~~~~~~~~~~~ - - This module implements context-local objects. - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import copy -from functools import update_wrapper - -from ._compat import implements_bool -from ._compat import PY2 -from .wsgi import ClosingIterator - -# since each thread has its own greenlet we can just use those as identifiers -# for the context. If greenlets are not available we fall back to the -# current thread ident depending on where it is. -try: - from greenlet import getcurrent as get_ident -except ImportError: - try: - from thread import get_ident - except ImportError: - from _thread import get_ident - - -def release_local(local): - """Releases the contents of the local for the current context. - This makes it possible to use locals without a manager. - - Example:: - - >>> loc = Local() - >>> loc.foo = 42 - >>> release_local(loc) - >>> hasattr(loc, 'foo') - False - - With this function one can release :class:`Local` objects as well - as :class:`LocalStack` objects. However it is not possible to - release data held by proxies that way, one always has to retain - a reference to the underlying local object in order to be able - to release it. - - .. versionadded:: 0.6.1 - """ - local.__release_local__() - - -class Local(object): - __slots__ = ("__storage__", "__ident_func__") - - def __init__(self): - object.__setattr__(self, "__storage__", {}) - object.__setattr__(self, "__ident_func__", get_ident) - - def __iter__(self): - return iter(self.__storage__.items()) - - def __call__(self, proxy): - """Create a proxy for a name.""" - return LocalProxy(self, proxy) - - def __release_local__(self): - self.__storage__.pop(self.__ident_func__(), None) - - def __getattr__(self, name): - try: - return self.__storage__[self.__ident_func__()][name] - except KeyError: - raise AttributeError(name) - - def __setattr__(self, name, value): - ident = self.__ident_func__() - storage = self.__storage__ - try: - storage[ident][name] = value - except KeyError: - storage[ident] = {name: value} - - def __delattr__(self, name): - try: - del self.__storage__[self.__ident_func__()][name] - except KeyError: - raise AttributeError(name) - - -class LocalStack(object): - """This class works similar to a :class:`Local` but keeps a stack - of objects instead. This is best explained with an example:: - - >>> ls = LocalStack() - >>> ls.push(42) - >>> ls.top - 42 - >>> ls.push(23) - >>> ls.top - 23 - >>> ls.pop() - 23 - >>> ls.top - 42 - - They can be force released by using a :class:`LocalManager` or with - the :func:`release_local` function but the correct way is to pop the - item from the stack after using. When the stack is empty it will - no longer be bound to the current context (and as such released). - - By calling the stack without arguments it returns a proxy that resolves to - the topmost item on the stack. - - .. versionadded:: 0.6.1 - """ - - def __init__(self): - self._local = Local() - - def __release_local__(self): - self._local.__release_local__() - - @property - def __ident_func__(self): - return self._local.__ident_func__ - - @__ident_func__.setter - def __ident_func__(self, value): - object.__setattr__(self._local, "__ident_func__", value) - - def __call__(self): - def _lookup(): - rv = self.top - if rv is None: - raise RuntimeError("object unbound") - return rv - - return LocalProxy(_lookup) - - def push(self, obj): - """Pushes a new item to the stack""" - rv = getattr(self._local, "stack", None) - if rv is None: - self._local.stack = rv = [] - rv.append(obj) - return rv - - def pop(self): - """Removes the topmost item from the stack, will return the - old value or `None` if the stack was already empty. - """ - stack = getattr(self._local, "stack", None) - if stack is None: - return None - elif len(stack) == 1: - release_local(self._local) - return stack[-1] - else: - return stack.pop() - - @property - def top(self): - """The topmost item on the stack. If the stack is empty, - `None` is returned. - """ - try: - return self._local.stack[-1] - except (AttributeError, IndexError): - return None - - -class LocalManager(object): - """Local objects cannot manage themselves. For that you need a local - manager. You can pass a local manager multiple locals or add them later - by appending them to `manager.locals`. Every time the manager cleans up, - it will clean up all the data left in the locals for this context. - - The `ident_func` parameter can be added to override the default ident - function for the wrapped locals. - - .. versionchanged:: 0.6.1 - Instead of a manager the :func:`release_local` function can be used - as well. - - .. versionchanged:: 0.7 - `ident_func` was added. - """ - - def __init__(self, locals=None, ident_func=None): - if locals is None: - self.locals = [] - elif isinstance(locals, Local): - self.locals = [locals] - else: - self.locals = list(locals) - if ident_func is not None: - self.ident_func = ident_func - for local in self.locals: - object.__setattr__(local, "__ident_func__", ident_func) - else: - self.ident_func = get_ident - - def get_ident(self): - """Return the context identifier the local objects use internally for - this context. You cannot override this method to change the behavior - but use it to link other context local objects (such as SQLAlchemy's - scoped sessions) to the Werkzeug locals. - - .. versionchanged:: 0.7 - You can pass a different ident function to the local manager that - will then be propagated to all the locals passed to the - constructor. - """ - return self.ident_func() - - def cleanup(self): - """Manually clean up the data in the locals for this context. Call - this at the end of the request or use `make_middleware()`. - """ - for local in self.locals: - release_local(local) - - def make_middleware(self, app): - """Wrap a WSGI application so that cleaning up happens after - request end. - """ - - def application(environ, start_response): - return ClosingIterator(app(environ, start_response), self.cleanup) - - return application - - def middleware(self, func): - """Like `make_middleware` but for decorating functions. - - Example usage:: - - @manager.middleware - def application(environ, start_response): - ... - - The difference to `make_middleware` is that the function passed - will have all the arguments copied from the inner application - (name, docstring, module). - """ - return update_wrapper(self.make_middleware(func), func) - - def __repr__(self): - return "<%s storages: %d>" % (self.__class__.__name__, len(self.locals)) - - -@implements_bool -class LocalProxy(object): - """Acts as a proxy for a werkzeug local. Forwards all operations to - a proxied object. The only operations not supported for forwarding - are right handed operands and any kind of assignment. - - Example usage:: - - from werkzeug.local import Local - l = Local() - - # these are proxies - request = l('request') - user = l('user') - - - from werkzeug.local import LocalStack - _response_local = LocalStack() - - # this is a proxy - response = _response_local() - - Whenever something is bound to l.user / l.request the proxy objects - will forward all operations. If no object is bound a :exc:`RuntimeError` - will be raised. - - To create proxies to :class:`Local` or :class:`LocalStack` objects, - call the object as shown above. If you want to have a proxy to an - object looked up by a function, you can (as of Werkzeug 0.6.1) pass - a function to the :class:`LocalProxy` constructor:: - - session = LocalProxy(lambda: get_current_request().session) - - .. versionchanged:: 0.6.1 - The class can be instantiated with a callable as well now. - """ - - __slots__ = ("__local", "__dict__", "__name__", "__wrapped__") - - def __init__(self, local, name=None): - object.__setattr__(self, "_LocalProxy__local", local) - object.__setattr__(self, "__name__", name) - if callable(local) and not hasattr(local, "__release_local__"): - # "local" is a callable that is not an instance of Local or - # LocalManager: mark it as a wrapped function. - object.__setattr__(self, "__wrapped__", local) - - def _get_current_object(self): - """Return the current object. This is useful if you want the real - object behind the proxy at a time for performance reasons or because - you want to pass the object into a different context. - """ - if not hasattr(self.__local, "__release_local__"): - return self.__local() - try: - return getattr(self.__local, self.__name__) - except AttributeError: - raise RuntimeError("no object bound to %s" % self.__name__) - - @property - def __dict__(self): - try: - return self._get_current_object().__dict__ - except RuntimeError: - raise AttributeError("__dict__") - - def __repr__(self): - try: - obj = self._get_current_object() - except RuntimeError: - return "<%s unbound>" % self.__class__.__name__ - return repr(obj) - - def __bool__(self): - try: - return bool(self._get_current_object()) - except RuntimeError: - return False - - def __unicode__(self): - try: - return unicode(self._get_current_object()) # noqa - except RuntimeError: - return repr(self) - - def __dir__(self): - try: - return dir(self._get_current_object()) - except RuntimeError: - return [] - - def __getattr__(self, name): - if name == "__members__": - return dir(self._get_current_object()) - return getattr(self._get_current_object(), name) - - def __setitem__(self, key, value): - self._get_current_object()[key] = value - - def __delitem__(self, key): - del self._get_current_object()[key] - - if PY2: - __getslice__ = lambda x, i, j: x._get_current_object()[i:j] - - def __setslice__(self, i, j, seq): - self._get_current_object()[i:j] = seq - - def __delslice__(self, i, j): - del self._get_current_object()[i:j] - - __setattr__ = lambda x, n, v: setattr(x._get_current_object(), n, v) - __delattr__ = lambda x, n: delattr(x._get_current_object(), n) - __str__ = lambda x: str(x._get_current_object()) - __lt__ = lambda x, o: x._get_current_object() < o - __le__ = lambda x, o: x._get_current_object() <= o - __eq__ = lambda x, o: x._get_current_object() == o - __ne__ = lambda x, o: x._get_current_object() != o - __gt__ = lambda x, o: x._get_current_object() > o - __ge__ = lambda x, o: x._get_current_object() >= o - __cmp__ = lambda x, o: cmp(x._get_current_object(), o) # noqa - __hash__ = lambda x: hash(x._get_current_object()) - __call__ = lambda x, *a, **kw: x._get_current_object()(*a, **kw) - __len__ = lambda x: len(x._get_current_object()) - __getitem__ = lambda x, i: x._get_current_object()[i] - __iter__ = lambda x: iter(x._get_current_object()) - __contains__ = lambda x, i: i in x._get_current_object() - __add__ = lambda x, o: x._get_current_object() + o - __sub__ = lambda x, o: x._get_current_object() - o - __mul__ = lambda x, o: x._get_current_object() * o - __floordiv__ = lambda x, o: x._get_current_object() // o - __mod__ = lambda x, o: x._get_current_object() % o - __divmod__ = lambda x, o: x._get_current_object().__divmod__(o) - __pow__ = lambda x, o: x._get_current_object() ** o - __lshift__ = lambda x, o: x._get_current_object() << o - __rshift__ = lambda x, o: x._get_current_object() >> o - __and__ = lambda x, o: x._get_current_object() & o - __xor__ = lambda x, o: x._get_current_object() ^ o - __or__ = lambda x, o: x._get_current_object() | o - __div__ = lambda x, o: x._get_current_object().__div__(o) - __truediv__ = lambda x, o: x._get_current_object().__truediv__(o) - __neg__ = lambda x: -(x._get_current_object()) - __pos__ = lambda x: +(x._get_current_object()) - __abs__ = lambda x: abs(x._get_current_object()) - __invert__ = lambda x: ~(x._get_current_object()) - __complex__ = lambda x: complex(x._get_current_object()) - __int__ = lambda x: int(x._get_current_object()) - __long__ = lambda x: long(x._get_current_object()) # noqa - __float__ = lambda x: float(x._get_current_object()) - __oct__ = lambda x: oct(x._get_current_object()) - __hex__ = lambda x: hex(x._get_current_object()) - __index__ = lambda x: x._get_current_object().__index__() - __coerce__ = lambda x, o: x._get_current_object().__coerce__(x, o) - __enter__ = lambda x: x._get_current_object().__enter__() - __exit__ = lambda x, *a, **kw: x._get_current_object().__exit__(*a, **kw) - __radd__ = lambda x, o: o + x._get_current_object() - __rsub__ = lambda x, o: o - x._get_current_object() - __rmul__ = lambda x, o: o * x._get_current_object() - __rdiv__ = lambda x, o: o / x._get_current_object() - if PY2: - __rtruediv__ = lambda x, o: x._get_current_object().__rtruediv__(o) - else: - __rtruediv__ = __rdiv__ - __rfloordiv__ = lambda x, o: o // x._get_current_object() - __rmod__ = lambda x, o: o % x._get_current_object() - __rdivmod__ = lambda x, o: x._get_current_object().__rdivmod__(o) - __copy__ = lambda x: copy.copy(x._get_current_object()) - __deepcopy__ = lambda x, memo: copy.deepcopy(x._get_current_object(), memo) diff --git a/venv/lib/python3.7/site-packages/werkzeug/middleware/__init__.py b/venv/lib/python3.7/site-packages/werkzeug/middleware/__init__.py deleted file mode 100644 index 5e049f5..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/middleware/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -""" -Middleware -========== - -A WSGI middleware is a WSGI application that wraps another application -in order to observe or change its behavior. Werkzeug provides some -middleware for common use cases. - -.. toctree:: - :maxdepth: 1 - - proxy_fix - shared_data - dispatcher - http_proxy - lint - profiler - -The :doc:`interactive debugger ` is also a middleware that can -be applied manually, although it is typically used automatically with -the :doc:`development server `. - -:copyright: 2007 Pallets -:license: BSD-3-Clause -""" diff --git a/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index e99679092b8b12829f0c8e99c9d671d750452a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 710 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 diff --git a/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-37.pyc deleted file mode 100644 index 9eee8c1dcd9f27164dd65a6be7be03f98bbe6805..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4576 zcmb_g&vVFF+94>*~x8J@W-+Q~@y~Rb> zz_s*n^tZz+hVd;uOfLsFcks=|Xt>cfxXG>9>|1Tir29%-Y1{g@+OF!~TDyi{JFfSg zwqqKjWjs~mg}&Q%P2-7?FxwE9p1P8o27UBsqZs|lNUXmY4-8)8^_K>(i^Ug}_7bmb z8%-y;X&Q!mcQA;fFi=sNuq~N(qgY7y_63*g?)0LJ^;15K1sllpAmSop0qaMc$Ko)M zf~j7hXoyfUCW5fXr1*L$GQ|!f)x)@OTR>=a!g8%n3FtA69tH{PiFm+(ov5fgV!NqQ zu}DPtG-FZ1M(I$pFy+G4YxM(22$sd^VU+AKo*tGW!OSerbv=&-LzRYckY%mbnVp}X zY3{nMFdd9!wAWKD_S=n(Kd`MJj)ltH7ThC}Otjd&?N8T!xAsXK3^U>W7tu4CX1+9# zQKJ0rFbTvS?DMbPhb z7^t!r9f)L=wFNK$@Adn*`z^u zpaNDc+xnacUyRQ3ba>5$4=kw}pn0tTl*bQMM-4dR%<3RwlLp@wPoh3d7)eO?Kp zGe*Nu+`4I8a=aUfm;?17h~i*37Og_#HAJA(c}_4XKZ1|ekWpf47AyMy#2(z=S!G*~ zx6uj}dK$l+ItWzn?TOUOQprA)X{tVCSuY*NT)Qqw72+Rdh(CqDL=kZ?$i$omWd{Ry z1Ow^Fnloq5O{DSJ@)t_$bwIPJUqhrQx!{~xQ0d$# z?U6zaWr9#mgIRLAH3($Tr;KW8cfOThpw%H#uW&&rUF1NEJpsKzKVp4BKaimq^Vp|R zMw%CDb~>BjB8a1Po1&yr`MaYQyUWyY08#iZOyglc(P$ZlOYGf|$F_yglgXham*(@$ zBXM7=a()$w+AQG=l&bWqStEjYN z6cz6bhL>bLSM~}f-<~p83(ph^IDcE6yVQAM#eCDA+4P%dT1;opGZUJVzHeAlaHVPG zHkFZfm7<*e+t?hhPwS)iTvt2qd0CxW-bVMRpLx$|f_~7U3bC{5i+(M9KfyPm|JO1|t~cM@gi7{}K78fyP*?0ga_l$2We)X00%I@NP#I2VL-x#lqS0;KYU7OBHFP)=`GF})* zwlYu5Q{$*Qu}`c?<g% zV-u22@<;01uOFMd_MUNUo;bXIYMv}`2dzsdu~TdCFYZq2{L(d}z~znC_K~A5?KiL< z&?nBRb>u*gMchFT^exef|1{->x;(M<^WtmkXkoIjzl^6Vf5(|!t?(s1a``ph0`Rna z0xf8Le&rNa%*HV5DxR*DvsUItYI`OKcWv{`rQ}K*->c-(6*R|SEtqS)s6a7ezvQQx z*T5%{@MeWb6{umB*Lx!1s4cl8o`nc*H$^%vf?)c1=i(@ZpNNpEI(O+3Sql*0i*7APgIRdM)<+7xE}K#$Wu%%dELnP=6wcL)xHr9lj#U z<)`}B#UfB~WuhJO-wO9&l?V-r6G?TxCRNLjl{-8J_$pwO^ z>}k8RgOj8Rl~?t-hN>&Q_EENE@)8D`Zoz>MXzDxE{G7z=WtpUPkqNm?nInHiL(a4& z>oLF(eVSFxE~#N=%+i3GStzwdhI|F-?DuF4)3%oFm3qx|Oc$R9ct$PCuk|yu4Qm

    2ATD3dGi3}P@+IRDMnt4QL zNpH=vMGf(}T`NwxMX;RdzY3Zk`K3qtkab_mRLTuPsinL7c>B{!U8G;`+$xOyn23{I ULu12#4m|7N*D{yk!IjGY0VKCDssI20 diff --git a/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-37.pyc deleted file mode 100644 index da0779342ad48d6a2f9cff0e68cc1989a2762595..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5759 zcmb7IOLN=E5eE1cM9Gi!+VSR)sfxF1>5?crDQ_w)duz3p{5Y(nl2o>rhXo*$NUUTwa*i*h9yhuv&+F)@=U}k!Hy1)Lq2R|$pwJ!k_Q)Rd>*Eqit}L7y9O)&@Pz9Q-c?I>8-&_qWGrRF7fh?(Wp4z z6%E6Bwfw}F$ByKJ(?7N){gV-U;+|NKF1svix92K0@Oju5Y$*LBmkY%lHgGxb3kVY| z=s5v%`0G#w3O9ni+5)fMm=sQ*b^EUHf~K|~bS9Is>7X#Fk<+=SEdMKkSp;Fm6x8c7Pq-eXYi% zS+H>@k!U45S7Eo8Zhr}e;w%vdNnPLDcMn1dVaIOJ)8f2vu!mj3MPJm70doohu*rv7PdR>93iFH$lcVSFuvhN%UzQjg;$OgcU7SZ#M z;b(7@$pyg3z5#hhIM`M!gelk;OHIJ=(DRQK%ndLFWPFH(U7Jnjgn{4fJ4&@$G2{vH zR;%j|N76m$1ugccd-wjrwy+%$D60j)2~UX@`(bBo`OnLb`%b8Y^#Q?VG|cg}p(B;B z`>qP?SeGvKq*ob#zQ{Q_jqAAv2)=x6Gj%pm4y=7Y7#VY7?6Qz*fPG;@<0!WP#9jJV|)F_ z&E0i-b!~0C(`jBZ1KJ0EKId2+xXn=ZZPo3Gfw+9$GhYSyv}e1!TlTZfo!w4n2`lfc zZ@*aIwl`LPT&D*>vR<8Z&N{a?w=w!swS0N8cpVm>DnyEX_axVH=kfOQt=&Ye#D+hm zFb)L5Vg{S%U`^pN17|nTdz*mqk<$l11(s zj9|1rF>OszT0)V@7Ipy=A0gp-Ah~35a02Zm4PD}U75Ky+U$mD zo{I3GsVUfo^_nDEJCSj>n6EIqy>F()CBSIvf(3la%Fq zy1YQT*2vY&L-5jt3T3cmvRR75c*`UQSYeMc@!#NfiD`U1x=(+|HIME$VwJHS6aosh z1hSfUAUL*kzj-g)&YBoXfno#Trfstxpu8tgYDh8gk1#yn`CTkcciUZ9qP7p|UFAPMkZa(io1UAVHgza!nY&#IJEi zlUi#0DaYpS`CQikPGZ7TnI04m$1ePVDk{My(J`?6sRr0d95~IAF`p!v@#DO3E|8|M zGA%Y{yNkre$r+~$cYl=aE=$UB+P^$ee=t#FNou-PG<4B#0pG{?s&CLlW@Ok#R6uJ+ zMYM&egti!!(UzhL+A=p#fSDVO%D4#r7?(AFjH@RU*MUE-#56*`1p0A}I;bFMRL3PH z`umcKK3SoL)|WMEP{SFL4sri7WF0@hK3)k1!MZ2kCf;&rA-Z zf;cVC(=(qQn#XhI;opj1qOl~`CjtJkbe0q%F*oJ(nF!EIw%B8TFrdOIW)ME5ZoCgv z8oIQfkRU}6N-wTV@*OXsNJ5}*AZ3BI;}aR;lwx&Xz=M-z80~~EB(=C)`jo9-M8%VN ziUe*852r^STfft>DV-#?vT@uRI2p0i=v*Rljm~>h;kwZ%NW#Xr*cV=-BA2kk z&?57-aaN3q+ypL5_$7Rn@e6#ORU-49$xDdjG9tLh%fM`rS9Du_WAfTRE3Wz8G>yo3 zhsb|Ta^~Kc?+a(us496>jZAJnOnXVXrF&~pP5wQqp|_Cr(wg(ScP^Tf|B2?%TSV{N zy9%%K1<14_i!a`W#=QK{2&xfe@hgV~jJ5cJeqPC>)gbMvmNp;F|HG8uVkdZG^WHqG zM|Ipcqk1kkmxZ3M;#IstR6ncpYf(L#-!I&xRY{w9{N}67VU_E8m4#>lb6-RY=&x!m zEHGl>eE|{u#p%C))Xb~HbSe{01#tRmqtihZ9lt*6bh21ZOM*RtsvGYMKx}kYCz7DT zeF%)AO<&?P*$$l^s5_I89XZlMCk7g2v`Z7N{WnxYXX&wzAU>X-IHsOnnK^%s=dzRK z>8+Gy^DS$Ia}9j+eN}PkfDv`~pZlw}iZbr}9f`Zc=j#P5Xvk_Lco)bNl7$ z_S*Uy{cGPm_jGG}b9b}-<+wqvUlGI-R!0Wd&aa@(OijDNHB0#-iqhaW!#Mdl6YoQW2|$KHitK z=aUX1g!a|hGPQj}Kba{@+l%^XR*s%i2b3Hrt;x7V#k@|bvmAu1NVv0Y3ANP*8lzkR z_0XqOD46kw^5oU>bt0ug$y~&@R?v5#DE+}*#kBCPn_rn%lTnaUn98g1N*j%G?3Bzi z+C92KT>y=UpKW_=*>?Q)6#whC{R>|GB|TN!=6)AS6Zyr?VDyi&`b0x4D=CZr9$!VZ zMeVPpf>o>C&`(K`J9yY$$Y4#@jQPCc@4Xh?Ko6V{saMeKU3(ZS_Z^{C(Oybsz4(7H CCb`l8 diff --git a/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc deleted file mode 100644 index 9f07e5e6bbbf1d257ab6ca552263194706085351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8920 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"`` (default): - The host header is automatically rewritten to the URL of the - target. - ``None``: - The host header is unmodified from the client request. - Any other value: - The host header is overwritten with the value. - ``headers``: - A dictionary of headers to be sent with the request to the - target. The default is ``{}``. - ``ssl_context``: - A :class:`ssl.SSLContext` defining how to verify requests if the - target is HTTPS. The default is ``None``. - - In the example above, everything under ``"/static/"`` is proxied to - the server on port 5001. The host header is rewritten to the target, - and the ``"/static/"`` prefix is removed from the URLs. - - :param app: The WSGI application to wrap. - :param targets: Proxy target configurations. See description above. - :param chunk_size: Size of chunks to read from input stream and - write to target. - :param timeout: Seconds before an operation to a target fails. - - .. versionadded:: 0.14 - """ - - def __init__(self, app, targets, chunk_size=2 << 13, timeout=10): - def _set_defaults(opts): - opts.setdefault("remove_prefix", False) - opts.setdefault("host", "") - opts.setdefault("headers", {}) - opts.setdefault("ssl_context", None) - return opts - - self.app = app - self.targets = dict( - ("/%s/" % k.strip("/"), _set_defaults(v)) for k, v in targets.items() - ) - self.chunk_size = chunk_size - self.timeout = timeout - - def proxy_to(self, opts, path, prefix): - target = url_parse(opts["target"]) - - def application(environ, start_response): - headers = list(EnvironHeaders(environ).items()) - headers[:] = [ - (k, v) - for k, v in headers - if not is_hop_by_hop_header(k) - and k.lower() not in ("content-length", "host") - ] - headers.append(("Connection", "close")) - - if opts["host"] == "": - headers.append(("Host", target.ascii_host)) - elif opts["host"] is None: - headers.append(("Host", environ["HTTP_HOST"])) - else: - headers.append(("Host", opts["host"])) - - headers.extend(opts["headers"].items()) - remote_path = path - - if opts["remove_prefix"]: - remote_path = "%s/%s" % ( - target.path.rstrip("/"), - remote_path[len(prefix) :].lstrip("/"), - ) - - content_length = environ.get("CONTENT_LENGTH") - chunked = False - - if content_length not in ("", None): - headers.append(("Content-Length", content_length)) - elif content_length is not None: - headers.append(("Transfer-Encoding", "chunked")) - chunked = True - - try: - if target.scheme == "http": - con = client.HTTPConnection( - target.ascii_host, target.port or 80, timeout=self.timeout - ) - elif target.scheme == "https": - con = client.HTTPSConnection( - target.ascii_host, - target.port or 443, - timeout=self.timeout, - context=opts["ssl_context"], - ) - else: - raise RuntimeError( - "Target scheme must be 'http' or 'https', got '{}'.".format( - target.scheme - ) - ) - - con.connect() - remote_url = url_quote(remote_path) - querystring = environ["QUERY_STRING"] - - if querystring: - remote_url = remote_url + "?" + querystring - - con.putrequest(environ["REQUEST_METHOD"], remote_url, skip_host=True) - - for k, v in headers: - if k.lower() == "connection": - v = "close" - - con.putheader(k, v) - - con.endheaders() - stream = get_input_stream(environ) - - while 1: - data = stream.read(self.chunk_size) - - if not data: - break - - if chunked: - con.send(b"%x\r\n%s\r\n" % (len(data), data)) - else: - con.send(data) - - resp = con.getresponse() - except socket.error: - from ..exceptions import BadGateway - - return BadGateway()(environ, start_response) - - start_response( - "%d %s" % (resp.status, resp.reason), - [ - (k.title(), v) - for k, v in resp.getheaders() - if not is_hop_by_hop_header(k) - ], - ) - - def read(): - while 1: - try: - data = resp.read(self.chunk_size) - except socket.error: - break - - if not data: - break - - yield data - - return read() - - return application - - def __call__(self, environ, start_response): - path = environ["PATH_INFO"] - app = self.app - - for prefix, opts in self.targets.items(): - if path.startswith(prefix): - app = self.proxy_to(opts, path, prefix) - break - - return app(environ, start_response) diff --git a/venv/lib/python3.7/site-packages/werkzeug/middleware/lint.py b/venv/lib/python3.7/site-packages/werkzeug/middleware/lint.py deleted file mode 100644 index 98f9581..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/middleware/lint.py +++ /dev/null @@ -1,408 +0,0 @@ -""" -WSGI Protocol Linter -==================== - -This module provides a middleware that performs sanity checks on the -behavior of the WSGI server and application. It checks that the -:pep:`3333` WSGI spec is properly implemented. It also warns on some -common HTTP errors such as non-empty responses for 304 status codes. - -.. autoclass:: LintMiddleware - -:copyright: 2007 Pallets -:license: BSD-3-Clause -""" -from warnings import warn - -from .._compat import implements_iterator -from .._compat import PY2 -from .._compat import string_types -from ..datastructures import Headers -from ..http import is_entity_header -from ..wsgi import FileWrapper - -try: - from urllib.parse import urlparse -except ImportError: - from urlparse import urlparse - - -class WSGIWarning(Warning): - """Warning class for WSGI warnings.""" - - -class HTTPWarning(Warning): - """Warning class for HTTP warnings.""" - - -def check_string(context, obj, stacklevel=3): - if type(obj) is not str: - warn( - "'%s' requires strings, got '%s'" % (context, type(obj).__name__), - WSGIWarning, - ) - - -class InputStream(object): - def __init__(self, stream): - self._stream = stream - - def read(self, *args): - if len(args) == 0: - warn( - "WSGI does not guarantee an EOF marker on the input stream, thus making" - " calls to 'wsgi.input.read()' unsafe. Conforming servers may never" - " return from this call.", - WSGIWarning, - stacklevel=2, - ) - elif len(args) != 1: - warn( - "Too many parameters passed to 'wsgi.input.read()'.", - WSGIWarning, - stacklevel=2, - ) - return self._stream.read(*args) - - def readline(self, *args): - if len(args) == 0: - warn( - "Calls to 'wsgi.input.readline()' without arguments are unsafe. Use" - " 'wsgi.input.read()' instead.", - WSGIWarning, - stacklevel=2, - ) - elif len(args) == 1: - warn( - "'wsgi.input.readline()' was called with a size hint. WSGI does not" - " support this, although it's available on all major servers.", - WSGIWarning, - stacklevel=2, - ) - else: - raise TypeError("Too many arguments passed to 'wsgi.input.readline()'.") - return self._stream.readline(*args) - - def __iter__(self): - try: - return iter(self._stream) - except TypeError: - warn("'wsgi.input' is not iterable.", WSGIWarning, stacklevel=2) - return iter(()) - - def close(self): - warn("The application closed the input stream!", WSGIWarning, stacklevel=2) - self._stream.close() - - -class ErrorStream(object): - def __init__(self, stream): - self._stream = stream - - def write(self, s): - check_string("wsgi.error.write()", s) - self._stream.write(s) - - def flush(self): - self._stream.flush() - - def writelines(self, seq): - for line in seq: - self.write(line) - - def close(self): - warn("The application closed the error stream!", WSGIWarning, stacklevel=2) - self._stream.close() - - -class GuardedWrite(object): - def __init__(self, write, chunks): - self._write = write - self._chunks = chunks - - def __call__(self, s): - check_string("write()", s) - self._write.write(s) - self._chunks.append(len(s)) - - -@implements_iterator -class GuardedIterator(object): - def __init__(self, iterator, headers_set, chunks): - self._iterator = iterator - if PY2: - self._next = iter(iterator).next - else: - self._next = iter(iterator).__next__ - self.closed = False - self.headers_set = headers_set - self.chunks = chunks - - def __iter__(self): - return self - - def __next__(self): - if self.closed: - warn("Iterated over closed 'app_iter'.", WSGIWarning, stacklevel=2) - - rv = self._next() - - if not self.headers_set: - warn( - "The application returned before it started the response.", - WSGIWarning, - stacklevel=2, - ) - - check_string("application iterator items", rv) - self.chunks.append(len(rv)) - return rv - - def close(self): - self.closed = True - - if hasattr(self._iterator, "close"): - self._iterator.close() - - if self.headers_set: - status_code, headers = self.headers_set - bytes_sent = sum(self.chunks) - content_length = headers.get("content-length", type=int) - - if status_code == 304: - for key, _value in headers: - key = key.lower() - if key not in ("expires", "content-location") and is_entity_header( - key - ): - warn( - "Entity header %r found in 304 response." % key, HTTPWarning - ) - if bytes_sent: - warn("304 responses must not have a body.", HTTPWarning) - elif 100 <= status_code < 200 or status_code == 204: - if content_length != 0: - warn( - "%r responses must have an empty content length." % status_code, - HTTPWarning, - ) - if bytes_sent: - warn( - "%r responses must not have a body." % status_code, HTTPWarning - ) - elif content_length is not None and content_length != bytes_sent: - warn( - "Content-Length and the number of bytes sent to the client do not" - " match.", - WSGIWarning, - ) - - def __del__(self): - if not self.closed: - try: - warn( - "Iterator was garbage collected before it was closed.", WSGIWarning - ) - except Exception: - pass - - -class LintMiddleware(object): - """Warns about common errors in the WSGI and HTTP behavior of the - server and wrapped application. Some of the issues it check are: - - - invalid status codes - - non-bytestrings sent to the WSGI server - - strings returned from the WSGI application - - non-empty conditional responses - - unquoted etags - - relative URLs in the Location header - - unsafe calls to wsgi.input - - unclosed iterators - - Error information is emitted using the :mod:`warnings` module. - - :param app: The WSGI application to wrap. - - .. code-block:: python - - from werkzeug.middleware.lint import LintMiddleware - app = LintMiddleware(app) - """ - - def __init__(self, app): - self.app = app - - def check_environ(self, environ): - if type(environ) is not dict: - warn( - "WSGI environment is not a standard Python dict.", - WSGIWarning, - stacklevel=4, - ) - for key in ( - "REQUEST_METHOD", - "SERVER_NAME", - "SERVER_PORT", - "wsgi.version", - "wsgi.input", - "wsgi.errors", - "wsgi.multithread", - "wsgi.multiprocess", - "wsgi.run_once", - ): - if key not in environ: - warn( - "Required environment key %r not found" % key, - WSGIWarning, - stacklevel=3, - ) - if environ["wsgi.version"] != (1, 0): - warn("Environ is not a WSGI 1.0 environ.", WSGIWarning, stacklevel=3) - - script_name = environ.get("SCRIPT_NAME", "") - path_info = environ.get("PATH_INFO", "") - - if script_name and script_name[0] != "/": - warn( - "'SCRIPT_NAME' does not start with a slash: %r" % script_name, - WSGIWarning, - stacklevel=3, - ) - - if path_info and path_info[0] != "/": - warn( - "'PATH_INFO' does not start with a slash: %r" % path_info, - WSGIWarning, - stacklevel=3, - ) - - def check_start_response(self, status, headers, exc_info): - check_string("status", status) - status_code = status.split(None, 1)[0] - - if len(status_code) != 3 or not status_code.isdigit(): - warn(WSGIWarning("Status code must be three digits"), stacklevel=3) - - if len(status) < 4 or status[3] != " ": - warn( - WSGIWarning( - "Invalid value for status %r. Valid " - "status strings are three digits, a space " - "and a status explanation" - ), - stacklevel=3, - ) - - status_code = int(status_code) - - if status_code < 100: - warn(WSGIWarning("status code < 100 detected"), stacklevel=3) - - if type(headers) is not list: - warn(WSGIWarning("header list is not a list"), stacklevel=3) - - for item in headers: - if type(item) is not tuple or len(item) != 2: - warn(WSGIWarning("Headers must tuple 2-item tuples"), stacklevel=3) - name, value = item - if type(name) is not str or type(value) is not str: - warn(WSGIWarning("header items must be strings"), stacklevel=3) - if name.lower() == "status": - warn( - WSGIWarning( - "The status header is not supported due to " - "conflicts with the CGI spec." - ), - stacklevel=3, - ) - - if exc_info is not None and not isinstance(exc_info, tuple): - warn(WSGIWarning("invalid value for exc_info"), stacklevel=3) - - headers = Headers(headers) - self.check_headers(headers) - - return status_code, headers - - def check_headers(self, headers): - etag = headers.get("etag") - - if etag is not None: - if etag.startswith(("W/", "w/")): - if etag.startswith("w/"): - warn( - HTTPWarning("weak etag indicator should be upcase."), - stacklevel=4, - ) - - etag = etag[2:] - - if not (etag[:1] == etag[-1:] == '"'): - warn(HTTPWarning("unquoted etag emitted."), stacklevel=4) - - location = headers.get("location") - - if location is not None: - if not urlparse(location).netloc: - warn( - HTTPWarning("absolute URLs required for location header"), - stacklevel=4, - ) - - def check_iterator(self, app_iter): - if isinstance(app_iter, string_types): - warn( - "The application returned astring. The response will send one character" - " at a time to the client, which will kill performance. Return a list" - " or iterable instead.", - WSGIWarning, - stacklevel=3, - ) - - def __call__(self, *args, **kwargs): - if len(args) != 2: - warn("A WSGI app takes two arguments.", WSGIWarning, stacklevel=2) - - if kwargs: - warn( - "A WSGI app does not take keyword arguments.", WSGIWarning, stacklevel=2 - ) - - environ, start_response = args - - self.check_environ(environ) - environ["wsgi.input"] = InputStream(environ["wsgi.input"]) - environ["wsgi.errors"] = ErrorStream(environ["wsgi.errors"]) - - # Hook our own file wrapper in so that applications will always - # iterate to the end and we can check the content length. - environ["wsgi.file_wrapper"] = FileWrapper - - headers_set = [] - chunks = [] - - def checking_start_response(*args, **kwargs): - if len(args) not in (2, 3): - warn( - "Invalid number of arguments: %s, expected 2 or 3." % len(args), - WSGIWarning, - stacklevel=2, - ) - - if kwargs: - warn("'start_response' does not take keyword arguments.", WSGIWarning) - - status, headers = args[:2] - - if len(args) == 3: - exc_info = args[2] - else: - exc_info = None - - headers_set[:] = self.check_start_response(status, headers, exc_info) - return GuardedWrite(start_response(status, headers, exc_info), chunks) - - app_iter = self.app(environ, checking_start_response) - self.check_iterator(app_iter) - return GuardedIterator(app_iter, headers_set, chunks) diff --git a/venv/lib/python3.7/site-packages/werkzeug/middleware/profiler.py b/venv/lib/python3.7/site-packages/werkzeug/middleware/profiler.py deleted file mode 100644 index 32a14d9..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/middleware/profiler.py +++ /dev/null @@ -1,132 +0,0 @@ -""" -Application Profiler -==================== - -This module provides a middleware that profiles each request with the -:mod:`cProfile` module. This can help identify bottlenecks in your code -that may be slowing down your application. - -.. autoclass:: ProfilerMiddleware - -:copyright: 2007 Pallets -:license: BSD-3-Clause -""" -from __future__ import print_function - -import os.path -import sys -import time -from pstats import Stats - -try: - from cProfile import Profile -except ImportError: - from profile import Profile - - -class ProfilerMiddleware(object): - """Wrap a WSGI application and profile the execution of each - request. Responses are buffered so that timings are more exact. - - If ``stream`` is given, :class:`pstats.Stats` are written to it - after each request. If ``profile_dir`` is given, :mod:`cProfile` - data files are saved to that directory, one file per request. - - The filename can be customized by passing ``filename_format``. If - it is a string, it will be formatted using :meth:`str.format` with - the following fields available: - - - ``{method}`` - The request method; GET, POST, etc. - - ``{path}`` - The request path or 'root' should one not exist. - - ``{elapsed}`` - The elapsed time of the request. - - ``{time}`` - The time of the request. - - If it is a callable, it will be called with the WSGI ``environ`` - dict and should return a filename. - - :param app: The WSGI application to wrap. - :param stream: Write stats to this stream. Disable with ``None``. - :param sort_by: A tuple of columns to sort stats by. See - :meth:`pstats.Stats.sort_stats`. - :param restrictions: A tuple of restrictions to filter stats by. See - :meth:`pstats.Stats.print_stats`. - :param profile_dir: Save profile data files to this directory. - :param filename_format: Format string for profile data file names, - or a callable returning a name. See explanation above. - - .. code-block:: python - - from werkzeug.middleware.profiler import ProfilerMiddleware - app = ProfilerMiddleware(app) - - .. versionchanged:: 0.15 - Stats are written even if ``profile_dir`` is given, and can be - disable by passing ``stream=None``. - - .. versionadded:: 0.15 - Added ``filename_format``. - - .. versionadded:: 0.9 - Added ``restrictions`` and ``profile_dir``. - """ - - def __init__( - self, - app, - stream=sys.stdout, - sort_by=("time", "calls"), - restrictions=(), - profile_dir=None, - filename_format="{method}.{path}.{elapsed:.0f}ms.{time:.0f}.prof", - ): - self._app = app - self._stream = stream - self._sort_by = sort_by - self._restrictions = restrictions - self._profile_dir = profile_dir - self._filename_format = filename_format - - def __call__(self, environ, start_response): - response_body = [] - - def catching_start_response(status, headers, exc_info=None): - start_response(status, headers, exc_info) - return response_body.append - - def runapp(): - app_iter = self._app(environ, catching_start_response) - response_body.extend(app_iter) - - if hasattr(app_iter, "close"): - app_iter.close() - - profile = Profile() - start = time.time() - profile.runcall(runapp) - body = b"".join(response_body) - elapsed = time.time() - start - - if self._profile_dir is not None: - if callable(self._filename_format): - filename = self._filename_format(environ) - else: - filename = self._filename_format.format( - method=environ["REQUEST_METHOD"], - path=( - environ.get("PATH_INFO").strip("/").replace("/", ".") or "root" - ), - elapsed=elapsed * 1000.0, - time=time.time(), - ) - filename = os.path.join(self._profile_dir, filename) - profile.dump_stats(filename) - - if self._stream is not None: - stats = Stats(profile, stream=self._stream) - stats.sort_stats(*self._sort_by) - print("-" * 80, file=self._stream) - print("PATH: {!r}".format(environ.get("PATH_INFO", "")), file=self._stream) - stats.print_stats(*self._restrictions) - print("-" * 80 + "\n", file=self._stream) - - return [body] diff --git a/venv/lib/python3.7/site-packages/werkzeug/middleware/proxy_fix.py b/venv/lib/python3.7/site-packages/werkzeug/middleware/proxy_fix.py deleted file mode 100644 index f393f61..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/middleware/proxy_fix.py +++ /dev/null @@ -1,169 +0,0 @@ -""" -X-Forwarded-For Proxy Fix -========================= - -This module provides a middleware that adjusts the WSGI environ based on -``X-Forwarded-`` headers that proxies in front of an application may -set. - -When an application is running behind a proxy server, WSGI may see the -request as coming from that server rather than the real client. Proxies -set various headers to track where the request actually came from. - -This middleware should only be applied if the application is actually -behind such a proxy, and should be configured with the number of proxies -that are chained in front of it. Not all proxies set all the headers. -Since incoming headers can be faked, you must set how many proxies are -setting each header so the middleware knows what to trust. - -.. autoclass:: ProxyFix - -:copyright: 2007 Pallets -:license: BSD-3-Clause -""" -from werkzeug.http import parse_list_header - - -class ProxyFix(object): - """Adjust the WSGI environ based on ``X-Forwarded-`` that proxies in - front of the application may set. - - - ``X-Forwarded-For`` sets ``REMOTE_ADDR``. - - ``X-Forwarded-Proto`` sets ``wsgi.url_scheme``. - - ``X-Forwarded-Host`` sets ``HTTP_HOST``, ``SERVER_NAME``, and - ``SERVER_PORT``. - - ``X-Forwarded-Port`` sets ``HTTP_HOST`` and ``SERVER_PORT``. - - ``X-Forwarded-Prefix`` sets ``SCRIPT_NAME``. - - You must tell the middleware how many proxies set each header so it - knows what values to trust. It is a security issue to trust values - that came from the client rather than a proxy. - - The original values of the headers are stored in the WSGI - environ as ``werkzeug.proxy_fix.orig``, a dict. - - :param app: The WSGI application to wrap. - :param x_for: Number of values to trust for ``X-Forwarded-For``. - :param x_proto: Number of values to trust for ``X-Forwarded-Proto``. - :param x_host: Number of values to trust for ``X-Forwarded-Host``. - :param x_port: Number of values to trust for ``X-Forwarded-Port``. - :param x_prefix: Number of values to trust for - ``X-Forwarded-Prefix``. - - .. code-block:: python - - from werkzeug.middleware.proxy_fix import ProxyFix - # App is behind one proxy that sets the -For and -Host headers. - app = ProxyFix(app, x_for=1, x_host=1) - - .. versionchanged:: 1.0 - Deprecated code has been removed: - - * The ``num_proxies`` argument and attribute. - * The ``get_remote_addr`` method. - * The environ keys ``orig_remote_addr``, - ``orig_wsgi_url_scheme``, and ``orig_http_host``. - - .. versionchanged:: 0.15 - All headers support multiple values. The ``num_proxies`` - argument is deprecated. Each header is configured with a - separate number of trusted proxies. - - .. versionchanged:: 0.15 - Original WSGI environ values are stored in the - ``werkzeug.proxy_fix.orig`` dict. ``orig_remote_addr``, - ``orig_wsgi_url_scheme``, and ``orig_http_host`` are deprecated - and will be removed in 1.0. - - .. versionchanged:: 0.15 - Support ``X-Forwarded-Port`` and ``X-Forwarded-Prefix``. - - .. versionchanged:: 0.15 - ``X-Forwarded-Host`` and ``X-Forwarded-Port`` modify - ``SERVER_NAME`` and ``SERVER_PORT``. - """ - - def __init__(self, app, x_for=1, x_proto=1, x_host=0, x_port=0, x_prefix=0): - self.app = app - self.x_for = x_for - self.x_proto = x_proto - self.x_host = x_host - self.x_port = x_port - self.x_prefix = x_prefix - - def _get_real_value(self, trusted, value): - """Get the real value from a list header based on the configured - number of trusted proxies. - - :param trusted: Number of values to trust in the header. - :param value: Comma separated list header value to parse. - :return: The real value, or ``None`` if there are fewer values - than the number of trusted proxies. - - .. versionchanged:: 1.0 - Renamed from ``_get_trusted_comma``. - - .. versionadded:: 0.15 - """ - if not (trusted and value): - return - values = parse_list_header(value) - if len(values) >= trusted: - return values[-trusted] - - def __call__(self, environ, start_response): - """Modify the WSGI environ based on the various ``Forwarded`` - headers before calling the wrapped application. Store the - original environ values in ``werkzeug.proxy_fix.orig_{key}``. - """ - environ_get = environ.get - orig_remote_addr = environ_get("REMOTE_ADDR") - orig_wsgi_url_scheme = environ_get("wsgi.url_scheme") - orig_http_host = environ_get("HTTP_HOST") - environ.update( - { - "werkzeug.proxy_fix.orig": { - "REMOTE_ADDR": orig_remote_addr, - "wsgi.url_scheme": orig_wsgi_url_scheme, - "HTTP_HOST": orig_http_host, - "SERVER_NAME": environ_get("SERVER_NAME"), - "SERVER_PORT": environ_get("SERVER_PORT"), - "SCRIPT_NAME": environ_get("SCRIPT_NAME"), - } - } - ) - - x_for = self._get_real_value(self.x_for, environ_get("HTTP_X_FORWARDED_FOR")) - if x_for: - environ["REMOTE_ADDR"] = x_for - - x_proto = self._get_real_value( - self.x_proto, environ_get("HTTP_X_FORWARDED_PROTO") - ) - if x_proto: - environ["wsgi.url_scheme"] = x_proto - - x_host = self._get_real_value(self.x_host, environ_get("HTTP_X_FORWARDED_HOST")) - if x_host: - environ["HTTP_HOST"] = x_host - parts = x_host.split(":", 1) - environ["SERVER_NAME"] = parts[0] - if len(parts) == 2: - environ["SERVER_PORT"] = parts[1] - - x_port = self._get_real_value(self.x_port, environ_get("HTTP_X_FORWARDED_PORT")) - if x_port: - host = environ.get("HTTP_HOST") - if host: - parts = host.split(":", 1) - host = parts[0] if len(parts) == 2 else host - environ["HTTP_HOST"] = "%s:%s" % (host, x_port) - environ["SERVER_PORT"] = x_port - - x_prefix = self._get_real_value( - self.x_prefix, environ_get("HTTP_X_FORWARDED_PREFIX") - ) - if x_prefix: - environ["SCRIPT_NAME"] = x_prefix - - return self.app(environ, start_response) diff --git a/venv/lib/python3.7/site-packages/werkzeug/middleware/shared_data.py b/venv/lib/python3.7/site-packages/werkzeug/middleware/shared_data.py deleted file mode 100644 index ab4ff0f..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/middleware/shared_data.py +++ /dev/null @@ -1,293 +0,0 @@ -""" -Serve Shared Static Files -========================= - -.. autoclass:: SharedDataMiddleware - :members: is_allowed - -:copyright: 2007 Pallets -:license: BSD-3-Clause -""" -import mimetypes -import os -import pkgutil -import posixpath -from datetime import datetime -from io import BytesIO -from time import mktime -from time import time -from zlib import adler32 - -from .._compat import PY2 -from .._compat import string_types -from ..filesystem import get_filesystem_encoding -from ..http import http_date -from ..http import is_resource_modified -from ..security import safe_join -from ..utils import get_content_type -from ..wsgi import get_path_info -from ..wsgi import wrap_file - - -class SharedDataMiddleware(object): - - """A WSGI middleware that provides static content for development - environments or simple server setups. Usage is quite simple:: - - import os - from werkzeug.wsgi import SharedDataMiddleware - - app = SharedDataMiddleware(app, { - '/static': os.path.join(os.path.dirname(__file__), 'static') - }) - - The contents of the folder ``./shared`` will now be available on - ``http://example.com/shared/``. This is pretty useful during development - because a standalone media server is not required. One can also mount - files on the root folder and still continue to use the application because - the shared data middleware forwards all unhandled requests to the - application, even if the requests are below one of the shared folders. - - If `pkg_resources` is available you can also tell the middleware to serve - files from package data:: - - app = SharedDataMiddleware(app, { - '/static': ('myapplication', 'static') - }) - - This will then serve the ``static`` folder in the `myapplication` - Python package. - - The optional `disallow` parameter can be a list of :func:`~fnmatch.fnmatch` - rules for files that are not accessible from the web. If `cache` is set to - `False` no caching headers are sent. - - Currently the middleware does not support non ASCII filenames. If the - encoding on the file system happens to be the encoding of the URI it may - work but this could also be by accident. We strongly suggest using ASCII - only file names for static files. - - The middleware will guess the mimetype using the Python `mimetype` - module. If it's unable to figure out the charset it will fall back - to `fallback_mimetype`. - - :param app: the application to wrap. If you don't want to wrap an - application you can pass it :exc:`NotFound`. - :param exports: a list or dict of exported files and folders. - :param disallow: a list of :func:`~fnmatch.fnmatch` rules. - :param cache: enable or disable caching headers. - :param cache_timeout: the cache timeout in seconds for the headers. - :param fallback_mimetype: The fallback mimetype for unknown files. - - .. versionchanged:: 1.0 - The default ``fallback_mimetype`` is - ``application/octet-stream``. If a filename looks like a text - mimetype, the ``utf-8`` charset is added to it. - - .. versionadded:: 0.6 - Added ``fallback_mimetype``. - - .. versionchanged:: 0.5 - Added ``cache_timeout``. - """ - - def __init__( - self, - app, - exports, - disallow=None, - cache=True, - cache_timeout=60 * 60 * 12, - fallback_mimetype="application/octet-stream", - ): - self.app = app - self.exports = [] - self.cache = cache - self.cache_timeout = cache_timeout - - if hasattr(exports, "items"): - exports = exports.items() - - for key, value in exports: - if isinstance(value, tuple): - loader = self.get_package_loader(*value) - elif isinstance(value, string_types): - if os.path.isfile(value): - loader = self.get_file_loader(value) - else: - loader = self.get_directory_loader(value) - else: - raise TypeError("unknown def %r" % value) - - self.exports.append((key, loader)) - - if disallow is not None: - from fnmatch import fnmatch - - self.is_allowed = lambda x: not fnmatch(x, disallow) - - self.fallback_mimetype = fallback_mimetype - - def is_allowed(self, filename): - """Subclasses can override this method to disallow the access to - certain files. However by providing `disallow` in the constructor - this method is overwritten. - """ - return True - - def _opener(self, filename): - return lambda: ( - open(filename, "rb"), - datetime.utcfromtimestamp(os.path.getmtime(filename)), - int(os.path.getsize(filename)), - ) - - def get_file_loader(self, filename): - return lambda x: (os.path.basename(filename), self._opener(filename)) - - def get_package_loader(self, package, package_path): - loadtime = datetime.utcnow() - provider = pkgutil.get_loader(package) - - if hasattr(provider, "get_resource_reader"): - # Python 3 - reader = provider.get_resource_reader(package) - - def loader(path): - if path is None: - return None, None - - path = safe_join(package_path, path) - basename = posixpath.basename(path) - - try: - resource = reader.open_resource(path) - except IOError: - return None, None - - if isinstance(resource, BytesIO): - return ( - basename, - lambda: (resource, loadtime, len(resource.getvalue())), - ) - - return ( - basename, - lambda: ( - resource, - datetime.utcfromtimestamp(os.path.getmtime(resource.name)), - os.path.getsize(resource.name), - ), - ) - - else: - # Python 2 - package_filename = provider.get_filename(package) - is_filesystem = os.path.exists(package_filename) - root = os.path.join(os.path.dirname(package_filename), package_path) - - def loader(path): - if path is None: - return None, None - - path = safe_join(root, path) - basename = posixpath.basename(path) - - if is_filesystem: - if not os.path.isfile(path): - return None, None - - return basename, self._opener(path) - - try: - data = provider.get_data(path) - except IOError: - return None, None - - return basename, lambda: (BytesIO(data), loadtime, len(data)) - - return loader - - def get_directory_loader(self, directory): - def loader(path): - if path is not None: - path = safe_join(directory, path) - else: - path = directory - - if os.path.isfile(path): - return os.path.basename(path), self._opener(path) - - return None, None - - return loader - - def generate_etag(self, mtime, file_size, real_filename): - if not isinstance(real_filename, bytes): - real_filename = real_filename.encode(get_filesystem_encoding()) - - return "wzsdm-%d-%s-%s" % ( - mktime(mtime.timetuple()), - file_size, - adler32(real_filename) & 0xFFFFFFFF, - ) - - def __call__(self, environ, start_response): - path = get_path_info(environ) - - if PY2: - path = path.encode(get_filesystem_encoding()) - - file_loader = None - - for search_path, loader in self.exports: - if search_path == path: - real_filename, file_loader = loader(None) - - if file_loader is not None: - break - - if not search_path.endswith("/"): - search_path += "/" - - if path.startswith(search_path): - real_filename, file_loader = loader(path[len(search_path) :]) - - if file_loader is not None: - break - - if file_loader is None or not self.is_allowed(real_filename): - return self.app(environ, start_response) - - guessed_type = mimetypes.guess_type(real_filename) - mime_type = get_content_type(guessed_type[0] or self.fallback_mimetype, "utf-8") - f, mtime, file_size = file_loader() - - headers = [("Date", http_date())] - - if self.cache: - timeout = self.cache_timeout - etag = self.generate_etag(mtime, file_size, real_filename) - headers += [ - ("Etag", '"%s"' % etag), - ("Cache-Control", "max-age=%d, public" % timeout), - ] - - if not is_resource_modified(environ, etag, last_modified=mtime): - f.close() - start_response("304 Not Modified", headers) - return [] - - headers.append(("Expires", http_date(time() + timeout))) - else: - headers.append(("Cache-Control", "public")) - - headers.extend( - ( - ("Content-Type", mime_type), - ("Content-Length", str(file_size)), - ("Last-Modified", http_date(mtime)), - ) - ) - start_response("200 OK", headers) - return wrap_file(environ, f) diff --git a/venv/lib/python3.7/site-packages/werkzeug/posixemulation.py b/venv/lib/python3.7/site-packages/werkzeug/posixemulation.py deleted file mode 100644 index 696b456..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/posixemulation.py +++ /dev/null @@ -1,117 +0,0 @@ -# -*- coding: utf-8 -*- -r""" - werkzeug.posixemulation - ~~~~~~~~~~~~~~~~~~~~~~~ - - Provides a POSIX emulation for some features that are relevant to - web applications. The main purpose is to simplify support for - systems such as Windows NT that are not 100% POSIX compatible. - - Currently this only implements a :func:`rename` function that - follows POSIX semantics. Eg: if the target file already exists it - will be replaced without asking. - - This module was introduced in 0.6.1 and is not a public interface. - It might become one in later versions of Werkzeug. - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import errno -import os -import random -import sys -import time - -from ._compat import to_unicode -from .filesystem import get_filesystem_encoding - -can_rename_open_file = False - -if os.name == "nt": - try: - import ctypes - - _MOVEFILE_REPLACE_EXISTING = 0x1 - _MOVEFILE_WRITE_THROUGH = 0x8 - _MoveFileEx = ctypes.windll.kernel32.MoveFileExW - - def _rename(src, dst): - src = to_unicode(src, get_filesystem_encoding()) - dst = to_unicode(dst, get_filesystem_encoding()) - if _rename_atomic(src, dst): - return True - retry = 0 - rv = False - while not rv and retry < 100: - rv = _MoveFileEx( - src, dst, _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH - ) - if not rv: - time.sleep(0.001) - retry += 1 - return rv - - # new in Vista and Windows Server 2008 - _CreateTransaction = ctypes.windll.ktmw32.CreateTransaction - _CommitTransaction = ctypes.windll.ktmw32.CommitTransaction - _MoveFileTransacted = ctypes.windll.kernel32.MoveFileTransactedW - _CloseHandle = ctypes.windll.kernel32.CloseHandle - can_rename_open_file = True - - def _rename_atomic(src, dst): - ta = _CreateTransaction(None, 0, 0, 0, 0, 1000, "Werkzeug rename") - if ta == -1: - return False - try: - retry = 0 - rv = False - while not rv and retry < 100: - rv = _MoveFileTransacted( - src, - dst, - None, - None, - _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH, - ta, - ) - if rv: - rv = _CommitTransaction(ta) - break - else: - time.sleep(0.001) - retry += 1 - return rv - finally: - _CloseHandle(ta) - - except Exception: - - def _rename(src, dst): - return False - - def _rename_atomic(src, dst): - return False - - def rename(src, dst): - # Try atomic or pseudo-atomic rename - if _rename(src, dst): - return - # Fall back to "move away and replace" - try: - os.rename(src, dst) - except OSError as e: - if e.errno != errno.EEXIST: - raise - old = "%s-%08x" % (dst, random.randint(0, sys.maxsize)) - os.rename(dst, old) - os.rename(src, dst) - try: - os.unlink(old) - except Exception: - pass - - -else: - rename = os.rename - can_rename_open_file = True diff --git a/venv/lib/python3.7/site-packages/werkzeug/routing.py b/venv/lib/python3.7/site-packages/werkzeug/routing.py deleted file mode 100644 index 8fa3c60..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/routing.py +++ /dev/null @@ -1,2210 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.routing - ~~~~~~~~~~~~~~~~ - - When it comes to combining multiple controller or view functions (however - you want to call them) you need a dispatcher. A simple way would be - applying regular expression tests on the ``PATH_INFO`` and calling - registered callback functions that return the value then. - - This module implements a much more powerful system than simple regular - expression matching because it can also convert values in the URLs and - build URLs. - - Here a simple example that creates an URL map for an application with - two subdomains (www and kb) and some URL rules: - - >>> m = Map([ - ... # Static URLs - ... Rule('/', endpoint='static/index'), - ... Rule('/about', endpoint='static/about'), - ... Rule('/help', endpoint='static/help'), - ... # Knowledge Base - ... Subdomain('kb', [ - ... Rule('/', endpoint='kb/index'), - ... Rule('/browse/', endpoint='kb/browse'), - ... Rule('/browse//', endpoint='kb/browse'), - ... Rule('/browse//', endpoint='kb/browse') - ... ]) - ... ], default_subdomain='www') - - If the application doesn't use subdomains it's perfectly fine to not set - the default subdomain and not use the `Subdomain` rule factory. The endpoint - in the rules can be anything, for example import paths or unique - identifiers. The WSGI application can use those endpoints to get the - handler for that URL. It doesn't have to be a string at all but it's - recommended. - - Now it's possible to create a URL adapter for one of the subdomains and - build URLs: - - >>> c = m.bind('example.com') - >>> c.build("kb/browse", dict(id=42)) - 'http://kb.example.com/browse/42/' - >>> c.build("kb/browse", dict()) - 'http://kb.example.com/browse/' - >>> c.build("kb/browse", dict(id=42, page=3)) - 'http://kb.example.com/browse/42/3' - >>> c.build("static/about") - '/about' - >>> c.build("static/index", force_external=True) - 'http://www.example.com/' - - >>> c = m.bind('example.com', subdomain='kb') - >>> c.build("static/about") - 'http://www.example.com/about' - - The first argument to bind is the server name *without* the subdomain. - Per default it will assume that the script is mounted on the root, but - often that's not the case so you can provide the real mount point as - second argument: - - >>> c = m.bind('example.com', '/applications/example') - - The third argument can be the subdomain, if not given the default - subdomain is used. For more details about binding have a look at the - documentation of the `MapAdapter`. - - And here is how you can match URLs: - - >>> c = m.bind('example.com') - >>> c.match("/") - ('static/index', {}) - >>> c.match("/about") - ('static/about', {}) - >>> c = m.bind('example.com', '/', 'kb') - >>> c.match("/") - ('kb/index', {}) - >>> c.match("/browse/42/23") - ('kb/browse', {'id': 42, 'page': 23}) - - If matching fails you get a `NotFound` exception, if the rule thinks - it's a good idea to redirect (for example because the URL was defined - to have a slash at the end but the request was missing that slash) it - will raise a `RequestRedirect` exception. Both are subclasses of the - `HTTPException` so you can use those errors as responses in the - application. - - If matching succeeded but the URL rule was incompatible to the given - method (for example there were only rules for `GET` and `HEAD` and - routing system tried to match a `POST` request) a `MethodNotAllowed` - exception is raised. - - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import ast -import difflib -import posixpath -import re -import uuid -import warnings -from pprint import pformat -from threading import Lock - -from ._compat import implements_to_string -from ._compat import iteritems -from ._compat import itervalues -from ._compat import native_string_result -from ._compat import string_types -from ._compat import text_type -from ._compat import to_bytes -from ._compat import to_unicode -from ._compat import wsgi_decoding_dance -from ._internal import _encode_idna -from ._internal import _get_environ -from .datastructures import ImmutableDict -from .datastructures import MultiDict -from .exceptions import BadHost -from .exceptions import BadRequest -from .exceptions import HTTPException -from .exceptions import MethodNotAllowed -from .exceptions import NotFound -from .urls import _fast_url_quote -from .urls import url_encode -from .urls import url_join -from .urls import url_quote -from .utils import cached_property -from .utils import format_string -from .utils import redirect -from .wsgi import get_host - -_rule_re = re.compile( - r""" - (?P[^<]*) # static rule data - < - (?: - (?P[a-zA-Z_][a-zA-Z0-9_]*) # converter name - (?:\((?P.*?)\))? # converter arguments - \: # variable delimiter - )? - (?P[a-zA-Z_][a-zA-Z0-9_]*) # variable name - > - """, - re.VERBOSE, -) -_simple_rule_re = re.compile(r"<([^>]+)>") -_converter_args_re = re.compile( - r""" - ((?P\w+)\s*=\s*)? - (?P - True|False| - \d+.\d+| - \d+.| - \d+| - [\w\d_.]+| - [urUR]?(?P"[^"]*?"|'[^']*') - )\s*, - """, - re.VERBOSE | re.UNICODE, -) - - -_PYTHON_CONSTANTS = {"None": None, "True": True, "False": False} - - -def _pythonize(value): - if value in _PYTHON_CONSTANTS: - return _PYTHON_CONSTANTS[value] - for convert in int, float: - try: - return convert(value) - except ValueError: - pass - if value[:1] == value[-1:] and value[0] in "\"'": - value = value[1:-1] - return text_type(value) - - -def parse_converter_args(argstr): - argstr += "," - args = [] - kwargs = {} - - for item in _converter_args_re.finditer(argstr): - value = item.group("stringval") - if value is None: - value = item.group("value") - value = _pythonize(value) - if not item.group("name"): - args.append(value) - else: - name = item.group("name") - kwargs[name] = value - - return tuple(args), kwargs - - -def parse_rule(rule): - """Parse a rule and return it as generator. Each iteration yields tuples - in the form ``(converter, arguments, variable)``. If the converter is - `None` it's a static url part, otherwise it's a dynamic one. - - :internal: - """ - pos = 0 - end = len(rule) - do_match = _rule_re.match - used_names = set() - while pos < end: - m = do_match(rule, pos) - if m is None: - break - data = m.groupdict() - if data["static"]: - yield None, None, data["static"] - variable = data["variable"] - converter = data["converter"] or "default" - if variable in used_names: - raise ValueError("variable name %r used twice." % variable) - used_names.add(variable) - yield converter, data["args"] or None, variable - pos = m.end() - if pos < end: - remaining = rule[pos:] - if ">" in remaining or "<" in remaining: - raise ValueError("malformed url rule: %r" % rule) - yield None, None, remaining - - -class RoutingException(Exception): - """Special exceptions that require the application to redirect, notifying - about missing urls, etc. - - :internal: - """ - - -class RequestRedirect(HTTPException, RoutingException): - """Raise if the map requests a redirect. This is for example the case if - `strict_slashes` are activated and an url that requires a trailing slash. - - The attribute `new_url` contains the absolute destination url. - """ - - code = 308 - - def __init__(self, new_url): - RoutingException.__init__(self, new_url) - self.new_url = new_url - - def get_response(self, environ): - return redirect(self.new_url, self.code) - - -class RequestPath(RoutingException): - """Internal exception.""" - - __slots__ = ("path_info",) - - def __init__(self, path_info): - self.path_info = path_info - - -class RequestAliasRedirect(RoutingException): # noqa: B903 - """This rule is an alias and wants to redirect to the canonical URL.""" - - def __init__(self, matched_values): - self.matched_values = matched_values - - -@implements_to_string -class BuildError(RoutingException, LookupError): - """Raised if the build system cannot find a URL for an endpoint with the - values provided. - """ - - def __init__(self, endpoint, values, method, adapter=None): - LookupError.__init__(self, endpoint, values, method) - self.endpoint = endpoint - self.values = values - self.method = method - self.adapter = adapter - - @cached_property - def suggested(self): - return self.closest_rule(self.adapter) - - def closest_rule(self, adapter): - def _score_rule(rule): - return sum( - [ - 0.98 - * difflib.SequenceMatcher( - None, rule.endpoint, self.endpoint - ).ratio(), - 0.01 * bool(set(self.values or ()).issubset(rule.arguments)), - 0.01 * bool(rule.methods and self.method in rule.methods), - ] - ) - - if adapter and adapter.map._rules: - return max(adapter.map._rules, key=_score_rule) - - def __str__(self): - message = [] - message.append("Could not build url for endpoint %r" % self.endpoint) - if self.method: - message.append(" (%r)" % self.method) - if self.values: - message.append(" with values %r" % sorted(self.values.keys())) - message.append(".") - if self.suggested: - if self.endpoint == self.suggested.endpoint: - if self.method and self.method not in self.suggested.methods: - message.append( - " Did you mean to use methods %r?" - % sorted(self.suggested.methods) - ) - missing_values = self.suggested.arguments.union( - set(self.suggested.defaults or ()) - ) - set(self.values.keys()) - if missing_values: - message.append( - " Did you forget to specify values %r?" % sorted(missing_values) - ) - else: - message.append(" Did you mean %r instead?" % self.suggested.endpoint) - return u"".join(message) - - -class WebsocketMismatch(BadRequest): - """The only matched rule is either a WebSocket and the request is - HTTP, or the rule is HTTP and the request is a WebSocket. - """ - - -class ValidationError(ValueError): - """Validation error. If a rule converter raises this exception the rule - does not match the current URL and the next URL is tried. - """ - - -class RuleFactory(object): - """As soon as you have more complex URL setups it's a good idea to use rule - factories to avoid repetitive tasks. Some of them are builtin, others can - be added by subclassing `RuleFactory` and overriding `get_rules`. - """ - - def get_rules(self, map): - """Subclasses of `RuleFactory` have to override this method and return - an iterable of rules.""" - raise NotImplementedError() - - -class Subdomain(RuleFactory): - """All URLs provided by this factory have the subdomain set to a - specific domain. For example if you want to use the subdomain for - the current language this can be a good setup:: - - url_map = Map([ - Rule('/', endpoint='#select_language'), - Subdomain('', [ - Rule('/', endpoint='index'), - Rule('/about', endpoint='about'), - Rule('/help', endpoint='help') - ]) - ]) - - All the rules except for the ``'#select_language'`` endpoint will now - listen on a two letter long subdomain that holds the language code - for the current request. - """ - - def __init__(self, subdomain, rules): - self.subdomain = subdomain - self.rules = rules - - def get_rules(self, map): - for rulefactory in self.rules: - for rule in rulefactory.get_rules(map): - rule = rule.empty() - rule.subdomain = self.subdomain - yield rule - - -class Submount(RuleFactory): - """Like `Subdomain` but prefixes the URL rule with a given string:: - - url_map = Map([ - Rule('/', endpoint='index'), - Submount('/blog', [ - Rule('/', endpoint='blog/index'), - Rule('/entry/', endpoint='blog/show') - ]) - ]) - - Now the rule ``'blog/show'`` matches ``/blog/entry/``. - """ - - def __init__(self, path, rules): - self.path = path.rstrip("/") - self.rules = rules - - def get_rules(self, map): - for rulefactory in self.rules: - for rule in rulefactory.get_rules(map): - rule = rule.empty() - rule.rule = self.path + rule.rule - yield rule - - -class EndpointPrefix(RuleFactory): - """Prefixes all endpoints (which must be strings for this factory) with - another string. This can be useful for sub applications:: - - url_map = Map([ - Rule('/', endpoint='index'), - EndpointPrefix('blog/', [Submount('/blog', [ - Rule('/', endpoint='index'), - Rule('/entry/', endpoint='show') - ])]) - ]) - """ - - def __init__(self, prefix, rules): - self.prefix = prefix - self.rules = rules - - def get_rules(self, map): - for rulefactory in self.rules: - for rule in rulefactory.get_rules(map): - rule = rule.empty() - rule.endpoint = self.prefix + rule.endpoint - yield rule - - -class RuleTemplate(object): - """Returns copies of the rules wrapped and expands string templates in - the endpoint, rule, defaults or subdomain sections. - - Here a small example for such a rule template:: - - from werkzeug.routing import Map, Rule, RuleTemplate - - resource = RuleTemplate([ - Rule('/$name/', endpoint='$name.list'), - Rule('/$name/', endpoint='$name.show') - ]) - - url_map = Map([resource(name='user'), resource(name='page')]) - - When a rule template is called the keyword arguments are used to - replace the placeholders in all the string parameters. - """ - - def __init__(self, rules): - self.rules = list(rules) - - def __call__(self, *args, **kwargs): - return RuleTemplateFactory(self.rules, dict(*args, **kwargs)) - - -class RuleTemplateFactory(RuleFactory): - """A factory that fills in template variables into rules. Used by - `RuleTemplate` internally. - - :internal: - """ - - def __init__(self, rules, context): - self.rules = rules - self.context = context - - def get_rules(self, map): - for rulefactory in self.rules: - for rule in rulefactory.get_rules(map): - new_defaults = subdomain = None - if rule.defaults: - new_defaults = {} - for key, value in iteritems(rule.defaults): - if isinstance(value, string_types): - value = format_string(value, self.context) - new_defaults[key] = value - if rule.subdomain is not None: - subdomain = format_string(rule.subdomain, self.context) - new_endpoint = rule.endpoint - if isinstance(new_endpoint, string_types): - new_endpoint = format_string(new_endpoint, self.context) - yield Rule( - format_string(rule.rule, self.context), - new_defaults, - subdomain, - rule.methods, - rule.build_only, - new_endpoint, - rule.strict_slashes, - ) - - -def _prefix_names(src): - """ast parse and prefix names with `.` to avoid collision with user vars""" - tree = ast.parse(src).body[0] - if isinstance(tree, ast.Expr): - tree = tree.value - for node in ast.walk(tree): - if isinstance(node, ast.Name): - node.id = "." + node.id - return tree - - -_CALL_CONVERTER_CODE_FMT = "self._converters[{elem!r}].to_url()" -_IF_KWARGS_URL_ENCODE_CODE = """\ -if kwargs: - q = '?' - params = self._encode_query_vars(kwargs) -else: - q = params = '' -""" -_IF_KWARGS_URL_ENCODE_AST = _prefix_names(_IF_KWARGS_URL_ENCODE_CODE) -_URL_ENCODE_AST_NAMES = (_prefix_names("q"), _prefix_names("params")) - - -@implements_to_string -class Rule(RuleFactory): - """A Rule represents one URL pattern. There are some options for `Rule` - that change the way it behaves and are passed to the `Rule` constructor. - Note that besides the rule-string all arguments *must* be keyword arguments - in order to not break the application on Werkzeug upgrades. - - `string` - Rule strings basically are just normal URL paths with placeholders in - the format ```` where the converter and the - arguments are optional. If no converter is defined the `default` - converter is used which means `string` in the normal configuration. - - URL rules that end with a slash are branch URLs, others are leaves. - If you have `strict_slashes` enabled (which is the default), all - branch URLs that are matched without a trailing slash will trigger a - redirect to the same URL with the missing slash appended. - - The converters are defined on the `Map`. - - `endpoint` - The endpoint for this rule. This can be anything. A reference to a - function, a string, a number etc. The preferred way is using a string - because the endpoint is used for URL generation. - - `defaults` - An optional dict with defaults for other rules with the same endpoint. - This is a bit tricky but useful if you want to have unique URLs:: - - url_map = Map([ - Rule('/all/', defaults={'page': 1}, endpoint='all_entries'), - Rule('/all/page/', endpoint='all_entries') - ]) - - If a user now visits ``http://example.com/all/page/1`` he will be - redirected to ``http://example.com/all/``. If `redirect_defaults` is - disabled on the `Map` instance this will only affect the URL - generation. - - `subdomain` - The subdomain rule string for this rule. If not specified the rule - only matches for the `default_subdomain` of the map. If the map is - not bound to a subdomain this feature is disabled. - - Can be useful if you want to have user profiles on different subdomains - and all subdomains are forwarded to your application:: - - url_map = Map([ - Rule('/', subdomain='', endpoint='user/homepage'), - Rule('/stats', subdomain='', endpoint='user/stats') - ]) - - `methods` - A sequence of http methods this rule applies to. If not specified, all - methods are allowed. For example this can be useful if you want different - endpoints for `POST` and `GET`. If methods are defined and the path - matches but the method matched against is not in this list or in the - list of another rule for that path the error raised is of the type - `MethodNotAllowed` rather than `NotFound`. If `GET` is present in the - list of methods and `HEAD` is not, `HEAD` is added automatically. - - `strict_slashes` - Override the `Map` setting for `strict_slashes` only for this rule. If - not specified the `Map` setting is used. - - `merge_slashes` - Override :attr:`Map.merge_slashes` for this rule. - - `build_only` - Set this to True and the rule will never match but will create a URL - that can be build. This is useful if you have resources on a subdomain - or folder that are not handled by the WSGI application (like static data) - - `redirect_to` - If given this must be either a string or callable. In case of a - callable it's called with the url adapter that triggered the match and - the values of the URL as keyword arguments and has to return the target - for the redirect, otherwise it has to be a string with placeholders in - rule syntax:: - - def foo_with_slug(adapter, id): - # ask the database for the slug for the old id. this of - # course has nothing to do with werkzeug. - return 'foo/' + Foo.get_slug_for_id(id) - - url_map = Map([ - Rule('/foo/', endpoint='foo'), - Rule('/some/old/url/', redirect_to='foo/'), - Rule('/other/old/url/', redirect_to=foo_with_slug) - ]) - - When the rule is matched the routing system will raise a - `RequestRedirect` exception with the target for the redirect. - - Keep in mind that the URL will be joined against the URL root of the - script so don't use a leading slash on the target URL unless you - really mean root of that domain. - - `alias` - If enabled this rule serves as an alias for another rule with the same - endpoint and arguments. - - `host` - If provided and the URL map has host matching enabled this can be - used to provide a match rule for the whole host. This also means - that the subdomain feature is disabled. - - `websocket` - If ``True``, this rule is only matches for WebSocket (``ws://``, - ``wss://``) requests. By default, rules will only match for HTTP - requests. - - .. versionadded:: 1.0 - Added ``websocket``. - - .. versionadded:: 1.0 - Added ``merge_slashes``. - - .. versionadded:: 0.7 - Added ``alias`` and ``host``. - - .. versionchanged:: 0.6.1 - ``HEAD`` is added to ``methods`` if ``GET`` is present. - """ - - def __init__( - self, - string, - defaults=None, - subdomain=None, - methods=None, - build_only=False, - endpoint=None, - strict_slashes=None, - merge_slashes=None, - redirect_to=None, - alias=False, - host=None, - websocket=False, - ): - if not string.startswith("/"): - raise ValueError("urls must start with a leading slash") - self.rule = string - self.is_leaf = not string.endswith("/") - - self.map = None - self.strict_slashes = strict_slashes - self.merge_slashes = merge_slashes - self.subdomain = subdomain - self.host = host - self.defaults = defaults - self.build_only = build_only - self.alias = alias - self.websocket = websocket - - if methods is not None: - if isinstance(methods, str): - raise TypeError("'methods' should be a list of strings.") - - methods = {x.upper() for x in methods} - - if "HEAD" not in methods and "GET" in methods: - methods.add("HEAD") - - if websocket and methods - {"GET", "HEAD", "OPTIONS"}: - raise ValueError( - "WebSocket rules can only use 'GET', 'HEAD', and 'OPTIONS' methods." - ) - - self.methods = methods - self.endpoint = endpoint - self.redirect_to = redirect_to - - if defaults: - self.arguments = set(map(str, defaults)) - else: - self.arguments = set() - self._trace = self._converters = self._regex = self._argument_weights = None - - def empty(self): - """ - Return an unbound copy of this rule. - - This can be useful if want to reuse an already bound URL for another - map. See ``get_empty_kwargs`` to override what keyword arguments are - provided to the new copy. - """ - return type(self)(self.rule, **self.get_empty_kwargs()) - - def get_empty_kwargs(self): - """ - Provides kwargs for instantiating empty copy with empty() - - Use this method to provide custom keyword arguments to the subclass of - ``Rule`` when calling ``some_rule.empty()``. Helpful when the subclass - has custom keyword arguments that are needed at instantiation. - - Must return a ``dict`` that will be provided as kwargs to the new - instance of ``Rule``, following the initial ``self.rule`` value which - is always provided as the first, required positional argument. - """ - defaults = None - if self.defaults: - defaults = dict(self.defaults) - return dict( - defaults=defaults, - subdomain=self.subdomain, - methods=self.methods, - build_only=self.build_only, - endpoint=self.endpoint, - strict_slashes=self.strict_slashes, - redirect_to=self.redirect_to, - alias=self.alias, - host=self.host, - ) - - def get_rules(self, map): - yield self - - def refresh(self): - """Rebinds and refreshes the URL. Call this if you modified the - rule in place. - - :internal: - """ - self.bind(self.map, rebind=True) - - def bind(self, map, rebind=False): - """Bind the url to a map and create a regular expression based on - the information from the rule itself and the defaults from the map. - - :internal: - """ - if self.map is not None and not rebind: - raise RuntimeError("url rule %r already bound to map %r" % (self, self.map)) - self.map = map - if self.strict_slashes is None: - self.strict_slashes = map.strict_slashes - if self.merge_slashes is None: - self.merge_slashes = map.merge_slashes - if self.subdomain is None: - self.subdomain = map.default_subdomain - self.compile() - - def get_converter(self, variable_name, converter_name, args, kwargs): - """Looks up the converter for the given parameter. - - .. versionadded:: 0.9 - """ - if converter_name not in self.map.converters: - raise LookupError("the converter %r does not exist" % converter_name) - return self.map.converters[converter_name](self.map, *args, **kwargs) - - def _encode_query_vars(self, query_vars): - return url_encode( - query_vars, - charset=self.map.charset, - sort=self.map.sort_parameters, - key=self.map.sort_key, - ) - - def compile(self): - """Compiles the regular expression and stores it.""" - assert self.map is not None, "rule not bound" - - if self.map.host_matching: - domain_rule = self.host or "" - else: - domain_rule = self.subdomain or "" - - self._trace = [] - self._converters = {} - self._static_weights = [] - self._argument_weights = [] - regex_parts = [] - - def _build_regex(rule): - index = 0 - for converter, arguments, variable in parse_rule(rule): - if converter is None: - for match in re.finditer(r"/+|[^/]+", variable): - part = match.group(0) - if part.startswith("/"): - if self.merge_slashes: - regex_parts.append(r"/+?") - self._trace.append((False, "/")) - else: - regex_parts.append(part) - self._trace.append((False, part)) - continue - self._trace.append((False, part)) - regex_parts.append(re.escape(part)) - if part: - self._static_weights.append((index, -len(part))) - else: - if arguments: - c_args, c_kwargs = parse_converter_args(arguments) - else: - c_args = () - c_kwargs = {} - convobj = self.get_converter(variable, converter, c_args, c_kwargs) - regex_parts.append("(?P<%s>%s)" % (variable, convobj.regex)) - self._converters[variable] = convobj - self._trace.append((True, variable)) - self._argument_weights.append(convobj.weight) - self.arguments.add(str(variable)) - index = index + 1 - - _build_regex(domain_rule) - regex_parts.append("\\|") - self._trace.append((False, "|")) - _build_regex(self.rule if self.is_leaf else self.rule.rstrip("/")) - if not self.is_leaf: - self._trace.append((False, "/")) - - self._build = self._compile_builder(False).__get__(self, None) - self._build_unknown = self._compile_builder(True).__get__(self, None) - - if self.build_only: - return - - if not (self.is_leaf and self.strict_slashes): - reps = u"*" if self.merge_slashes else u"?" - tail = u"(?/%s)" % reps - else: - tail = u"" - - regex = u"^%s%s$" % (u"".join(regex_parts), tail) - self._regex = re.compile(regex, re.UNICODE) - - def match(self, path, method=None): - """Check if the rule matches a given path. Path is a string in the - form ``"subdomain|/path"`` and is assembled by the map. If - the map is doing host matching the subdomain part will be the host - instead. - - If the rule matches a dict with the converted values is returned, - otherwise the return value is `None`. - - :internal: - """ - if not self.build_only: - require_redirect = False - - m = self._regex.search(path) - if m is not None: - groups = m.groupdict() - # we have a folder like part of the url without a trailing - # slash and strict slashes enabled. raise an exception that - # tells the map to redirect to the same url but with a - # trailing slash - if ( - self.strict_slashes - and not self.is_leaf - and not groups.pop("__suffix__") - and ( - method is None or self.methods is None or method in self.methods - ) - ): - path += "/" - require_redirect = True - # if we are not in strict slashes mode we have to remove - # a __suffix__ - elif not self.strict_slashes: - del groups["__suffix__"] - - result = {} - for name, value in iteritems(groups): - try: - value = self._converters[name].to_python(value) - except ValidationError: - return - result[str(name)] = value - if self.defaults: - result.update(self.defaults) - - if self.merge_slashes: - new_path = "|".join(self.build(result, False)) - if path.endswith("/") and not new_path.endswith("/"): - new_path += "/" - if new_path.count("/") < path.count("/"): - path = new_path - require_redirect = True - - if require_redirect: - path = path.split("|", 1)[1] - raise RequestPath(path) - - if self.alias and self.map.redirect_defaults: - raise RequestAliasRedirect(result) - - return result - - @staticmethod - def _get_func_code(code, name): - globs, locs = {}, {} - exec(code, globs, locs) - return locs[name] - - def _compile_builder(self, append_unknown=True): - defaults = self.defaults or {} - dom_ops = [] - url_ops = [] - - opl = dom_ops - for is_dynamic, data in self._trace: - if data == "|" and opl is dom_ops: - opl = url_ops - continue - # this seems like a silly case to ever come up but: - # if a default is given for a value that appears in the rule, - # resolve it to a constant ahead of time - if is_dynamic and data in defaults: - data = self._converters[data].to_url(defaults[data]) - opl.append((False, data)) - elif not is_dynamic: - opl.append( - (False, url_quote(to_bytes(data, self.map.charset), safe="/:|+")) - ) - else: - opl.append((True, data)) - - def _convert(elem): - ret = _prefix_names(_CALL_CONVERTER_CODE_FMT.format(elem=elem)) - ret.args = [ast.Name(str(elem), ast.Load())] # str for py2 - return ret - - def _parts(ops): - parts = [ - _convert(elem) if is_dynamic else ast.Str(s=elem) - for is_dynamic, elem in ops - ] - parts = parts or [ast.Str("")] - # constant fold - ret = [parts[0]] - for p in parts[1:]: - if isinstance(p, ast.Str) and isinstance(ret[-1], ast.Str): - ret[-1] = ast.Str(ret[-1].s + p.s) - else: - ret.append(p) - return ret - - dom_parts = _parts(dom_ops) - url_parts = _parts(url_ops) - if not append_unknown: - body = [] - else: - body = [_IF_KWARGS_URL_ENCODE_AST] - url_parts.extend(_URL_ENCODE_AST_NAMES) - - def _join(parts): - if len(parts) == 1: # shortcut - return parts[0] - elif hasattr(ast, "JoinedStr"): # py36+ - return ast.JoinedStr(parts) - else: - call = _prefix_names('"".join()') - call.args = [ast.Tuple(parts, ast.Load())] - return call - - body.append( - ast.Return(ast.Tuple([_join(dom_parts), _join(url_parts)], ast.Load())) - ) - - # str is necessary for python2 - pargs = [ - str(elem) - for is_dynamic, elem in dom_ops + url_ops - if is_dynamic and elem not in defaults - ] - kargs = [str(k) for k in defaults] - - func_ast = _prefix_names("def _(): pass") - func_ast.name = "".format(self.rule) - if hasattr(ast, "arg"): # py3 - func_ast.args.args.append(ast.arg(".self", None)) - for arg in pargs + kargs: - func_ast.args.args.append(ast.arg(arg, None)) - func_ast.args.kwarg = ast.arg(".kwargs", None) - else: - func_ast.args.args.append(ast.Name(".self", ast.Param())) - for arg in pargs + kargs: - func_ast.args.args.append(ast.Name(arg, ast.Param())) - func_ast.args.kwarg = ".kwargs" - for _ in kargs: - func_ast.args.defaults.append(ast.Str("")) - func_ast.body = body - - # use `ast.parse` instead of `ast.Module` for better portability - # python3.8 changes the signature of `ast.Module` - module = ast.parse("") - module.body = [func_ast] - - # mark everything as on line 1, offset 0 - # less error-prone than `ast.fix_missing_locations` - # bad line numbers cause an assert to fail in debug builds - for node in ast.walk(module): - if "lineno" in node._attributes: - node.lineno = 1 - if "col_offset" in node._attributes: - node.col_offset = 0 - - code = compile(module, "", "exec") - return self._get_func_code(code, func_ast.name) - - def build(self, values, append_unknown=True): - """Assembles the relative url for that rule and the subdomain. - If building doesn't work for some reasons `None` is returned. - - :internal: - """ - try: - if append_unknown: - return self._build_unknown(**values) - else: - return self._build(**values) - except ValidationError: - return None - - def provides_defaults_for(self, rule): - """Check if this rule has defaults for a given rule. - - :internal: - """ - return ( - not self.build_only - and self.defaults - and self.endpoint == rule.endpoint - and self != rule - and self.arguments == rule.arguments - ) - - def suitable_for(self, values, method=None): - """Check if the dict of values has enough data for url generation. - - :internal: - """ - # if a method was given explicitly and that method is not supported - # by this rule, this rule is not suitable. - if ( - method is not None - and self.methods is not None - and method not in self.methods - ): - return False - - defaults = self.defaults or () - - # all arguments required must be either in the defaults dict or - # the value dictionary otherwise it's not suitable - for key in self.arguments: - if key not in defaults and key not in values: - return False - - # in case defaults are given we ensure that either the value was - # skipped or the value is the same as the default value. - if defaults: - for key, value in iteritems(defaults): - if key in values and value != values[key]: - return False - - return True - - def match_compare_key(self): - """The match compare key for sorting. - - Current implementation: - - 1. rules without any arguments come first for performance - reasons only as we expect them to match faster and some - common ones usually don't have any arguments (index pages etc.) - 2. rules with more static parts come first so the second argument - is the negative length of the number of the static weights. - 3. we order by static weights, which is a combination of index - and length - 4. The more complex rules come first so the next argument is the - negative length of the number of argument weights. - 5. lastly we order by the actual argument weights. - - :internal: - """ - return ( - bool(self.arguments), - -len(self._static_weights), - self._static_weights, - -len(self._argument_weights), - self._argument_weights, - ) - - def build_compare_key(self): - """The build compare key for sorting. - - :internal: - """ - return 1 if self.alias else 0, -len(self.arguments), -len(self.defaults or ()) - - def __eq__(self, other): - return self.__class__ is other.__class__ and self._trace == other._trace - - __hash__ = None - - def __ne__(self, other): - return not self.__eq__(other) - - def __str__(self): - return self.rule - - @native_string_result - def __repr__(self): - if self.map is None: - return u"<%s (unbound)>" % self.__class__.__name__ - tmp = [] - for is_dynamic, data in self._trace: - if is_dynamic: - tmp.append(u"<%s>" % data) - else: - tmp.append(data) - return u"<%s %s%s -> %s>" % ( - self.__class__.__name__, - repr((u"".join(tmp)).lstrip(u"|")).lstrip(u"u"), - self.methods is not None and u" (%s)" % u", ".join(self.methods) or u"", - self.endpoint, - ) - - -class BaseConverter(object): - """Base class for all converters.""" - - regex = "[^/]+" - weight = 100 - - def __init__(self, map): - self.map = map - - def to_python(self, value): - return value - - def to_url(self, value): - if isinstance(value, (bytes, bytearray)): - return _fast_url_quote(value) - return _fast_url_quote(text_type(value).encode(self.map.charset)) - - -class UnicodeConverter(BaseConverter): - """This converter is the default converter and accepts any string but - only one path segment. Thus the string can not include a slash. - - This is the default validator. - - Example:: - - Rule('/pages/'), - Rule('/') - - :param map: the :class:`Map`. - :param minlength: the minimum length of the string. Must be greater - or equal 1. - :param maxlength: the maximum length of the string. - :param length: the exact length of the string. - """ - - def __init__(self, map, minlength=1, maxlength=None, length=None): - BaseConverter.__init__(self, map) - if length is not None: - length = "{%d}" % int(length) - else: - if maxlength is None: - maxlength = "" - else: - maxlength = int(maxlength) - length = "{%s,%s}" % (int(minlength), maxlength) - self.regex = "[^/]" + length - - -class AnyConverter(BaseConverter): - """Matches one of the items provided. Items can either be Python - identifiers or strings:: - - Rule('/') - - :param map: the :class:`Map`. - :param items: this function accepts the possible items as positional - arguments. - """ - - def __init__(self, map, *items): - BaseConverter.__init__(self, map) - self.regex = "(?:%s)" % "|".join([re.escape(x) for x in items]) - - -class PathConverter(BaseConverter): - """Like the default :class:`UnicodeConverter`, but it also matches - slashes. This is useful for wikis and similar applications:: - - Rule('/') - Rule('//edit') - - :param map: the :class:`Map`. - """ - - regex = "[^/].*?" - weight = 200 - - -class NumberConverter(BaseConverter): - """Baseclass for `IntegerConverter` and `FloatConverter`. - - :internal: - """ - - weight = 50 - - def __init__(self, map, fixed_digits=0, min=None, max=None, signed=False): - if signed: - self.regex = self.signed_regex - BaseConverter.__init__(self, map) - self.fixed_digits = fixed_digits - self.min = min - self.max = max - self.signed = signed - - def to_python(self, value): - if self.fixed_digits and len(value) != self.fixed_digits: - raise ValidationError() - value = self.num_convert(value) - if (self.min is not None and value < self.min) or ( - self.max is not None and value > self.max - ): - raise ValidationError() - return value - - def to_url(self, value): - value = self.num_convert(value) - if self.fixed_digits: - value = ("%%0%sd" % self.fixed_digits) % value - return str(value) - - @property - def signed_regex(self): - return r"-?" + self.regex - - -class IntegerConverter(NumberConverter): - """This converter only accepts integer values:: - - Rule("/page/") - - By default it only accepts unsigned, positive values. The ``signed`` - parameter will enable signed, negative values. :: - - Rule("/page/") - - :param map: The :class:`Map`. - :param fixed_digits: The number of fixed digits in the URL. If you - set this to ``4`` for example, the rule will only match if the - URL looks like ``/0001/``. The default is variable length. - :param min: The minimal value. - :param max: The maximal value. - :param signed: Allow signed (negative) values. - - .. versionadded:: 0.15 - The ``signed`` parameter. - """ - - regex = r"\d+" - num_convert = int - - -class FloatConverter(NumberConverter): - """This converter only accepts floating point values:: - - Rule("/probability/") - - By default it only accepts unsigned, positive values. The ``signed`` - parameter will enable signed, negative values. :: - - Rule("/offset/") - - :param map: The :class:`Map`. - :param min: The minimal value. - :param max: The maximal value. - :param signed: Allow signed (negative) values. - - .. versionadded:: 0.15 - The ``signed`` parameter. - """ - - regex = r"\d+\.\d+" - num_convert = float - - def __init__(self, map, min=None, max=None, signed=False): - NumberConverter.__init__(self, map, min=min, max=max, signed=signed) - - -class UUIDConverter(BaseConverter): - """This converter only accepts UUID strings:: - - Rule('/object/') - - .. versionadded:: 0.10 - - :param map: the :class:`Map`. - """ - - regex = ( - r"[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-" - r"[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" - ) - - def to_python(self, value): - return uuid.UUID(value) - - def to_url(self, value): - return str(value) - - -#: the default converter mapping for the map. -DEFAULT_CONVERTERS = { - "default": UnicodeConverter, - "string": UnicodeConverter, - "any": AnyConverter, - "path": PathConverter, - "int": IntegerConverter, - "float": FloatConverter, - "uuid": UUIDConverter, -} - - -class Map(object): - """The map class stores all the URL rules and some configuration - parameters. Some of the configuration values are only stored on the - `Map` instance since those affect all rules, others are just defaults - and can be overridden for each rule. Note that you have to specify all - arguments besides the `rules` as keyword arguments! - - :param rules: sequence of url rules for this map. - :param default_subdomain: The default subdomain for rules without a - subdomain defined. - :param charset: charset of the url. defaults to ``"utf-8"`` - :param strict_slashes: If a rule ends with a slash but the matched - URL does not, redirect to the URL with a trailing slash. - :param merge_slashes: Merge consecutive slashes when matching or - building URLs. Matches will redirect to the normalized URL. - Slashes in variable parts are not merged. - :param redirect_defaults: This will redirect to the default rule if it - wasn't visited that way. This helps creating - unique URLs. - :param converters: A dict of converters that adds additional converters - to the list of converters. If you redefine one - converter this will override the original one. - :param sort_parameters: If set to `True` the url parameters are sorted. - See `url_encode` for more details. - :param sort_key: The sort key function for `url_encode`. - :param encoding_errors: the error method to use for decoding - :param host_matching: if set to `True` it enables the host matching - feature and disables the subdomain one. If - enabled the `host` parameter to rules is used - instead of the `subdomain` one. - - .. versionchanged:: 1.0 - If ``url_scheme`` is ``ws`` or ``wss``, only WebSocket rules - will match. - - .. versionchanged:: 1.0 - Added ``merge_slashes``. - - .. versionchanged:: 0.7 - Added ``encoding_errors`` and ``host_matching``. - - .. versionchanged:: 0.5 - Added ``sort_parameters`` and ``sort_key``. - """ - - #: A dict of default converters to be used. - default_converters = ImmutableDict(DEFAULT_CONVERTERS) - - #: The type of lock to use when updating. - #: - #: .. versionadded:: 1.0 - lock_class = Lock - - def __init__( - self, - rules=None, - default_subdomain="", - charset="utf-8", - strict_slashes=True, - merge_slashes=True, - redirect_defaults=True, - converters=None, - sort_parameters=False, - sort_key=None, - encoding_errors="replace", - host_matching=False, - ): - self._rules = [] - self._rules_by_endpoint = {} - self._remap = True - self._remap_lock = self.lock_class() - - self.default_subdomain = default_subdomain - self.charset = charset - self.encoding_errors = encoding_errors - self.strict_slashes = strict_slashes - self.merge_slashes = merge_slashes - self.redirect_defaults = redirect_defaults - self.host_matching = host_matching - - self.converters = self.default_converters.copy() - if converters: - self.converters.update(converters) - - self.sort_parameters = sort_parameters - self.sort_key = sort_key - - for rulefactory in rules or (): - self.add(rulefactory) - - def is_endpoint_expecting(self, endpoint, *arguments): - """Iterate over all rules and check if the endpoint expects - the arguments provided. This is for example useful if you have - some URLs that expect a language code and others that do not and - you want to wrap the builder a bit so that the current language - code is automatically added if not provided but endpoints expect - it. - - :param endpoint: the endpoint to check. - :param arguments: this function accepts one or more arguments - as positional arguments. Each one of them is - checked. - """ - self.update() - arguments = set(arguments) - for rule in self._rules_by_endpoint[endpoint]: - if arguments.issubset(rule.arguments): - return True - return False - - def iter_rules(self, endpoint=None): - """Iterate over all rules or the rules of an endpoint. - - :param endpoint: if provided only the rules for that endpoint - are returned. - :return: an iterator - """ - self.update() - if endpoint is not None: - return iter(self._rules_by_endpoint[endpoint]) - return iter(self._rules) - - def add(self, rulefactory): - """Add a new rule or factory to the map and bind it. Requires that the - rule is not bound to another map. - - :param rulefactory: a :class:`Rule` or :class:`RuleFactory` - """ - for rule in rulefactory.get_rules(self): - rule.bind(self) - self._rules.append(rule) - self._rules_by_endpoint.setdefault(rule.endpoint, []).append(rule) - self._remap = True - - def bind( - self, - server_name, - script_name=None, - subdomain=None, - url_scheme="http", - default_method="GET", - path_info=None, - query_args=None, - ): - """Return a new :class:`MapAdapter` with the details specified to the - call. Note that `script_name` will default to ``'/'`` if not further - specified or `None`. The `server_name` at least is a requirement - because the HTTP RFC requires absolute URLs for redirects and so all - redirect exceptions raised by Werkzeug will contain the full canonical - URL. - - If no path_info is passed to :meth:`match` it will use the default path - info passed to bind. While this doesn't really make sense for - manual bind calls, it's useful if you bind a map to a WSGI - environment which already contains the path info. - - `subdomain` will default to the `default_subdomain` for this map if - no defined. If there is no `default_subdomain` you cannot use the - subdomain feature. - - .. versionchanged:: 1.0 - If ``url_scheme`` is ``ws`` or ``wss``, only WebSocket rules - will match. - - .. versionchanged:: 0.15 - ``path_info`` defaults to ``'/'`` if ``None``. - - .. versionchanged:: 0.8 - ``query_args`` can be a string. - - .. versionchanged:: 0.7 - Added ``query_args``. - """ - server_name = server_name.lower() - if self.host_matching: - if subdomain is not None: - raise RuntimeError("host matching enabled and a subdomain was provided") - elif subdomain is None: - subdomain = self.default_subdomain - if script_name is None: - script_name = "/" - if path_info is None: - path_info = "/" - try: - server_name = _encode_idna(server_name) - except UnicodeError: - raise BadHost() - return MapAdapter( - self, - server_name, - script_name, - subdomain, - url_scheme, - path_info, - default_method, - query_args, - ) - - def bind_to_environ(self, environ, server_name=None, subdomain=None): - """Like :meth:`bind` but you can pass it an WSGI environment and it - will fetch the information from that dictionary. Note that because of - limitations in the protocol there is no way to get the current - subdomain and real `server_name` from the environment. If you don't - provide it, Werkzeug will use `SERVER_NAME` and `SERVER_PORT` (or - `HTTP_HOST` if provided) as used `server_name` with disabled subdomain - feature. - - If `subdomain` is `None` but an environment and a server name is - provided it will calculate the current subdomain automatically. - Example: `server_name` is ``'example.com'`` and the `SERVER_NAME` - in the wsgi `environ` is ``'staging.dev.example.com'`` the calculated - subdomain will be ``'staging.dev'``. - - If the object passed as environ has an environ attribute, the value of - this attribute is used instead. This allows you to pass request - objects. Additionally `PATH_INFO` added as a default of the - :class:`MapAdapter` so that you don't have to pass the path info to - the match method. - - .. versionchanged:: 1.0.0 - If the passed server name specifies port 443, it will match - if the incoming scheme is ``https`` without a port. - - .. versionchanged:: 1.0.0 - A warning is shown when the passed server name does not - match the incoming WSGI server name. - - .. versionchanged:: 0.8 - This will no longer raise a ValueError when an unexpected server - name was passed. - - .. versionchanged:: 0.5 - previously this method accepted a bogus `calculate_subdomain` - parameter that did not have any effect. It was removed because - of that. - - :param environ: a WSGI environment. - :param server_name: an optional server name hint (see above). - :param subdomain: optionally the current subdomain (see above). - """ - environ = _get_environ(environ) - wsgi_server_name = get_host(environ).lower() - scheme = environ["wsgi.url_scheme"] - - if server_name is None: - server_name = wsgi_server_name - else: - server_name = server_name.lower() - - # strip standard port to match get_host() - if scheme == "http" and server_name.endswith(":80"): - server_name = server_name[:-3] - elif scheme == "https" and server_name.endswith(":443"): - server_name = server_name[:-4] - - if subdomain is None and not self.host_matching: - cur_server_name = wsgi_server_name.split(".") - real_server_name = server_name.split(".") - offset = -len(real_server_name) - - if cur_server_name[offset:] != real_server_name: - # This can happen even with valid configs if the server was - # accessed directly by IP address under some situations. - # Instead of raising an exception like in Werkzeug 0.7 or - # earlier we go by an invalid subdomain which will result - # in a 404 error on matching. - warnings.warn( - "Current server name '{}' doesn't match configured" - " server name '{}'".format(wsgi_server_name, server_name), - stacklevel=2, - ) - subdomain = "" - else: - subdomain = ".".join(filter(None, cur_server_name[:offset])) - - def _get_wsgi_string(name): - val = environ.get(name) - if val is not None: - return wsgi_decoding_dance(val, self.charset) - - script_name = _get_wsgi_string("SCRIPT_NAME") - path_info = _get_wsgi_string("PATH_INFO") - query_args = _get_wsgi_string("QUERY_STRING") - return Map.bind( - self, - server_name, - script_name, - subdomain, - scheme, - environ["REQUEST_METHOD"], - path_info, - query_args=query_args, - ) - - def update(self): - """Called before matching and building to keep the compiled rules - in the correct order after things changed. - """ - if not self._remap: - return - - with self._remap_lock: - if not self._remap: - return - - self._rules.sort(key=lambda x: x.match_compare_key()) - for rules in itervalues(self._rules_by_endpoint): - rules.sort(key=lambda x: x.build_compare_key()) - self._remap = False - - def __repr__(self): - rules = self.iter_rules() - return "%s(%s)" % (self.__class__.__name__, pformat(list(rules))) - - -class MapAdapter(object): - - """Returned by :meth:`Map.bind` or :meth:`Map.bind_to_environ` and does - the URL matching and building based on runtime information. - """ - - def __init__( - self, - map, - server_name, - script_name, - subdomain, - url_scheme, - path_info, - default_method, - query_args=None, - ): - self.map = map - self.server_name = to_unicode(server_name) - script_name = to_unicode(script_name) - if not script_name.endswith(u"/"): - script_name += u"/" - self.script_name = script_name - self.subdomain = to_unicode(subdomain) - self.url_scheme = to_unicode(url_scheme) - self.path_info = to_unicode(path_info) - self.default_method = to_unicode(default_method) - self.query_args = query_args - self.websocket = self.url_scheme in {"ws", "wss"} - - def dispatch( - self, view_func, path_info=None, method=None, catch_http_exceptions=False - ): - """Does the complete dispatching process. `view_func` is called with - the endpoint and a dict with the values for the view. It should - look up the view function, call it, and return a response object - or WSGI application. http exceptions are not caught by default - so that applications can display nicer error messages by just - catching them by hand. If you want to stick with the default - error messages you can pass it ``catch_http_exceptions=True`` and - it will catch the http exceptions. - - Here a small example for the dispatch usage:: - - from werkzeug.wrappers import Request, Response - from werkzeug.wsgi import responder - from werkzeug.routing import Map, Rule - - def on_index(request): - return Response('Hello from the index') - - url_map = Map([Rule('/', endpoint='index')]) - views = {'index': on_index} - - @responder - def application(environ, start_response): - request = Request(environ) - urls = url_map.bind_to_environ(environ) - return urls.dispatch(lambda e, v: views[e](request, **v), - catch_http_exceptions=True) - - Keep in mind that this method might return exception objects, too, so - use :class:`Response.force_type` to get a response object. - - :param view_func: a function that is called with the endpoint as - first argument and the value dict as second. Has - to dispatch to the actual view function with this - information. (see above) - :param path_info: the path info to use for matching. Overrides the - path info specified on binding. - :param method: the HTTP method used for matching. Overrides the - method specified on binding. - :param catch_http_exceptions: set to `True` to catch any of the - werkzeug :class:`HTTPException`\\s. - """ - try: - try: - endpoint, args = self.match(path_info, method) - except RequestRedirect as e: - return e - return view_func(endpoint, args) - except HTTPException as e: - if catch_http_exceptions: - return e - raise - - def match( - self, - path_info=None, - method=None, - return_rule=False, - query_args=None, - websocket=None, - ): - """The usage is simple: you just pass the match method the current - path info as well as the method (which defaults to `GET`). The - following things can then happen: - - - you receive a `NotFound` exception that indicates that no URL is - matching. A `NotFound` exception is also a WSGI application you - can call to get a default page not found page (happens to be the - same object as `werkzeug.exceptions.NotFound`) - - - you receive a `MethodNotAllowed` exception that indicates that there - is a match for this URL but not for the current request method. - This is useful for RESTful applications. - - - you receive a `RequestRedirect` exception with a `new_url` - attribute. This exception is used to notify you about a request - Werkzeug requests from your WSGI application. This is for example the - case if you request ``/foo`` although the correct URL is ``/foo/`` - You can use the `RequestRedirect` instance as response-like object - similar to all other subclasses of `HTTPException`. - - - you receive a ``WebsocketMismatch`` exception if the only - match is a WebSocket rule but the bind is an HTTP request, or - if the match is an HTTP rule but the bind is a WebSocket - request. - - - you get a tuple in the form ``(endpoint, arguments)`` if there is - a match (unless `return_rule` is True, in which case you get a tuple - in the form ``(rule, arguments)``) - - If the path info is not passed to the match method the default path - info of the map is used (defaults to the root URL if not defined - explicitly). - - All of the exceptions raised are subclasses of `HTTPException` so they - can be used as WSGI responses. They will all render generic error or - redirect pages. - - Here is a small example for matching: - - >>> m = Map([ - ... Rule('/', endpoint='index'), - ... Rule('/downloads/', endpoint='downloads/index'), - ... Rule('/downloads/', endpoint='downloads/show') - ... ]) - >>> urls = m.bind("example.com", "/") - >>> urls.match("/", "GET") - ('index', {}) - >>> urls.match("/downloads/42") - ('downloads/show', {'id': 42}) - - And here is what happens on redirect and missing URLs: - - >>> urls.match("/downloads") - Traceback (most recent call last): - ... - RequestRedirect: http://example.com/downloads/ - >>> urls.match("/missing") - Traceback (most recent call last): - ... - NotFound: 404 Not Found - - :param path_info: the path info to use for matching. Overrides the - path info specified on binding. - :param method: the HTTP method used for matching. Overrides the - method specified on binding. - :param return_rule: return the rule that matched instead of just the - endpoint (defaults to `False`). - :param query_args: optional query arguments that are used for - automatic redirects as string or dictionary. It's - currently not possible to use the query arguments - for URL matching. - :param websocket: Match WebSocket instead of HTTP requests. A - websocket request has a ``ws`` or ``wss`` - :attr:`url_scheme`. This overrides that detection. - - .. versionadded:: 1.0 - Added ``websocket``. - - .. versionchanged:: 0.8 - ``query_args`` can be a string. - - .. versionadded:: 0.7 - Added ``query_args``. - - .. versionadded:: 0.6 - Added ``return_rule``. - """ - self.map.update() - if path_info is None: - path_info = self.path_info - else: - path_info = to_unicode(path_info, self.map.charset) - if query_args is None: - query_args = self.query_args - method = (method or self.default_method).upper() - - if websocket is None: - websocket = self.websocket - - require_redirect = False - - path = u"%s|%s" % ( - self.map.host_matching and self.server_name or self.subdomain, - path_info and "/%s" % path_info.lstrip("/"), - ) - - have_match_for = set() - websocket_mismatch = False - - for rule in self.map._rules: - try: - rv = rule.match(path, method) - except RequestPath as e: - raise RequestRedirect( - self.make_redirect_url( - url_quote(e.path_info, self.map.charset, safe="/:|+"), - query_args, - ) - ) - except RequestAliasRedirect as e: - raise RequestRedirect( - self.make_alias_redirect_url( - path, rule.endpoint, e.matched_values, method, query_args - ) - ) - if rv is None: - continue - if rule.methods is not None and method not in rule.methods: - have_match_for.update(rule.methods) - continue - - if rule.websocket != websocket: - websocket_mismatch = True - continue - - if self.map.redirect_defaults: - redirect_url = self.get_default_redirect(rule, method, rv, query_args) - if redirect_url is not None: - raise RequestRedirect(redirect_url) - - if rule.redirect_to is not None: - if isinstance(rule.redirect_to, string_types): - - def _handle_match(match): - value = rv[match.group(1)] - return rule._converters[match.group(1)].to_url(value) - - redirect_url = _simple_rule_re.sub(_handle_match, rule.redirect_to) - else: - redirect_url = rule.redirect_to(self, **rv) - raise RequestRedirect( - str( - url_join( - "%s://%s%s%s" - % ( - self.url_scheme or "http", - self.subdomain + "." if self.subdomain else "", - self.server_name, - self.script_name, - ), - redirect_url, - ) - ) - ) - - if require_redirect: - raise RequestRedirect( - self.make_redirect_url( - url_quote(path_info, self.map.charset, safe="/:|+"), query_args - ) - ) - - if return_rule: - return rule, rv - else: - return rule.endpoint, rv - - if have_match_for: - raise MethodNotAllowed(valid_methods=list(have_match_for)) - - if websocket_mismatch: - raise WebsocketMismatch() - - raise NotFound() - - def test(self, path_info=None, method=None): - """Test if a rule would match. Works like `match` but returns `True` - if the URL matches, or `False` if it does not exist. - - :param path_info: the path info to use for matching. Overrides the - path info specified on binding. - :param method: the HTTP method used for matching. Overrides the - method specified on binding. - """ - try: - self.match(path_info, method) - except RequestRedirect: - pass - except HTTPException: - return False - return True - - def allowed_methods(self, path_info=None): - """Returns the valid methods that match for a given path. - - .. versionadded:: 0.7 - """ - try: - self.match(path_info, method="--") - except MethodNotAllowed as e: - return e.valid_methods - except HTTPException: - pass - return [] - - def get_host(self, domain_part): - """Figures out the full host name for the given domain part. The - domain part is a subdomain in case host matching is disabled or - a full host name. - """ - if self.map.host_matching: - if domain_part is None: - return self.server_name - return to_unicode(domain_part, "ascii") - subdomain = domain_part - if subdomain is None: - subdomain = self.subdomain - else: - subdomain = to_unicode(subdomain, "ascii") - return (subdomain + u"." if subdomain else u"") + self.server_name - - def get_default_redirect(self, rule, method, values, query_args): - """A helper that returns the URL to redirect to if it finds one. - This is used for default redirecting only. - - :internal: - """ - assert self.map.redirect_defaults - for r in self.map._rules_by_endpoint[rule.endpoint]: - # every rule that comes after this one, including ourself - # has a lower priority for the defaults. We order the ones - # with the highest priority up for building. - if r is rule: - break - if r.provides_defaults_for(rule) and r.suitable_for(values, method): - values.update(r.defaults) - domain_part, path = r.build(values) - return self.make_redirect_url(path, query_args, domain_part=domain_part) - - def encode_query_args(self, query_args): - if not isinstance(query_args, string_types): - query_args = url_encode(query_args, self.map.charset) - return query_args - - def make_redirect_url(self, path_info, query_args=None, domain_part=None): - """Creates a redirect URL. - - :internal: - """ - suffix = "" - if query_args: - suffix = "?" + self.encode_query_args(query_args) - return str( - "%s://%s/%s%s" - % ( - self.url_scheme or "http", - self.get_host(domain_part), - posixpath.join( - self.script_name[:-1].lstrip("/"), path_info.lstrip("/") - ), - suffix, - ) - ) - - def make_alias_redirect_url(self, path, endpoint, values, method, query_args): - """Internally called to make an alias redirect URL.""" - url = self.build( - endpoint, values, method, append_unknown=False, force_external=True - ) - if query_args: - url += "?" + self.encode_query_args(query_args) - assert url != path, "detected invalid alias setting. No canonical URL found" - return url - - def _partial_build(self, endpoint, values, method, append_unknown): - """Helper for :meth:`build`. Returns subdomain and path for the - rule that accepts this endpoint, values and method. - - :internal: - """ - # in case the method is none, try with the default method first - if method is None: - rv = self._partial_build( - endpoint, values, self.default_method, append_unknown - ) - if rv is not None: - return rv - - # Default method did not match or a specific method is passed. - # Check all for first match with matching host. If no matching - # host is found, go with first result. - first_match = None - - for rule in self.map._rules_by_endpoint.get(endpoint, ()): - if rule.suitable_for(values, method): - rv = rule.build(values, append_unknown) - - if rv is not None: - rv = (rv[0], rv[1], rule.websocket) - if self.map.host_matching: - if rv[0] == self.server_name: - return rv - elif first_match is None: - first_match = rv - else: - return rv - - return first_match - - def build( - self, - endpoint, - values=None, - method=None, - force_external=False, - append_unknown=True, - ): - """Building URLs works pretty much the other way round. Instead of - `match` you call `build` and pass it the endpoint and a dict of - arguments for the placeholders. - - The `build` function also accepts an argument called `force_external` - which, if you set it to `True` will force external URLs. Per default - external URLs (include the server name) will only be used if the - target URL is on a different subdomain. - - >>> m = Map([ - ... Rule('/', endpoint='index'), - ... Rule('/downloads/', endpoint='downloads/index'), - ... Rule('/downloads/', endpoint='downloads/show') - ... ]) - >>> urls = m.bind("example.com", "/") - >>> urls.build("index", {}) - '/' - >>> urls.build("downloads/show", {'id': 42}) - '/downloads/42' - >>> urls.build("downloads/show", {'id': 42}, force_external=True) - 'http://example.com/downloads/42' - - Because URLs cannot contain non ASCII data you will always get - bytestrings back. Non ASCII characters are urlencoded with the - charset defined on the map instance. - - Additional values are converted to unicode and appended to the URL as - URL querystring parameters: - - >>> urls.build("index", {'q': 'My Searchstring'}) - '/?q=My+Searchstring' - - When processing those additional values, lists are furthermore - interpreted as multiple values (as per - :py:class:`werkzeug.datastructures.MultiDict`): - - >>> urls.build("index", {'q': ['a', 'b', 'c']}) - '/?q=a&q=b&q=c' - - Passing a ``MultiDict`` will also add multiple values: - - >>> urls.build("index", MultiDict((('p', 'z'), ('q', 'a'), ('q', 'b')))) - '/?p=z&q=a&q=b' - - If a rule does not exist when building a `BuildError` exception is - raised. - - The build method accepts an argument called `method` which allows you - to specify the method you want to have an URL built for if you have - different methods for the same endpoint specified. - - .. versionadded:: 0.6 - the `append_unknown` parameter was added. - - :param endpoint: the endpoint of the URL to build. - :param values: the values for the URL to build. Unhandled values are - appended to the URL as query parameters. - :param method: the HTTP method for the rule if there are different - URLs for different methods on the same endpoint. - :param force_external: enforce full canonical external URLs. If the URL - scheme is not provided, this will generate - a protocol-relative URL. - :param append_unknown: unknown parameters are appended to the generated - URL as query string argument. Disable this - if you want the builder to ignore those. - """ - self.map.update() - - if values: - if isinstance(values, MultiDict): - temp_values = {} - # iteritems(dict, values) is like `values.lists()` - # without the call or `list()` coercion overhead. - for key, value in iteritems(dict, values): - if not value: - continue - if len(value) == 1: # flatten single item lists - value = value[0] - if value is None: # drop None - continue - temp_values[key] = value - values = temp_values - else: - # drop None - values = dict(i for i in iteritems(values) if i[1] is not None) - else: - values = {} - - rv = self._partial_build(endpoint, values, method, append_unknown) - if rv is None: - raise BuildError(endpoint, values, method, self) - - domain_part, path, websocket = rv - host = self.get_host(domain_part) - - # Always build WebSocket routes with the scheme (browsers - # require full URLs). If bound to a WebSocket, ensure that HTTP - # routes are built with an HTTP scheme. - url_scheme = self.url_scheme - secure = url_scheme in {"https", "wss"} - - if websocket: - force_external = True - url_scheme = "wss" if secure else "ws" - elif url_scheme: - url_scheme = "https" if secure else "http" - - # shortcut this. - if not force_external and ( - (self.map.host_matching and host == self.server_name) - or (not self.map.host_matching and domain_part == self.subdomain) - ): - return "%s/%s" % (self.script_name.rstrip("/"), path.lstrip("/")) - return str( - "%s//%s%s/%s" - % ( - url_scheme + ":" if url_scheme else "", - host, - self.script_name[:-1], - path.lstrip("/"), - ) - ) diff --git a/venv/lib/python3.7/site-packages/werkzeug/security.py b/venv/lib/python3.7/site-packages/werkzeug/security.py deleted file mode 100644 index 2308040..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/security.py +++ /dev/null @@ -1,249 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.security - ~~~~~~~~~~~~~~~~~ - - Security related helpers such as secure password hashing tools. - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import codecs -import hashlib -import hmac -import os -import posixpath -from random import SystemRandom -from struct import Struct - -from ._compat import izip -from ._compat import PY2 -from ._compat import range_type -from ._compat import text_type -from ._compat import to_bytes -from ._compat import to_native - -SALT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" -DEFAULT_PBKDF2_ITERATIONS = 150000 - -_pack_int = Struct(">I").pack -_builtin_safe_str_cmp = getattr(hmac, "compare_digest", None) -_sys_rng = SystemRandom() -_os_alt_seps = list( - sep for sep in [os.path.sep, os.path.altsep] if sep not in (None, "/") -) - - -def pbkdf2_hex( - data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS, keylen=None, hashfunc=None -): - """Like :func:`pbkdf2_bin`, but returns a hex-encoded string. - - .. versionadded:: 0.9 - - :param data: the data to derive. - :param salt: the salt for the derivation. - :param iterations: the number of iterations. - :param keylen: the length of the resulting key. If not provided, - the digest size will be used. - :param hashfunc: the hash function to use. This can either be the - string name of a known hash function, or a function - from the hashlib module. Defaults to sha256. - """ - rv = pbkdf2_bin(data, salt, iterations, keylen, hashfunc) - return to_native(codecs.encode(rv, "hex_codec")) - - -def pbkdf2_bin( - data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS, keylen=None, hashfunc=None -): - """Returns a binary digest for the PBKDF2 hash algorithm of `data` - with the given `salt`. It iterates `iterations` times and produces a - key of `keylen` bytes. By default, SHA-256 is used as hash function; - a different hashlib `hashfunc` can be provided. - - .. versionadded:: 0.9 - - :param data: the data to derive. - :param salt: the salt for the derivation. - :param iterations: the number of iterations. - :param keylen: the length of the resulting key. If not provided - the digest size will be used. - :param hashfunc: the hash function to use. This can either be the - string name of a known hash function or a function - from the hashlib module. Defaults to sha256. - """ - if not hashfunc: - hashfunc = "sha256" - - data = to_bytes(data) - salt = to_bytes(salt) - - if callable(hashfunc): - _test_hash = hashfunc() - hash_name = getattr(_test_hash, "name", None) - else: - hash_name = hashfunc - return hashlib.pbkdf2_hmac(hash_name, data, salt, iterations, keylen) - - -def safe_str_cmp(a, b): - """This function compares strings in somewhat constant time. This - requires that the length of at least one string is known in advance. - - Returns `True` if the two strings are equal, or `False` if they are not. - - .. versionadded:: 0.7 - """ - if isinstance(a, text_type): - a = a.encode("utf-8") - if isinstance(b, text_type): - b = b.encode("utf-8") - - if _builtin_safe_str_cmp is not None: - return _builtin_safe_str_cmp(a, b) - - if len(a) != len(b): - return False - - rv = 0 - if PY2: - for x, y in izip(a, b): - rv |= ord(x) ^ ord(y) - else: - for x, y in izip(a, b): - rv |= x ^ y - - return rv == 0 - - -def gen_salt(length): - """Generate a random string of SALT_CHARS with specified ``length``.""" - if length <= 0: - raise ValueError("Salt length must be positive") - return "".join(_sys_rng.choice(SALT_CHARS) for _ in range_type(length)) - - -def _hash_internal(method, salt, password): - """Internal password hash helper. Supports plaintext without salt, - unsalted and salted passwords. In case salted passwords are used - hmac is used. - """ - if method == "plain": - return password, method - - if isinstance(password, text_type): - password = password.encode("utf-8") - - if method.startswith("pbkdf2:"): - args = method[7:].split(":") - if len(args) not in (1, 2): - raise ValueError("Invalid number of arguments for PBKDF2") - method = args.pop(0) - iterations = args and int(args[0] or 0) or DEFAULT_PBKDF2_ITERATIONS - is_pbkdf2 = True - actual_method = "pbkdf2:%s:%d" % (method, iterations) - else: - is_pbkdf2 = False - actual_method = method - - if is_pbkdf2: - if not salt: - raise ValueError("Salt is required for PBKDF2") - rv = pbkdf2_hex(password, salt, iterations, hashfunc=method) - elif salt: - if isinstance(salt, text_type): - salt = salt.encode("utf-8") - mac = _create_mac(salt, password, method) - rv = mac.hexdigest() - else: - rv = hashlib.new(method, password).hexdigest() - return rv, actual_method - - -def _create_mac(key, msg, method): - if callable(method): - return hmac.HMAC(key, msg, method) - - def hashfunc(d=b""): - return hashlib.new(method, d) - - # Python 2.7 used ``hasattr(digestmod, '__call__')`` - # to detect if hashfunc is callable - hashfunc.__call__ = hashfunc - return hmac.HMAC(key, msg, hashfunc) - - -def generate_password_hash(password, method="pbkdf2:sha256", salt_length=8): - """Hash a password with the given method and salt with a string of - the given length. The format of the string returned includes the method - that was used so that :func:`check_password_hash` can check the hash. - - The format for the hashed string looks like this:: - - method$salt$hash - - This method can **not** generate unsalted passwords but it is possible - to set param method='plain' in order to enforce plaintext passwords. - If a salt is used, hmac is used internally to salt the password. - - If PBKDF2 is wanted it can be enabled by setting the method to - ``pbkdf2:method:iterations`` where iterations is optional:: - - pbkdf2:sha256:80000$salt$hash - pbkdf2:sha256$salt$hash - - :param password: the password to hash. - :param method: the hash method to use (one that hashlib supports). Can - optionally be in the format ``pbkdf2:[:iterations]`` - to enable PBKDF2. - :param salt_length: the length of the salt in letters. - """ - salt = gen_salt(salt_length) if method != "plain" else "" - h, actual_method = _hash_internal(method, salt, password) - return "%s$%s$%s" % (actual_method, salt, h) - - -def check_password_hash(pwhash, password): - """check a password against a given salted and hashed password value. - In order to support unsalted legacy passwords this method supports - plain text passwords, md5 and sha1 hashes (both salted and unsalted). - - Returns `True` if the password matched, `False` otherwise. - - :param pwhash: a hashed string like returned by - :func:`generate_password_hash`. - :param password: the plaintext password to compare against the hash. - """ - if pwhash.count("$") < 2: - return False - method, salt, hashval = pwhash.split("$", 2) - return safe_str_cmp(_hash_internal(method, salt, password)[0], hashval) - - -def safe_join(directory, *pathnames): - """Safely join zero or more untrusted path components to a base - directory to avoid escaping the base directory. - - :param directory: The trusted base directory. - :param pathnames: The untrusted path components relative to the - base directory. - :return: A safe path, otherwise ``None``. - """ - parts = [directory] - - for filename in pathnames: - if filename != "": - filename = posixpath.normpath(filename) - - if ( - any(sep in filename for sep in _os_alt_seps) - or os.path.isabs(filename) - or filename == ".." - or filename.startswith("../") - ): - return None - - parts.append(filename) - - return posixpath.join(*parts) diff --git a/venv/lib/python3.7/site-packages/werkzeug/serving.py b/venv/lib/python3.7/site-packages/werkzeug/serving.py deleted file mode 100644 index f2a0dc9..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/serving.py +++ /dev/null @@ -1,1117 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.serving - ~~~~~~~~~~~~~~~~ - - There are many ways to serve a WSGI application. While you're developing - it you usually don't want a full blown webserver like Apache but a simple - standalone one. From Python 2.5 onwards there is the `wsgiref`_ server in - the standard library. If you're using older versions of Python you can - download the package from the cheeseshop. - - However there are some caveats. Sourcecode won't reload itself when - changed and each time you kill the server using ``^C`` you get an - `KeyboardInterrupt` error. While the latter is easy to solve the first - one can be a pain in the ass in some situations. - - The easiest way is creating a small ``start-myproject.py`` that runs the - application:: - - #!/usr/bin/env python - # -*- coding: utf-8 -*- - from myproject import make_app - from werkzeug.serving import run_simple - - app = make_app(...) - run_simple('localhost', 8080, app, use_reloader=True) - - You can also pass it a `extra_files` keyword argument with a list of - additional files (like configuration files) you want to observe. - - For bigger applications you should consider using `click` - (http://click.pocoo.org) instead of a simple start file. - - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import io -import os -import signal -import socket -import sys -from datetime import datetime as dt -from datetime import timedelta - -from ._compat import PY2 -from ._compat import reraise -from ._compat import WIN -from ._compat import wsgi_encoding_dance -from ._internal import _log -from .exceptions import InternalServerError -from .urls import uri_to_iri -from .urls import url_parse -from .urls import url_unquote - -try: - import socketserver - from http.server import BaseHTTPRequestHandler - from http.server import HTTPServer -except ImportError: - import SocketServer as socketserver - from BaseHTTPServer import HTTPServer - from BaseHTTPServer import BaseHTTPRequestHandler - -try: - import ssl -except ImportError: - - class _SslDummy(object): - def __getattr__(self, name): - raise RuntimeError("SSL support unavailable") - - ssl = _SslDummy() - -try: - import click -except ImportError: - click = None - - -ThreadingMixIn = socketserver.ThreadingMixIn -can_fork = hasattr(os, "fork") - -if can_fork: - ForkingMixIn = socketserver.ForkingMixIn -else: - - class ForkingMixIn(object): - pass - - -try: - af_unix = socket.AF_UNIX -except AttributeError: - af_unix = None - - -LISTEN_QUEUE = 128 -can_open_by_fd = not WIN and hasattr(socket, "fromfd") - -# On Python 3, ConnectionError represents the same errnos as -# socket.error from Python 2, while socket.error is an alias for the -# more generic OSError. -if PY2: - _ConnectionError = socket.error -else: - _ConnectionError = ConnectionError - - -class DechunkedInput(io.RawIOBase): - """An input stream that handles Transfer-Encoding 'chunked'""" - - def __init__(self, rfile): - self._rfile = rfile - self._done = False - self._len = 0 - - def readable(self): - return True - - def read_chunk_len(self): - try: - line = self._rfile.readline().decode("latin1") - _len = int(line.strip(), 16) - except ValueError: - raise IOError("Invalid chunk header") - if _len < 0: - raise IOError("Negative chunk length not allowed") - return _len - - def readinto(self, buf): - read = 0 - while not self._done and read < len(buf): - if self._len == 0: - # This is the first chunk or we fully consumed the previous - # one. Read the next length of the next chunk - self._len = self.read_chunk_len() - - if self._len == 0: - # Found the final chunk of size 0. The stream is now exhausted, - # but there is still a final newline that should be consumed - self._done = True - - if self._len > 0: - # There is data (left) in this chunk, so append it to the - # buffer. If this operation fully consumes the chunk, this will - # reset self._len to 0. - n = min(len(buf), self._len) - buf[read : read + n] = self._rfile.read(n) - self._len -= n - read += n - - if self._len == 0: - # Skip the terminating newline of a chunk that has been fully - # consumed. This also applies to the 0-sized final chunk - terminator = self._rfile.readline() - if terminator not in (b"\n", b"\r\n", b"\r"): - raise IOError("Missing chunk terminating newline") - - return read - - -class WSGIRequestHandler(BaseHTTPRequestHandler, object): - - """A request handler that implements WSGI dispatching.""" - - @property - def server_version(self): - from . import __version__ - - return "Werkzeug/" + __version__ - - def make_environ(self): - request_url = url_parse(self.path) - - def shutdown_server(): - self.server.shutdown_signal = True - - url_scheme = "http" if self.server.ssl_context is None else "https" - if not self.client_address: - self.client_address = "" - if isinstance(self.client_address, str): - self.client_address = (self.client_address, 0) - else: - pass - - # If there was no scheme but the path started with two slashes, - # the first segment may have been incorrectly parsed as the - # netloc, prepend it to the path again. - if not request_url.scheme and request_url.netloc: - path_info = "/%s%s" % (request_url.netloc, request_url.path) - else: - path_info = request_url.path - - path_info = url_unquote(path_info) - - environ = { - "wsgi.version": (1, 0), - "wsgi.url_scheme": url_scheme, - "wsgi.input": self.rfile, - "wsgi.errors": sys.stderr, - "wsgi.multithread": self.server.multithread, - "wsgi.multiprocess": self.server.multiprocess, - "wsgi.run_once": False, - "werkzeug.server.shutdown": shutdown_server, - "SERVER_SOFTWARE": self.server_version, - "REQUEST_METHOD": self.command, - "SCRIPT_NAME": "", - "PATH_INFO": wsgi_encoding_dance(path_info), - "QUERY_STRING": wsgi_encoding_dance(request_url.query), - # Non-standard, added by mod_wsgi, uWSGI - "REQUEST_URI": wsgi_encoding_dance(self.path), - # Non-standard, added by gunicorn - "RAW_URI": wsgi_encoding_dance(self.path), - "REMOTE_ADDR": self.address_string(), - "REMOTE_PORT": self.port_integer(), - "SERVER_NAME": self.server.server_address[0], - "SERVER_PORT": str(self.server.server_address[1]), - "SERVER_PROTOCOL": self.request_version, - } - - for key, value in self.get_header_items(): - key = key.upper().replace("-", "_") - value = value.replace("\r\n", "") - if key not in ("CONTENT_TYPE", "CONTENT_LENGTH"): - key = "HTTP_" + key - if key in environ: - value = "{},{}".format(environ[key], value) - environ[key] = value - - if environ.get("HTTP_TRANSFER_ENCODING", "").strip().lower() == "chunked": - environ["wsgi.input_terminated"] = True - environ["wsgi.input"] = DechunkedInput(environ["wsgi.input"]) - - # Per RFC 2616, if the URL is absolute, use that as the host. - # We're using "has a scheme" to indicate an absolute URL. - if request_url.scheme and request_url.netloc: - environ["HTTP_HOST"] = request_url.netloc - - try: - # binary_form=False gives nicer information, but wouldn't be compatible with - # what Nginx or Apache could return. - peer_cert = self.connection.getpeercert(binary_form=True) - if peer_cert is not None: - # Nginx and Apache use PEM format. - environ["SSL_CLIENT_CERT"] = ssl.DER_cert_to_PEM_cert(peer_cert) - except ValueError: - # SSL handshake hasn't finished. - self.server.log("error", "Cannot fetch SSL peer certificate info") - except AttributeError: - # Not using TLS, the socket will not have getpeercert(). - pass - - return environ - - def run_wsgi(self): - if self.headers.get("Expect", "").lower().strip() == "100-continue": - self.wfile.write(b"HTTP/1.1 100 Continue\r\n\r\n") - - self.environ = environ = self.make_environ() - headers_set = [] - headers_sent = [] - - def write(data): - assert headers_set, "write() before start_response" - if not headers_sent: - status, response_headers = headers_sent[:] = headers_set - try: - code, msg = status.split(None, 1) - except ValueError: - code, msg = status, "" - code = int(code) - self.send_response(code, msg) - header_keys = set() - for key, value in response_headers: - self.send_header(key, value) - key = key.lower() - header_keys.add(key) - if not ( - "content-length" in header_keys - or environ["REQUEST_METHOD"] == "HEAD" - or code < 200 - or code in (204, 304) - ): - self.close_connection = True - self.send_header("Connection", "close") - if "server" not in header_keys: - self.send_header("Server", self.version_string()) - if "date" not in header_keys: - self.send_header("Date", self.date_time_string()) - self.end_headers() - - assert isinstance(data, bytes), "applications must write bytes" - if data: - # Only write data if there is any to avoid Python 3.5 SSL bug - self.wfile.write(data) - self.wfile.flush() - - def start_response(status, response_headers, exc_info=None): - if exc_info: - try: - if headers_sent: - reraise(*exc_info) - finally: - exc_info = None - elif headers_set: - raise AssertionError("Headers already set") - headers_set[:] = [status, response_headers] - return write - - def execute(app): - application_iter = app(environ, start_response) - try: - for data in application_iter: - write(data) - if not headers_sent: - write(b"") - finally: - if hasattr(application_iter, "close"): - application_iter.close() - - try: - execute(self.server.app) - except (_ConnectionError, socket.timeout) as e: - self.connection_dropped(e, environ) - except Exception: - if self.server.passthrough_errors: - raise - from .debug.tbtools import get_current_traceback - - traceback = get_current_traceback(ignore_system_exceptions=True) - try: - # if we haven't yet sent the headers but they are set - # we roll back to be able to set them again. - if not headers_sent: - del headers_set[:] - execute(InternalServerError()) - except Exception: - pass - self.server.log("error", "Error on request:\n%s", traceback.plaintext) - - def handle(self): - """Handles a request ignoring dropped connections.""" - try: - BaseHTTPRequestHandler.handle(self) - except (_ConnectionError, socket.timeout) as e: - self.connection_dropped(e) - except Exception as e: - if self.server.ssl_context is None or not is_ssl_error(e): - raise - if self.server.shutdown_signal: - self.initiate_shutdown() - - def initiate_shutdown(self): - """A horrible, horrible way to kill the server for Python 2.6 and - later. It's the best we can do. - """ - # Windows does not provide SIGKILL, go with SIGTERM then. - sig = getattr(signal, "SIGKILL", signal.SIGTERM) - # reloader active - if is_running_from_reloader(): - os.kill(os.getpid(), sig) - # python 2.7 - self.server._BaseServer__shutdown_request = True - # python 2.6 - self.server._BaseServer__serving = False - - def connection_dropped(self, error, environ=None): - """Called if the connection was closed by the client. By default - nothing happens. - """ - - def handle_one_request(self): - """Handle a single HTTP request.""" - self.raw_requestline = self.rfile.readline() - if not self.raw_requestline: - self.close_connection = 1 - elif self.parse_request(): - return self.run_wsgi() - - def send_response(self, code, message=None): - """Send the response header and log the response code.""" - self.log_request(code) - if message is None: - message = code in self.responses and self.responses[code][0] or "" - if self.request_version != "HTTP/0.9": - hdr = "%s %d %s\r\n" % (self.protocol_version, code, message) - self.wfile.write(hdr.encode("ascii")) - - def version_string(self): - return BaseHTTPRequestHandler.version_string(self).strip() - - def address_string(self): - if getattr(self, "environ", None): - return self.environ["REMOTE_ADDR"] - elif not self.client_address: - return "" - elif isinstance(self.client_address, str): - return self.client_address - else: - return self.client_address[0] - - def port_integer(self): - return self.client_address[1] - - def log_request(self, code="-", size="-"): - try: - path = uri_to_iri(self.path) - msg = "%s %s %s" % (self.command, path, self.request_version) - except AttributeError: - # path isn't set if the requestline was bad - msg = self.requestline - - code = str(code) - - if click: - color = click.style - - if code[0] == "1": # 1xx - Informational - msg = color(msg, bold=True) - elif code[0] == "2": # 2xx - Success - msg = color(msg, fg="white") - elif code == "304": # 304 - Resource Not Modified - msg = color(msg, fg="cyan") - elif code[0] == "3": # 3xx - Redirection - msg = color(msg, fg="green") - elif code == "404": # 404 - Resource Not Found - msg = color(msg, fg="yellow") - elif code[0] == "4": # 4xx - Client Error - msg = color(msg, fg="red", bold=True) - else: # 5xx, or any other response - msg = color(msg, fg="magenta", bold=True) - - self.log("info", '"%s" %s %s', msg, code, size) - - def log_error(self, *args): - self.log("error", *args) - - def log_message(self, format, *args): - self.log("info", format, *args) - - def log(self, type, message, *args): - _log( - type, - "%s - - [%s] %s\n" - % (self.address_string(), self.log_date_time_string(), message % args), - ) - - def get_header_items(self): - """ - Get an iterable list of key/value pairs representing headers. - - This function provides Python 2/3 compatibility as related to the - parsing of request headers. Python 2.7 is not compliant with - RFC 3875 Section 4.1.18 which requires multiple values for headers - to be provided or RFC 2616 which allows for folding of multi-line - headers. This function will return a matching list regardless - of Python version. It can be removed once Python 2.7 support - is dropped. - - :return: List of tuples containing header hey/value pairs - """ - if PY2: - # For Python 2, process the headers manually according to - # W3C RFC 2616 Section 4.2. - items = [] - for header in self.headers.headers: - # Remove "\r\n" from the header and split on ":" to get - # the field name and value. - try: - key, value = header[0:-2].split(":", 1) - except ValueError: - # If header could not be slit with : but starts with white - # space and it follows an existing header, it's a folded - # header. - if header[0] in ("\t", " ") and items: - # Pop off the last header - key, value = items.pop() - # Append the current header to the value of the last - # header which will be placed back on the end of the - # list - value = value + header - # Otherwise it's just a bad header and should error - else: - # Re-raise the value error - raise - - # Add the key and the value once stripped of leading - # white space. The specification allows for stripping - # trailing white space but the Python 3 code does not - # strip trailing white space. Therefore, trailing space - # will be left as is to match the Python 3 behavior. - items.append((key, value.lstrip())) - else: - items = self.headers.items() - - return items - - -#: backwards compatible name if someone is subclassing it -BaseRequestHandler = WSGIRequestHandler - - -def generate_adhoc_ssl_pair(cn=None): - try: - from cryptography import x509 - from cryptography.x509.oid import NameOID - from cryptography.hazmat.backends import default_backend - from cryptography.hazmat.primitives import hashes - from cryptography.hazmat.primitives.asymmetric import rsa - except ImportError: - raise TypeError("Using ad-hoc certificates requires the cryptography library.") - pkey = rsa.generate_private_key( - public_exponent=65537, key_size=2048, backend=default_backend() - ) - - # pretty damn sure that this is not actually accepted by anyone - if cn is None: - cn = u"*" - - subject = x509.Name( - [ - x509.NameAttribute(NameOID.ORGANIZATION_NAME, u"Dummy Certificate"), - x509.NameAttribute(NameOID.COMMON_NAME, cn), - ] - ) - - cert = ( - x509.CertificateBuilder() - .subject_name(subject) - .issuer_name(subject) - .public_key(pkey.public_key()) - .serial_number(x509.random_serial_number()) - .not_valid_before(dt.utcnow()) - .not_valid_after(dt.utcnow() + timedelta(days=365)) - .add_extension(x509.ExtendedKeyUsage([x509.OID_SERVER_AUTH]), critical=False) - .add_extension( - x509.SubjectAlternativeName([x509.DNSName(u"*")]), critical=False - ) - .sign(pkey, hashes.SHA256(), default_backend()) - ) - return cert, pkey - - -def make_ssl_devcert(base_path, host=None, cn=None): - """Creates an SSL key for development. This should be used instead of - the ``'adhoc'`` key which generates a new cert on each server start. - It accepts a path for where it should store the key and cert and - either a host or CN. If a host is given it will use the CN - ``*.host/CN=host``. - - For more information see :func:`run_simple`. - - .. versionadded:: 0.9 - - :param base_path: the path to the certificate and key. The extension - ``.crt`` is added for the certificate, ``.key`` is - added for the key. - :param host: the name of the host. This can be used as an alternative - for the `cn`. - :param cn: the `CN` to use. - """ - - if host is not None: - cn = u"*.%s/CN=%s" % (host, host) - cert, pkey = generate_adhoc_ssl_pair(cn=cn) - - from cryptography.hazmat.primitives import serialization - - cert_file = base_path + ".crt" - pkey_file = base_path + ".key" - - with open(cert_file, "wb") as f: - f.write(cert.public_bytes(serialization.Encoding.PEM)) - with open(pkey_file, "wb") as f: - f.write( - pkey.private_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PrivateFormat.TraditionalOpenSSL, - encryption_algorithm=serialization.NoEncryption(), - ) - ) - - return cert_file, pkey_file - - -def generate_adhoc_ssl_context(): - """Generates an adhoc SSL context for the development server.""" - import tempfile - import atexit - - cert, pkey = generate_adhoc_ssl_pair() - - from cryptography.hazmat.primitives import serialization - - cert_handle, cert_file = tempfile.mkstemp() - pkey_handle, pkey_file = tempfile.mkstemp() - atexit.register(os.remove, pkey_file) - atexit.register(os.remove, cert_file) - - os.write(cert_handle, cert.public_bytes(serialization.Encoding.PEM)) - os.write( - pkey_handle, - pkey.private_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PrivateFormat.TraditionalOpenSSL, - encryption_algorithm=serialization.NoEncryption(), - ), - ) - - os.close(cert_handle) - os.close(pkey_handle) - ctx = load_ssl_context(cert_file, pkey_file) - return ctx - - -def load_ssl_context(cert_file, pkey_file=None, protocol=None): - """Loads SSL context from cert/private key files and optional protocol. - Many parameters are directly taken from the API of - :py:class:`ssl.SSLContext`. - - :param cert_file: Path of the certificate to use. - :param pkey_file: Path of the private key to use. If not given, the key - will be obtained from the certificate file. - :param protocol: One of the ``PROTOCOL_*`` constants in the stdlib ``ssl`` - module. Defaults to ``PROTOCOL_SSLv23``. - """ - if protocol is None: - try: - protocol = ssl.PROTOCOL_TLS_SERVER - except AttributeError: - # Python <= 3.5 compat - protocol = ssl.PROTOCOL_SSLv23 - ctx = _SSLContext(protocol) - ctx.load_cert_chain(cert_file, pkey_file) - return ctx - - -class _SSLContext(object): - - """A dummy class with a small subset of Python3's ``ssl.SSLContext``, only - intended to be used with and by Werkzeug.""" - - def __init__(self, protocol): - self._protocol = protocol - self._certfile = None - self._keyfile = None - self._password = None - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._certfile = certfile - self._keyfile = keyfile or certfile - self._password = password - - def wrap_socket(self, sock, **kwargs): - return ssl.wrap_socket( - sock, - keyfile=self._keyfile, - certfile=self._certfile, - ssl_version=self._protocol, - **kwargs - ) - - -def is_ssl_error(error=None): - """Checks if the given error (or the current one) is an SSL error.""" - if error is None: - error = sys.exc_info()[1] - return isinstance(error, ssl.SSLError) - - -def select_address_family(host, port): - """Return ``AF_INET4``, ``AF_INET6``, or ``AF_UNIX`` depending on - the host and port.""" - # disabled due to problems with current ipv6 implementations - # and various operating systems. Probably this code also is - # not supposed to work, but I can't come up with any other - # ways to implement this. - # try: - # info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, - # socket.SOCK_STREAM, 0, - # socket.AI_PASSIVE) - # if info: - # return info[0][0] - # except socket.gaierror: - # pass - if host.startswith("unix://"): - return socket.AF_UNIX - elif ":" in host and hasattr(socket, "AF_INET6"): - return socket.AF_INET6 - return socket.AF_INET - - -def get_sockaddr(host, port, family): - """Return a fully qualified socket address that can be passed to - :func:`socket.bind`.""" - if family == af_unix: - return host.split("://", 1)[1] - try: - res = socket.getaddrinfo( - host, port, family, socket.SOCK_STREAM, socket.IPPROTO_TCP - ) - except socket.gaierror: - return host, port - return res[0][4] - - -class BaseWSGIServer(HTTPServer, object): - - """Simple single-threaded, single-process WSGI server.""" - - multithread = False - multiprocess = False - request_queue_size = LISTEN_QUEUE - - def __init__( - self, - host, - port, - app, - handler=None, - passthrough_errors=False, - ssl_context=None, - fd=None, - ): - if handler is None: - handler = WSGIRequestHandler - - self.address_family = select_address_family(host, port) - - if fd is not None: - real_sock = socket.fromfd(fd, self.address_family, socket.SOCK_STREAM) - port = 0 - - server_address = get_sockaddr(host, int(port), self.address_family) - - # remove socket file if it already exists - if self.address_family == af_unix and os.path.exists(server_address): - os.unlink(server_address) - HTTPServer.__init__(self, server_address, handler) - - self.app = app - self.passthrough_errors = passthrough_errors - self.shutdown_signal = False - self.host = host - self.port = self.socket.getsockname()[1] - - # Patch in the original socket. - if fd is not None: - self.socket.close() - self.socket = real_sock - self.server_address = self.socket.getsockname() - - if ssl_context is not None: - if isinstance(ssl_context, tuple): - ssl_context = load_ssl_context(*ssl_context) - if ssl_context == "adhoc": - ssl_context = generate_adhoc_ssl_context() - - # If we are on Python 2 the return value from socket.fromfd - # is an internal socket object but what we need for ssl wrap - # is the wrapper around it :( - sock = self.socket - if PY2 and not isinstance(sock, socket.socket): - sock = socket.socket(sock.family, sock.type, sock.proto, sock) - self.socket = ssl_context.wrap_socket(sock, server_side=True) - self.ssl_context = ssl_context - else: - self.ssl_context = None - - def log(self, type, message, *args): - _log(type, message, *args) - - def serve_forever(self): - self.shutdown_signal = False - try: - HTTPServer.serve_forever(self) - except KeyboardInterrupt: - pass - finally: - self.server_close() - - def handle_error(self, request, client_address): - if self.passthrough_errors: - raise - # Python 2 still causes a socket.error after the earlier - # handling, so silence it here. - if isinstance(sys.exc_info()[1], _ConnectionError): - return - return HTTPServer.handle_error(self, request, client_address) - - def get_request(self): - con, info = self.socket.accept() - return con, info - - -class ThreadedWSGIServer(ThreadingMixIn, BaseWSGIServer): - - """A WSGI server that does threading.""" - - multithread = True - daemon_threads = True - - -class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer): - - """A WSGI server that does forking.""" - - multiprocess = True - - def __init__( - self, - host, - port, - app, - processes=40, - handler=None, - passthrough_errors=False, - ssl_context=None, - fd=None, - ): - if not can_fork: - raise ValueError("Your platform does not support forking.") - BaseWSGIServer.__init__( - self, host, port, app, handler, passthrough_errors, ssl_context, fd - ) - self.max_children = processes - - -def make_server( - host=None, - port=None, - app=None, - threaded=False, - processes=1, - request_handler=None, - passthrough_errors=False, - ssl_context=None, - fd=None, -): - """Create a new server instance that is either threaded, or forks - or just processes one request after another. - """ - if threaded and processes > 1: - raise ValueError("cannot have a multithreaded and multi process server.") - elif threaded: - return ThreadedWSGIServer( - host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd - ) - elif processes > 1: - return ForkingWSGIServer( - host, - port, - app, - processes, - request_handler, - passthrough_errors, - ssl_context, - fd=fd, - ) - else: - return BaseWSGIServer( - host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd - ) - - -def is_running_from_reloader(): - """Checks if the application is running from within the Werkzeug - reloader subprocess. - - .. versionadded:: 0.10 - """ - return os.environ.get("WERKZEUG_RUN_MAIN") == "true" - - -def run_simple( - hostname, - port, - application, - use_reloader=False, - use_debugger=False, - use_evalex=True, - extra_files=None, - reloader_interval=1, - reloader_type="auto", - threaded=False, - processes=1, - request_handler=None, - static_files=None, - passthrough_errors=False, - ssl_context=None, -): - """Start a WSGI application. Optional features include a reloader, - multithreading and fork support. - - This function has a command-line interface too:: - - python -m werkzeug.serving --help - - .. versionadded:: 0.5 - `static_files` was added to simplify serving of static files as well - as `passthrough_errors`. - - .. versionadded:: 0.6 - support for SSL was added. - - .. versionadded:: 0.8 - Added support for automatically loading a SSL context from certificate - file and private key. - - .. versionadded:: 0.9 - Added command-line interface. - - .. versionadded:: 0.10 - Improved the reloader and added support for changing the backend - through the `reloader_type` parameter. See :ref:`reloader` - for more information. - - .. versionchanged:: 0.15 - Bind to a Unix socket by passing a path that starts with - ``unix://`` as the ``hostname``. - - :param hostname: The host to bind to, for example ``'localhost'``. - If the value is a path that starts with ``unix://`` it will bind - to a Unix socket instead of a TCP socket.. - :param port: The port for the server. eg: ``8080`` - :param application: the WSGI application to execute - :param use_reloader: should the server automatically restart the python - process if modules were changed? - :param use_debugger: should the werkzeug debugging system be used? - :param use_evalex: should the exception evaluation feature be enabled? - :param extra_files: a list of files the reloader should watch - additionally to the modules. For example configuration - files. - :param reloader_interval: the interval for the reloader in seconds. - :param reloader_type: the type of reloader to use. The default is - auto detection. Valid values are ``'stat'`` and - ``'watchdog'``. See :ref:`reloader` for more - information. - :param threaded: should the process handle each request in a separate - thread? - :param processes: if greater than 1 then handle each request in a new process - up to this maximum number of concurrent processes. - :param request_handler: optional parameter that can be used to replace - the default one. You can use this to replace it - with a different - :class:`~BaseHTTPServer.BaseHTTPRequestHandler` - subclass. - :param static_files: a list or dict of paths for static files. This works - exactly like :class:`SharedDataMiddleware`, it's actually - just wrapping the application in that middleware before - serving. - :param passthrough_errors: set this to `True` to disable the error catching. - This means that the server will die on errors but - it can be useful to hook debuggers in (pdb etc.) - :param ssl_context: an SSL context for the connection. Either an - :class:`ssl.SSLContext`, a tuple in the form - ``(cert_file, pkey_file)``, the string ``'adhoc'`` if - the server should automatically create one, or ``None`` - to disable SSL (which is the default). - """ - if not isinstance(port, int): - raise TypeError("port must be an integer") - if use_debugger: - from .debug import DebuggedApplication - - application = DebuggedApplication(application, use_evalex) - if static_files: - from .middleware.shared_data import SharedDataMiddleware - - application = SharedDataMiddleware(application, static_files) - - def log_startup(sock): - display_hostname = hostname if hostname not in ("", "*") else "localhost" - quit_msg = "(Press CTRL+C to quit)" - if sock.family == af_unix: - _log("info", " * Running on %s %s", display_hostname, quit_msg) - else: - if ":" in display_hostname: - display_hostname = "[%s]" % display_hostname - port = sock.getsockname()[1] - _log( - "info", - " * Running on %s://%s:%d/ %s", - "http" if ssl_context is None else "https", - display_hostname, - port, - quit_msg, - ) - - def inner(): - try: - fd = int(os.environ["WERKZEUG_SERVER_FD"]) - except (LookupError, ValueError): - fd = None - srv = make_server( - hostname, - port, - application, - threaded, - processes, - request_handler, - passthrough_errors, - ssl_context, - fd=fd, - ) - if fd is None: - log_startup(srv.socket) - srv.serve_forever() - - if use_reloader: - # If we're not running already in the subprocess that is the - # reloader we want to open up a socket early to make sure the - # port is actually available. - if not is_running_from_reloader(): - if port == 0 and not can_open_by_fd: - raise ValueError( - "Cannot bind to a random port with enabled " - "reloader if the Python interpreter does " - "not support socket opening by fd." - ) - - # Create and destroy a socket so that any exceptions are - # raised before we spawn a separate Python interpreter and - # lose this ability. - address_family = select_address_family(hostname, port) - server_address = get_sockaddr(hostname, port, address_family) - s = socket.socket(address_family, socket.SOCK_STREAM) - s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - s.bind(server_address) - if hasattr(s, "set_inheritable"): - s.set_inheritable(True) - - # If we can open the socket by file descriptor, then we can just - # reuse this one and our socket will survive the restarts. - if can_open_by_fd: - os.environ["WERKZEUG_SERVER_FD"] = str(s.fileno()) - s.listen(LISTEN_QUEUE) - log_startup(s) - else: - s.close() - if address_family == af_unix: - _log("info", "Unlinking %s" % server_address) - os.unlink(server_address) - - # Do not use relative imports, otherwise "python -m werkzeug.serving" - # breaks. - from ._reloader import run_with_reloader - - run_with_reloader(inner, extra_files, reloader_interval, reloader_type) - else: - inner() - - -def run_with_reloader(*args, **kwargs): - # People keep using undocumented APIs. Do not use this function - # please, we do not guarantee that it continues working. - from ._reloader import run_with_reloader - - return run_with_reloader(*args, **kwargs) - - -def main(): - """A simple command-line interface for :py:func:`run_simple`.""" - - # in contrast to argparse, this works at least under Python < 2.7 - import optparse - from .utils import import_string - - parser = optparse.OptionParser(usage="Usage: %prog [options] app_module:app_object") - parser.add_option( - "-b", - "--bind", - dest="address", - help="The hostname:port the app should listen on.", - ) - parser.add_option( - "-d", - "--debug", - dest="use_debugger", - action="store_true", - default=False, - help="Use Werkzeug's debugger.", - ) - parser.add_option( - "-r", - "--reload", - dest="use_reloader", - action="store_true", - default=False, - help="Reload Python process if modules change.", - ) - options, args = parser.parse_args() - - hostname, port = None, None - if options.address: - address = options.address.split(":") - hostname = address[0] - if len(address) > 1: - port = address[1] - - if len(args) != 1: - sys.stdout.write("No application supplied, or too much. See --help\n") - sys.exit(1) - app = import_string(args[0]) - - run_simple( - hostname=(hostname or "127.0.0.1"), - port=int(port or 5000), - application=app, - use_reloader=options.use_reloader, - use_debugger=options.use_debugger, - ) - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.7/site-packages/werkzeug/test.py b/venv/lib/python3.7/site-packages/werkzeug/test.py deleted file mode 100644 index c5ce50a..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/test.py +++ /dev/null @@ -1,1123 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.test - ~~~~~~~~~~~~~ - - This module implements a client to WSGI applications for testing. - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import mimetypes -import sys -from io import BytesIO -from itertools import chain -from random import random -from tempfile import TemporaryFile -from time import time - -from ._compat import iteritems -from ._compat import iterlists -from ._compat import itervalues -from ._compat import make_literal_wrapper -from ._compat import reraise -from ._compat import string_types -from ._compat import text_type -from ._compat import to_bytes -from ._compat import wsgi_encoding_dance -from ._internal import _get_environ -from .datastructures import CallbackDict -from .datastructures import CombinedMultiDict -from .datastructures import EnvironHeaders -from .datastructures import FileMultiDict -from .datastructures import Headers -from .datastructures import MultiDict -from .http import dump_cookie -from .http import dump_options_header -from .http import parse_options_header -from .urls import iri_to_uri -from .urls import url_encode -from .urls import url_fix -from .urls import url_parse -from .urls import url_unparse -from .urls import url_unquote -from .utils import get_content_type -from .wrappers import BaseRequest -from .wsgi import ClosingIterator -from .wsgi import get_current_url - -try: - from urllib.request import Request as U2Request -except ImportError: - from urllib2 import Request as U2Request - -try: - from http.cookiejar import CookieJar -except ImportError: - from cookielib import CookieJar - - -def stream_encode_multipart( - values, use_tempfile=True, threshold=1024 * 500, boundary=None, charset="utf-8" -): - """Encode a dict of values (either strings or file descriptors or - :class:`FileStorage` objects.) into a multipart encoded string stored - in a file descriptor. - """ - if boundary is None: - boundary = "---------------WerkzeugFormPart_%s%s" % (time(), random()) - _closure = [BytesIO(), 0, False] - - if use_tempfile: - - def write_binary(string): - stream, total_length, on_disk = _closure - if on_disk: - stream.write(string) - else: - length = len(string) - if length + _closure[1] <= threshold: - stream.write(string) - else: - new_stream = TemporaryFile("wb+") - new_stream.write(stream.getvalue()) - new_stream.write(string) - _closure[0] = new_stream - _closure[2] = True - _closure[1] = total_length + length - - else: - write_binary = _closure[0].write - - def write(string): - write_binary(string.encode(charset)) - - if not isinstance(values, MultiDict): - values = MultiDict(values) - - for key, values in iterlists(values): - for value in values: - write('--%s\r\nContent-Disposition: form-data; name="%s"' % (boundary, key)) - reader = getattr(value, "read", None) - if reader is not None: - filename = getattr(value, "filename", getattr(value, "name", None)) - content_type = getattr(value, "content_type", None) - if content_type is None: - content_type = ( - filename - and mimetypes.guess_type(filename)[0] - or "application/octet-stream" - ) - if filename is not None: - write('; filename="%s"\r\n' % filename) - else: - write("\r\n") - write("Content-Type: %s\r\n\r\n" % content_type) - while 1: - chunk = reader(16384) - if not chunk: - break - write_binary(chunk) - else: - if not isinstance(value, string_types): - value = str(value) - - value = to_bytes(value, charset) - write("\r\n\r\n") - write_binary(value) - write("\r\n") - write("--%s--\r\n" % boundary) - - length = int(_closure[0].tell()) - _closure[0].seek(0) - return _closure[0], length, boundary - - -def encode_multipart(values, boundary=None, charset="utf-8"): - """Like `stream_encode_multipart` but returns a tuple in the form - (``boundary``, ``data``) where data is a bytestring. - """ - stream, length, boundary = stream_encode_multipart( - values, use_tempfile=False, boundary=boundary, charset=charset - ) - return boundary, stream.read() - - -class _TestCookieHeaders(object): - - """A headers adapter for cookielib - """ - - def __init__(self, headers): - self.headers = headers - - def getheaders(self, name): - headers = [] - name = name.lower() - for k, v in self.headers: - if k.lower() == name: - headers.append(v) - return headers - - def get_all(self, name, default=None): - rv = [] - for k, v in self.headers: - if k.lower() == name.lower(): - rv.append(v) - return rv or default or [] - - -class _TestCookieResponse(object): - - """Something that looks like a httplib.HTTPResponse, but is actually just an - adapter for our test responses to make them available for cookielib. - """ - - def __init__(self, headers): - self.headers = _TestCookieHeaders(headers) - - def info(self): - return self.headers - - -class _TestCookieJar(CookieJar): - - """A cookielib.CookieJar modified to inject and read cookie headers from - and to wsgi environments, and wsgi application responses. - """ - - def inject_wsgi(self, environ): - """Inject the cookies as client headers into the server's wsgi - environment. - """ - cvals = ["%s=%s" % (c.name, c.value) for c in self] - - if cvals: - environ["HTTP_COOKIE"] = "; ".join(cvals) - else: - environ.pop("HTTP_COOKIE", None) - - def extract_wsgi(self, environ, headers): - """Extract the server's set-cookie headers as cookies into the - cookie jar. - """ - self.extract_cookies( - _TestCookieResponse(headers), U2Request(get_current_url(environ)) - ) - - -def _iter_data(data): - """Iterates over a `dict` or :class:`MultiDict` yielding all keys and - values. - This is used to iterate over the data passed to the - :class:`EnvironBuilder`. - """ - if isinstance(data, MultiDict): - for key, values in iterlists(data): - for value in values: - yield key, value - else: - for key, values in iteritems(data): - if isinstance(values, list): - for value in values: - yield key, value - else: - yield key, values - - -class EnvironBuilder(object): - """This class can be used to conveniently create a WSGI environment - for testing purposes. It can be used to quickly create WSGI environments - or request objects from arbitrary data. - - The signature of this class is also used in some other places as of - Werkzeug 0.5 (:func:`create_environ`, :meth:`BaseResponse.from_values`, - :meth:`Client.open`). Because of this most of the functionality is - available through the constructor alone. - - Files and regular form data can be manipulated independently of each - other with the :attr:`form` and :attr:`files` attributes, but are - passed with the same argument to the constructor: `data`. - - `data` can be any of these values: - - - a `str` or `bytes` object: The object is converted into an - :attr:`input_stream`, the :attr:`content_length` is set and you have to - provide a :attr:`content_type`. - - a `dict` or :class:`MultiDict`: The keys have to be strings. The values - have to be either any of the following objects, or a list of any of the - following objects: - - - a :class:`file`-like object: These are converted into - :class:`FileStorage` objects automatically. - - a `tuple`: The :meth:`~FileMultiDict.add_file` method is called - with the key and the unpacked `tuple` items as positional - arguments. - - a `str`: The string is set as form data for the associated key. - - a file-like object: The object content is loaded in memory and then - handled like a regular `str` or a `bytes`. - - :param path: the path of the request. In the WSGI environment this will - end up as `PATH_INFO`. If the `query_string` is not defined - and there is a question mark in the `path` everything after - it is used as query string. - :param base_url: the base URL is a URL that is used to extract the WSGI - URL scheme, host (server name + server port) and the - script root (`SCRIPT_NAME`). - :param query_string: an optional string or dict with URL parameters. - :param method: the HTTP method to use, defaults to `GET`. - :param input_stream: an optional input stream. Do not specify this and - `data`. As soon as an input stream is set you can't - modify :attr:`args` and :attr:`files` unless you - set the :attr:`input_stream` to `None` again. - :param content_type: The content type for the request. As of 0.5 you - don't have to provide this when specifying files - and form data via `data`. - :param content_length: The content length for the request. You don't - have to specify this when providing data via - `data`. - :param errors_stream: an optional error stream that is used for - `wsgi.errors`. Defaults to :data:`stderr`. - :param multithread: controls `wsgi.multithread`. Defaults to `False`. - :param multiprocess: controls `wsgi.multiprocess`. Defaults to `False`. - :param run_once: controls `wsgi.run_once`. Defaults to `False`. - :param headers: an optional list or :class:`Headers` object of headers. - :param data: a string or dict of form data or a file-object. - See explanation above. - :param json: An object to be serialized and assigned to ``data``. - Defaults the content type to ``"application/json"``. - Serialized with the function assigned to :attr:`json_dumps`. - :param environ_base: an optional dict of environment defaults. - :param environ_overrides: an optional dict of environment overrides. - :param charset: the charset used to encode unicode data. - - .. versionadded:: 0.15 - The ``json`` param and :meth:`json_dumps` method. - - .. versionadded:: 0.15 - The environ has keys ``REQUEST_URI`` and ``RAW_URI`` containing - the path before perecent-decoding. This is not part of the WSGI - PEP, but many WSGI servers include it. - - .. versionchanged:: 0.6 - ``path`` and ``base_url`` can now be unicode strings that are - encoded with :func:`iri_to_uri`. - """ - - #: the server protocol to use. defaults to HTTP/1.1 - server_protocol = "HTTP/1.1" - - #: the wsgi version to use. defaults to (1, 0) - wsgi_version = (1, 0) - - #: the default request class for :meth:`get_request` - request_class = BaseRequest - - import json - - #: The serialization function used when ``json`` is passed. - json_dumps = staticmethod(json.dumps) - del json - - def __init__( - self, - path="/", - base_url=None, - query_string=None, - method="GET", - input_stream=None, - content_type=None, - content_length=None, - errors_stream=None, - multithread=False, - multiprocess=False, - run_once=False, - headers=None, - data=None, - environ_base=None, - environ_overrides=None, - charset="utf-8", - mimetype=None, - json=None, - ): - path_s = make_literal_wrapper(path) - if query_string is not None and path_s("?") in path: - raise ValueError("Query string is defined in the path and as an argument") - if query_string is None and path_s("?") in path: - path, query_string = path.split(path_s("?"), 1) - self.charset = charset - self.path = iri_to_uri(path) - if base_url is not None: - base_url = url_fix(iri_to_uri(base_url, charset), charset) - self.base_url = base_url - if isinstance(query_string, (bytes, text_type)): - self.query_string = query_string - else: - if query_string is None: - query_string = MultiDict() - elif not isinstance(query_string, MultiDict): - query_string = MultiDict(query_string) - self.args = query_string - self.method = method - if headers is None: - headers = Headers() - elif not isinstance(headers, Headers): - headers = Headers(headers) - self.headers = headers - if content_type is not None: - self.content_type = content_type - if errors_stream is None: - errors_stream = sys.stderr - self.errors_stream = errors_stream - self.multithread = multithread - self.multiprocess = multiprocess - self.run_once = run_once - self.environ_base = environ_base - self.environ_overrides = environ_overrides - self.input_stream = input_stream - self.content_length = content_length - self.closed = False - - if json is not None: - if data is not None: - raise TypeError("can't provide both json and data") - - data = self.json_dumps(json) - - if self.content_type is None: - self.content_type = "application/json" - - if data: - if input_stream is not None: - raise TypeError("can't provide input stream and data") - if hasattr(data, "read"): - data = data.read() - if isinstance(data, text_type): - data = data.encode(self.charset) - if isinstance(data, bytes): - self.input_stream = BytesIO(data) - if self.content_length is None: - self.content_length = len(data) - else: - for key, value in _iter_data(data): - if isinstance(value, (tuple, dict)) or hasattr(value, "read"): - self._add_file_from_data(key, value) - else: - self.form.setlistdefault(key).append(value) - - if mimetype is not None: - self.mimetype = mimetype - - @classmethod - def from_environ(cls, environ, **kwargs): - """Turn an environ dict back into a builder. Any extra kwargs - override the args extracted from the environ. - - .. versionadded:: 0.15 - """ - headers = Headers(EnvironHeaders(environ)) - out = { - "path": environ["PATH_INFO"], - "base_url": cls._make_base_url( - environ["wsgi.url_scheme"], headers.pop("Host"), environ["SCRIPT_NAME"] - ), - "query_string": environ["QUERY_STRING"], - "method": environ["REQUEST_METHOD"], - "input_stream": environ["wsgi.input"], - "content_type": headers.pop("Content-Type", None), - "content_length": headers.pop("Content-Length", None), - "errors_stream": environ["wsgi.errors"], - "multithread": environ["wsgi.multithread"], - "multiprocess": environ["wsgi.multiprocess"], - "run_once": environ["wsgi.run_once"], - "headers": headers, - } - out.update(kwargs) - return cls(**out) - - def _add_file_from_data(self, key, value): - """Called in the EnvironBuilder to add files from the data dict.""" - if isinstance(value, tuple): - self.files.add_file(key, *value) - else: - self.files.add_file(key, value) - - @staticmethod - def _make_base_url(scheme, host, script_root): - return url_unparse((scheme, host, script_root, "", "")).rstrip("/") + "/" - - @property - def base_url(self): - """The base URL is used to extract the URL scheme, host name, - port, and root path. - """ - return self._make_base_url(self.url_scheme, self.host, self.script_root) - - @base_url.setter - def base_url(self, value): - if value is None: - scheme = "http" - netloc = "localhost" - script_root = "" - else: - scheme, netloc, script_root, qs, anchor = url_parse(value) - if qs or anchor: - raise ValueError("base url must not contain a query string or fragment") - self.script_root = script_root.rstrip("/") - self.host = netloc - self.url_scheme = scheme - - @property - def content_type(self): - """The content type for the request. Reflected from and to - the :attr:`headers`. Do not set if you set :attr:`files` or - :attr:`form` for auto detection. - """ - ct = self.headers.get("Content-Type") - if ct is None and not self._input_stream: - if self._files: - return "multipart/form-data" - if self._form: - return "application/x-www-form-urlencoded" - return None - return ct - - @content_type.setter - def content_type(self, value): - if value is None: - self.headers.pop("Content-Type", None) - else: - self.headers["Content-Type"] = value - - @property - def mimetype(self): - """The mimetype (content type without charset etc.) - - .. versionadded:: 0.14 - """ - ct = self.content_type - return ct.split(";")[0].strip() if ct else None - - @mimetype.setter - def mimetype(self, value): - self.content_type = get_content_type(value, self.charset) - - @property - def mimetype_params(self): - """ The mimetype parameters as dict. For example if the - content type is ``text/html; charset=utf-8`` the params would be - ``{'charset': 'utf-8'}``. - - .. versionadded:: 0.14 - """ - - def on_update(d): - self.headers["Content-Type"] = dump_options_header(self.mimetype, d) - - d = parse_options_header(self.headers.get("content-type", ""))[1] - return CallbackDict(d, on_update) - - @property - def content_length(self): - """The content length as integer. Reflected from and to the - :attr:`headers`. Do not set if you set :attr:`files` or - :attr:`form` for auto detection. - """ - return self.headers.get("Content-Length", type=int) - - @content_length.setter - def content_length(self, value): - if value is None: - self.headers.pop("Content-Length", None) - else: - self.headers["Content-Length"] = str(value) - - def _get_form(self, name, storage): - """Common behavior for getting the :attr:`form` and - :attr:`files` properties. - - :param name: Name of the internal cached attribute. - :param storage: Storage class used for the data. - """ - if self.input_stream is not None: - raise AttributeError("an input stream is defined") - - rv = getattr(self, name) - - if rv is None: - rv = storage() - setattr(self, name, rv) - - return rv - - def _set_form(self, name, value): - """Common behavior for setting the :attr:`form` and - :attr:`files` properties. - - :param name: Name of the internal cached attribute. - :param value: Value to assign to the attribute. - """ - self._input_stream = None - setattr(self, name, value) - - @property - def form(self): - """A :class:`MultiDict` of form values.""" - return self._get_form("_form", MultiDict) - - @form.setter - def form(self, value): - self._set_form("_form", value) - - @property - def files(self): - """A :class:`FileMultiDict` of uploaded files. Use - :meth:`~FileMultiDict.add_file` to add new files. - """ - return self._get_form("_files", FileMultiDict) - - @files.setter - def files(self, value): - self._set_form("_files", value) - - @property - def input_stream(self): - """An optional input stream. If you set this it will clear - :attr:`form` and :attr:`files`. - """ - return self._input_stream - - @input_stream.setter - def input_stream(self, value): - self._input_stream = value - self._form = None - self._files = None - - @property - def query_string(self): - """The query string. If you set this to a string - :attr:`args` will no longer be available. - """ - if self._query_string is None: - if self._args is not None: - return url_encode(self._args, charset=self.charset) - return "" - return self._query_string - - @query_string.setter - def query_string(self, value): - self._query_string = value - self._args = None - - @property - def args(self): - """The URL arguments as :class:`MultiDict`.""" - if self._query_string is not None: - raise AttributeError("a query string is defined") - if self._args is None: - self._args = MultiDict() - return self._args - - @args.setter - def args(self, value): - self._query_string = None - self._args = value - - @property - def server_name(self): - """The server name (read-only, use :attr:`host` to set)""" - return self.host.split(":", 1)[0] - - @property - def server_port(self): - """The server port as integer (read-only, use :attr:`host` to set)""" - pieces = self.host.split(":", 1) - if len(pieces) == 2 and pieces[1].isdigit(): - return int(pieces[1]) - if self.url_scheme == "https": - return 443 - return 80 - - def __del__(self): - try: - self.close() - except Exception: - pass - - def close(self): - """Closes all files. If you put real :class:`file` objects into the - :attr:`files` dict you can call this method to automatically close - them all in one go. - """ - if self.closed: - return - try: - files = itervalues(self.files) - except AttributeError: - files = () - for f in files: - try: - f.close() - except Exception: - pass - self.closed = True - - def get_environ(self): - """Return the built environ. - - .. versionchanged:: 0.15 - The content type and length headers are set based on - input stream detection. Previously this only set the WSGI - keys. - """ - input_stream = self.input_stream - content_length = self.content_length - - mimetype = self.mimetype - content_type = self.content_type - - if input_stream is not None: - start_pos = input_stream.tell() - input_stream.seek(0, 2) - end_pos = input_stream.tell() - input_stream.seek(start_pos) - content_length = end_pos - start_pos - elif mimetype == "multipart/form-data": - values = CombinedMultiDict([self.form, self.files]) - input_stream, content_length, boundary = stream_encode_multipart( - values, charset=self.charset - ) - content_type = mimetype + '; boundary="%s"' % boundary - elif mimetype == "application/x-www-form-urlencoded": - # XXX: py2v3 review - values = url_encode(self.form, charset=self.charset) - values = values.encode("ascii") - content_length = len(values) - input_stream = BytesIO(values) - else: - input_stream = BytesIO() - - result = {} - if self.environ_base: - result.update(self.environ_base) - - def _path_encode(x): - return wsgi_encoding_dance(url_unquote(x, self.charset), self.charset) - - qs = wsgi_encoding_dance(self.query_string) - - result.update( - { - "REQUEST_METHOD": self.method, - "SCRIPT_NAME": _path_encode(self.script_root), - "PATH_INFO": _path_encode(self.path), - "QUERY_STRING": qs, - # Non-standard, added by mod_wsgi, uWSGI - "REQUEST_URI": wsgi_encoding_dance(self.path), - # Non-standard, added by gunicorn - "RAW_URI": wsgi_encoding_dance(self.path), - "SERVER_NAME": self.server_name, - "SERVER_PORT": str(self.server_port), - "HTTP_HOST": self.host, - "SERVER_PROTOCOL": self.server_protocol, - "wsgi.version": self.wsgi_version, - "wsgi.url_scheme": self.url_scheme, - "wsgi.input": input_stream, - "wsgi.errors": self.errors_stream, - "wsgi.multithread": self.multithread, - "wsgi.multiprocess": self.multiprocess, - "wsgi.run_once": self.run_once, - } - ) - - headers = self.headers.copy() - - if content_type is not None: - result["CONTENT_TYPE"] = content_type - headers.set("Content-Type", content_type) - - if content_length is not None: - result["CONTENT_LENGTH"] = str(content_length) - headers.set("Content-Length", content_length) - - for key, value in headers.to_wsgi_list(): - result["HTTP_%s" % key.upper().replace("-", "_")] = value - - if self.environ_overrides: - result.update(self.environ_overrides) - - return result - - def get_request(self, cls=None): - """Returns a request with the data. If the request class is not - specified :attr:`request_class` is used. - - :param cls: The request wrapper to use. - """ - if cls is None: - cls = self.request_class - return cls(self.get_environ()) - - -class ClientRedirectError(Exception): - """If a redirect loop is detected when using follow_redirects=True with - the :cls:`Client`, then this exception is raised. - """ - - -class Client(object): - """This class allows you to send requests to a wrapped application. - - The response wrapper can be a class or factory function that takes - three arguments: app_iter, status and headers. The default response - wrapper just returns a tuple. - - Example:: - - class ClientResponse(BaseResponse): - ... - - client = Client(MyApplication(), response_wrapper=ClientResponse) - - The use_cookies parameter indicates whether cookies should be stored and - sent for subsequent requests. This is True by default, but passing False - will disable this behaviour. - - If you want to request some subdomain of your application you may set - `allow_subdomain_redirects` to `True` as if not no external redirects - are allowed. - - .. versionadded:: 0.5 - `use_cookies` is new in this version. Older versions did not provide - builtin cookie support. - - .. versionadded:: 0.14 - The `mimetype` parameter was added. - - .. versionadded:: 0.15 - The ``json`` parameter. - """ - - def __init__( - self, - application, - response_wrapper=None, - use_cookies=True, - allow_subdomain_redirects=False, - ): - self.application = application - self.response_wrapper = response_wrapper - if use_cookies: - self.cookie_jar = _TestCookieJar() - else: - self.cookie_jar = None - self.allow_subdomain_redirects = allow_subdomain_redirects - - def set_cookie( - self, - server_name, - key, - value="", - max_age=None, - expires=None, - path="/", - domain=None, - secure=None, - httponly=False, - samesite=None, - charset="utf-8", - ): - """Sets a cookie in the client's cookie jar. The server name - is required and has to match the one that is also passed to - the open call. - """ - assert self.cookie_jar is not None, "cookies disabled" - header = dump_cookie( - key, - value, - max_age, - expires, - path, - domain, - secure, - httponly, - charset, - samesite=samesite, - ) - environ = create_environ(path, base_url="http://" + server_name) - headers = [("Set-Cookie", header)] - self.cookie_jar.extract_wsgi(environ, headers) - - def delete_cookie(self, server_name, key, path="/", domain=None): - """Deletes a cookie in the test client.""" - self.set_cookie( - server_name, key, expires=0, max_age=0, path=path, domain=domain - ) - - def run_wsgi_app(self, environ, buffered=False): - """Runs the wrapped WSGI app with the given environment.""" - if self.cookie_jar is not None: - self.cookie_jar.inject_wsgi(environ) - rv = run_wsgi_app(self.application, environ, buffered=buffered) - if self.cookie_jar is not None: - self.cookie_jar.extract_wsgi(environ, rv[2]) - return rv - - def resolve_redirect(self, response, new_location, environ, buffered=False): - """Perform a new request to the location given by the redirect - response to the previous request. - """ - scheme, netloc, path, qs, anchor = url_parse(new_location) - builder = EnvironBuilder.from_environ(environ, query_string=qs) - - to_name_parts = netloc.split(":", 1)[0].split(".") - from_name_parts = builder.server_name.split(".") - - if to_name_parts != [""]: - # The new location has a host, use it for the base URL. - builder.url_scheme = scheme - builder.host = netloc - else: - # A local redirect with autocorrect_location_header=False - # doesn't have a host, so use the request's host. - to_name_parts = from_name_parts - - # Explain why a redirect to a different server name won't be followed. - if to_name_parts != from_name_parts: - if to_name_parts[-len(from_name_parts) :] == from_name_parts: - if not self.allow_subdomain_redirects: - raise RuntimeError("Following subdomain redirects is not enabled.") - else: - raise RuntimeError("Following external redirects is not supported.") - - path_parts = path.split("/") - root_parts = builder.script_root.split("/") - - if path_parts[: len(root_parts)] == root_parts: - # Strip the script root from the path. - builder.path = path[len(builder.script_root) :] - else: - # The new location is not under the script root, so use the - # whole path and clear the previous root. - builder.path = path - builder.script_root = "" - - status_code = int(response[1].split(None, 1)[0]) - - # Only 307 and 308 preserve all of the original request. - if status_code not in {307, 308}: - # HEAD is preserved, everything else becomes GET. - if builder.method != "HEAD": - builder.method = "GET" - - # Clear the body and the headers that describe it. - builder.input_stream = None - builder.content_type = None - builder.content_length = None - builder.headers.pop("Transfer-Encoding", None) - - # Disable the response wrapper while handling redirects. Not - # thread safe, but the client should not be shared anyway. - old_response_wrapper = self.response_wrapper - self.response_wrapper = None - - try: - return self.open(builder, as_tuple=True, buffered=buffered) - finally: - self.response_wrapper = old_response_wrapper - - def open(self, *args, **kwargs): - """Takes the same arguments as the :class:`EnvironBuilder` class with - some additions: You can provide a :class:`EnvironBuilder` or a WSGI - environment as only argument instead of the :class:`EnvironBuilder` - arguments and two optional keyword arguments (`as_tuple`, `buffered`) - that change the type of the return value or the way the application is - executed. - - .. versionchanged:: 0.5 - If a dict is provided as file in the dict for the `data` parameter - the content type has to be called `content_type` now instead of - `mimetype`. This change was made for consistency with - :class:`werkzeug.FileWrapper`. - - The `follow_redirects` parameter was added to :func:`open`. - - Additional parameters: - - :param as_tuple: Returns a tuple in the form ``(environ, result)`` - :param buffered: Set this to True to buffer the application run. - This will automatically close the application for - you as well. - :param follow_redirects: Set this to True if the `Client` should - follow HTTP redirects. - """ - as_tuple = kwargs.pop("as_tuple", False) - buffered = kwargs.pop("buffered", False) - follow_redirects = kwargs.pop("follow_redirects", False) - environ = None - if not kwargs and len(args) == 1: - if isinstance(args[0], EnvironBuilder): - environ = args[0].get_environ() - elif isinstance(args[0], dict): - environ = args[0] - if environ is None: - builder = EnvironBuilder(*args, **kwargs) - try: - environ = builder.get_environ() - finally: - builder.close() - - response = self.run_wsgi_app(environ.copy(), buffered=buffered) - - # handle redirects - redirect_chain = [] - while 1: - status_code = int(response[1].split(None, 1)[0]) - if ( - status_code not in {301, 302, 303, 305, 307, 308} - or not follow_redirects - ): - break - - # Exhaust intermediate response bodies to ensure middleware - # that returns an iterator runs any cleanup code. - if not buffered: - for _ in response[0]: - pass - - new_location = response[2]["location"] - new_redirect_entry = (new_location, status_code) - if new_redirect_entry in redirect_chain: - raise ClientRedirectError("loop detected") - redirect_chain.append(new_redirect_entry) - environ, response = self.resolve_redirect( - response, new_location, environ, buffered=buffered - ) - - if self.response_wrapper is not None: - response = self.response_wrapper(*response) - if as_tuple: - return environ, response - return response - - def get(self, *args, **kw): - """Like open but method is enforced to GET.""" - kw["method"] = "GET" - return self.open(*args, **kw) - - def patch(self, *args, **kw): - """Like open but method is enforced to PATCH.""" - kw["method"] = "PATCH" - return self.open(*args, **kw) - - def post(self, *args, **kw): - """Like open but method is enforced to POST.""" - kw["method"] = "POST" - return self.open(*args, **kw) - - def head(self, *args, **kw): - """Like open but method is enforced to HEAD.""" - kw["method"] = "HEAD" - return self.open(*args, **kw) - - def put(self, *args, **kw): - """Like open but method is enforced to PUT.""" - kw["method"] = "PUT" - return self.open(*args, **kw) - - def delete(self, *args, **kw): - """Like open but method is enforced to DELETE.""" - kw["method"] = "DELETE" - return self.open(*args, **kw) - - def options(self, *args, **kw): - """Like open but method is enforced to OPTIONS.""" - kw["method"] = "OPTIONS" - return self.open(*args, **kw) - - def trace(self, *args, **kw): - """Like open but method is enforced to TRACE.""" - kw["method"] = "TRACE" - return self.open(*args, **kw) - - def __repr__(self): - return "<%s %r>" % (self.__class__.__name__, self.application) - - -def create_environ(*args, **kwargs): - """Create a new WSGI environ dict based on the values passed. The first - parameter should be the path of the request which defaults to '/'. The - second one can either be an absolute path (in that case the host is - localhost:80) or a full path to the request with scheme, netloc port and - the path to the script. - - This accepts the same arguments as the :class:`EnvironBuilder` - constructor. - - .. versionchanged:: 0.5 - This function is now a thin wrapper over :class:`EnvironBuilder` which - was added in 0.5. The `headers`, `environ_base`, `environ_overrides` - and `charset` parameters were added. - """ - builder = EnvironBuilder(*args, **kwargs) - try: - return builder.get_environ() - finally: - builder.close() - - -def run_wsgi_app(app, environ, buffered=False): - """Return a tuple in the form (app_iter, status, headers) of the - application output. This works best if you pass it an application that - returns an iterator all the time. - - Sometimes applications may use the `write()` callable returned - by the `start_response` function. This tries to resolve such edge - cases automatically. But if you don't get the expected output you - should set `buffered` to `True` which enforces buffering. - - If passed an invalid WSGI application the behavior of this function is - undefined. Never pass non-conforming WSGI applications to this function. - - :param app: the application to execute. - :param buffered: set to `True` to enforce buffering. - :return: tuple in the form ``(app_iter, status, headers)`` - """ - environ = _get_environ(environ) - response = [] - buffer = [] - - def start_response(status, headers, exc_info=None): - if exc_info is not None: - reraise(*exc_info) - response[:] = [status, headers] - return buffer.append - - app_rv = app(environ, start_response) - close_func = getattr(app_rv, "close", None) - app_iter = iter(app_rv) - - # when buffering we emit the close call early and convert the - # application iterator into a regular list - if buffered: - try: - app_iter = list(app_iter) - finally: - if close_func is not None: - close_func() - - # otherwise we iterate the application iter until we have a response, chain - # the already received data with the already collected data and wrap it in - # a new `ClosingIterator` if we need to restore a `close` callable from the - # original return value. - else: - for item in app_iter: - buffer.append(item) - if response: - break - if buffer: - app_iter = chain(buffer, app_iter) - if close_func is not None and app_iter is not app_rv: - app_iter = ClosingIterator(app_iter, close_func) - - return app_iter, response[0], Headers(response[1]) diff --git a/venv/lib/python3.7/site-packages/werkzeug/testapp.py b/venv/lib/python3.7/site-packages/werkzeug/testapp.py deleted file mode 100644 index 5ea8549..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/testapp.py +++ /dev/null @@ -1,241 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testapp - ~~~~~~~~~~~~~~~~ - - Provide a small test application that can be used to test a WSGI server - and check it for WSGI compliance. - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import base64 -import os -import sys -from textwrap import wrap - -from . import __version__ as _werkzeug_version -from .utils import escape -from .wrappers import BaseRequest as Request -from .wrappers import BaseResponse as Response - -logo = Response( - base64.b64decode( - """ -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 -=""" - ), - mimetype="image/png", -) - - -TEMPLATE = u"""\ - -WSGI Information - -

    - -

    WSGI Information

    -

    - This page displays all available information about the WSGI server and - the underlying Python interpreter. -

    Python Interpreter

    - - - - - - -
    Python Version - %(python_version)s -
    Platform - %(platform)s [%(os)s] -
    API Version - %(api_version)s -
    Byteorder - %(byteorder)s -
    Werkzeug Version - %(werkzeug_version)s -
    -

    WSGI Environment

    - %(wsgi_env)s
    -

    Installed Eggs

    -

    - The following python packages were installed on the system as - Python eggs: -

      %(python_eggs)s
    -

    System Path

    -

    - The following paths are the current contents of the load path. The - following entries are looked up for Python packages. Note that not - all items in this path are folders. Gray and underlined items are - entries pointing to invalid resources or used by custom import hooks - such as the zip importer. -

    - Items with a bright background were expanded for display from a relative - path. If you encounter such paths in the output you might want to check - your setup as relative paths are usually problematic in multithreaded - environments. -

      %(sys_path)s
    -
    -""" - - -def iter_sys_path(): - if os.name == "posix": - - def strip(x): - prefix = os.path.expanduser("~") - if x.startswith(prefix): - x = "~" + x[len(prefix) :] - return x - - else: - - def strip(x): - return x - - cwd = os.path.abspath(os.getcwd()) - for item in sys.path: - path = os.path.join(cwd, item or os.path.curdir) - yield strip(os.path.normpath(path)), not os.path.isdir(path), path != item - - -def render_testapp(req): - try: - import pkg_resources - except ImportError: - eggs = () - else: - eggs = sorted(pkg_resources.working_set, key=lambda x: x.project_name.lower()) - python_eggs = [] - for egg in eggs: - try: - version = egg.version - except (ValueError, AttributeError): - version = "unknown" - python_eggs.append( - "
  • %s [%s]" % (escape(egg.project_name), escape(version)) - ) - - wsgi_env = [] - sorted_environ = sorted(req.environ.items(), key=lambda x: repr(x[0]).lower()) - for key, value in sorted_environ: - wsgi_env.append( - "%s%s" - % (escape(str(key)), " ".join(wrap(escape(repr(value))))) - ) - - sys_path = [] - for item, virtual, expanded in iter_sys_path(): - class_ = [] - if virtual: - class_.append("virtual") - if expanded: - class_.append("exp") - sys_path.append( - "%s" - % (' class="%s"' % " ".join(class_) if class_ else "", escape(item)) - ) - - return ( - TEMPLATE - % { - "python_version": "
    ".join(escape(sys.version).splitlines()), - "platform": escape(sys.platform), - "os": escape(os.name), - "api_version": sys.api_version, - "byteorder": sys.byteorder, - "werkzeug_version": _werkzeug_version, - "python_eggs": "\n".join(python_eggs), - "wsgi_env": "\n".join(wsgi_env), - "sys_path": "\n".join(sys_path), - } - ).encode("utf-8") - - -def test_app(environ, start_response): - """Simple test application that dumps the environment. You can use - it to check if Werkzeug is working properly: - - .. sourcecode:: pycon - - >>> from werkzeug.serving import run_simple - >>> from werkzeug.testapp import test_app - >>> run_simple('localhost', 3000, test_app) - * Running on http://localhost:3000/ - - The application displays important information from the WSGI environment, - the Python interpreter and the installed libraries. - """ - req = Request(environ, populate_request=False) - if req.args.get("resource") == "logo": - response = logo - else: - response = Response(render_testapp(req), mimetype="text/html") - return response(environ, start_response) - - -if __name__ == "__main__": - from .serving import run_simple - - run_simple("localhost", 5000, test_app, use_reloader=True) diff --git a/venv/lib/python3.7/site-packages/werkzeug/urls.py b/venv/lib/python3.7/site-packages/werkzeug/urls.py deleted file mode 100644 index d5e487b..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/urls.py +++ /dev/null @@ -1,1138 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.urls - ~~~~~~~~~~~~~ - - ``werkzeug.urls`` used to provide several wrapper functions for Python 2 - urlparse, whose main purpose were to work around the behavior of the Py2 - stdlib and its lack of unicode support. While this was already a somewhat - inconvenient situation, it got even more complicated because Python 3's - ``urllib.parse`` actually does handle unicode properly. In other words, - this module would wrap two libraries with completely different behavior. So - now this module contains a 2-and-3-compatible backport of Python 3's - ``urllib.parse``, which is mostly API-compatible. - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import codecs -import os -import re -from collections import namedtuple - -from ._compat import fix_tuple_repr -from ._compat import implements_to_string -from ._compat import make_literal_wrapper -from ._compat import normalize_string_tuple -from ._compat import PY2 -from ._compat import text_type -from ._compat import to_native -from ._compat import to_unicode -from ._compat import try_coerce_native -from ._internal import _decode_idna -from ._internal import _encode_idna - -# A regular expression for what a valid schema looks like -_scheme_re = re.compile(r"^[a-zA-Z0-9+-.]+$") - -# Characters that are safe in any part of an URL. -_always_safe = frozenset( - bytearray( - b"abcdefghijklmnopqrstuvwxyz" - b"ABCDEFGHIJKLMNOPQRSTUVWXYZ" - b"0123456789" - b"-._~" - ) -) - -_hexdigits = "0123456789ABCDEFabcdef" -_hextobyte = dict( - ((a + b).encode(), int(a + b, 16)) for a in _hexdigits for b in _hexdigits -) -_bytetohex = [("%%%02X" % char).encode("ascii") for char in range(256)] - - -_URLTuple = fix_tuple_repr( - namedtuple("_URLTuple", ["scheme", "netloc", "path", "query", "fragment"]) -) - - -class BaseURL(_URLTuple): - """Superclass of :py:class:`URL` and :py:class:`BytesURL`.""" - - __slots__ = () - - def replace(self, **kwargs): - """Return an URL with the same values, except for those parameters - given new values by whichever keyword arguments are specified.""" - return self._replace(**kwargs) - - @property - def host(self): - """The host part of the URL if available, otherwise `None`. The - host is either the hostname or the IP address mentioned in the - URL. It will not contain the port. - """ - return self._split_host()[0] - - @property - def ascii_host(self): - """Works exactly like :attr:`host` but will return a result that - is restricted to ASCII. If it finds a netloc that is not ASCII - it will attempt to idna decode it. This is useful for socket - operations when the URL might include internationalized characters. - """ - rv = self.host - if rv is not None and isinstance(rv, text_type): - try: - rv = _encode_idna(rv) - except UnicodeError: - rv = rv.encode("ascii", "ignore") - return to_native(rv, "ascii", "ignore") - - @property - def port(self): - """The port in the URL as an integer if it was present, `None` - otherwise. This does not fill in default ports. - """ - try: - rv = int(to_native(self._split_host()[1])) - if 0 <= rv <= 65535: - return rv - except (ValueError, TypeError): - pass - - @property - def auth(self): - """The authentication part in the URL if available, `None` - otherwise. - """ - return self._split_netloc()[0] - - @property - def username(self): - """The username if it was part of the URL, `None` otherwise. - This undergoes URL decoding and will always be a unicode string. - """ - rv = self._split_auth()[0] - if rv is not None: - return _url_unquote_legacy(rv) - - @property - def raw_username(self): - """The username if it was part of the URL, `None` otherwise. - Unlike :attr:`username` this one is not being decoded. - """ - return self._split_auth()[0] - - @property - def password(self): - """The password if it was part of the URL, `None` otherwise. - This undergoes URL decoding and will always be a unicode string. - """ - rv = self._split_auth()[1] - if rv is not None: - return _url_unquote_legacy(rv) - - @property - def raw_password(self): - """The password if it was part of the URL, `None` otherwise. - Unlike :attr:`password` this one is not being decoded. - """ - return self._split_auth()[1] - - def decode_query(self, *args, **kwargs): - """Decodes the query part of the URL. Ths is a shortcut for - calling :func:`url_decode` on the query argument. The arguments and - keyword arguments are forwarded to :func:`url_decode` unchanged. - """ - return url_decode(self.query, *args, **kwargs) - - def join(self, *args, **kwargs): - """Joins this URL with another one. This is just a convenience - function for calling into :meth:`url_join` and then parsing the - return value again. - """ - return url_parse(url_join(self, *args, **kwargs)) - - def to_url(self): - """Returns a URL string or bytes depending on the type of the - information stored. This is just a convenience function - for calling :meth:`url_unparse` for this URL. - """ - return url_unparse(self) - - def decode_netloc(self): - """Decodes the netloc part into a string.""" - rv = _decode_idna(self.host or "") - - if ":" in rv: - rv = "[%s]" % rv - port = self.port - if port is not None: - rv = "%s:%d" % (rv, port) - auth = ":".join( - filter( - None, - [ - _url_unquote_legacy(self.raw_username or "", "/:%@"), - _url_unquote_legacy(self.raw_password or "", "/:%@"), - ], - ) - ) - if auth: - rv = "%s@%s" % (auth, rv) - return rv - - def to_uri_tuple(self): - """Returns a :class:`BytesURL` tuple that holds a URI. This will - encode all the information in the URL properly to ASCII using the - rules a web browser would follow. - - It's usually more interesting to directly call :meth:`iri_to_uri` which - will return a string. - """ - return url_parse(iri_to_uri(self).encode("ascii")) - - def to_iri_tuple(self): - """Returns a :class:`URL` tuple that holds a IRI. This will try - to decode as much information as possible in the URL without - losing information similar to how a web browser does it for the - URL bar. - - It's usually more interesting to directly call :meth:`uri_to_iri` which - will return a string. - """ - return url_parse(uri_to_iri(self)) - - def get_file_location(self, pathformat=None): - """Returns a tuple with the location of the file in the form - ``(server, location)``. If the netloc is empty in the URL or - points to localhost, it's represented as ``None``. - - The `pathformat` by default is autodetection but needs to be set - when working with URLs of a specific system. The supported values - are ``'windows'`` when working with Windows or DOS paths and - ``'posix'`` when working with posix paths. - - If the URL does not point to a local file, the server and location - are both represented as ``None``. - - :param pathformat: The expected format of the path component. - Currently ``'windows'`` and ``'posix'`` are - supported. Defaults to ``None`` which is - autodetect. - """ - if self.scheme != "file": - return None, None - - path = url_unquote(self.path) - host = self.netloc or None - - if pathformat is None: - if os.name == "nt": - pathformat = "windows" - else: - pathformat = "posix" - - if pathformat == "windows": - if path[:1] == "/" and path[1:2].isalpha() and path[2:3] in "|:": - path = path[1:2] + ":" + path[3:] - windows_share = path[:3] in ("\\" * 3, "/" * 3) - import ntpath - - path = ntpath.normpath(path) - # Windows shared drives are represented as ``\\host\\directory``. - # That results in a URL like ``file://///host/directory``, and a - # path like ``///host/directory``. We need to special-case this - # because the path contains the hostname. - if windows_share and host is None: - parts = path.lstrip("\\").split("\\", 1) - if len(parts) == 2: - host, path = parts - else: - host = parts[0] - path = "" - elif pathformat == "posix": - import posixpath - - path = posixpath.normpath(path) - else: - raise TypeError("Invalid path format %s" % repr(pathformat)) - - if host in ("127.0.0.1", "::1", "localhost"): - host = None - - return host, path - - def _split_netloc(self): - if self._at in self.netloc: - return self.netloc.split(self._at, 1) - return None, self.netloc - - def _split_auth(self): - auth = self._split_netloc()[0] - if not auth: - return None, None - if self._colon not in auth: - return auth, None - return auth.split(self._colon, 1) - - def _split_host(self): - rv = self._split_netloc()[1] - if not rv: - return None, None - - if not rv.startswith(self._lbracket): - if self._colon in rv: - return rv.split(self._colon, 1) - return rv, None - - idx = rv.find(self._rbracket) - if idx < 0: - return rv, None - - host = rv[1:idx] - rest = rv[idx + 1 :] - if rest.startswith(self._colon): - return host, rest[1:] - return host, None - - -@implements_to_string -class URL(BaseURL): - """Represents a parsed URL. This behaves like a regular tuple but - also has some extra attributes that give further insight into the - URL. - """ - - __slots__ = () - _at = "@" - _colon = ":" - _lbracket = "[" - _rbracket = "]" - - def __str__(self): - return self.to_url() - - def encode_netloc(self): - """Encodes the netloc part to an ASCII safe URL as bytes.""" - rv = self.ascii_host or "" - if ":" in rv: - rv = "[%s]" % rv - port = self.port - if port is not None: - rv = "%s:%d" % (rv, port) - auth = ":".join( - filter( - None, - [ - url_quote(self.raw_username or "", "utf-8", "strict", "/:%"), - url_quote(self.raw_password or "", "utf-8", "strict", "/:%"), - ], - ) - ) - if auth: - rv = "%s@%s" % (auth, rv) - return to_native(rv) - - def encode(self, charset="utf-8", errors="replace"): - """Encodes the URL to a tuple made out of bytes. The charset is - only being used for the path, query and fragment. - """ - return BytesURL( - self.scheme.encode("ascii"), - self.encode_netloc(), - self.path.encode(charset, errors), - self.query.encode(charset, errors), - self.fragment.encode(charset, errors), - ) - - -class BytesURL(BaseURL): - """Represents a parsed URL in bytes.""" - - __slots__ = () - _at = b"@" - _colon = b":" - _lbracket = b"[" - _rbracket = b"]" - - def __str__(self): - return self.to_url().decode("utf-8", "replace") - - def encode_netloc(self): - """Returns the netloc unchanged as bytes.""" - return self.netloc - - def decode(self, charset="utf-8", errors="replace"): - """Decodes the URL to a tuple made out of strings. The charset is - only being used for the path, query and fragment. - """ - return URL( - self.scheme.decode("ascii"), - self.decode_netloc(), - self.path.decode(charset, errors), - self.query.decode(charset, errors), - self.fragment.decode(charset, errors), - ) - - -_unquote_maps = {frozenset(): _hextobyte} - - -def _unquote_to_bytes(string, unsafe=""): - if isinstance(string, text_type): - string = string.encode("utf-8") - - if isinstance(unsafe, text_type): - unsafe = unsafe.encode("utf-8") - - unsafe = frozenset(bytearray(unsafe)) - groups = iter(string.split(b"%")) - result = bytearray(next(groups, b"")) - - try: - hex_to_byte = _unquote_maps[unsafe] - except KeyError: - hex_to_byte = _unquote_maps[unsafe] = { - h: b for h, b in _hextobyte.items() if b not in unsafe - } - - for group in groups: - code = group[:2] - - if code in hex_to_byte: - result.append(hex_to_byte[code]) - result.extend(group[2:]) - else: - result.append(37) # % - result.extend(group) - - return bytes(result) - - -def _url_encode_impl(obj, charset, encode_keys, sort, key): - from .datastructures import iter_multi_items - - iterable = iter_multi_items(obj) - if sort: - iterable = sorted(iterable, key=key) - for key, value in iterable: - if value is None: - continue - if not isinstance(key, bytes): - key = text_type(key).encode(charset) - if not isinstance(value, bytes): - value = text_type(value).encode(charset) - yield _fast_url_quote_plus(key) + "=" + _fast_url_quote_plus(value) - - -def _url_unquote_legacy(value, unsafe=""): - try: - return url_unquote(value, charset="utf-8", errors="strict", unsafe=unsafe) - except UnicodeError: - return url_unquote(value, charset="latin1", unsafe=unsafe) - - -def url_parse(url, scheme=None, allow_fragments=True): - """Parses a URL from a string into a :class:`URL` tuple. If the URL - is lacking a scheme it can be provided as second argument. Otherwise, - it is ignored. Optionally fragments can be stripped from the URL - by setting `allow_fragments` to `False`. - - The inverse of this function is :func:`url_unparse`. - - :param url: the URL to parse. - :param scheme: the default schema to use if the URL is schemaless. - :param allow_fragments: if set to `False` a fragment will be removed - from the URL. - """ - s = make_literal_wrapper(url) - is_text_based = isinstance(url, text_type) - - if scheme is None: - scheme = s("") - netloc = query = fragment = s("") - i = url.find(s(":")) - if i > 0 and _scheme_re.match(to_native(url[:i], errors="replace")): - # make sure "iri" is not actually a port number (in which case - # "scheme" is really part of the path) - rest = url[i + 1 :] - if not rest or any(c not in s("0123456789") for c in rest): - # not a port number - scheme, url = url[:i].lower(), rest - - if url[:2] == s("//"): - delim = len(url) - for c in s("/?#"): - wdelim = url.find(c, 2) - if wdelim >= 0: - delim = min(delim, wdelim) - netloc, url = url[2:delim], url[delim:] - if (s("[") in netloc and s("]") not in netloc) or ( - s("]") in netloc and s("[") not in netloc - ): - raise ValueError("Invalid IPv6 URL") - - if allow_fragments and s("#") in url: - url, fragment = url.split(s("#"), 1) - if s("?") in url: - url, query = url.split(s("?"), 1) - - result_type = URL if is_text_based else BytesURL - return result_type(scheme, netloc, url, query, fragment) - - -def _make_fast_url_quote(charset="utf-8", errors="strict", safe="/:", unsafe=""): - """Precompile the translation table for a URL encoding function. - - Unlike :func:`url_quote`, the generated function only takes the - string to quote. - - :param charset: The charset to encode the result with. - :param errors: How to handle encoding errors. - :param safe: An optional sequence of safe characters to never encode. - :param unsafe: An optional sequence of unsafe characters to always encode. - """ - if isinstance(safe, text_type): - safe = safe.encode(charset, errors) - - if isinstance(unsafe, text_type): - unsafe = unsafe.encode(charset, errors) - - safe = (frozenset(bytearray(safe)) | _always_safe) - frozenset(bytearray(unsafe)) - table = [chr(c) if c in safe else "%%%02X" % c for c in range(256)] - - if not PY2: - - def quote(string): - return "".join([table[c] for c in string]) - - else: - - def quote(string): - return "".join([table[c] for c in bytearray(string)]) - - return quote - - -_fast_url_quote = _make_fast_url_quote() -_fast_quote_plus = _make_fast_url_quote(safe=" ", unsafe="+") - - -def _fast_url_quote_plus(string): - return _fast_quote_plus(string).replace(" ", "+") - - -def url_quote(string, charset="utf-8", errors="strict", safe="/:", unsafe=""): - """URL encode a single string with a given encoding. - - :param s: the string to quote. - :param charset: the charset to be used. - :param safe: an optional sequence of safe characters. - :param unsafe: an optional sequence of unsafe characters. - - .. versionadded:: 0.9.2 - The `unsafe` parameter was added. - """ - if not isinstance(string, (text_type, bytes, bytearray)): - string = text_type(string) - if isinstance(string, text_type): - string = string.encode(charset, errors) - if isinstance(safe, text_type): - safe = safe.encode(charset, errors) - if isinstance(unsafe, text_type): - unsafe = unsafe.encode(charset, errors) - safe = (frozenset(bytearray(safe)) | _always_safe) - frozenset(bytearray(unsafe)) - rv = bytearray() - for char in bytearray(string): - if char in safe: - rv.append(char) - else: - rv.extend(_bytetohex[char]) - return to_native(bytes(rv)) - - -def url_quote_plus(string, charset="utf-8", errors="strict", safe=""): - """URL encode a single string with the given encoding and convert - whitespace to "+". - - :param s: The string to quote. - :param charset: The charset to be used. - :param safe: An optional sequence of safe characters. - """ - return url_quote(string, charset, errors, safe + " ", "+").replace(" ", "+") - - -def url_unparse(components): - """The reverse operation to :meth:`url_parse`. This accepts arbitrary - as well as :class:`URL` tuples and returns a URL as a string. - - :param components: the parsed URL as tuple which should be converted - into a URL string. - """ - scheme, netloc, path, query, fragment = normalize_string_tuple(components) - s = make_literal_wrapper(scheme) - url = s("") - - # We generally treat file:///x and file:/x the same which is also - # what browsers seem to do. This also allows us to ignore a schema - # register for netloc utilization or having to differentiate between - # empty and missing netloc. - if netloc or (scheme and path.startswith(s("/"))): - if path and path[:1] != s("/"): - path = s("/") + path - url = s("//") + (netloc or s("")) + path - elif path: - url += path - if scheme: - url = scheme + s(":") + url - if query: - url = url + s("?") + query - if fragment: - url = url + s("#") + fragment - return url - - -def url_unquote(string, charset="utf-8", errors="replace", unsafe=""): - """URL decode a single string with a given encoding. If the charset - is set to `None` no unicode decoding is performed and raw bytes - are returned. - - :param s: the string to unquote. - :param charset: the charset of the query string. If set to `None` - no unicode decoding will take place. - :param errors: the error handling for the charset decoding. - """ - rv = _unquote_to_bytes(string, unsafe) - if charset is not None: - rv = rv.decode(charset, errors) - return rv - - -def url_unquote_plus(s, charset="utf-8", errors="replace"): - """URL decode a single string with the given `charset` and decode "+" to - whitespace. - - Per default encoding errors are ignored. If you want a different behavior - you can set `errors` to ``'replace'`` or ``'strict'``. In strict mode a - :exc:`HTTPUnicodeError` is raised. - - :param s: The string to unquote. - :param charset: the charset of the query string. If set to `None` - no unicode decoding will take place. - :param errors: The error handling for the `charset` decoding. - """ - if isinstance(s, text_type): - s = s.replace(u"+", u" ") - else: - s = s.replace(b"+", b" ") - return url_unquote(s, charset, errors) - - -def url_fix(s, charset="utf-8"): - r"""Sometimes you get an URL by a user that just isn't a real URL because - it contains unsafe characters like ' ' and so on. This function can fix - some of the problems in a similar way browsers handle data entered by the - user: - - >>> url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffskl\xe4rung)') - 'http://de.wikipedia.org/wiki/Elf%20(Begriffskl%C3%A4rung)' - - :param s: the string with the URL to fix. - :param charset: The target charset for the URL if the url was given as - unicode string. - """ - # First step is to switch to unicode processing and to convert - # backslashes (which are invalid in URLs anyways) to slashes. This is - # consistent with what Chrome does. - s = to_unicode(s, charset, "replace").replace("\\", "/") - - # For the specific case that we look like a malformed windows URL - # we want to fix this up manually: - if s.startswith("file://") and s[7:8].isalpha() and s[8:10] in (":/", "|/"): - s = "file:///" + s[7:] - - url = url_parse(s) - path = url_quote(url.path, charset, safe="/%+$!*'(),") - qs = url_quote_plus(url.query, charset, safe=":&%=+$!*'(),") - anchor = url_quote_plus(url.fragment, charset, safe=":&%=+$!*'(),") - return to_native(url_unparse((url.scheme, url.encode_netloc(), path, qs, anchor))) - - -# not-unreserved characters remain quoted when unquoting to IRI -_to_iri_unsafe = "".join([chr(c) for c in range(128) if c not in _always_safe]) - - -def _codec_error_url_quote(e): - """Used in :func:`uri_to_iri` after unquoting to re-quote any - invalid bytes. - """ - out = _fast_url_quote(e.object[e.start : e.end]) - - if PY2: - out = out.decode("utf-8") - - return out, e.end - - -codecs.register_error("werkzeug.url_quote", _codec_error_url_quote) - - -def uri_to_iri(uri, charset="utf-8", errors="werkzeug.url_quote"): - """Convert a URI to an IRI. All valid UTF-8 characters are unquoted, - leaving all reserved and invalid characters quoted. If the URL has - a domain, it is decoded from Punycode. - - >>> uri_to_iri("http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF") - 'http://\\u2603.net/p\\xe5th?q=\\xe8ry%DF' - - :param uri: The URI to convert. - :param charset: The encoding to encode unquoted bytes with. - :param errors: Error handler to use during ``bytes.encode``. By - default, invalid bytes are left quoted. - - .. versionchanged:: 0.15 - All reserved and invalid characters remain quoted. Previously, - only some reserved characters were preserved, and invalid bytes - were replaced instead of left quoted. - - .. versionadded:: 0.6 - """ - if isinstance(uri, tuple): - uri = url_unparse(uri) - - uri = url_parse(to_unicode(uri, charset)) - path = url_unquote(uri.path, charset, errors, _to_iri_unsafe) - query = url_unquote(uri.query, charset, errors, _to_iri_unsafe) - fragment = url_unquote(uri.fragment, charset, errors, _to_iri_unsafe) - return url_unparse((uri.scheme, uri.decode_netloc(), path, query, fragment)) - - -# reserved characters remain unquoted when quoting to URI -_to_uri_safe = ":/?#[]@!$&'()*+,;=%" - - -def iri_to_uri(iri, charset="utf-8", errors="strict", safe_conversion=False): - """Convert an IRI to a URI. All non-ASCII and unsafe characters are - quoted. If the URL has a domain, it is encoded to Punycode. - - >>> iri_to_uri('http://\\u2603.net/p\\xe5th?q=\\xe8ry%DF') - 'http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF' - - :param iri: The IRI to convert. - :param charset: The encoding of the IRI. - :param errors: Error handler to use during ``bytes.encode``. - :param safe_conversion: Return the URL unchanged if it only contains - ASCII characters and no whitespace. See the explanation below. - - There is a general problem with IRI conversion with some protocols - that are in violation of the URI specification. Consider the - following two IRIs:: - - magnet:?xt=uri:whatever - itms-services://?action=download-manifest - - After parsing, we don't know if the scheme requires the ``//``, - which is dropped if empty, but conveys different meanings in the - final URL if it's present or not. In this case, you can use - ``safe_conversion``, which will return the URL unchanged if it only - contains ASCII characters and no whitespace. This can result in a - URI with unquoted characters if it was not already quoted correctly, - but preserves the URL's semantics. Werkzeug uses this for the - ``Location`` header for redirects. - - .. versionchanged:: 0.15 - All reserved characters remain unquoted. Previously, only some - reserved characters were left unquoted. - - .. versionchanged:: 0.9.6 - The ``safe_conversion`` parameter was added. - - .. versionadded:: 0.6 - """ - if isinstance(iri, tuple): - iri = url_unparse(iri) - - if safe_conversion: - # If we're not sure if it's safe to convert the URL, and it only - # contains ASCII characters, return it unconverted. - try: - native_iri = to_native(iri) - ascii_iri = native_iri.encode("ascii") - - # Only return if it doesn't have whitespace. (Why?) - if len(ascii_iri.split()) == 1: - return native_iri - except UnicodeError: - pass - - iri = url_parse(to_unicode(iri, charset, errors)) - path = url_quote(iri.path, charset, errors, _to_uri_safe) - query = url_quote(iri.query, charset, errors, _to_uri_safe) - fragment = url_quote(iri.fragment, charset, errors, _to_uri_safe) - return to_native( - url_unparse((iri.scheme, iri.encode_netloc(), path, query, fragment)) - ) - - -def url_decode( - s, - charset="utf-8", - decode_keys=False, - include_empty=True, - errors="replace", - separator="&", - cls=None, -): - """ - Parse a querystring and return it as :class:`MultiDict`. There is a - difference in key decoding on different Python versions. On Python 3 - keys will always be fully decoded whereas on Python 2, keys will - remain bytestrings if they fit into ASCII. On 2.x keys can be forced - to be unicode by setting `decode_keys` to `True`. - - If the charset is set to `None` no unicode decoding will happen and - raw bytes will be returned. - - Per default a missing value for a key will default to an empty key. If - you don't want that behavior you can set `include_empty` to `False`. - - Per default encoding errors are ignored. If you want a different behavior - you can set `errors` to ``'replace'`` or ``'strict'``. In strict mode a - `HTTPUnicodeError` is raised. - - .. versionchanged:: 0.5 - In previous versions ";" and "&" could be used for url decoding. - This changed in 0.5 where only "&" is supported. If you want to - use ";" instead a different `separator` can be provided. - - The `cls` parameter was added. - - :param s: a string with the query string to decode. - :param charset: the charset of the query string. If set to `None` - no unicode decoding will take place. - :param decode_keys: Used on Python 2.x to control whether keys should - be forced to be unicode objects. If set to `True` - then keys will be unicode in all cases. Otherwise, - they remain `str` if they fit into ASCII. - :param include_empty: Set to `False` if you don't want empty values to - appear in the dict. - :param errors: the decoding error behavior. - :param separator: the pair separator to be used, defaults to ``&`` - :param cls: an optional dict class to use. If this is not specified - or `None` the default :class:`MultiDict` is used. - """ - if cls is None: - from .datastructures import MultiDict - - cls = MultiDict - if isinstance(s, text_type) and not isinstance(separator, text_type): - separator = separator.decode(charset or "ascii") - elif isinstance(s, bytes) and not isinstance(separator, bytes): - separator = separator.encode(charset or "ascii") - return cls( - _url_decode_impl( - s.split(separator), charset, decode_keys, include_empty, errors - ) - ) - - -def url_decode_stream( - stream, - charset="utf-8", - decode_keys=False, - include_empty=True, - errors="replace", - separator="&", - cls=None, - limit=None, - return_iterator=False, -): - """Works like :func:`url_decode` but decodes a stream. The behavior - of stream and limit follows functions like - :func:`~werkzeug.wsgi.make_line_iter`. The generator of pairs is - directly fed to the `cls` so you can consume the data while it's - parsed. - - .. versionadded:: 0.8 - - :param stream: a stream with the encoded querystring - :param charset: the charset of the query string. If set to `None` - no unicode decoding will take place. - :param decode_keys: Used on Python 2.x to control whether keys should - be forced to be unicode objects. If set to `True`, - keys will be unicode in all cases. Otherwise, they - remain `str` if they fit into ASCII. - :param include_empty: Set to `False` if you don't want empty values to - appear in the dict. - :param errors: the decoding error behavior. - :param separator: the pair separator to be used, defaults to ``&`` - :param cls: an optional dict class to use. If this is not specified - or `None` the default :class:`MultiDict` is used. - :param limit: the content length of the URL data. Not necessary if - a limited stream is provided. - :param return_iterator: if set to `True` the `cls` argument is ignored - and an iterator over all decoded pairs is - returned - """ - from .wsgi import make_chunk_iter - - pair_iter = make_chunk_iter(stream, separator, limit) - decoder = _url_decode_impl(pair_iter, charset, decode_keys, include_empty, errors) - - if return_iterator: - return decoder - - if cls is None: - from .datastructures import MultiDict - - cls = MultiDict - - return cls(decoder) - - -def _url_decode_impl(pair_iter, charset, decode_keys, include_empty, errors): - for pair in pair_iter: - if not pair: - continue - s = make_literal_wrapper(pair) - equal = s("=") - if equal in pair: - key, value = pair.split(equal, 1) - else: - if not include_empty: - continue - key = pair - value = s("") - key = url_unquote_plus(key, charset, errors) - if charset is not None and PY2 and not decode_keys: - key = try_coerce_native(key) - yield key, url_unquote_plus(value, charset, errors) - - -def url_encode( - obj, charset="utf-8", encode_keys=False, sort=False, key=None, separator=b"&" -): - """URL encode a dict/`MultiDict`. If a value is `None` it will not appear - in the result string. Per default only values are encoded into the target - charset strings. If `encode_keys` is set to ``True`` unicode keys are - supported too. - - If `sort` is set to `True` the items are sorted by `key` or the default - sorting algorithm. - - .. versionadded:: 0.5 - `sort`, `key`, and `separator` were added. - - :param obj: the object to encode into a query string. - :param charset: the charset of the query string. - :param encode_keys: set to `True` if you have unicode keys. (Ignored on - Python 3.x) - :param sort: set to `True` if you want parameters to be sorted by `key`. - :param separator: the separator to be used for the pairs. - :param key: an optional function to be used for sorting. For more details - check out the :func:`sorted` documentation. - """ - separator = to_native(separator, "ascii") - return separator.join(_url_encode_impl(obj, charset, encode_keys, sort, key)) - - -def url_encode_stream( - obj, - stream=None, - charset="utf-8", - encode_keys=False, - sort=False, - key=None, - separator=b"&", -): - """Like :meth:`url_encode` but writes the results to a stream - object. If the stream is `None` a generator over all encoded - pairs is returned. - - .. versionadded:: 0.8 - - :param obj: the object to encode into a query string. - :param stream: a stream to write the encoded object into or `None` if - an iterator over the encoded pairs should be returned. In - that case the separator argument is ignored. - :param charset: the charset of the query string. - :param encode_keys: set to `True` if you have unicode keys. (Ignored on - Python 3.x) - :param sort: set to `True` if you want parameters to be sorted by `key`. - :param separator: the separator to be used for the pairs. - :param key: an optional function to be used for sorting. For more details - check out the :func:`sorted` documentation. - """ - separator = to_native(separator, "ascii") - gen = _url_encode_impl(obj, charset, encode_keys, sort, key) - if stream is None: - return gen - for idx, chunk in enumerate(gen): - if idx: - stream.write(separator) - stream.write(chunk) - - -def url_join(base, url, allow_fragments=True): - """Join a base URL and a possibly relative URL to form an absolute - interpretation of the latter. - - :param base: the base URL for the join operation. - :param url: the URL to join. - :param allow_fragments: indicates whether fragments should be allowed. - """ - if isinstance(base, tuple): - base = url_unparse(base) - if isinstance(url, tuple): - url = url_unparse(url) - - base, url = normalize_string_tuple((base, url)) - s = make_literal_wrapper(base) - - if not base: - return url - if not url: - return base - - bscheme, bnetloc, bpath, bquery, bfragment = url_parse( - base, allow_fragments=allow_fragments - ) - scheme, netloc, path, query, fragment = url_parse(url, bscheme, allow_fragments) - if scheme != bscheme: - return url - if netloc: - return url_unparse((scheme, netloc, path, query, fragment)) - netloc = bnetloc - - if path[:1] == s("/"): - segments = path.split(s("/")) - elif not path: - segments = bpath.split(s("/")) - if not query: - query = bquery - else: - segments = bpath.split(s("/"))[:-1] + path.split(s("/")) - - # If the rightmost part is "./" we want to keep the slash but - # remove the dot. - if segments[-1] == s("."): - segments[-1] = s("") - - # Resolve ".." and "." - segments = [segment for segment in segments if segment != s(".")] - while 1: - i = 1 - n = len(segments) - 1 - while i < n: - if segments[i] == s("..") and segments[i - 1] not in (s(""), s("..")): - del segments[i - 1 : i + 1] - break - i += 1 - else: - break - - # Remove trailing ".." if the URL is absolute - unwanted_marker = [s(""), s("..")] - while segments[:2] == unwanted_marker: - del segments[1] - - path = s("/").join(segments) - return url_unparse((scheme, netloc, path, query, fragment)) - - -class Href(object): - """Implements a callable that constructs URLs with the given base. The - function can be called with any number of positional and keyword - arguments which than are used to assemble the URL. Works with URLs - and posix paths. - - Positional arguments are appended as individual segments to - the path of the URL: - - >>> href = Href('/foo') - >>> href('bar', 23) - '/foo/bar/23' - >>> href('foo', bar=23) - '/foo/foo?bar=23' - - If any of the arguments (positional or keyword) evaluates to `None` it - will be skipped. If no keyword arguments are given the last argument - can be a :class:`dict` or :class:`MultiDict` (or any other dict subclass), - otherwise the keyword arguments are used for the query parameters, cutting - off the first trailing underscore of the parameter name: - - >>> href(is_=42) - '/foo?is=42' - >>> href({'foo': 'bar'}) - '/foo?foo=bar' - - Combining of both methods is not allowed: - - >>> href({'foo': 'bar'}, bar=42) - Traceback (most recent call last): - ... - TypeError: keyword arguments and query-dicts can't be combined - - Accessing attributes on the href object creates a new href object with - the attribute name as prefix: - - >>> bar_href = href.bar - >>> bar_href("blub") - '/foo/bar/blub' - - If `sort` is set to `True` the items are sorted by `key` or the default - sorting algorithm: - - >>> href = Href("/", sort=True) - >>> href(a=1, b=2, c=3) - '/?a=1&b=2&c=3' - - .. versionadded:: 0.5 - `sort` and `key` were added. - """ - - def __init__(self, base="./", charset="utf-8", sort=False, key=None): - if not base: - base = "./" - self.base = base - self.charset = charset - self.sort = sort - self.key = key - - def __getattr__(self, name): - if name[:2] == "__": - raise AttributeError(name) - base = self.base - if base[-1:] != "/": - base += "/" - return Href(url_join(base, name), self.charset, self.sort, self.key) - - def __call__(self, *path, **query): - if path and isinstance(path[-1], dict): - if query: - raise TypeError("keyword arguments and query-dicts can't be combined") - query, path = path[-1], path[:-1] - elif query: - query = dict( - [(k.endswith("_") and k[:-1] or k, v) for k, v in query.items()] - ) - path = "/".join( - [ - to_unicode(url_quote(x, self.charset), "ascii") - for x in path - if x is not None - ] - ).lstrip("/") - rv = self.base - if path: - if not rv.endswith("/"): - rv += "/" - rv = url_join(rv, "./" + path) - if query: - rv += "?" + to_unicode( - url_encode(query, self.charset, sort=self.sort, key=self.key), "ascii" - ) - return to_native(rv) diff --git a/venv/lib/python3.7/site-packages/werkzeug/useragents.py b/venv/lib/python3.7/site-packages/werkzeug/useragents.py deleted file mode 100644 index 74f2fa4..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/useragents.py +++ /dev/null @@ -1,202 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.useragents - ~~~~~~~~~~~~~~~~~~~ - - This module provides a helper to inspect user agent strings. This module - is far from complete but should work for most of the currently available - browsers. - - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import re - - -class UserAgentParser(object): - """A simple user agent parser. Used by the `UserAgent`.""" - - platforms = ( - (" cros ", "chromeos"), - ("iphone|ios", "iphone"), - ("ipad", "ipad"), - (r"darwin|mac|os\s*x", "macos"), - ("win", "windows"), - (r"android", "android"), - ("netbsd", "netbsd"), - ("openbsd", "openbsd"), - ("freebsd", "freebsd"), - ("dragonfly", "dragonflybsd"), - ("(sun|i86)os", "solaris"), - (r"x11|lin(\b|ux)?", "linux"), - (r"nintendo\s+wii", "wii"), - ("irix", "irix"), - ("hp-?ux", "hpux"), - ("aix", "aix"), - ("sco|unix_sv", "sco"), - ("bsd", "bsd"), - ("amiga", "amiga"), - ("blackberry|playbook", "blackberry"), - ("symbian", "symbian"), - ) - browsers = ( - ("googlebot", "google"), - ("msnbot", "msn"), - ("yahoo", "yahoo"), - ("ask jeeves", "ask"), - (r"aol|america\s+online\s+browser", "aol"), - (r"opera|opr", "opera"), - ("edge", "edge"), - ("chrome|crios", "chrome"), - ("seamonkey", "seamonkey"), - ("firefox|firebird|phoenix|iceweasel", "firefox"), - ("galeon", "galeon"), - ("safari|version", "safari"), - ("webkit", "webkit"), - ("camino", "camino"), - ("konqueror", "konqueror"), - ("k-meleon", "kmeleon"), - ("netscape", "netscape"), - (r"msie|microsoft\s+internet\s+explorer|trident/.+? rv:", "msie"), - ("lynx", "lynx"), - ("links", "links"), - ("Baiduspider", "baidu"), - ("bingbot", "bing"), - ("mozilla", "mozilla"), - ) - - _browser_version_re = r"(?:%s)[/\sa-z(]*(\d+[.\da-z]+)?" - _language_re = re.compile( - r"(?:;\s*|\s+)(\b\w{2}\b(?:-\b\w{2}\b)?)\s*;|" - r"(?:\(|\[|;)\s*(\b\w{2}\b(?:-\b\w{2}\b)?)\s*(?:\]|\)|;)" - ) - - def __init__(self): - self.platforms = [(b, re.compile(a, re.I)) for a, b in self.platforms] - self.browsers = [ - (b, re.compile(self._browser_version_re % a, re.I)) - for a, b in self.browsers - ] - - def __call__(self, user_agent): - for platform, regex in self.platforms: # noqa: B007 - match = regex.search(user_agent) - if match is not None: - break - else: - platform = None - for browser, regex in self.browsers: # noqa: B007 - match = regex.search(user_agent) - if match is not None: - version = match.group(1) - break - else: - browser = version = None - match = self._language_re.search(user_agent) - if match is not None: - language = match.group(1) or match.group(2) - else: - language = None - return platform, browser, version, language - - -class UserAgent(object): - """Represents a user agent. Pass it a WSGI environment or a user agent - string and you can inspect some of the details from the user agent - string via the attributes. The following attributes exist: - - .. attribute:: string - - the raw user agent string - - .. attribute:: platform - - the browser platform. The following platforms are currently - recognized: - - - `aix` - - `amiga` - - `android` - - `blackberry` - - `bsd` - - `chromeos` - - `dragonflybsd` - - `freebsd` - - `hpux` - - `ipad` - - `iphone` - - `irix` - - `linux` - - `macos` - - `netbsd` - - `openbsd` - - `sco` - - `solaris` - - `symbian` - - `wii` - - `windows` - - .. attribute:: browser - - the name of the browser. The following browsers are currently - recognized: - - - `aol` * - - `ask` * - - `baidu` * - - `bing` * - - `camino` - - `chrome` - - `edge` - - `firefox` - - `galeon` - - `google` * - - `kmeleon` - - `konqueror` - - `links` - - `lynx` - - `mozilla` - - `msie` - - `msn` - - `netscape` - - `opera` - - `safari` - - `seamonkey` - - `webkit` - - `yahoo` * - - (Browsers marked with a star (``*``) are crawlers.) - - .. attribute:: version - - the version of the browser - - .. attribute:: language - - the language of the browser - """ - - _parser = UserAgentParser() - - def __init__(self, environ_or_string): - if isinstance(environ_or_string, dict): - environ_or_string = environ_or_string.get("HTTP_USER_AGENT", "") - self.string = environ_or_string - self.platform, self.browser, self.version, self.language = self._parser( - environ_or_string - ) - - def to_header(self): - return self.string - - def __str__(self): - return self.string - - def __nonzero__(self): - return bool(self.browser) - - __bool__ = __nonzero__ - - def __repr__(self): - return "<%s %r/%s>" % (self.__class__.__name__, self.browser, self.version) diff --git a/venv/lib/python3.7/site-packages/werkzeug/utils.py b/venv/lib/python3.7/site-packages/werkzeug/utils.py deleted file mode 100644 index 59c6f27..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/utils.py +++ /dev/null @@ -1,778 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.utils - ~~~~~~~~~~~~~~ - - This module implements various utilities for WSGI applications. Most of - them are used by the request and response wrappers but especially for - middleware development it makes sense to use them without the wrappers. - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import codecs -import os -import pkgutil -import re -import sys - -from ._compat import iteritems -from ._compat import PY2 -from ._compat import reraise -from ._compat import string_types -from ._compat import text_type -from ._compat import unichr -from ._internal import _DictAccessorProperty -from ._internal import _missing -from ._internal import _parse_signature - -try: - from html.entities import name2codepoint -except ImportError: - from htmlentitydefs import name2codepoint - - -_format_re = re.compile(r"\$(?:(%s)|\{(%s)\})" % (("[a-zA-Z_][a-zA-Z0-9_]*",) * 2)) -_entity_re = re.compile(r"&([^;]+);") -_filename_ascii_strip_re = re.compile(r"[^A-Za-z0-9_.-]") -_windows_device_files = ( - "CON", - "AUX", - "COM1", - "COM2", - "COM3", - "COM4", - "LPT1", - "LPT2", - "LPT3", - "PRN", - "NUL", -) - - -class cached_property(property): - """A decorator that converts a function into a lazy property. The - function wrapped is called the first time to retrieve the result - and then that calculated result is used the next time you access - the value:: - - class Foo(object): - - @cached_property - def foo(self): - # calculate something important here - return 42 - - The class has to have a `__dict__` in order for this property to - work. - """ - - # implementation detail: A subclass of python's builtin property - # decorator, we override __get__ to check for a cached value. If one - # chooses to invoke __get__ by hand the property will still work as - # expected because the lookup logic is replicated in __get__ for - # manual invocation. - - def __init__(self, func, name=None, doc=None): - self.__name__ = name or func.__name__ - self.__module__ = func.__module__ - self.__doc__ = doc or func.__doc__ - self.func = func - - def __set__(self, obj, value): - obj.__dict__[self.__name__] = value - - def __get__(self, obj, type=None): - if obj is None: - return self - value = obj.__dict__.get(self.__name__, _missing) - if value is _missing: - value = self.func(obj) - obj.__dict__[self.__name__] = value - return value - - -def invalidate_cached_property(obj, name): - """Invalidates the cache for a :class:`cached_property`: - - >>> class Test(object): - ... @cached_property - ... def magic_number(self): - ... print("recalculating...") - ... return 42 - ... - >>> var = Test() - >>> var.magic_number - recalculating... - 42 - >>> var.magic_number - 42 - >>> invalidate_cached_property(var, "magic_number") - >>> var.magic_number - recalculating... - 42 - - You must pass the name of the cached property as the second argument. - """ - if not isinstance(getattr(obj.__class__, name, None), cached_property): - raise TypeError( - "Attribute {} of object {} is not a cached_property, " - "cannot be invalidated".format(name, obj) - ) - obj.__dict__[name] = _missing - - -class environ_property(_DictAccessorProperty): - """Maps request attributes to environment variables. This works not only - for the Werzeug request object, but also any other class with an - environ attribute: - - >>> class Test(object): - ... environ = {'key': 'value'} - ... test = environ_property('key') - >>> var = Test() - >>> var.test - 'value' - - If you pass it a second value it's used as default if the key does not - exist, the third one can be a converter that takes a value and converts - it. If it raises :exc:`ValueError` or :exc:`TypeError` the default value - is used. If no default value is provided `None` is used. - - Per default the property is read only. You have to explicitly enable it - by passing ``read_only=False`` to the constructor. - """ - - read_only = True - - def lookup(self, obj): - return obj.environ - - -class header_property(_DictAccessorProperty): - """Like `environ_property` but for headers.""" - - def lookup(self, obj): - return obj.headers - - -class HTMLBuilder(object): - """Helper object for HTML generation. - - Per default there are two instances of that class. The `html` one, and - the `xhtml` one for those two dialects. The class uses keyword parameters - and positional parameters to generate small snippets of HTML. - - Keyword parameters are converted to XML/SGML attributes, positional - arguments are used as children. Because Python accepts positional - arguments before keyword arguments it's a good idea to use a list with the - star-syntax for some children: - - >>> html.p(class_='foo', *[html.a('foo', href='foo.html'), ' ', - ... html.a('bar', href='bar.html')]) - u'

    foo bar

    ' - - This class works around some browser limitations and can not be used for - arbitrary SGML/XML generation. For that purpose lxml and similar - libraries exist. - - Calling the builder escapes the string passed: - - >>> html.p(html("")) - u'

    <foo>

    ' - """ - - _entity_re = re.compile(r"&([^;]+);") - _entities = name2codepoint.copy() - _entities["apos"] = 39 - _empty_elements = { - "area", - "base", - "basefont", - "br", - "col", - "command", - "embed", - "frame", - "hr", - "img", - "input", - "keygen", - "isindex", - "link", - "meta", - "param", - "source", - "wbr", - } - _boolean_attributes = { - "selected", - "checked", - "compact", - "declare", - "defer", - "disabled", - "ismap", - "multiple", - "nohref", - "noresize", - "noshade", - "nowrap", - } - _plaintext_elements = {"textarea"} - _c_like_cdata = {"script", "style"} - - def __init__(self, dialect): - self._dialect = dialect - - def __call__(self, s): - return escape(s) - - def __getattr__(self, tag): - if tag[:2] == "__": - raise AttributeError(tag) - - def proxy(*children, **arguments): - buffer = "<" + tag - for key, value in iteritems(arguments): - if value is None: - continue - if key[-1] == "_": - key = key[:-1] - if key in self._boolean_attributes: - if not value: - continue - if self._dialect == "xhtml": - value = '="' + key + '"' - else: - value = "" - else: - value = '="' + escape(value) + '"' - buffer += " " + key + value - if not children and tag in self._empty_elements: - if self._dialect == "xhtml": - buffer += " />" - else: - buffer += ">" - return buffer - buffer += ">" - - children_as_string = "".join( - [text_type(x) for x in children if x is not None] - ) - - if children_as_string: - if tag in self._plaintext_elements: - children_as_string = escape(children_as_string) - elif tag in self._c_like_cdata and self._dialect == "xhtml": - children_as_string = ( - "/**/" - ) - buffer += children_as_string + "" - return buffer - - return proxy - - def __repr__(self): - return "<%s for %r>" % (self.__class__.__name__, self._dialect) - - -html = HTMLBuilder("html") -xhtml = HTMLBuilder("xhtml") - -# https://cgit.freedesktop.org/xdg/shared-mime-info/tree/freedesktop.org.xml.in -# https://www.iana.org/assignments/media-types/media-types.xhtml -# Types listed in the XDG mime info that have a charset in the IANA registration. -_charset_mimetypes = { - "application/ecmascript", - "application/javascript", - "application/sql", - "application/xml", - "application/xml-dtd", - "application/xml-external-parsed-entity", -} - - -def get_content_type(mimetype, charset): - """Returns the full content type string with charset for a mimetype. - - If the mimetype represents text, the charset parameter will be - appended, otherwise the mimetype is returned unchanged. - - :param mimetype: The mimetype to be used as content type. - :param charset: The charset to be appended for text mimetypes. - :return: The content type. - - .. versionchanged:: 0.15 - Any type that ends with ``+xml`` gets a charset, not just those - that start with ``application/``. Known text types such as - ``application/javascript`` are also given charsets. - """ - if ( - mimetype.startswith("text/") - or mimetype in _charset_mimetypes - or mimetype.endswith("+xml") - ): - mimetype += "; charset=" + charset - - return mimetype - - -def detect_utf_encoding(data): - """Detect which UTF encoding was used to encode the given bytes. - - The latest JSON standard (:rfc:`8259`) suggests that only UTF-8 is - accepted. Older documents allowed 8, 16, or 32. 16 and 32 can be big - or little endian. Some editors or libraries may prepend a BOM. - - :internal: - - :param data: Bytes in unknown UTF encoding. - :return: UTF encoding name - - .. versionadded:: 0.15 - """ - head = data[:4] - - if head[:3] == codecs.BOM_UTF8: - return "utf-8-sig" - - if b"\x00" not in head: - return "utf-8" - - if head in (codecs.BOM_UTF32_BE, codecs.BOM_UTF32_LE): - return "utf-32" - - if head[:2] in (codecs.BOM_UTF16_BE, codecs.BOM_UTF16_LE): - return "utf-16" - - if len(head) == 4: - if head[:3] == b"\x00\x00\x00": - return "utf-32-be" - - if head[::2] == b"\x00\x00": - return "utf-16-be" - - if head[1:] == b"\x00\x00\x00": - return "utf-32-le" - - if head[1::2] == b"\x00\x00": - return "utf-16-le" - - if len(head) == 2: - return "utf-16-be" if head.startswith(b"\x00") else "utf-16-le" - - return "utf-8" - - -def format_string(string, context): - """String-template format a string: - - >>> format_string('$foo and ${foo}s', dict(foo=42)) - '42 and 42s' - - This does not do any attribute lookup etc. For more advanced string - formattings have a look at the `werkzeug.template` module. - - :param string: the format string. - :param context: a dict with the variables to insert. - """ - - def lookup_arg(match): - x = context[match.group(1) or match.group(2)] - if not isinstance(x, string_types): - x = type(string)(x) - return x - - return _format_re.sub(lookup_arg, string) - - -def secure_filename(filename): - r"""Pass it a filename and it will return a secure version of it. This - filename can then safely be stored on a regular file system and passed - to :func:`os.path.join`. The filename returned is an ASCII only string - for maximum portability. - - On windows systems the function also makes sure that the file is not - named after one of the special device files. - - >>> secure_filename("My cool movie.mov") - 'My_cool_movie.mov' - >>> secure_filename("../../../etc/passwd") - 'etc_passwd' - >>> secure_filename(u'i contain cool \xfcml\xe4uts.txt') - 'i_contain_cool_umlauts.txt' - - The function might return an empty filename. It's your responsibility - to ensure that the filename is unique and that you abort or - generate a random filename if the function returned an empty one. - - .. versionadded:: 0.5 - - :param filename: the filename to secure - """ - if isinstance(filename, text_type): - from unicodedata import normalize - - filename = normalize("NFKD", filename).encode("ascii", "ignore") - if not PY2: - filename = filename.decode("ascii") - for sep in os.path.sep, os.path.altsep: - if sep: - filename = filename.replace(sep, " ") - filename = str(_filename_ascii_strip_re.sub("", "_".join(filename.split()))).strip( - "._" - ) - - # on nt a couple of special files are present in each folder. We - # have to ensure that the target file is not such a filename. In - # this case we prepend an underline - if ( - os.name == "nt" - and filename - and filename.split(".")[0].upper() in _windows_device_files - ): - filename = "_" + filename - - return filename - - -def escape(s): - """Replace special characters "&", "<", ">" and (") to HTML-safe sequences. - - There is a special handling for `None` which escapes to an empty string. - - .. versionchanged:: 0.9 - `quote` is now implicitly on. - - :param s: the string to escape. - :param quote: ignored. - """ - if s is None: - return "" - elif hasattr(s, "__html__"): - return text_type(s.__html__()) - - if not isinstance(s, string_types): - s = text_type(s) - - return ( - s.replace("&", "&") - .replace("<", "<") - .replace(">", ">") - .replace('"', """) - ) - - -def unescape(s): - """The reverse function of `escape`. This unescapes all the HTML - entities, not only the XML entities inserted by `escape`. - - :param s: the string to unescape. - """ - - def handle_match(m): - name = m.group(1) - if name in HTMLBuilder._entities: - return unichr(HTMLBuilder._entities[name]) - try: - if name[:2] in ("#x", "#X"): - return unichr(int(name[2:], 16)) - elif name.startswith("#"): - return unichr(int(name[1:])) - except ValueError: - pass - return u"" - - return _entity_re.sub(handle_match, s) - - -def redirect(location, code=302, Response=None): - """Returns a response object (a WSGI application) that, if called, - redirects the client to the target location. Supported codes are - 301, 302, 303, 305, 307, and 308. 300 is not supported because - it's not a real redirect and 304 because it's the answer for a - request with a request with defined If-Modified-Since headers. - - .. versionadded:: 0.6 - The location can now be a unicode string that is encoded using - the :func:`iri_to_uri` function. - - .. versionadded:: 0.10 - The class used for the Response object can now be passed in. - - :param location: the location the response should redirect to. - :param code: the redirect status code. defaults to 302. - :param class Response: a Response class to use when instantiating a - response. The default is :class:`werkzeug.wrappers.Response` if - unspecified. - """ - if Response is None: - from .wrappers import Response - - display_location = escape(location) - if isinstance(location, text_type): - # Safe conversion is necessary here as we might redirect - # to a broken URI scheme (for instance itms-services). - from .urls import iri_to_uri - - location = iri_to_uri(location, safe_conversion=True) - response = Response( - '\n' - "Redirecting...\n" - "

    Redirecting...

    \n" - "

    You should be redirected automatically to target URL: " - '%s. If not click the link.' - % (escape(location), display_location), - code, - mimetype="text/html", - ) - response.headers["Location"] = location - return response - - -def append_slash_redirect(environ, code=301): - """Redirects to the same URL but with a slash appended. The behavior - of this function is undefined if the path ends with a slash already. - - :param environ: the WSGI environment for the request that triggers - the redirect. - :param code: the status code for the redirect. - """ - new_path = environ["PATH_INFO"].strip("/") + "/" - query_string = environ.get("QUERY_STRING") - if query_string: - new_path += "?" + query_string - return redirect(new_path, code) - - -def import_string(import_name, silent=False): - """Imports an object based on a string. This is useful if you want to - use import paths as endpoints or something similar. An import path can - be specified either in dotted notation (``xml.sax.saxutils.escape``) - or with a colon as object delimiter (``xml.sax.saxutils:escape``). - - If `silent` is True the return value will be `None` if the import fails. - - :param import_name: the dotted name for the object to import. - :param silent: if set to `True` import errors are ignored and - `None` is returned instead. - :return: imported object - """ - # force the import name to automatically convert to strings - # __import__ is not able to handle unicode strings in the fromlist - # if the module is a package - import_name = str(import_name).replace(":", ".") - try: - try: - __import__(import_name) - except ImportError: - if "." not in import_name: - raise - else: - return sys.modules[import_name] - - module_name, obj_name = import_name.rsplit(".", 1) - module = __import__(module_name, globals(), locals(), [obj_name]) - try: - return getattr(module, obj_name) - except AttributeError as e: - raise ImportError(e) - - except ImportError as e: - if not silent: - reraise( - ImportStringError, ImportStringError(import_name, e), sys.exc_info()[2] - ) - - -def find_modules(import_path, include_packages=False, recursive=False): - """Finds all the modules below a package. This can be useful to - automatically import all views / controllers so that their metaclasses / - function decorators have a chance to register themselves on the - application. - - Packages are not returned unless `include_packages` is `True`. This can - also recursively list modules but in that case it will import all the - packages to get the correct load path of that module. - - :param import_path: the dotted name for the package to find child modules. - :param include_packages: set to `True` if packages should be returned, too. - :param recursive: set to `True` if recursion should happen. - :return: generator - """ - module = import_string(import_path) - path = getattr(module, "__path__", None) - if path is None: - raise ValueError("%r is not a package" % import_path) - basename = module.__name__ + "." - for _importer, modname, ispkg in pkgutil.iter_modules(path): - modname = basename + modname - if ispkg: - if include_packages: - yield modname - if recursive: - for item in find_modules(modname, include_packages, True): - yield item - else: - yield modname - - -def validate_arguments(func, args, kwargs, drop_extra=True): - """Checks if the function accepts the arguments and keyword arguments. - Returns a new ``(args, kwargs)`` tuple that can safely be passed to - the function without causing a `TypeError` because the function signature - is incompatible. If `drop_extra` is set to `True` (which is the default) - any extra positional or keyword arguments are dropped automatically. - - The exception raised provides three attributes: - - `missing` - A set of argument names that the function expected but where - missing. - - `extra` - A dict of keyword arguments that the function can not handle but - where provided. - - `extra_positional` - A list of values that where given by positional argument but the - function cannot accept. - - This can be useful for decorators that forward user submitted data to - a view function:: - - from werkzeug.utils import ArgumentValidationError, validate_arguments - - def sanitize(f): - def proxy(request): - data = request.values.to_dict() - try: - args, kwargs = validate_arguments(f, (request,), data) - except ArgumentValidationError: - raise BadRequest('The browser failed to transmit all ' - 'the data expected.') - return f(*args, **kwargs) - return proxy - - :param func: the function the validation is performed against. - :param args: a tuple of positional arguments. - :param kwargs: a dict of keyword arguments. - :param drop_extra: set to `False` if you don't want extra arguments - to be silently dropped. - :return: tuple in the form ``(args, kwargs)``. - """ - parser = _parse_signature(func) - args, kwargs, missing, extra, extra_positional = parser(args, kwargs)[:5] - if missing: - raise ArgumentValidationError(tuple(missing)) - elif (extra or extra_positional) and not drop_extra: - raise ArgumentValidationError(None, extra, extra_positional) - return tuple(args), kwargs - - -def bind_arguments(func, args, kwargs): - """Bind the arguments provided into a dict. When passed a function, - a tuple of arguments and a dict of keyword arguments `bind_arguments` - returns a dict of names as the function would see it. This can be useful - to implement a cache decorator that uses the function arguments to build - the cache key based on the values of the arguments. - - :param func: the function the arguments should be bound for. - :param args: tuple of positional arguments. - :param kwargs: a dict of keyword arguments. - :return: a :class:`dict` of bound keyword arguments. - """ - ( - args, - kwargs, - missing, - extra, - extra_positional, - arg_spec, - vararg_var, - kwarg_var, - ) = _parse_signature(func)(args, kwargs) - values = {} - for (name, _has_default, _default), value in zip(arg_spec, args): - values[name] = value - if vararg_var is not None: - values[vararg_var] = tuple(extra_positional) - elif extra_positional: - raise TypeError("too many positional arguments") - if kwarg_var is not None: - multikw = set(extra) & set([x[0] for x in arg_spec]) - if multikw: - raise TypeError( - "got multiple values for keyword argument " + repr(next(iter(multikw))) - ) - values[kwarg_var] = extra - elif extra: - raise TypeError("got unexpected keyword argument " + repr(next(iter(extra)))) - return values - - -class ArgumentValidationError(ValueError): - - """Raised if :func:`validate_arguments` fails to validate""" - - def __init__(self, missing=None, extra=None, extra_positional=None): - self.missing = set(missing or ()) - self.extra = extra or {} - self.extra_positional = extra_positional or [] - ValueError.__init__( - self, - "function arguments invalid. (%d missing, %d additional)" - % (len(self.missing), len(self.extra) + len(self.extra_positional)), - ) - - -class ImportStringError(ImportError): - """Provides information about a failed :func:`import_string` attempt.""" - - #: String in dotted notation that failed to be imported. - import_name = None - #: Wrapped exception. - exception = None - - def __init__(self, import_name, exception): - self.import_name = import_name - self.exception = exception - - msg = ( - "import_string() failed for %r. Possible reasons are:\n\n" - "- missing __init__.py in a package;\n" - "- package or module path not included in sys.path;\n" - "- duplicated package or module name taking precedence in " - "sys.path;\n" - "- missing module, class, function or variable;\n\n" - "Debugged import:\n\n%s\n\n" - "Original exception:\n\n%s: %s" - ) - - name = "" - tracked = [] - for part in import_name.replace(":", ".").split("."): - name += (name and ".") + part - imported = import_string(name, silent=True) - if imported: - tracked.append((name, getattr(imported, "__file__", None))) - else: - track = ["- %r found in %r." % (n, i) for n, i in tracked] - track.append("- %r not found." % name) - msg = msg % ( - import_name, - "\n".join(track), - exception.__class__.__name__, - str(exception), - ) - break - - ImportError.__init__(self, msg) - - def __repr__(self): - return "<%s(%r, %r)>" % ( - self.__class__.__name__, - self.import_name, - self.exception, - ) diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/__init__.py b/venv/lib/python3.7/site-packages/werkzeug/wrappers/__init__.py deleted file mode 100644 index 56c764a..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wrappers/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -werkzeug.wrappers -~~~~~~~~~~~~~~~~~ - -The wrappers are simple request and response objects which you can -subclass to do whatever you want them to do. The request object contains -the information transmitted by the client (webbrowser) and the response -object contains all the information sent back to the browser. - -An important detail is that the request object is created with the WSGI -environ and will act as high-level proxy whereas the response object is an -actual WSGI application. - -Like everything else in Werkzeug these objects will work correctly with -unicode data. Incoming form data parsed by the response object will be -decoded into an unicode object if possible and if it makes sense. - -:copyright: 2007 Pallets -:license: BSD-3-Clause -""" -from .accept import AcceptMixin -from .auth import AuthorizationMixin -from .auth import WWWAuthenticateMixin -from .base_request import BaseRequest -from .base_response import BaseResponse -from .common_descriptors import CommonRequestDescriptorsMixin -from .common_descriptors import CommonResponseDescriptorsMixin -from .etag import ETagRequestMixin -from .etag import ETagResponseMixin -from .request import PlainRequest -from .request import Request -from .request import StreamOnlyMixin -from .response import Response -from .response import ResponseStream -from .response import ResponseStreamMixin -from .user_agent import UserAgentMixin diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b061b45121ba141d21d1250e428b6c546cf9650c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1638 zcmaJ>&2Aev5SDD&l2?D0>?C!87IUl*vVsOl0i!5lCq)~eKS7*A01sJEyNs3czn}1KcRnNVabY_y13mwlWzNE?;8_7{T|q`wVyk&3sI}lUno}pxPr-g@dCha z7|Cls$h2~lE1RGraP?LjNgdY;oT17}?i|ZuzVy`UdYU=SmOe8dy`{TIk}Cx$f;P@4pEJx&0LSvMu;6(oeO$^6!=iIoaaRPF z+08dE5~kj9gJpOPR~&Po847Bl;EQ4+P$L1Q(eKwN8AAfU!>)*}*nVTw7$Ykxz|#UY zQ}8S(gvox#mkhk#Ygcf!04A_eT)}MHeNXyf>wF$7ZI-CIG1yIk+hf*ArFf=u203*U z+w?+ZT6#X;jbMb58oO&m6g%b_3Y@bfXPzd<6i`>HAo6Z|!rwxvt>tq(V_p}Wa|erpvWKk=!MG{_x=!@DdxyoJ}sVZtrsm*Ei26k0#Fqtt?CaY~t-bZ*IC* zS;k8DJ%7&?PRCc3E41OaL8@pyoy}%`0o(6IWYONerk1^`Pdx_r>S=xOasJ6OEu~gl zhv&>@hL=to8{X>Nky%cyIcDb~7aCqbJq{ttYSV!;9 ztL^o~EC&(SZfH6Aw{&C#2C~9T)5t@I7si{?=3%VGg}*jHd_XO7opirtL{OIBZ&YrxxbO&;8rHX-B@UH}(9` z_x4UaWM<%PLq8n*g#_DfQtInlkE>h#r{yl!oZx-*D!e`GzlccLxTvz2m#@|L7XV zpK4II4hYZT6X(zogP5_An7(N$*#g<}EiKz1+rF*kPTWZx-_f!YcaxsqGmRsIbV=`> zL3-4^xBWhGUm2tRUlynxnZ@pOiMgP15{5LBFtK-v(?yOKw3!*4ot({@(c?_*53t@J zEGZ_G!?FDkhf7L=jI)e#c^88Err97phfk=E8oo&k-y)`O(+;tS{m!^IeFx+YakSh8 zS=$WrJ&;|}*YhqJfbBcQPHD|q^h1=cexIO33Fw+}6vkKxD$s2tmk6im5KGAqFMoQ0 z1${|H#!^8&n%+d5rI$!8MpwC{0|ZSnw4f5Tm}PD|!`z)_8^`8~z74w|Lcp=;IAUgX!_)<*QkZEO)^{-dA18Qm)E`hP3R4Ff8^f zpKFspf=QvGU^te!`nUz1dS^R0kKp8HvfZ0H)qbm?p=roSlrFZhDUA>wLbGNaxQI*o zNXiqP-ztePrzm7e1_TiiOVL`P$U|VOK#NtBfu^q&k?TM#@eKuaF=KCluZ^;b*xMLf zZe;9-oA}P=({H{ynIDa8ow{p)M`kOwb>cN9eyYILiPvpSyk=uNw*N(BtoU9799M<6 z72x-x@^%SdCtrh}=b;;*8bkqbP8XD*r`|!c3b8s#5ya^xV!5byR%YEooG{{ak;j;C z9(l09lo`3UM&*QR{#K|?C-b9kCr7iY%B(}hZHU1G@oFIaOvOu+p$}weD;3Sw`KVvG zL6G8v20<|hf`pMgR`M_i-sU*2R(e4|SQrExUTTBys%}qpswQzoo(+Pk>cp$V@&)djWaETzoKa_i(WiiN(t=#~$Q*3x!u;eJ_q P@l3rZ`tG4w{p^1L`u|DY diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-37.pyc deleted file mode 100644 index c31ed73d9391a571f5002413ce513854f1184869..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1654 zcmbW1&u`Q?6vyo(Gn1B?QVK!{u~LM@VUU_RflyT{3J1!8vf3R~DTmFN*kuBlB-jo^ zqk&5+;Lm^~2mYa4Iq@%W+V`AhcBXJZ>&Q?3mG{2S{@C|>y;TBbZSUxx_YNW7u+tRi zlY3Cr9vDtIO~`}>lw#Y0wiQ^WZ724`2^>lu67KNU3E?f#I<|v0^xM1x{f_B(xcfKh zuY9+_U7uE0b0(DtS)s?7j7z5DEDgtkaUo&$k9u}GothOQ)p5kM_;11ah(%+;!(3*$ zkoqVBuk&I<>mF2f4U8ZGJpe4c|kr=PCwJP zR9iE8Od(~fyg3A&XZ6$`y*NG1z&p(3#1A(1hQmL@-KWF7Cx1N(c88Ci?Dy@eBhuHg z%+kt!F0?c!YE_OB$zj#56Z=9WqV;2YpeOktkMqqqRhlKq=B=X4ZkM;>!NF;&gC^&} zRI(gSQw?y#{rsrvE$w_4^Fl0%-KC|sv?b=?{H5jl{dVPsVag^V46D^JoMgO6u-y&A zR|QK>XF6fXvnUKDx|SHkNMA7LaI6KU4b>=c9mg^w|C_r@2L}h3L4$Tp-cC(k1KwHw z7um}^2JERkOBFy?^DsvNF=(o~4xJC=5J2G8iTjp*tg)~G3k$G7Ff0JWDF+4&5VpCf zY|bjM!ItQlheHA}+(oF$2Qwq;3O9jXw&fKJ$mv~@Zp?_hIRhp?6EkLQ!)pSe?fr5c za^1x9Yc`}@KP#kfRh^nH6|CrN{ul&qvrm00U5H*E9iCdX0r`>cpVyjMjB?k^txS! z6$%j}PPYw&-}o(kfVu3!KXMJtc{J-_Dz|y2Bt8WTG@}q{kiGydb7V-qO95#d+3&lR tGuApc7u#f0wF(_4%G{8uUBhPZH$VK!cja!^*KG&cF#F!6@Y(CVe*w^Kx0wI{ diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc deleted file mode 100644 index bb17e84b30848af889f36d4b5bbe00c267112969..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21464 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 Gm;NtsW8x|R diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc deleted file mode 100644 index 3c373c81b8bcde590268ab99ef15ab0cf0e69305..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23138 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 AR{#J2 diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc deleted file mode 100644 index 15ec49e3cade1c641536c71e6508dcbd1465b0d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12727 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 diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/cors.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/cors.cpython-37.pyc deleted file mode 100644 index 99e1ff8596373c8e1903ab0076219810ab288235..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3230 zcmc&$PmkL~6!*U*PB!}wP%mxK2qb6@@fM_(YE@ND)2Lg-ZXgM&qj5_hP>{Z+`RM@6El{)tUy^ z+Ro`WzpQH7A5xiK76^CY<^vdrM)Xh{>8`Fz*#Oya4JDhQIkH?!$ri{Zx1?(iG*Tkv z7aA$k@^jOzfL6mh{8=M4D`cn&yq<{`$hPM3>bH4rf+X-byDIFg=6NVFr zk307;r-k8T#K-&UOUi2qE-}OcVL~_}l>015M9jEy*k&>3sLO&wn4w2`JZ3&c{UK&S zbcn9WXd22zzI5)?l;$|-7$yzk2)t6Vy^TI`uB$ih%FbZ$rPu8}eDH8D{cbR%Xc%*m zhaf;>`QlKl=EQ;$bim?~gZfmUZ7c+X<>e^wB#t;$FgV!vDd(OaM}oznhr=+Qc)5?q zD2~9tbe&ru5u+d?fe+r%WEl9vVm6L2qe$6O;=qoYB=+48Rm81!yVLJ`?e5;7*Zsol zb-wz#(;s*{o!0$Mub=+jr;$LDKnxK^38M#La5xmR)hy0f00t&ui1sPsGkY1TuW--f zpE~(h5ERo~1cPZruVG+h)iB1yI~Yekt3c|yAN&&>yPd&K_kQ}@+oCa|Vi=Pd7-KHC z9TNIK#Uh`CUj&Qd)7SE0uTjlx&x`PgdR|uZyirWXp_J>M_jHWI;!VZ#AZYx@!(8~mh50uFw zPX%JejCpI2ZYJl4pbE91*QJ~_izP)ZMbXW6PSMSlr08b*)v|zZD+LFEXmJ`IyvldB z4#;F^u0C>_KLd?yu3Vz2mD5ibl4N<8IAiWBQ?Qm#S-xshJ_6yHPV^(2y+;hWImEoJ zMQc*}UWeYT{h*E>uwmBTAhQG;(+e!uV4L7LGm|)J80;M>myU5brgN)i@4~A)aC2FJ znqlj8BfYW|%^h`Q;pweMs;f;IeVQ+CZZQp$*)WG&RVSbs>7O&*u3~MTewI%+CCy^G zHt zwmJF>ZHX#er(G*EgGgj17tFmh=LJCV0FW~Yts0oDWwrr>12?|~gKR-{drdYT^|Q^3 zNy>|C%+^qdM8Ti{$x34pgj}^?1rzk){U_8Hs;eohWkF^3?Yybqk*uuPxUQ?8x$*Je DwOiP3 diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/etag.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/etag.cpython-37.pyc deleted file mode 100644 index 3743acd83c17c59a5b0c8a585ef14b8af02cea0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11520 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 diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/request.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/request.cpython-37.pyc deleted file mode 100644 index 8ecfc2199ab369a0b5054467714ee1bf3c207d29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1941 zcmah~OOGQp5bjQQ-p?I`mJ5<^C=!!!StKF^J3G4z9GF2fgOD1Dj?=CrUfhqh-4iB< zy$rvB|G;1BD<}8~oG81Kkj-SFqpp<8c0IqUe%9@_9DI6T-~IGg)p7nXi|u1}p5m*1 zL&6;93MY00*EM`aRAMjiEbj?Ft_D@h`=S=tgSzFbq7gTPrsZp*6}N-7k>r_9 zrP`h!oL^pDZ?<=`7dLcqAnSdvK%OliDeXt-((W<-J;hfIkbo1o%n2&Y4Lnvs|GlEV z(M3%pFLNQt9H`DEFd|D&NjiH4ktRIO1jJ~BCkvvNK<23s>B_8P6SkVPS_Gd{d?%5h zN=>GFS()N_NvKT|SpsDsNk*l@`wy-i##r73O&5eFj6^g-^HG{;nF_K*kvOL1?W~kK za?BK=CRK!+>ng+0utX1Bcv!$v!BXptP^|8|?Y>!o{CN%eVziPp%Rs78gjF3KRR8l_tYw!pd{|3I0zAl?EbSE{@jWA4T3}INb z!Z1!*E)3rZ!`C?#o1JeH^qO;DNV68~Dr%s?105R*U|%mO$gnMBLf_ zpdTTKznL36B7QNCGeFRRMe6~Y^^z;H;)wSM0kkO3%wS1xc`9v=(mCOp=#((7=uE(_ z-~@M2ZM=o=h>#njZF5c;b5_HIYAq+zITxU&ACv78uTF{C;!VAEwn*3S*9zvML?r*DpvFk|86N4#@kWZjH4030}2sN83Q(%kWWURSu zFNQT~${^c@bPVYt2_A0(2^rNiWV^W(yuYG}4o&FgmT6yL|01L0`bLqNHUwW)L(-`G z72mb8<7IxwZ0dX`DBsS<^^a$V6KTb9$mW`uCgv0;*IrR@NMv-z1=k$Z|0V}IyIqL^!n1QFNP;Yt(xuh4~ODf~4c_{k)c2+56S{ GgYG{@Qy~NZ diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/response.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/response.cpython-37.pyc deleted file mode 100644 index d0f96362f7689b9252caab92226aaeeac4015fba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3470 zcma)9TW=dh6yBTdjbl4$no>~;8m_`ral}LW5LGBm+R{qkq9!6}CD?3s#`dOr>&$FZ zTZRWx@y35hANdvh1Af4YH=g>yAK-~|X1z`vr-gOqx@XUvIp;f174D^jHPq4>Kq)99o ztl!&Cq9}>Wox4o+8i<;DWp*a;=p;Z{Gv_@?hYjlCuVYKNYZNRudo3sUEoi5R37(p@g5?y(r9qUe$ zUIrzs=B-kM9m$y&jefsFdO^qtonC{4!4pQ3gG1&^k_kr1!H|Gj$c7(!LTv2Ma!~i% zCo-uMcsNTr6QDx%#X&-cB)?YuGPPmr>p2T{| zx|0rb+jWCDkgj_P1+t*i^r}9(`gn5B!U&y`YUUnDt?sb}ld*QF@s`x7eysltw>dNp z0U6Z%6`V?~j1z0DzbsdklPa~S_R`QbSsTMQaPvxcbp7G_BZ8>+WRS!J{)*cx2<*0X zrxs-rRX%EMC$R)Gu6@Pgz8th|z6es}^>4i}WA`{uxYAUC^CH#N zIbjep@h*HYv0q&uy?v29iq6Mif)9>UBqFF31`834F6de*6b8KP`GYIUEbqe`fjqQ% z4Jd+(4_ko`X5lgc{+rDY)gS&~82fcK}^xqMD0q?nNik)!tfbk_@t$c`I z!`VC7q2qCM6HcJZ?J~Xc4{#6T>6s2ao@14OO{_v^Tb5xNwq@JUOlTF`QWQSCoIdF4 zo6rQFb~Z~g3!|aRbQNl0w9C&aTIH$HA8H`Igiq7i+4R0oM0TLk921bLwlU#Bev$)E zLXsLV2vMZRlSri=IS2%auu33DK^PJ*lSu@T)rU+mBz-1{M>YVKd}F^ze*2_UO2H9U z&jLuiiknANv{_4H_!tr*<2}!3kXL6CBPo+&k^N?XgSMUmM*?&T*p6=OLh|O5j5B3G zJaP8KNqPoQp-EnYt!hDa8!e!aWsa`R!da=eQ;>DrRsJE6a*P=KW9&Y`4!`7|VRsQK z+VJ8QH03df3XVHIwCRH$vI$LP__HXWDxTzaDU}>= z5AX$jB^d{_?LcV3t50(G++n3+cT_Q_jE$uq@hB|?RI0#oalb_UzG8#NmGGbA`{t6m zko*~lmSlpUa;6+l%huvj-L`ch<}O0o4S>)V!UzFruW(#<+sk<+lR+pHOmhpZz%fZU z%>(#9z~vJ^;uYLm@zwtV?in#S<{!sG8}J%Ta|?07F_`Do0(8p76s*;m7r8-h-!4M& W7YKG0?i%{^XD+WTH|n}E{rwBfLT?5D diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc b/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc deleted file mode 100644 index d8f73ff6dc67454477f408e2dc80a71f993a70f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 796 zcmYjP&2G~`5Z?7ql7_TBA|wubjYREJIaCO>AK$%X=W0N`PFvPXTJf6L4E_mz}}2{vn>8W&h@ z#)P#xpEp)9TQQp{rqx}ejAhmQR;8A$vOLYk3?!{eEArB~tXgQJBts_B$t0*PFtg)rt~_G6{=msT~42=N@8iT31YTPjh{0>N$#-%~HxzoO?c)#7O4?`*O&+j}rk=*1x}hq+=DI3j-holY%}=6-aQ^Q)w#z!M z^ZE=rwW27_&YQM+-k#_2r!C2N$2MMRQNxN%{4mg{UU%b%@DY;3g2Zp1>^pMnaJ}|h zcsCt%BhE{)RGfEX&X<*J3iKzO-!-Dx-V8aHRm!=>SD=s3An5}$!Vn*12x`z71%c;I qph)7F_4Dn=5H>b1jKk{&{l;DL0i>&dxZUVQ&+8?Q-hof(#QzUuUDs&< diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/accept.py b/venv/lib/python3.7/site-packages/werkzeug/wrappers/accept.py deleted file mode 100644 index d0620a0..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wrappers/accept.py +++ /dev/null @@ -1,50 +0,0 @@ -from ..datastructures import CharsetAccept -from ..datastructures import LanguageAccept -from ..datastructures import MIMEAccept -from ..http import parse_accept_header -from ..utils import cached_property - - -class AcceptMixin(object): - """A mixin for classes with an :attr:`~BaseResponse.environ` attribute - to get all the HTTP accept headers as - :class:`~werkzeug.datastructures.Accept` objects (or subclasses - thereof). - """ - - @cached_property - def accept_mimetypes(self): - """List of mimetypes this client supports as - :class:`~werkzeug.datastructures.MIMEAccept` object. - """ - return parse_accept_header(self.environ.get("HTTP_ACCEPT"), MIMEAccept) - - @cached_property - def accept_charsets(self): - """List of charsets this client supports as - :class:`~werkzeug.datastructures.CharsetAccept` object. - """ - return parse_accept_header( - self.environ.get("HTTP_ACCEPT_CHARSET"), CharsetAccept - ) - - @cached_property - def accept_encodings(self): - """List of encodings this client accepts. Encodings in a HTTP term - are compression encodings such as gzip. For charsets have a look at - :attr:`accept_charset`. - """ - return parse_accept_header(self.environ.get("HTTP_ACCEPT_ENCODING")) - - @cached_property - def accept_languages(self): - """List of languages this client accepts as - :class:`~werkzeug.datastructures.LanguageAccept` object. - - .. versionchanged 0.5 - In previous versions this was a regular - :class:`~werkzeug.datastructures.Accept` object. - """ - return parse_accept_header( - self.environ.get("HTTP_ACCEPT_LANGUAGE"), LanguageAccept - ) diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/auth.py b/venv/lib/python3.7/site-packages/werkzeug/wrappers/auth.py deleted file mode 100644 index 714f755..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wrappers/auth.py +++ /dev/null @@ -1,33 +0,0 @@ -from ..http import parse_authorization_header -from ..http import parse_www_authenticate_header -from ..utils import cached_property - - -class AuthorizationMixin(object): - """Adds an :attr:`authorization` property that represents the parsed - value of the `Authorization` header as - :class:`~werkzeug.datastructures.Authorization` object. - """ - - @cached_property - def authorization(self): - """The `Authorization` object in parsed form.""" - header = self.environ.get("HTTP_AUTHORIZATION") - return parse_authorization_header(header) - - -class WWWAuthenticateMixin(object): - """Adds a :attr:`www_authenticate` property to a response object.""" - - @property - def www_authenticate(self): - """The `WWW-Authenticate` header in a parsed form.""" - - def on_update(www_auth): - if not www_auth and "www-authenticate" in self.headers: - del self.headers["www-authenticate"] - elif www_auth: - self.headers["WWW-Authenticate"] = www_auth.to_header() - - header = self.headers.get("www-authenticate") - return parse_www_authenticate_header(header, on_update) diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/base_request.py b/venv/lib/python3.7/site-packages/werkzeug/wrappers/base_request.py deleted file mode 100644 index 1f21db2..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wrappers/base_request.py +++ /dev/null @@ -1,673 +0,0 @@ -from functools import update_wrapper -from io import BytesIO - -from .._compat import to_native -from .._compat import to_unicode -from .._compat import wsgi_decoding_dance -from .._compat import wsgi_get_bytes -from ..datastructures import CombinedMultiDict -from ..datastructures import EnvironHeaders -from ..datastructures import ImmutableList -from ..datastructures import ImmutableMultiDict -from ..datastructures import iter_multi_items -from ..datastructures import MultiDict -from ..formparser import default_stream_factory -from ..formparser import FormDataParser -from ..http import parse_cookie -from ..http import parse_list_header -from ..http import parse_options_header -from ..urls import url_decode -from ..utils import cached_property -from ..utils import environ_property -from ..wsgi import get_content_length -from ..wsgi import get_current_url -from ..wsgi import get_host -from ..wsgi import get_input_stream - - -class BaseRequest(object): - """Very basic request object. This does not implement advanced stuff like - entity tag parsing or cache controls. The request object is created with - the WSGI environment as first argument and will add itself to the WSGI - environment as ``'werkzeug.request'`` unless it's created with - `populate_request` set to False. - - There are a couple of mixins available that add additional functionality - to the request object, there is also a class called `Request` which - subclasses `BaseRequest` and all the important mixins. - - It's a good idea to create a custom subclass of the :class:`BaseRequest` - and add missing functionality either via mixins or direct implementation. - Here an example for such subclasses:: - - from werkzeug.wrappers import BaseRequest, ETagRequestMixin - - class Request(BaseRequest, ETagRequestMixin): - pass - - Request objects are **read only**. As of 0.5 modifications are not - allowed in any place. Unlike the lower level parsing functions the - request object will use immutable objects everywhere possible. - - Per default the request object will assume all the text data is `utf-8` - encoded. Please refer to :doc:`the unicode chapter ` for more - details about customizing the behavior. - - Per default the request object will be added to the WSGI - environment as `werkzeug.request` to support the debugging system. - If you don't want that, set `populate_request` to `False`. - - If `shallow` is `True` the environment is initialized as shallow - object around the environ. Every operation that would modify the - environ in any way (such as consuming form data) raises an exception - unless the `shallow` attribute is explicitly set to `False`. This - is useful for middlewares where you don't want to consume the form - data by accident. A shallow request is not populated to the WSGI - environment. - - .. versionchanged:: 0.5 - read-only mode was enforced by using immutables classes for all - data. - """ - - #: the charset for the request, defaults to utf-8 - charset = "utf-8" - - #: the error handling procedure for errors, defaults to 'replace' - encoding_errors = "replace" - - #: the maximum content length. This is forwarded to the form data - #: parsing function (:func:`parse_form_data`). When set and the - #: :attr:`form` or :attr:`files` attribute is accessed and the - #: parsing fails because more than the specified value is transmitted - #: a :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. - #: - #: Have a look at :ref:`dealing-with-request-data` for more details. - #: - #: .. versionadded:: 0.5 - max_content_length = None - - #: the maximum form field size. This is forwarded to the form data - #: parsing function (:func:`parse_form_data`). When set and the - #: :attr:`form` or :attr:`files` attribute is accessed and the - #: data in memory for post data is longer than the specified value a - #: :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. - #: - #: Have a look at :ref:`dealing-with-request-data` for more details. - #: - #: .. versionadded:: 0.5 - max_form_memory_size = None - - #: the class to use for `args` and `form`. The default is an - #: :class:`~werkzeug.datastructures.ImmutableMultiDict` which supports - #: multiple values per key. alternatively it makes sense to use an - #: :class:`~werkzeug.datastructures.ImmutableOrderedMultiDict` which - #: preserves order or a :class:`~werkzeug.datastructures.ImmutableDict` - #: which is the fastest but only remembers the last key. It is also - #: possible to use mutable structures, but this is not recommended. - #: - #: .. versionadded:: 0.6 - parameter_storage_class = ImmutableMultiDict - - #: the type to be used for list values from the incoming WSGI environment. - #: By default an :class:`~werkzeug.datastructures.ImmutableList` is used - #: (for example for :attr:`access_list`). - #: - #: .. versionadded:: 0.6 - list_storage_class = ImmutableList - - #: The type to be used for dict values from the incoming WSGI - #: environment. (For example for :attr:`cookies`.) By default an - #: :class:`~werkzeug.datastructures.ImmutableMultiDict` is used. - #: - #: .. versionchanged:: 1.0.0 - #: Changed to ``ImmutableMultiDict`` to support multiple values. - #: - #: .. versionadded:: 0.6 - dict_storage_class = ImmutableMultiDict - - #: The form data parser that shoud be used. Can be replaced to customize - #: the form date parsing. - form_data_parser_class = FormDataParser - - #: Optionally a list of hosts that is trusted by this request. By default - #: all hosts are trusted which means that whatever the client sends the - #: host is will be accepted. - #: - #: Because `Host` and `X-Forwarded-Host` headers can be set to any value by - #: a malicious client, it is recommended to either set this property or - #: implement similar validation in the proxy (if application is being run - #: behind one). - #: - #: .. versionadded:: 0.9 - trusted_hosts = None - - #: Indicates whether the data descriptor should be allowed to read and - #: buffer up the input stream. By default it's enabled. - #: - #: .. versionadded:: 0.9 - disable_data_descriptor = False - - def __init__(self, environ, populate_request=True, shallow=False): - self.environ = environ - if populate_request and not shallow: - self.environ["werkzeug.request"] = self - self.shallow = shallow - - def __repr__(self): - # make sure the __repr__ even works if the request was created - # from an invalid WSGI environment. If we display the request - # in a debug session we don't want the repr to blow up. - args = [] - try: - args.append("'%s'" % to_native(self.url, self.url_charset)) - args.append("[%s]" % self.method) - except Exception: - args.append("(invalid WSGI environ)") - - return "<%s %s>" % (self.__class__.__name__, " ".join(args)) - - @property - def url_charset(self): - """The charset that is assumed for URLs. Defaults to the value - of :attr:`charset`. - - .. versionadded:: 0.6 - """ - return self.charset - - @classmethod - def from_values(cls, *args, **kwargs): - """Create a new request object based on the values provided. If - environ is given missing values are filled from there. This method is - useful for small scripts when you need to simulate a request from an URL. - Do not use this method for unittesting, there is a full featured client - object (:class:`Client`) that allows to create multipart requests, - support for cookies etc. - - This accepts the same options as the - :class:`~werkzeug.test.EnvironBuilder`. - - .. versionchanged:: 0.5 - This method now accepts the same arguments as - :class:`~werkzeug.test.EnvironBuilder`. Because of this the - `environ` parameter is now called `environ_overrides`. - - :return: request object - """ - from ..test import EnvironBuilder - - charset = kwargs.pop("charset", cls.charset) - kwargs["charset"] = charset - builder = EnvironBuilder(*args, **kwargs) - try: - return builder.get_request(cls) - finally: - builder.close() - - @classmethod - def application(cls, f): - """Decorate a function as responder that accepts the request as - the last argument. This works like the :func:`responder` - decorator but the function is passed the request object as the - last argument and the request object will be closed - automatically:: - - @Request.application - def my_wsgi_app(request): - return Response('Hello World!') - - As of Werkzeug 0.14 HTTP exceptions are automatically caught and - converted to responses instead of failing. - - :param f: the WSGI callable to decorate - :return: a new WSGI callable - """ - #: return a callable that wraps the -2nd argument with the request - #: and calls the function with all the arguments up to that one and - #: the request. The return value is then called with the latest - #: two arguments. This makes it possible to use this decorator for - #: both standalone WSGI functions as well as bound methods and - #: partially applied functions. - from ..exceptions import HTTPException - - def application(*args): - request = cls(args[-2]) - with request: - try: - resp = f(*args[:-2] + (request,)) - except HTTPException as e: - resp = e.get_response(args[-2]) - return resp(*args[-2:]) - - return update_wrapper(application, f) - - def _get_file_stream( - self, total_content_length, content_type, filename=None, content_length=None - ): - """Called to get a stream for the file upload. - - This must provide a file-like class with `read()`, `readline()` - and `seek()` methods that is both writeable and readable. - - The default implementation returns a temporary file if the total - content length is higher than 500KB. Because many browsers do not - provide a content length for the files only the total content - length matters. - - :param total_content_length: the total content length of all the - data in the request combined. This value - is guaranteed to be there. - :param content_type: the mimetype of the uploaded file. - :param filename: the filename of the uploaded file. May be `None`. - :param content_length: the length of this file. This value is usually - not provided because webbrowsers do not provide - this value. - """ - return default_stream_factory( - total_content_length=total_content_length, - filename=filename, - content_type=content_type, - content_length=content_length, - ) - - @property - def want_form_data_parsed(self): - """Returns True if the request method carries content. As of - Werkzeug 0.9 this will be the case if a content type is transmitted. - - .. versionadded:: 0.8 - """ - return bool(self.environ.get("CONTENT_TYPE")) - - def make_form_data_parser(self): - """Creates the form data parser. Instantiates the - :attr:`form_data_parser_class` with some parameters. - - .. versionadded:: 0.8 - """ - return self.form_data_parser_class( - self._get_file_stream, - self.charset, - self.encoding_errors, - self.max_form_memory_size, - self.max_content_length, - self.parameter_storage_class, - ) - - def _load_form_data(self): - """Method used internally to retrieve submitted data. After calling - this sets `form` and `files` on the request object to multi dicts - filled with the incoming form data. As a matter of fact the input - stream will be empty afterwards. You can also call this method to - force the parsing of the form data. - - .. versionadded:: 0.8 - """ - # abort early if we have already consumed the stream - if "form" in self.__dict__: - return - - _assert_not_shallow(self) - - if self.want_form_data_parsed: - content_type = self.environ.get("CONTENT_TYPE", "") - content_length = get_content_length(self.environ) - mimetype, options = parse_options_header(content_type) - parser = self.make_form_data_parser() - data = parser.parse( - self._get_stream_for_parsing(), mimetype, content_length, options - ) - else: - data = ( - self.stream, - self.parameter_storage_class(), - self.parameter_storage_class(), - ) - - # inject the values into the instance dict so that we bypass - # our cached_property non-data descriptor. - d = self.__dict__ - d["stream"], d["form"], d["files"] = data - - def _get_stream_for_parsing(self): - """This is the same as accessing :attr:`stream` with the difference - that if it finds cached data from calling :meth:`get_data` first it - will create a new stream out of the cached data. - - .. versionadded:: 0.9.3 - """ - cached_data = getattr(self, "_cached_data", None) - if cached_data is not None: - return BytesIO(cached_data) - return self.stream - - def close(self): - """Closes associated resources of this request object. This - closes all file handles explicitly. You can also use the request - object in a with statement which will automatically close it. - - .. versionadded:: 0.9 - """ - files = self.__dict__.get("files") - for _key, value in iter_multi_items(files or ()): - value.close() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, tb): - self.close() - - @cached_property - def stream(self): - """ - If the incoming form data was not encoded with a known mimetype - the data is stored unmodified in this stream for consumption. Most - of the time it is a better idea to use :attr:`data` which will give - you that data as a string. The stream only returns the data once. - - Unlike :attr:`input_stream` this stream is properly guarded that you - can't accidentally read past the length of the input. Werkzeug will - internally always refer to this stream to read data which makes it - possible to wrap this object with a stream that does filtering. - - .. versionchanged:: 0.9 - This stream is now always available but might be consumed by the - form parser later on. Previously the stream was only set if no - parsing happened. - """ - _assert_not_shallow(self) - return get_input_stream(self.environ) - - input_stream = environ_property( - "wsgi.input", - """The WSGI input stream. - - In general it's a bad idea to use this one because you can - easily read past the boundary. Use the :attr:`stream` - instead.""", - ) - - @cached_property - def args(self): - """The parsed URL parameters (the part in the URL after the question - mark). - - By default an - :class:`~werkzeug.datastructures.ImmutableMultiDict` - is returned from this function. This can be changed by setting - :attr:`parameter_storage_class` to a different type. This might - be necessary if the order of the form data is important. - """ - return url_decode( - wsgi_get_bytes(self.environ.get("QUERY_STRING", "")), - self.url_charset, - errors=self.encoding_errors, - cls=self.parameter_storage_class, - ) - - @cached_property - def data(self): - """ - Contains the incoming request data as string in case it came with - a mimetype Werkzeug does not handle. - """ - - if self.disable_data_descriptor: - raise AttributeError("data descriptor is disabled") - # XXX: this should eventually be deprecated. - - # We trigger form data parsing first which means that the descriptor - # will not cache the data that would otherwise be .form or .files - # data. This restores the behavior that was there in Werkzeug - # before 0.9. New code should use :meth:`get_data` explicitly as - # this will make behavior explicit. - return self.get_data(parse_form_data=True) - - def get_data(self, cache=True, as_text=False, parse_form_data=False): - """This reads the buffered incoming data from the client into one - bytestring. By default this is cached but that behavior can be - changed by setting `cache` to `False`. - - Usually it's a bad idea to call this method without checking the - content length first as a client could send dozens of megabytes or more - to cause memory problems on the server. - - Note that if the form data was already parsed this method will not - return anything as form data parsing does not cache the data like - this method does. To implicitly invoke form data parsing function - set `parse_form_data` to `True`. When this is done the return value - of this method will be an empty string if the form parser handles - the data. This generally is not necessary as if the whole data is - cached (which is the default) the form parser will used the cached - data to parse the form data. Please be generally aware of checking - the content length first in any case before calling this method - to avoid exhausting server memory. - - If `as_text` is set to `True` the return value will be a decoded - unicode string. - - .. versionadded:: 0.9 - """ - rv = getattr(self, "_cached_data", None) - if rv is None: - if parse_form_data: - self._load_form_data() - rv = self.stream.read() - if cache: - self._cached_data = rv - if as_text: - rv = rv.decode(self.charset, self.encoding_errors) - return rv - - @cached_property - def form(self): - """The form parameters. By default an - :class:`~werkzeug.datastructures.ImmutableMultiDict` - is returned from this function. This can be changed by setting - :attr:`parameter_storage_class` to a different type. This might - be necessary if the order of the form data is important. - - Please keep in mind that file uploads will not end up here, but instead - in the :attr:`files` attribute. - - .. versionchanged:: 0.9 - - Previous to Werkzeug 0.9 this would only contain form data for POST - and PUT requests. - """ - self._load_form_data() - return self.form - - @cached_property - def values(self): - """A :class:`werkzeug.datastructures.CombinedMultiDict` that combines - :attr:`args` and :attr:`form`.""" - args = [] - for d in self.args, self.form: - if not isinstance(d, MultiDict): - d = MultiDict(d) - args.append(d) - return CombinedMultiDict(args) - - @cached_property - def files(self): - """:class:`~werkzeug.datastructures.MultiDict` object containing - all uploaded files. Each key in :attr:`files` is the name from the - ````. Each value in :attr:`files` is a - Werkzeug :class:`~werkzeug.datastructures.FileStorage` object. - - It basically behaves like a standard file object you know from Python, - with the difference that it also has a - :meth:`~werkzeug.datastructures.FileStorage.save` function that can - store the file on the filesystem. - - Note that :attr:`files` will only contain data if the request method was - POST, PUT or PATCH and the ``

    `` that posted to the request had - ``enctype="multipart/form-data"``. It will be empty otherwise. - - See the :class:`~werkzeug.datastructures.MultiDict` / - :class:`~werkzeug.datastructures.FileStorage` documentation for - more details about the used data structure. - """ - self._load_form_data() - return self.files - - @cached_property - def cookies(self): - """A :class:`dict` with the contents of all cookies transmitted with - the request.""" - return parse_cookie( - self.environ, - self.charset, - self.encoding_errors, - cls=self.dict_storage_class, - ) - - @cached_property - def headers(self): - """The headers from the WSGI environ as immutable - :class:`~werkzeug.datastructures.EnvironHeaders`. - """ - return EnvironHeaders(self.environ) - - @cached_property - def path(self): - """Requested path as unicode. This works a bit like the regular path - info in the WSGI environment but will always include a leading slash, - even if the URL root is accessed. - """ - raw_path = wsgi_decoding_dance( - self.environ.get("PATH_INFO") or "", self.charset, self.encoding_errors - ) - return "/" + raw_path.lstrip("/") - - @cached_property - def full_path(self): - """Requested path as unicode, including the query string.""" - return self.path + u"?" + to_unicode(self.query_string, self.url_charset) - - @cached_property - def script_root(self): - """The root path of the script without the trailing slash.""" - raw_path = wsgi_decoding_dance( - self.environ.get("SCRIPT_NAME") or "", self.charset, self.encoding_errors - ) - return raw_path.rstrip("/") - - @cached_property - def url(self): - """The reconstructed current URL as IRI. - See also: :attr:`trusted_hosts`. - """ - return get_current_url(self.environ, trusted_hosts=self.trusted_hosts) - - @cached_property - def base_url(self): - """Like :attr:`url` but without the querystring - See also: :attr:`trusted_hosts`. - """ - return get_current_url( - self.environ, strip_querystring=True, trusted_hosts=self.trusted_hosts - ) - - @cached_property - def url_root(self): - """The full URL root (with hostname), this is the application - root as IRI. - See also: :attr:`trusted_hosts`. - """ - return get_current_url(self.environ, True, trusted_hosts=self.trusted_hosts) - - @cached_property - def host_url(self): - """Just the host with scheme as IRI. - See also: :attr:`trusted_hosts`. - """ - return get_current_url( - self.environ, host_only=True, trusted_hosts=self.trusted_hosts - ) - - @cached_property - def host(self): - """Just the host including the port if available. - See also: :attr:`trusted_hosts`. - """ - return get_host(self.environ, trusted_hosts=self.trusted_hosts) - - query_string = environ_property( - "QUERY_STRING", - "", - read_only=True, - load_func=wsgi_get_bytes, - doc="The URL parameters as raw bytestring.", - ) - method = environ_property( - "REQUEST_METHOD", - "GET", - read_only=True, - load_func=lambda x: x.upper(), - doc="The request method. (For example ``'GET'`` or ``'POST'``).", - ) - - @cached_property - def access_route(self): - """If a forwarded header exists this is a list of all ip addresses - from the client ip to the last proxy server. - """ - if "HTTP_X_FORWARDED_FOR" in self.environ: - return self.list_storage_class( - parse_list_header(self.environ["HTTP_X_FORWARDED_FOR"]) - ) - elif "REMOTE_ADDR" in self.environ: - return self.list_storage_class([self.environ["REMOTE_ADDR"]]) - return self.list_storage_class() - - @property - def remote_addr(self): - """The remote address of the client.""" - return self.environ.get("REMOTE_ADDR") - - remote_user = environ_property( - "REMOTE_USER", - doc="""If the server supports user authentication, and the - script is protected, this attribute contains the username the - user has authenticated as.""", - ) - scheme = environ_property( - "wsgi.url_scheme", - doc=""" - URL scheme (http or https). - - .. versionadded:: 0.7""", - ) - is_secure = property( - lambda self: self.environ["wsgi.url_scheme"] == "https", - doc="`True` if the request is secure.", - ) - is_multithread = environ_property( - "wsgi.multithread", - doc="""boolean that is `True` if the application is served by a - multithreaded WSGI server.""", - ) - is_multiprocess = environ_property( - "wsgi.multiprocess", - doc="""boolean that is `True` if the application is served by a - WSGI server that spawns multiple processes.""", - ) - is_run_once = environ_property( - "wsgi.run_once", - doc="""boolean that is `True` if the application will be - executed only once in a process lifetime. This is the case for - CGI for example, but it's not guaranteed that the execution only - happens one time.""", - ) - - -def _assert_not_shallow(request): - if request.shallow: - raise RuntimeError( - "A shallow request tried to consume form data. If you really" - " want to do that, set `shallow` to False." - ) diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/base_response.py b/venv/lib/python3.7/site-packages/werkzeug/wrappers/base_response.py deleted file mode 100644 index 00b9640..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wrappers/base_response.py +++ /dev/null @@ -1,700 +0,0 @@ -import warnings - -from .._compat import integer_types -from .._compat import string_types -from .._compat import text_type -from .._compat import to_bytes -from .._compat import to_native -from ..datastructures import Headers -from ..http import dump_cookie -from ..http import HTTP_STATUS_CODES -from ..http import remove_entity_headers -from ..urls import iri_to_uri -from ..urls import url_join -from ..utils import get_content_type -from ..wsgi import ClosingIterator -from ..wsgi import get_current_url - - -def _run_wsgi_app(*args): - """This function replaces itself to ensure that the test module is not - imported unless required. DO NOT USE! - """ - global _run_wsgi_app - from ..test import run_wsgi_app as _run_wsgi_app - - return _run_wsgi_app(*args) - - -def _warn_if_string(iterable): - """Helper for the response objects to check if the iterable returned - to the WSGI server is not a string. - """ - if isinstance(iterable, string_types): - warnings.warn( - "Response iterable was set to a string. This will appear to" - " work but means that the server will send the data to the" - " client one character at a time. This is almost never" - " intended behavior, use 'response.data' to assign strings" - " to the response object.", - stacklevel=2, - ) - - -def _iter_encoded(iterable, charset): - for item in iterable: - if isinstance(item, text_type): - yield item.encode(charset) - else: - yield item - - -def _clean_accept_ranges(accept_ranges): - if accept_ranges is True: - return "bytes" - elif accept_ranges is False: - return "none" - elif isinstance(accept_ranges, text_type): - return to_native(accept_ranges) - raise ValueError("Invalid accept_ranges value") - - -class BaseResponse(object): - """Base response class. The most important fact about a response object - is that it's a regular WSGI application. It's initialized with a couple - of response parameters (headers, body, status code etc.) and will start a - valid WSGI response when called with the environ and start response - callable. - - Because it's a WSGI application itself processing usually ends before the - actual response is sent to the server. This helps debugging systems - because they can catch all the exceptions before responses are started. - - Here a small example WSGI application that takes advantage of the - response objects:: - - from werkzeug.wrappers import BaseResponse as Response - - def index(): - return Response('Index page') - - def application(environ, start_response): - path = environ.get('PATH_INFO') or '/' - if path == '/': - response = index() - else: - response = Response('Not Found', status=404) - return response(environ, start_response) - - Like :class:`BaseRequest` which object is lacking a lot of functionality - implemented in mixins. This gives you a better control about the actual - API of your response objects, so you can create subclasses and add custom - functionality. A full featured response object is available as - :class:`Response` which implements a couple of useful mixins. - - To enforce a new type of already existing responses you can use the - :meth:`force_type` method. This is useful if you're working with different - subclasses of response objects and you want to post process them with a - known interface. - - Per default the response object will assume all the text data is `utf-8` - encoded. Please refer to :doc:`the unicode chapter ` for more - details about customizing the behavior. - - Response can be any kind of iterable or string. If it's a string it's - considered being an iterable with one item which is the string passed. - Headers can be a list of tuples or a - :class:`~werkzeug.datastructures.Headers` object. - - Special note for `mimetype` and `content_type`: For most mime types - `mimetype` and `content_type` work the same, the difference affects - only 'text' mimetypes. If the mimetype passed with `mimetype` is a - mimetype starting with `text/`, the charset parameter of the response - object is appended to it. In contrast the `content_type` parameter is - always added as header unmodified. - - .. versionchanged:: 0.5 - the `direct_passthrough` parameter was added. - - :param response: a string or response iterable. - :param status: a string with a status or an integer with the status code. - :param headers: a list of headers or a - :class:`~werkzeug.datastructures.Headers` object. - :param mimetype: the mimetype for the response. See notice above. - :param content_type: the content type for the response. See notice above. - :param direct_passthrough: if set to `True` :meth:`iter_encoded` is not - called before iteration which makes it - possible to pass special iterators through - unchanged (see :func:`wrap_file` for more - details.) - """ - - #: the charset of the response. - charset = "utf-8" - - #: the default status if none is provided. - default_status = 200 - - #: the default mimetype if none is provided. - default_mimetype = "text/plain" - - #: if set to `False` accessing properties on the response object will - #: not try to consume the response iterator and convert it into a list. - #: - #: .. versionadded:: 0.6.2 - #: - #: That attribute was previously called `implicit_seqence_conversion`. - #: (Notice the typo). If you did use this feature, you have to adapt - #: your code to the name change. - implicit_sequence_conversion = True - - #: Should this response object correct the location header to be RFC - #: conformant? This is true by default. - #: - #: .. versionadded:: 0.8 - autocorrect_location_header = True - - #: Should this response object automatically set the content-length - #: header if possible? This is true by default. - #: - #: .. versionadded:: 0.8 - automatically_set_content_length = True - - #: Warn if a cookie header exceeds this size. The default, 4093, should be - #: safely `supported by most browsers `_. A cookie larger than - #: this size will still be sent, but it may be ignored or handled - #: incorrectly by some browsers. Set to 0 to disable this check. - #: - #: .. versionadded:: 0.13 - #: - #: .. _`cookie`: http://browsercookielimits.squawky.net/ - max_cookie_size = 4093 - - def __init__( - self, - response=None, - status=None, - headers=None, - mimetype=None, - content_type=None, - direct_passthrough=False, - ): - if isinstance(headers, Headers): - self.headers = headers - elif not headers: - self.headers = Headers() - else: - self.headers = Headers(headers) - - if content_type is None: - if mimetype is None and "content-type" not in self.headers: - mimetype = self.default_mimetype - if mimetype is not None: - mimetype = get_content_type(mimetype, self.charset) - content_type = mimetype - if content_type is not None: - self.headers["Content-Type"] = content_type - if status is None: - status = self.default_status - if isinstance(status, integer_types): - self.status_code = status - else: - self.status = status - - self.direct_passthrough = direct_passthrough - self._on_close = [] - - # we set the response after the headers so that if a class changes - # the charset attribute, the data is set in the correct charset. - if response is None: - self.response = [] - elif isinstance(response, (text_type, bytes, bytearray)): - self.set_data(response) - else: - self.response = response - - def call_on_close(self, func): - """Adds a function to the internal list of functions that should - be called as part of closing down the response. Since 0.7 this - function also returns the function that was passed so that this - can be used as a decorator. - - .. versionadded:: 0.6 - """ - self._on_close.append(func) - return func - - def __repr__(self): - if self.is_sequence: - body_info = "%d bytes" % sum(map(len, self.iter_encoded())) - else: - body_info = "streamed" if self.is_streamed else "likely-streamed" - return "<%s %s [%s]>" % (self.__class__.__name__, body_info, self.status) - - @classmethod - def force_type(cls, response, environ=None): - """Enforce that the WSGI response is a response object of the current - type. Werkzeug will use the :class:`BaseResponse` internally in many - situations like the exceptions. If you call :meth:`get_response` on an - exception you will get back a regular :class:`BaseResponse` object, even - if you are using a custom subclass. - - This method can enforce a given response type, and it will also - convert arbitrary WSGI callables into response objects if an environ - is provided:: - - # convert a Werkzeug response object into an instance of the - # MyResponseClass subclass. - response = MyResponseClass.force_type(response) - - # convert any WSGI application into a response object - response = MyResponseClass.force_type(response, environ) - - This is especially useful if you want to post-process responses in - the main dispatcher and use functionality provided by your subclass. - - Keep in mind that this will modify response objects in place if - possible! - - :param response: a response object or wsgi application. - :param environ: a WSGI environment object. - :return: a response object. - """ - if not isinstance(response, BaseResponse): - if environ is None: - raise TypeError( - "cannot convert WSGI application into response" - " objects without an environ" - ) - response = BaseResponse(*_run_wsgi_app(response, environ)) - response.__class__ = cls - return response - - @classmethod - def from_app(cls, app, environ, buffered=False): - """Create a new response object from an application output. This - works best if you pass it an application that returns a generator all - the time. Sometimes applications may use the `write()` callable - returned by the `start_response` function. This tries to resolve such - edge cases automatically. But if you don't get the expected output - you should set `buffered` to `True` which enforces buffering. - - :param app: the WSGI application to execute. - :param environ: the WSGI environment to execute against. - :param buffered: set to `True` to enforce buffering. - :return: a response object. - """ - return cls(*_run_wsgi_app(app, environ, buffered)) - - @property - def status_code(self): - """The HTTP status code as a number.""" - return self._status_code - - @status_code.setter - def status_code(self, code): - self._status_code = code - try: - self._status = "%d %s" % (code, HTTP_STATUS_CODES[code].upper()) - except KeyError: - self._status = "%d UNKNOWN" % code - - @property - def status(self): - """The HTTP status code as a string.""" - return self._status - - @status.setter - def status(self, value): - try: - self._status = to_native(value) - except AttributeError: - raise TypeError("Invalid status argument") - - try: - self._status_code = int(self._status.split(None, 1)[0]) - except ValueError: - self._status_code = 0 - self._status = "0 %s" % self._status - except IndexError: - raise ValueError("Empty status argument") - - def get_data(self, as_text=False): - """The string representation of the request body. Whenever you call - this property the request iterable is encoded and flattened. This - can lead to unwanted behavior if you stream big data. - - This behavior can be disabled by setting - :attr:`implicit_sequence_conversion` to `False`. - - If `as_text` is set to `True` the return value will be a decoded - unicode string. - - .. versionadded:: 0.9 - """ - self._ensure_sequence() - rv = b"".join(self.iter_encoded()) - if as_text: - rv = rv.decode(self.charset) - return rv - - def set_data(self, value): - """Sets a new string as response. The value set must be either a - unicode or bytestring. If a unicode string is set it's encoded - automatically to the charset of the response (utf-8 by default). - - .. versionadded:: 0.9 - """ - # if an unicode string is set, it's encoded directly so that we - # can set the content length - if isinstance(value, text_type): - value = value.encode(self.charset) - else: - value = bytes(value) - self.response = [value] - if self.automatically_set_content_length: - self.headers["Content-Length"] = str(len(value)) - - data = property( - get_data, - set_data, - doc="A descriptor that calls :meth:`get_data` and :meth:`set_data`.", - ) - - def calculate_content_length(self): - """Returns the content length if available or `None` otherwise.""" - try: - self._ensure_sequence() - except RuntimeError: - return None - return sum(len(x) for x in self.iter_encoded()) - - def _ensure_sequence(self, mutable=False): - """This method can be called by methods that need a sequence. If - `mutable` is true, it will also ensure that the response sequence - is a standard Python list. - - .. versionadded:: 0.6 - """ - if self.is_sequence: - # if we need a mutable object, we ensure it's a list. - if mutable and not isinstance(self.response, list): - self.response = list(self.response) - return - if self.direct_passthrough: - raise RuntimeError( - "Attempted implicit sequence conversion but the" - " response object is in direct passthrough mode." - ) - if not self.implicit_sequence_conversion: - raise RuntimeError( - "The response object required the iterable to be a" - " sequence, but the implicit conversion was disabled." - " Call make_sequence() yourself." - ) - self.make_sequence() - - def make_sequence(self): - """Converts the response iterator in a list. By default this happens - automatically if required. If `implicit_sequence_conversion` is - disabled, this method is not automatically called and some properties - might raise exceptions. This also encodes all the items. - - .. versionadded:: 0.6 - """ - if not self.is_sequence: - # if we consume an iterable we have to ensure that the close - # method of the iterable is called if available when we tear - # down the response - close = getattr(self.response, "close", None) - self.response = list(self.iter_encoded()) - if close is not None: - self.call_on_close(close) - - def iter_encoded(self): - """Iter the response encoded with the encoding of the response. - If the response object is invoked as WSGI application the return - value of this method is used as application iterator unless - :attr:`direct_passthrough` was activated. - """ - if __debug__: - _warn_if_string(self.response) - # Encode in a separate function so that self.response is fetched - # early. This allows us to wrap the response with the return - # value from get_app_iter or iter_encoded. - return _iter_encoded(self.response, self.charset) - - def set_cookie( - self, - key, - value="", - max_age=None, - expires=None, - path="/", - domain=None, - secure=False, - httponly=False, - samesite=None, - ): - """Sets a cookie. The parameters are the same as in the cookie `Morsel` - object in the Python standard library but it accepts unicode data, too. - - A warning is raised if the size of the cookie header exceeds - :attr:`max_cookie_size`, but the header will still be set. - - :param key: the key (name) of the cookie to be set. - :param value: the value of the cookie. - :param max_age: should be a number of seconds, or `None` (default) if - the cookie should last only as long as the client's - browser session. - :param expires: should be a `datetime` object or UNIX timestamp. - :param path: limits the cookie to a given path, per default it will - span the whole domain. - :param domain: if you want to set a cross-domain cookie. For example, - ``domain=".example.com"`` will set a cookie that is - readable by the domain ``www.example.com``, - ``foo.example.com`` etc. Otherwise, a cookie will only - be readable by the domain that set it. - :param secure: If `True`, the cookie will only be available via HTTPS - :param httponly: disallow JavaScript to access the cookie. This is an - extension to the cookie standard and probably not - supported by all browsers. - :param samesite: Limits the scope of the cookie such that it will only - be attached to requests if those requests are - "same-site". - """ - self.headers.add( - "Set-Cookie", - dump_cookie( - key, - value=value, - max_age=max_age, - expires=expires, - path=path, - domain=domain, - secure=secure, - httponly=httponly, - charset=self.charset, - max_size=self.max_cookie_size, - samesite=samesite, - ), - ) - - def delete_cookie(self, key, path="/", domain=None): - """Delete a cookie. Fails silently if key doesn't exist. - - :param key: the key (name) of the cookie to be deleted. - :param path: if the cookie that should be deleted was limited to a - path, the path has to be defined here. - :param domain: if the cookie that should be deleted was limited to a - domain, that domain has to be defined here. - """ - self.set_cookie(key, expires=0, max_age=0, path=path, domain=domain) - - @property - def is_streamed(self): - """If the response is streamed (the response is not an iterable with - a length information) this property is `True`. In this case streamed - means that there is no information about the number of iterations. - This is usually `True` if a generator is passed to the response object. - - This is useful for checking before applying some sort of post - filtering that should not take place for streamed responses. - """ - try: - len(self.response) - except (TypeError, AttributeError): - return True - return False - - @property - def is_sequence(self): - """If the iterator is buffered, this property will be `True`. A - response object will consider an iterator to be buffered if the - response attribute is a list or tuple. - - .. versionadded:: 0.6 - """ - return isinstance(self.response, (tuple, list)) - - def close(self): - """Close the wrapped response if possible. You can also use the object - in a with statement which will automatically close it. - - .. versionadded:: 0.9 - Can now be used in a with statement. - """ - if hasattr(self.response, "close"): - self.response.close() - for func in self._on_close: - func() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, tb): - self.close() - - def freeze(self): - """Call this method if you want to make your response object ready for - being pickled. This buffers the generator if there is one. It will - also set the `Content-Length` header to the length of the body. - - .. versionchanged:: 0.6 - The `Content-Length` header is now set. - """ - # we explicitly set the length to a list of the *encoded* response - # iterator. Even if the implicit sequence conversion is disabled. - self.response = list(self.iter_encoded()) - self.headers["Content-Length"] = str(sum(map(len, self.response))) - - def get_wsgi_headers(self, environ): - """This is automatically called right before the response is started - and returns headers modified for the given environment. It returns a - copy of the headers from the response with some modifications applied - if necessary. - - For example the location header (if present) is joined with the root - URL of the environment. Also the content length is automatically set - to zero here for certain status codes. - - .. versionchanged:: 0.6 - Previously that function was called `fix_headers` and modified - the response object in place. Also since 0.6, IRIs in location - and content-location headers are handled properly. - - Also starting with 0.6, Werkzeug will attempt to set the content - length if it is able to figure it out on its own. This is the - case if all the strings in the response iterable are already - encoded and the iterable is buffered. - - :param environ: the WSGI environment of the request. - :return: returns a new :class:`~werkzeug.datastructures.Headers` - object. - """ - headers = Headers(self.headers) - location = None - content_location = None - content_length = None - status = self.status_code - - # iterate over the headers to find all values in one go. Because - # get_wsgi_headers is used each response that gives us a tiny - # speedup. - for key, value in headers: - ikey = key.lower() - if ikey == u"location": - location = value - elif ikey == u"content-location": - content_location = value - elif ikey == u"content-length": - content_length = value - - # make sure the location header is an absolute URL - if location is not None: - old_location = location - if isinstance(location, text_type): - # Safe conversion is necessary here as we might redirect - # to a broken URI scheme (for instance itms-services). - location = iri_to_uri(location, safe_conversion=True) - - if self.autocorrect_location_header: - current_url = get_current_url(environ, strip_querystring=True) - if isinstance(current_url, text_type): - current_url = iri_to_uri(current_url) - location = url_join(current_url, location) - if location != old_location: - headers["Location"] = location - - # make sure the content location is a URL - if content_location is not None and isinstance(content_location, text_type): - headers["Content-Location"] = iri_to_uri(content_location) - - if 100 <= status < 200 or status == 204: - # Per section 3.3.2 of RFC 7230, "a server MUST NOT send a - # Content-Length header field in any response with a status - # code of 1xx (Informational) or 204 (No Content)." - headers.remove("Content-Length") - elif status == 304: - remove_entity_headers(headers) - - # if we can determine the content length automatically, we - # should try to do that. But only if this does not involve - # flattening the iterator or encoding of unicode strings in - # the response. We however should not do that if we have a 304 - # response. - if ( - self.automatically_set_content_length - and self.is_sequence - and content_length is None - and status not in (204, 304) - and not (100 <= status < 200) - ): - try: - content_length = sum(len(to_bytes(x, "ascii")) for x in self.response) - except UnicodeError: - # aha, something non-bytestringy in there, too bad, we - # can't safely figure out the length of the response. - pass - else: - headers["Content-Length"] = str(content_length) - - return headers - - def get_app_iter(self, environ): - """Returns the application iterator for the given environ. Depending - on the request method and the current status code the return value - might be an empty response rather than the one from the response. - - If the request method is `HEAD` or the status code is in a range - where the HTTP specification requires an empty response, an empty - iterable is returned. - - .. versionadded:: 0.6 - - :param environ: the WSGI environment of the request. - :return: a response iterable. - """ - status = self.status_code - if ( - environ["REQUEST_METHOD"] == "HEAD" - or 100 <= status < 200 - or status in (204, 304) - ): - iterable = () - elif self.direct_passthrough: - if __debug__: - _warn_if_string(self.response) - return self.response - else: - iterable = self.iter_encoded() - return ClosingIterator(iterable, self.close) - - def get_wsgi_response(self, environ): - """Returns the final WSGI response as tuple. The first item in - the tuple is the application iterator, the second the status and - the third the list of headers. The response returned is created - specially for the given environment. For example if the request - method in the WSGI environment is ``'HEAD'`` the response will - be empty and only the headers and status code will be present. - - .. versionadded:: 0.6 - - :param environ: the WSGI environment of the request. - :return: an ``(app_iter, status, headers)`` tuple. - """ - headers = self.get_wsgi_headers(environ) - app_iter = self.get_app_iter(environ) - return app_iter, self.status, headers.to_wsgi_list() - - def __call__(self, environ, start_response): - """Process this response as WSGI application. - - :param environ: the WSGI environment. - :param start_response: the response callable provided by the WSGI - server. - :return: an application iterator - """ - app_iter, status, headers = self.get_wsgi_response(environ) - start_response(status, headers) - return app_iter diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/common_descriptors.py b/venv/lib/python3.7/site-packages/werkzeug/wrappers/common_descriptors.py deleted file mode 100644 index f169959..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wrappers/common_descriptors.py +++ /dev/null @@ -1,341 +0,0 @@ -from datetime import datetime -from datetime import timedelta - -from .._compat import string_types -from ..datastructures import CallbackDict -from ..http import dump_age -from ..http import dump_csp_header -from ..http import dump_header -from ..http import dump_options_header -from ..http import http_date -from ..http import parse_age -from ..http import parse_csp_header -from ..http import parse_date -from ..http import parse_options_header -from ..http import parse_set_header -from ..utils import cached_property -from ..utils import environ_property -from ..utils import get_content_type -from ..utils import header_property -from ..wsgi import get_content_length - - -class CommonRequestDescriptorsMixin(object): - """A mixin for :class:`BaseRequest` subclasses. Request objects that - mix this class in will automatically get descriptors for a couple of - HTTP headers with automatic type conversion. - - .. versionadded:: 0.5 - """ - - content_type = environ_property( - "CONTENT_TYPE", - doc="""The Content-Type entity-header field indicates the media - type of the entity-body sent to the recipient or, in the case of - the HEAD method, the media type that would have been sent had - the request been a GET.""", - ) - - @cached_property - def content_length(self): - """The Content-Length entity-header field indicates the size of the - entity-body in bytes or, in the case of the HEAD method, the size of - the entity-body that would have been sent had the request been a - GET. - """ - return get_content_length(self.environ) - - content_encoding = environ_property( - "HTTP_CONTENT_ENCODING", - doc="""The Content-Encoding entity-header field is used as a - modifier to the media-type. When present, its value indicates - what additional content codings have been applied to the - entity-body, and thus what decoding mechanisms must be applied - in order to obtain the media-type referenced by the Content-Type - header field. - - .. versionadded:: 0.9""", - ) - content_md5 = environ_property( - "HTTP_CONTENT_MD5", - doc="""The Content-MD5 entity-header field, as defined in - RFC 1864, is an MD5 digest of the entity-body for the purpose of - providing an end-to-end message integrity check (MIC) of the - entity-body. (Note: a MIC is good for detecting accidental - modification of the entity-body in transit, but is not proof - against malicious attacks.) - - .. versionadded:: 0.9""", - ) - referrer = environ_property( - "HTTP_REFERER", - doc="""The Referer[sic] request-header field allows the client - to specify, for the server's benefit, the address (URI) of the - resource from which the Request-URI was obtained (the - "referrer", although the header field is misspelled).""", - ) - date = environ_property( - "HTTP_DATE", - None, - parse_date, - doc="""The Date general-header field represents the date and - time at which the message was originated, having the same - semantics as orig-date in RFC 822.""", - ) - max_forwards = environ_property( - "HTTP_MAX_FORWARDS", - None, - int, - doc="""The Max-Forwards request-header field provides a - mechanism with the TRACE and OPTIONS methods to limit the number - of proxies or gateways that can forward the request to the next - inbound server.""", - ) - - def _parse_content_type(self): - if not hasattr(self, "_parsed_content_type"): - self._parsed_content_type = parse_options_header( - self.environ.get("CONTENT_TYPE", "") - ) - - @property - def mimetype(self): - """Like :attr:`content_type`, but without parameters (eg, without - charset, type etc.) and always lowercase. For example if the content - type is ``text/HTML; charset=utf-8`` the mimetype would be - ``'text/html'``. - """ - self._parse_content_type() - return self._parsed_content_type[0].lower() - - @property - def mimetype_params(self): - """The mimetype parameters as dict. For example if the content - type is ``text/html; charset=utf-8`` the params would be - ``{'charset': 'utf-8'}``. - """ - self._parse_content_type() - return self._parsed_content_type[1] - - @cached_property - def pragma(self): - """The Pragma general-header field is used to include - implementation-specific directives that might apply to any recipient - along the request/response chain. All pragma directives specify - optional behavior from the viewpoint of the protocol; however, some - systems MAY require that behavior be consistent with the directives. - """ - return parse_set_header(self.environ.get("HTTP_PRAGMA", "")) - - -class CommonResponseDescriptorsMixin(object): - """A mixin for :class:`BaseResponse` subclasses. Response objects that - mix this class in will automatically get descriptors for a couple of - HTTP headers with automatic type conversion. - """ - - @property - def mimetype(self): - """The mimetype (content type without charset etc.)""" - ct = self.headers.get("content-type") - if ct: - return ct.split(";")[0].strip() - - @mimetype.setter - def mimetype(self, value): - self.headers["Content-Type"] = get_content_type(value, self.charset) - - @property - def mimetype_params(self): - """The mimetype parameters as dict. For example if the - content type is ``text/html; charset=utf-8`` the params would be - ``{'charset': 'utf-8'}``. - - .. versionadded:: 0.5 - """ - - def on_update(d): - self.headers["Content-Type"] = dump_options_header(self.mimetype, d) - - d = parse_options_header(self.headers.get("content-type", ""))[1] - return CallbackDict(d, on_update) - - location = header_property( - "Location", - doc="""The Location response-header field is used to redirect - the recipient to a location other than the Request-URI for - completion of the request or identification of a new - resource.""", - ) - age = header_property( - "Age", - None, - parse_age, - dump_age, - doc="""The Age response-header field conveys the sender's - estimate of the amount of time since the response (or its - revalidation) was generated at the origin server. - - Age values are non-negative decimal integers, representing time - in seconds.""", - ) - content_type = header_property( - "Content-Type", - doc="""The Content-Type entity-header field indicates the media - type of the entity-body sent to the recipient or, in the case of - the HEAD method, the media type that would have been sent had - the request been a GET.""", - ) - content_length = header_property( - "Content-Length", - None, - int, - str, - doc="""The Content-Length entity-header field indicates the size - of the entity-body, in decimal number of OCTETs, sent to the - recipient or, in the case of the HEAD method, the size of the - entity-body that would have been sent had the request been a - GET.""", - ) - content_location = header_property( - "Content-Location", - doc="""The Content-Location entity-header field MAY be used to - supply the resource location for the entity enclosed in the - message when that entity is accessible from a location separate - from the requested resource's URI.""", - ) - content_encoding = header_property( - "Content-Encoding", - doc="""The Content-Encoding entity-header field is used as a - modifier to the media-type. When present, its value indicates - what additional content codings have been applied to the - entity-body, and thus what decoding mechanisms must be applied - in order to obtain the media-type referenced by the Content-Type - header field.""", - ) - content_md5 = header_property( - "Content-MD5", - doc="""The Content-MD5 entity-header field, as defined in - RFC 1864, is an MD5 digest of the entity-body for the purpose of - providing an end-to-end message integrity check (MIC) of the - entity-body. (Note: a MIC is good for detecting accidental - modification of the entity-body in transit, but is not proof - against malicious attacks.)""", - ) - content_security_policy = header_property( - "Content-Security-Policy", - None, - parse_csp_header, - dump_csp_header, - doc="""The Content-Security-Policy header adds an additional layer of - security to help detect and mitigate certain types of attacks.""", - ) - content_security_policy_report_only = header_property( - "Content-Security-Policy-Report-Only", - None, - parse_csp_header, - dump_csp_header, - doc="""The Content-Security-Policy-Report-Only header adds a csp policy - that is not enforced but is reported thereby helping detect - certain types of attacks.""", - ) - date = header_property( - "Date", - None, - parse_date, - http_date, - doc="""The Date general-header field represents the date and - time at which the message was originated, having the same - semantics as orig-date in RFC 822.""", - ) - expires = header_property( - "Expires", - None, - parse_date, - http_date, - doc="""The Expires entity-header field gives the date/time after - which the response is considered stale. A stale cache entry may - not normally be returned by a cache.""", - ) - last_modified = header_property( - "Last-Modified", - None, - parse_date, - http_date, - doc="""The Last-Modified entity-header field indicates the date - and time at which the origin server believes the variant was - last modified.""", - ) - - @property - def retry_after(self): - """The Retry-After response-header field can be used with a - 503 (Service Unavailable) response to indicate how long the - service is expected to be unavailable to the requesting client. - - Time in seconds until expiration or date. - """ - value = self.headers.get("retry-after") - if value is None: - return - elif value.isdigit(): - return datetime.utcnow() + timedelta(seconds=int(value)) - return parse_date(value) - - @retry_after.setter - def retry_after(self, value): - if value is None: - if "retry-after" in self.headers: - del self.headers["retry-after"] - return - elif isinstance(value, datetime): - value = http_date(value) - else: - value = str(value) - self.headers["Retry-After"] = value - - def _set_property(name, doc=None): # noqa: B902 - def fget(self): - def on_update(header_set): - if not header_set and name in self.headers: - del self.headers[name] - elif header_set: - self.headers[name] = header_set.to_header() - - return parse_set_header(self.headers.get(name), on_update) - - def fset(self, value): - if not value: - del self.headers[name] - elif isinstance(value, string_types): - self.headers[name] = value - else: - self.headers[name] = dump_header(value) - - return property(fget, fset, doc=doc) - - vary = _set_property( - "Vary", - doc="""The Vary field value indicates the set of request-header - fields that fully determines, while the response is fresh, - whether a cache is permitted to use the response to reply to a - subsequent request without revalidation.""", - ) - content_language = _set_property( - "Content-Language", - doc="""The Content-Language entity-header field describes the - natural language(s) of the intended audience for the enclosed - entity. Note that this might not be equivalent to all the - languages used within the entity-body.""", - ) - allow = _set_property( - "Allow", - doc="""The Allow entity-header field lists the set of methods - supported by the resource identified by the Request-URI. The - purpose of this field is strictly to inform the recipient of - valid methods associated with the resource. An Allow header - field MUST be present in a 405 (Method Not Allowed) - response.""", - ) - - del _set_property diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/cors.py b/venv/lib/python3.7/site-packages/werkzeug/wrappers/cors.py deleted file mode 100644 index 790e50e..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wrappers/cors.py +++ /dev/null @@ -1,102 +0,0 @@ -from ..http import dump_header -from ..http import parse_set_header -from ..utils import environ_property -from ..utils import header_property - - -class CORSRequestMixin(object): - """A mixin for :class:`~werkzeug.wrappers.BaseRequest` subclasses - that adds descriptors for Cross Origin Resource Sharing (CORS) - headers. - - .. versionadded:: 1.0 - """ - - origin = environ_property( - "HTTP_ORIGIN", - doc=( - "The host that the request originated from. Set" - " :attr:`~CORSResponseMixin.access_control_allow_origin` on" - " the response to indicate which origins are allowed." - ), - ) - - access_control_request_headers = environ_property( - "HTTP_ACCESS_CONTROL_REQUEST_HEADERS", - load_func=parse_set_header, - doc=( - "Sent with a preflight request to indicate which headers" - " will be sent with the cross origin request. Set" - " :attr:`~CORSResponseMixin.access_control_allow_headers`" - " on the response to indicate which headers are allowed." - ), - ) - - access_control_request_method = environ_property( - "HTTP_ACCESS_CONTROL_REQUEST_METHOD", - doc=( - "Sent with a preflight request to indicate which method" - " will be used for the cross origin request. Set" - " :attr:`~CORSResponseMixin.access_control_allow_methods`" - " on the response to indicate which methods are allowed." - ), - ) - - -class CORSResponseMixin(object): - """A mixin for :class:`~werkzeug.wrappers.BaseResponse` subclasses - that adds descriptors for Cross Origin Resource Sharing (CORS) - headers. - - .. versionadded:: 1.0 - """ - - @property - def access_control_allow_credentials(self): - """Whether credentials can be shared by the browser to - JavaScript code. As part of the preflight request it indicates - whether credentials can be used on the cross origin request. - """ - return "Access-Control-Allow-Credentials" in self.headers - - @access_control_allow_credentials.setter - def access_control_allow_credentials(self, value): - if value is True: - self.headers["Access-Control-Allow-Credentials"] = "true" - else: - self.headers.pop("Access-Control-Allow-Credentials", None) - - access_control_allow_headers = header_property( - "Access-Control-Allow-Headers", - load_func=parse_set_header, - dump_func=dump_header, - doc="Which headers can be sent with the cross origin request.", - ) - - access_control_allow_methods = header_property( - "Access-Control-Allow-Methods", - load_func=parse_set_header, - dump_func=dump_header, - doc="Which methods can be used for the cross origin request.", - ) - - access_control_allow_origin = header_property( - "Access-Control-Allow-Origin", - load_func=parse_set_header, - dump_func=dump_header, - doc="The origins that may make cross origin requests.", - ) - - access_control_expose_headers = header_property( - "Access-Control-Expose-Headers", - load_func=parse_set_header, - dump_func=dump_header, - doc="Which headers can be shared by the browser to JavaScript code.", - ) - - access_control_max_age = header_property( - "Access-Control-Max-Age", - load_func=int, - dump_func=str, - doc="The maximum age in seconds the access control settings can be cached for.", - ) diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/etag.py b/venv/lib/python3.7/site-packages/werkzeug/wrappers/etag.py deleted file mode 100644 index 460629b..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wrappers/etag.py +++ /dev/null @@ -1,304 +0,0 @@ -from .._compat import string_types -from .._internal import _get_environ -from ..datastructures import ContentRange -from ..datastructures import RequestCacheControl -from ..datastructures import ResponseCacheControl -from ..http import generate_etag -from ..http import http_date -from ..http import is_resource_modified -from ..http import parse_cache_control_header -from ..http import parse_content_range_header -from ..http import parse_date -from ..http import parse_etags -from ..http import parse_if_range_header -from ..http import parse_range_header -from ..http import quote_etag -from ..http import unquote_etag -from ..utils import cached_property -from ..utils import header_property -from ..wrappers.base_response import _clean_accept_ranges -from ..wsgi import _RangeWrapper - - -class ETagRequestMixin(object): - """Add entity tag and cache descriptors to a request object or object with - a WSGI environment available as :attr:`~BaseRequest.environ`. This not - only provides access to etags but also to the cache control header. - """ - - @cached_property - def cache_control(self): - """A :class:`~werkzeug.datastructures.RequestCacheControl` object - for the incoming cache control headers. - """ - cache_control = self.environ.get("HTTP_CACHE_CONTROL") - return parse_cache_control_header(cache_control, None, RequestCacheControl) - - @cached_property - def if_match(self): - """An object containing all the etags in the `If-Match` header. - - :rtype: :class:`~werkzeug.datastructures.ETags` - """ - return parse_etags(self.environ.get("HTTP_IF_MATCH")) - - @cached_property - def if_none_match(self): - """An object containing all the etags in the `If-None-Match` header. - - :rtype: :class:`~werkzeug.datastructures.ETags` - """ - return parse_etags(self.environ.get("HTTP_IF_NONE_MATCH")) - - @cached_property - def if_modified_since(self): - """The parsed `If-Modified-Since` header as datetime object.""" - return parse_date(self.environ.get("HTTP_IF_MODIFIED_SINCE")) - - @cached_property - def if_unmodified_since(self): - """The parsed `If-Unmodified-Since` header as datetime object.""" - return parse_date(self.environ.get("HTTP_IF_UNMODIFIED_SINCE")) - - @cached_property - def if_range(self): - """The parsed `If-Range` header. - - .. versionadded:: 0.7 - - :rtype: :class:`~werkzeug.datastructures.IfRange` - """ - return parse_if_range_header(self.environ.get("HTTP_IF_RANGE")) - - @cached_property - def range(self): - """The parsed `Range` header. - - .. versionadded:: 0.7 - - :rtype: :class:`~werkzeug.datastructures.Range` - """ - return parse_range_header(self.environ.get("HTTP_RANGE")) - - -class ETagResponseMixin(object): - """Adds extra functionality to a response object for etag and cache - handling. This mixin requires an object with at least a `headers` - object that implements a dict like interface similar to - :class:`~werkzeug.datastructures.Headers`. - - If you want the :meth:`freeze` method to automatically add an etag, you - have to mixin this method before the response base class. The default - response class does not do that. - """ - - @property - def cache_control(self): - """The Cache-Control general-header field is used to specify - directives that MUST be obeyed by all caching mechanisms along the - request/response chain. - """ - - def on_update(cache_control): - if not cache_control and "cache-control" in self.headers: - del self.headers["cache-control"] - elif cache_control: - self.headers["Cache-Control"] = cache_control.to_header() - - return parse_cache_control_header( - self.headers.get("cache-control"), on_update, ResponseCacheControl - ) - - def _wrap_response(self, start, length): - """Wrap existing Response in case of Range Request context.""" - if self.status_code == 206: - self.response = _RangeWrapper(self.response, start, length) - - def _is_range_request_processable(self, environ): - """Return ``True`` if `Range` header is present and if underlying - resource is considered unchanged when compared with `If-Range` header. - """ - return ( - "HTTP_IF_RANGE" not in environ - or not is_resource_modified( - environ, - self.headers.get("etag"), - None, - self.headers.get("last-modified"), - ignore_if_range=False, - ) - ) and "HTTP_RANGE" in environ - - def _process_range_request(self, environ, complete_length=None, accept_ranges=None): - """Handle Range Request related headers (RFC7233). If `Accept-Ranges` - header is valid, and Range Request is processable, we set the headers - as described by the RFC, and wrap the underlying response in a - RangeWrapper. - - Returns ``True`` if Range Request can be fulfilled, ``False`` otherwise. - - :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` - if `Range` header could not be parsed or satisfied. - """ - from ..exceptions import RequestedRangeNotSatisfiable - - if ( - accept_ranges is None - or complete_length is None - or not self._is_range_request_processable(environ) - ): - return False - - parsed_range = parse_range_header(environ.get("HTTP_RANGE")) - - if parsed_range is None: - raise RequestedRangeNotSatisfiable(complete_length) - - range_tuple = parsed_range.range_for_length(complete_length) - content_range_header = parsed_range.to_content_range_header(complete_length) - - if range_tuple is None or content_range_header is None: - raise RequestedRangeNotSatisfiable(complete_length) - - content_length = range_tuple[1] - range_tuple[0] - self.headers["Content-Length"] = content_length - self.headers["Accept-Ranges"] = accept_ranges - self.content_range = content_range_header - self.status_code = 206 - self._wrap_response(range_tuple[0], content_length) - return True - - def make_conditional( - self, request_or_environ, accept_ranges=False, complete_length=None - ): - """Make the response conditional to the request. This method works - best if an etag was defined for the response already. The `add_etag` - method can be used to do that. If called without etag just the date - header is set. - - This does nothing if the request method in the request or environ is - anything but GET or HEAD. - - For optimal performance when handling range requests, it's recommended - that your response data object implements `seekable`, `seek` and `tell` - methods as described by :py:class:`io.IOBase`. Objects returned by - :meth:`~werkzeug.wsgi.wrap_file` automatically implement those methods. - - It does not remove the body of the response because that's something - the :meth:`__call__` function does for us automatically. - - Returns self so that you can do ``return resp.make_conditional(req)`` - but modifies the object in-place. - - :param request_or_environ: a request object or WSGI environment to be - used to make the response conditional - against. - :param accept_ranges: This parameter dictates the value of - `Accept-Ranges` header. If ``False`` (default), - the header is not set. If ``True``, it will be set - to ``"bytes"``. If ``None``, it will be set to - ``"none"``. If it's a string, it will use this - value. - :param complete_length: Will be used only in valid Range Requests. - It will set `Content-Range` complete length - value and compute `Content-Length` real value. - This parameter is mandatory for successful - Range Requests completion. - :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` - if `Range` header could not be parsed or satisfied. - """ - environ = _get_environ(request_or_environ) - if environ["REQUEST_METHOD"] in ("GET", "HEAD"): - # if the date is not in the headers, add it now. We however - # will not override an already existing header. Unfortunately - # this header will be overriden by many WSGI servers including - # wsgiref. - if "date" not in self.headers: - self.headers["Date"] = http_date() - accept_ranges = _clean_accept_ranges(accept_ranges) - is206 = self._process_range_request(environ, complete_length, accept_ranges) - if not is206 and not is_resource_modified( - environ, - self.headers.get("etag"), - None, - self.headers.get("last-modified"), - ): - if parse_etags(environ.get("HTTP_IF_MATCH")): - self.status_code = 412 - else: - self.status_code = 304 - if ( - self.automatically_set_content_length - and "content-length" not in self.headers - ): - length = self.calculate_content_length() - if length is not None: - self.headers["Content-Length"] = length - return self - - def add_etag(self, overwrite=False, weak=False): - """Add an etag for the current response if there is none yet.""" - if overwrite or "etag" not in self.headers: - self.set_etag(generate_etag(self.get_data()), weak) - - def set_etag(self, etag, weak=False): - """Set the etag, and override the old one if there was one.""" - self.headers["ETag"] = quote_etag(etag, weak) - - def get_etag(self): - """Return a tuple in the form ``(etag, is_weak)``. If there is no - ETag the return value is ``(None, None)``. - """ - return unquote_etag(self.headers.get("ETag")) - - def freeze(self, no_etag=False): - """Call this method if you want to make your response object ready for - pickeling. This buffers the generator if there is one. This also - sets the etag unless `no_etag` is set to `True`. - """ - if not no_etag: - self.add_etag() - super(ETagResponseMixin, self).freeze() - - accept_ranges = header_property( - "Accept-Ranges", - doc="""The `Accept-Ranges` header. Even though the name would - indicate that multiple values are supported, it must be one - string token only. - - The values ``'bytes'`` and ``'none'`` are common. - - .. versionadded:: 0.7""", - ) - - @property - def content_range(self): - """The ``Content-Range`` header as a - :class:`~werkzeug.datastructures.ContentRange` object. Available - even if the header is not set. - - .. versionadded:: 0.7 - """ - - def on_update(rng): - if not rng: - del self.headers["content-range"] - else: - self.headers["Content-Range"] = rng.to_header() - - rv = parse_content_range_header(self.headers.get("content-range"), on_update) - # always provide a content range object to make the descriptor - # more user friendly. It provides an unset() method that can be - # used to remove the header quickly. - if rv is None: - rv = ContentRange(None, None, None, on_update=on_update) - return rv - - @content_range.setter - def content_range(self, value): - if not value: - del self.headers["content-range"] - elif isinstance(value, string_types): - self.headers["Content-Range"] = value - else: - self.headers["Content-Range"] = value.to_header() diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/json.py b/venv/lib/python3.7/site-packages/werkzeug/wrappers/json.py deleted file mode 100644 index 6d5dc33..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wrappers/json.py +++ /dev/null @@ -1,145 +0,0 @@ -from __future__ import absolute_import - -import datetime -import uuid - -from .._compat import text_type -from ..exceptions import BadRequest -from ..utils import detect_utf_encoding - -try: - import simplejson as _json -except ImportError: - import json as _json - - -class _JSONModule(object): - @staticmethod - def _default(o): - if isinstance(o, datetime.date): - return o.isoformat() - - if isinstance(o, uuid.UUID): - return str(o) - - if hasattr(o, "__html__"): - return text_type(o.__html__()) - - raise TypeError() - - @classmethod - def dumps(cls, obj, **kw): - kw.setdefault("separators", (",", ":")) - kw.setdefault("default", cls._default) - kw.setdefault("sort_keys", True) - return _json.dumps(obj, **kw) - - @staticmethod - def loads(s, **kw): - if isinstance(s, bytes): - # Needed for Python < 3.6 - encoding = detect_utf_encoding(s) - s = s.decode(encoding) - - return _json.loads(s, **kw) - - -class JSONMixin(object): - """Mixin to parse :attr:`data` as JSON. Can be mixed in for both - :class:`~werkzeug.wrappers.Request` and - :class:`~werkzeug.wrappers.Response` classes. - - If `simplejson`_ is installed it is preferred over Python's built-in - :mod:`json` module. - - .. _simplejson: https://simplejson.readthedocs.io/en/latest/ - """ - - #: A module or other object that has ``dumps`` and ``loads`` - #: functions that match the API of the built-in :mod:`json` module. - json_module = _JSONModule - - @property - def json(self): - """The parsed JSON data if :attr:`mimetype` indicates JSON - (:mimetype:`application/json`, see :meth:`is_json`). - - Calls :meth:`get_json` with default arguments. - """ - return self.get_json() - - @property - def is_json(self): - """Check if the mimetype indicates JSON data, either - :mimetype:`application/json` or :mimetype:`application/*+json`. - """ - mt = self.mimetype - return ( - mt == "application/json" - or mt.startswith("application/") - and mt.endswith("+json") - ) - - def _get_data_for_json(self, cache): - try: - return self.get_data(cache=cache) - except TypeError: - # Response doesn't have cache param. - return self.get_data() - - # Cached values for ``(silent=False, silent=True)``. Initialized - # with sentinel values. - _cached_json = (Ellipsis, Ellipsis) - - def get_json(self, force=False, silent=False, cache=True): - """Parse :attr:`data` as JSON. - - If the mimetype does not indicate JSON - (:mimetype:`application/json`, see :meth:`is_json`), this - returns ``None``. - - If parsing fails, :meth:`on_json_loading_failed` is called and - its return value is used as the return value. - - :param force: Ignore the mimetype and always try to parse JSON. - :param silent: Silence parsing errors and return ``None`` - instead. - :param cache: Store the parsed JSON to return for subsequent - calls. - """ - if cache and self._cached_json[silent] is not Ellipsis: - return self._cached_json[silent] - - if not (force or self.is_json): - return None - - data = self._get_data_for_json(cache=cache) - - try: - rv = self.json_module.loads(data) - except ValueError as e: - if silent: - rv = None - - if cache: - normal_rv, _ = self._cached_json - self._cached_json = (normal_rv, rv) - else: - rv = self.on_json_loading_failed(e) - - if cache: - _, silent_rv = self._cached_json - self._cached_json = (rv, silent_rv) - else: - if cache: - self._cached_json = (rv, rv) - - return rv - - def on_json_loading_failed(self, e): - """Called if :meth:`get_json` parsing fails and isn't silenced. - If this method returns a value, it is used as the return value - for :meth:`get_json`. The default implementation raises - :exc:`~werkzeug.exceptions.BadRequest`. - """ - raise BadRequest("Failed to decode JSON object: {0}".format(e)) diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/request.py b/venv/lib/python3.7/site-packages/werkzeug/wrappers/request.py deleted file mode 100644 index 5c2fe10..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wrappers/request.py +++ /dev/null @@ -1,49 +0,0 @@ -from .accept import AcceptMixin -from .auth import AuthorizationMixin -from .base_request import BaseRequest -from .common_descriptors import CommonRequestDescriptorsMixin -from .cors import CORSRequestMixin -from .etag import ETagRequestMixin -from .user_agent import UserAgentMixin - - -class Request( - BaseRequest, - AcceptMixin, - ETagRequestMixin, - UserAgentMixin, - AuthorizationMixin, - CORSRequestMixin, - CommonRequestDescriptorsMixin, -): - """Full featured request object implementing the following mixins: - - - :class:`AcceptMixin` for accept header parsing - - :class:`ETagRequestMixin` for etag and cache control handling - - :class:`UserAgentMixin` for user agent introspection - - :class:`AuthorizationMixin` for http auth handling - - :class:`~werkzeug.wrappers.cors.CORSRequestMixin` for Cross - Origin Resource Sharing headers - - :class:`CommonRequestDescriptorsMixin` for common headers - - """ - - -class StreamOnlyMixin(object): - """If mixed in before the request object this will change the behavior - of it to disable handling of form parsing. This disables the - :attr:`files`, :attr:`form` attributes and will just provide a - :attr:`stream` attribute that however is always available. - - .. versionadded:: 0.9 - """ - - disable_data_descriptor = True - want_form_data_parsed = False - - -class PlainRequest(StreamOnlyMixin, Request): - """A request object without special form parsing capabilities. - - .. versionadded:: 0.9 - """ diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/response.py b/venv/lib/python3.7/site-packages/werkzeug/wrappers/response.py deleted file mode 100644 index 8f190f7..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wrappers/response.py +++ /dev/null @@ -1,84 +0,0 @@ -from ..utils import cached_property -from .auth import WWWAuthenticateMixin -from .base_response import BaseResponse -from .common_descriptors import CommonResponseDescriptorsMixin -from .cors import CORSResponseMixin -from .etag import ETagResponseMixin - - -class ResponseStream(object): - """A file descriptor like object used by the :class:`ResponseStreamMixin` to - represent the body of the stream. It directly pushes into the response - iterable of the response object. - """ - - mode = "wb+" - - def __init__(self, response): - self.response = response - self.closed = False - - def write(self, value): - if self.closed: - raise ValueError("I/O operation on closed file") - self.response._ensure_sequence(mutable=True) - self.response.response.append(value) - self.response.headers.pop("Content-Length", None) - return len(value) - - def writelines(self, seq): - for item in seq: - self.write(item) - - def close(self): - self.closed = True - - def flush(self): - if self.closed: - raise ValueError("I/O operation on closed file") - - def isatty(self): - if self.closed: - raise ValueError("I/O operation on closed file") - return False - - def tell(self): - self.response._ensure_sequence() - return sum(map(len, self.response.response)) - - @property - def encoding(self): - return self.response.charset - - -class ResponseStreamMixin(object): - """Mixin for :class:`BaseResponse` subclasses. Classes that inherit from - this mixin will automatically get a :attr:`stream` property that provides - a write-only interface to the response iterable. - """ - - @cached_property - def stream(self): - """The response iterable as write-only stream.""" - return ResponseStream(self) - - -class Response( - BaseResponse, - ETagResponseMixin, - WWWAuthenticateMixin, - CORSResponseMixin, - ResponseStreamMixin, - CommonResponseDescriptorsMixin, -): - """Full featured response object implementing the following mixins: - - - :class:`ETagResponseMixin` for etag and cache control handling - - :class:`WWWAuthenticateMixin` for HTTP authentication support - - :class:`~werkzeug.wrappers.cors.CORSResponseMixin` for Cross - Origin Resource Sharing headers - - :class:`ResponseStreamMixin` to add support for the ``stream`` - property - - :class:`CommonResponseDescriptorsMixin` for various HTTP - descriptors - """ diff --git a/venv/lib/python3.7/site-packages/werkzeug/wrappers/user_agent.py b/venv/lib/python3.7/site-packages/werkzeug/wrappers/user_agent.py deleted file mode 100644 index a32d8ac..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wrappers/user_agent.py +++ /dev/null @@ -1,14 +0,0 @@ -from ..useragents import UserAgent -from ..utils import cached_property - - -class UserAgentMixin(object): - """Adds a `user_agent` attribute to the request object which - contains the parsed user agent of the browser that triggered the - request as a :class:`~werkzeug.useragents.UserAgent` object. - """ - - @cached_property - def user_agent(self): - """The current user agent.""" - return UserAgent(self.environ) diff --git a/venv/lib/python3.7/site-packages/werkzeug/wsgi.py b/venv/lib/python3.7/site-packages/werkzeug/wsgi.py deleted file mode 100644 index aa4e713..0000000 --- a/venv/lib/python3.7/site-packages/werkzeug/wsgi.py +++ /dev/null @@ -1,1000 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.wsgi - ~~~~~~~~~~~~~ - - This module implements WSGI related helpers. - - :copyright: 2007 Pallets - :license: BSD-3-Clause -""" -import io -import re -from functools import partial -from functools import update_wrapper -from itertools import chain - -from ._compat import BytesIO -from ._compat import implements_iterator -from ._compat import make_literal_wrapper -from ._compat import string_types -from ._compat import text_type -from ._compat import to_bytes -from ._compat import to_unicode -from ._compat import try_coerce_native -from ._compat import wsgi_get_bytes -from ._internal import _encode_idna -from .urls import uri_to_iri -from .urls import url_join -from .urls import url_parse -from .urls import url_quote - - -def responder(f): - """Marks a function as responder. Decorate a function with it and it - will automatically call the return value as WSGI application. - - Example:: - - @responder - def application(environ, start_response): - return Response('Hello World!') - """ - return update_wrapper(lambda *a: f(*a)(*a[-2:]), f) - - -def get_current_url( - environ, - root_only=False, - strip_querystring=False, - host_only=False, - trusted_hosts=None, -): - """A handy helper function that recreates the full URL as IRI for the - current request or parts of it. Here's an example: - - >>> from werkzeug.test import create_environ - >>> env = create_environ("/?param=foo", "http://localhost/script") - >>> get_current_url(env) - 'http://localhost/script/?param=foo' - >>> get_current_url(env, root_only=True) - 'http://localhost/script/' - >>> get_current_url(env, host_only=True) - 'http://localhost/' - >>> get_current_url(env, strip_querystring=True) - 'http://localhost/script/' - - This optionally it verifies that the host is in a list of trusted hosts. - If the host is not in there it will raise a - :exc:`~werkzeug.exceptions.SecurityError`. - - Note that the string returned might contain unicode characters as the - representation is an IRI not an URI. If you need an ASCII only - representation you can use the :func:`~werkzeug.urls.iri_to_uri` - function: - - >>> from werkzeug.urls import iri_to_uri - >>> iri_to_uri(get_current_url(env)) - 'http://localhost/script/?param=foo' - - :param environ: the WSGI environment to get the current URL from. - :param root_only: set `True` if you only want the root URL. - :param strip_querystring: set to `True` if you don't want the querystring. - :param host_only: set to `True` if the host URL should be returned. - :param trusted_hosts: a list of trusted hosts, see :func:`host_is_trusted` - for more information. - """ - tmp = [environ["wsgi.url_scheme"], "://", get_host(environ, trusted_hosts)] - cat = tmp.append - if host_only: - return uri_to_iri("".join(tmp) + "/") - cat(url_quote(wsgi_get_bytes(environ.get("SCRIPT_NAME", ""))).rstrip("/")) - cat("/") - if not root_only: - cat(url_quote(wsgi_get_bytes(environ.get("PATH_INFO", "")).lstrip(b"/"))) - if not strip_querystring: - qs = get_query_string(environ) - if qs: - cat("?" + qs) - return uri_to_iri("".join(tmp)) - - -def host_is_trusted(hostname, trusted_list): - """Checks if a host is trusted against a list. This also takes care - of port normalization. - - .. versionadded:: 0.9 - - :param hostname: the hostname to check - :param trusted_list: a list of hostnames to check against. If a - hostname starts with a dot it will match against - all subdomains as well. - """ - if not hostname: - return False - - if isinstance(trusted_list, string_types): - trusted_list = [trusted_list] - - def _normalize(hostname): - if ":" in hostname: - hostname = hostname.rsplit(":", 1)[0] - return _encode_idna(hostname) - - try: - hostname = _normalize(hostname) - except UnicodeError: - return False - for ref in trusted_list: - if ref.startswith("."): - ref = ref[1:] - suffix_match = True - else: - suffix_match = False - try: - ref = _normalize(ref) - except UnicodeError: - return False - if ref == hostname: - return True - if suffix_match and hostname.endswith(b"." + ref): - return True - return False - - -def get_host(environ, trusted_hosts=None): - """Return the host for the given WSGI environment. This first checks - the ``Host`` header. If it's not present, then ``SERVER_NAME`` and - ``SERVER_PORT`` are used. The host will only contain the port if it - is different than the standard port for the protocol. - - Optionally, verify that the host is trusted using - :func:`host_is_trusted` and raise a - :exc:`~werkzeug.exceptions.SecurityError` if it is not. - - :param environ: The WSGI environment to get the host from. - :param trusted_hosts: A list of trusted hosts. - :return: Host, with port if necessary. - :raise ~werkzeug.exceptions.SecurityError: If the host is not - trusted. - """ - if "HTTP_HOST" in environ: - rv = environ["HTTP_HOST"] - if environ["wsgi.url_scheme"] == "http" and rv.endswith(":80"): - rv = rv[:-3] - elif environ["wsgi.url_scheme"] == "https" and rv.endswith(":443"): - rv = rv[:-4] - else: - rv = environ["SERVER_NAME"] - if (environ["wsgi.url_scheme"], environ["SERVER_PORT"]) not in ( - ("https", "443"), - ("http", "80"), - ): - rv += ":" + environ["SERVER_PORT"] - if trusted_hosts is not None: - if not host_is_trusted(rv, trusted_hosts): - from .exceptions import SecurityError - - raise SecurityError('Host "%s" is not trusted' % rv) - return rv - - -def get_content_length(environ): - """Returns the content length from the WSGI environment as - integer. If it's not available or chunked transfer encoding is used, - ``None`` is returned. - - .. versionadded:: 0.9 - - :param environ: the WSGI environ to fetch the content length from. - """ - if environ.get("HTTP_TRANSFER_ENCODING", "") == "chunked": - return None - - content_length = environ.get("CONTENT_LENGTH") - if content_length is not None: - try: - return max(0, int(content_length)) - except (ValueError, TypeError): - pass - - -def get_input_stream(environ, safe_fallback=True): - """Returns the input stream from the WSGI environment and wraps it - in the most sensible way possible. The stream returned is not the - raw WSGI stream in most cases but one that is safe to read from - without taking into account the content length. - - If content length is not set, the stream will be empty for safety reasons. - If the WSGI server supports chunked or infinite streams, it should set - the ``wsgi.input_terminated`` value in the WSGI environ to indicate that. - - .. versionadded:: 0.9 - - :param environ: the WSGI environ to fetch the stream from. - :param safe_fallback: use an empty stream as a safe fallback when the - content length is not set. Disabling this allows infinite streams, - which can be a denial-of-service risk. - """ - stream = environ["wsgi.input"] - content_length = get_content_length(environ) - - # A wsgi extension that tells us if the input is terminated. In - # that case we return the stream unchanged as we know we can safely - # read it until the end. - if environ.get("wsgi.input_terminated"): - return stream - - # If the request doesn't specify a content length, returning the stream is - # potentially dangerous because it could be infinite, malicious or not. If - # safe_fallback is true, return an empty stream instead for safety. - if content_length is None: - return BytesIO() if safe_fallback else stream - - # Otherwise limit the stream to the content length - return LimitedStream(stream, content_length) - - -def get_query_string(environ): - """Returns the `QUERY_STRING` from the WSGI environment. This also takes - care about the WSGI decoding dance on Python 3 environments as a - native string. The string returned will be restricted to ASCII - characters. - - .. versionadded:: 0.9 - - :param environ: the WSGI environment object to get the query string from. - """ - qs = wsgi_get_bytes(environ.get("QUERY_STRING", "")) - # QUERY_STRING really should be ascii safe but some browsers - # will send us some unicode stuff (I am looking at you IE). - # In that case we want to urllib quote it badly. - return try_coerce_native(url_quote(qs, safe=":&%=+$!*'(),")) - - -def get_path_info(environ, charset="utf-8", errors="replace"): - """Returns the `PATH_INFO` from the WSGI environment and properly - decodes it. This also takes care about the WSGI decoding dance - on Python 3 environments. if the `charset` is set to `None` a - bytestring is returned. - - .. versionadded:: 0.9 - - :param environ: the WSGI environment object to get the path from. - :param charset: the charset for the path info, or `None` if no - decoding should be performed. - :param errors: the decoding error handling. - """ - path = wsgi_get_bytes(environ.get("PATH_INFO", "")) - return to_unicode(path, charset, errors, allow_none_charset=True) - - -def get_script_name(environ, charset="utf-8", errors="replace"): - """Returns the `SCRIPT_NAME` from the WSGI environment and properly - decodes it. This also takes care about the WSGI decoding dance - on Python 3 environments. if the `charset` is set to `None` a - bytestring is returned. - - .. versionadded:: 0.9 - - :param environ: the WSGI environment object to get the path from. - :param charset: the charset for the path, or `None` if no - decoding should be performed. - :param errors: the decoding error handling. - """ - path = wsgi_get_bytes(environ.get("SCRIPT_NAME", "")) - return to_unicode(path, charset, errors, allow_none_charset=True) - - -def pop_path_info(environ, charset="utf-8", errors="replace"): - """Removes and returns the next segment of `PATH_INFO`, pushing it onto - `SCRIPT_NAME`. Returns `None` if there is nothing left on `PATH_INFO`. - - If the `charset` is set to `None` a bytestring is returned. - - If there are empty segments (``'/foo//bar``) these are ignored but - properly pushed to the `SCRIPT_NAME`: - - >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} - >>> pop_path_info(env) - 'a' - >>> env['SCRIPT_NAME'] - '/foo/a' - >>> pop_path_info(env) - 'b' - >>> env['SCRIPT_NAME'] - '/foo/a/b' - - .. versionadded:: 0.5 - - .. versionchanged:: 0.9 - The path is now decoded and a charset and encoding - parameter can be provided. - - :param environ: the WSGI environment that is modified. - """ - path = environ.get("PATH_INFO") - if not path: - return None - - script_name = environ.get("SCRIPT_NAME", "") - - # shift multiple leading slashes over - old_path = path - path = path.lstrip("/") - if path != old_path: - script_name += "/" * (len(old_path) - len(path)) - - if "/" not in path: - environ["PATH_INFO"] = "" - environ["SCRIPT_NAME"] = script_name + path - rv = wsgi_get_bytes(path) - else: - segment, path = path.split("/", 1) - environ["PATH_INFO"] = "/" + path - environ["SCRIPT_NAME"] = script_name + segment - rv = wsgi_get_bytes(segment) - - return to_unicode(rv, charset, errors, allow_none_charset=True) - - -def peek_path_info(environ, charset="utf-8", errors="replace"): - """Returns the next segment on the `PATH_INFO` or `None` if there - is none. Works like :func:`pop_path_info` without modifying the - environment: - - >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} - >>> peek_path_info(env) - 'a' - >>> peek_path_info(env) - 'a' - - If the `charset` is set to `None` a bytestring is returned. - - .. versionadded:: 0.5 - - .. versionchanged:: 0.9 - The path is now decoded and a charset and encoding - parameter can be provided. - - :param environ: the WSGI environment that is checked. - """ - segments = environ.get("PATH_INFO", "").lstrip("/").split("/", 1) - if segments: - return to_unicode( - wsgi_get_bytes(segments[0]), charset, errors, allow_none_charset=True - ) - - -def extract_path_info( - environ_or_baseurl, - path_or_url, - charset="utf-8", - errors="werkzeug.url_quote", - collapse_http_schemes=True, -): - """Extracts the path info from the given URL (or WSGI environment) and - path. The path info returned is a unicode string, not a bytestring - suitable for a WSGI environment. The URLs might also be IRIs. - - If the path info could not be determined, `None` is returned. - - Some examples: - - >>> extract_path_info('http://example.com/app', '/app/hello') - u'/hello' - >>> extract_path_info('http://example.com/app', - ... 'https://example.com/app/hello') - u'/hello' - >>> extract_path_info('http://example.com/app', - ... 'https://example.com/app/hello', - ... collapse_http_schemes=False) is None - True - - Instead of providing a base URL you can also pass a WSGI environment. - - :param environ_or_baseurl: a WSGI environment dict, a base URL or - base IRI. This is the root of the - application. - :param path_or_url: an absolute path from the server root, a - relative path (in which case it's the path info) - or a full URL. Also accepts IRIs and unicode - parameters. - :param charset: the charset for byte data in URLs - :param errors: the error handling on decode - :param collapse_http_schemes: if set to `False` the algorithm does - not assume that http and https on the - same server point to the same - resource. - - .. versionchanged:: 0.15 - The ``errors`` parameter defaults to leaving invalid bytes - quoted instead of replacing them. - - .. versionadded:: 0.6 - """ - - def _normalize_netloc(scheme, netloc): - parts = netloc.split(u"@", 1)[-1].split(u":", 1) - if len(parts) == 2: - netloc, port = parts - if (scheme == u"http" and port == u"80") or ( - scheme == u"https" and port == u"443" - ): - port = None - else: - netloc = parts[0] - port = None - if port is not None: - netloc += u":" + port - return netloc - - # make sure whatever we are working on is a IRI and parse it - path = uri_to_iri(path_or_url, charset, errors) - if isinstance(environ_or_baseurl, dict): - environ_or_baseurl = get_current_url(environ_or_baseurl, root_only=True) - base_iri = uri_to_iri(environ_or_baseurl, charset, errors) - base_scheme, base_netloc, base_path = url_parse(base_iri)[:3] - cur_scheme, cur_netloc, cur_path, = url_parse(url_join(base_iri, path))[:3] - - # normalize the network location - base_netloc = _normalize_netloc(base_scheme, base_netloc) - cur_netloc = _normalize_netloc(cur_scheme, cur_netloc) - - # is that IRI even on a known HTTP scheme? - if collapse_http_schemes: - for scheme in base_scheme, cur_scheme: - if scheme not in (u"http", u"https"): - return None - else: - if not (base_scheme in (u"http", u"https") and base_scheme == cur_scheme): - return None - - # are the netlocs compatible? - if base_netloc != cur_netloc: - return None - - # are we below the application path? - base_path = base_path.rstrip(u"/") - if not cur_path.startswith(base_path): - return None - - return u"/" + cur_path[len(base_path) :].lstrip(u"/") - - -@implements_iterator -class ClosingIterator(object): - """The WSGI specification requires that all middlewares and gateways - respect the `close` callback of the iterable returned by the application. - Because it is useful to add another close action to a returned iterable - and adding a custom iterable is a boring task this class can be used for - that:: - - return ClosingIterator(app(environ, start_response), [cleanup_session, - cleanup_locals]) - - If there is just one close function it can be passed instead of the list. - - A closing iterator is not needed if the application uses response objects - and finishes the processing if the response is started:: - - try: - return response(environ, start_response) - finally: - cleanup_session() - cleanup_locals() - """ - - def __init__(self, iterable, callbacks=None): - iterator = iter(iterable) - self._next = partial(next, iterator) - if callbacks is None: - callbacks = [] - elif callable(callbacks): - callbacks = [callbacks] - else: - callbacks = list(callbacks) - iterable_close = getattr(iterable, "close", None) - if iterable_close: - callbacks.insert(0, iterable_close) - self._callbacks = callbacks - - def __iter__(self): - return self - - def __next__(self): - return self._next() - - def close(self): - for callback in self._callbacks: - callback() - - -def wrap_file(environ, file, buffer_size=8192): - """Wraps a file. This uses the WSGI server's file wrapper if available - or otherwise the generic :class:`FileWrapper`. - - .. versionadded:: 0.5 - - If the file wrapper from the WSGI server is used it's important to not - iterate over it from inside the application but to pass it through - unchanged. If you want to pass out a file wrapper inside a response - object you have to set :attr:`~BaseResponse.direct_passthrough` to `True`. - - More information about file wrappers are available in :pep:`333`. - - :param file: a :class:`file`-like object with a :meth:`~file.read` method. - :param buffer_size: number of bytes for one iteration. - """ - return environ.get("wsgi.file_wrapper", FileWrapper)(file, buffer_size) - - -@implements_iterator -class FileWrapper(object): - """This class can be used to convert a :class:`file`-like object into - an iterable. It yields `buffer_size` blocks until the file is fully - read. - - You should not use this class directly but rather use the - :func:`wrap_file` function that uses the WSGI server's file wrapper - support if it's available. - - .. versionadded:: 0.5 - - If you're using this object together with a :class:`BaseResponse` you have - to use the `direct_passthrough` mode. - - :param file: a :class:`file`-like object with a :meth:`~file.read` method. - :param buffer_size: number of bytes for one iteration. - """ - - def __init__(self, file, buffer_size=8192): - self.file = file - self.buffer_size = buffer_size - - def close(self): - if hasattr(self.file, "close"): - self.file.close() - - def seekable(self): - if hasattr(self.file, "seekable"): - return self.file.seekable() - if hasattr(self.file, "seek"): - return True - return False - - def seek(self, *args): - if hasattr(self.file, "seek"): - self.file.seek(*args) - - def tell(self): - if hasattr(self.file, "tell"): - return self.file.tell() - return None - - def __iter__(self): - return self - - def __next__(self): - data = self.file.read(self.buffer_size) - if data: - return data - raise StopIteration() - - -@implements_iterator -class _RangeWrapper(object): - # private for now, but should we make it public in the future ? - - """This class can be used to convert an iterable object into - an iterable that will only yield a piece of the underlying content. - It yields blocks until the underlying stream range is fully read. - The yielded blocks will have a size that can't exceed the original - iterator defined block size, but that can be smaller. - - If you're using this object together with a :class:`BaseResponse` you have - to use the `direct_passthrough` mode. - - :param iterable: an iterable object with a :meth:`__next__` method. - :param start_byte: byte from which read will start. - :param byte_range: how many bytes to read. - """ - - def __init__(self, iterable, start_byte=0, byte_range=None): - self.iterable = iter(iterable) - self.byte_range = byte_range - self.start_byte = start_byte - self.end_byte = None - if byte_range is not None: - self.end_byte = self.start_byte + self.byte_range - self.read_length = 0 - self.seekable = hasattr(iterable, "seekable") and iterable.seekable() - self.end_reached = False - - def __iter__(self): - return self - - def _next_chunk(self): - try: - chunk = next(self.iterable) - self.read_length += len(chunk) - return chunk - except StopIteration: - self.end_reached = True - raise - - def _first_iteration(self): - chunk = None - if self.seekable: - self.iterable.seek(self.start_byte) - self.read_length = self.iterable.tell() - contextual_read_length = self.read_length - else: - while self.read_length <= self.start_byte: - chunk = self._next_chunk() - if chunk is not None: - chunk = chunk[self.start_byte - self.read_length :] - contextual_read_length = self.start_byte - return chunk, contextual_read_length - - def _next(self): - if self.end_reached: - raise StopIteration() - chunk = None - contextual_read_length = self.read_length - if self.read_length == 0: - chunk, contextual_read_length = self._first_iteration() - if chunk is None: - chunk = self._next_chunk() - if self.end_byte is not None and self.read_length >= self.end_byte: - self.end_reached = True - return chunk[: self.end_byte - contextual_read_length] - return chunk - - def __next__(self): - chunk = self._next() - if chunk: - return chunk - self.end_reached = True - raise StopIteration() - - def close(self): - if hasattr(self.iterable, "close"): - self.iterable.close() - - -def _make_chunk_iter(stream, limit, buffer_size): - """Helper for the line and chunk iter functions.""" - if isinstance(stream, (bytes, bytearray, text_type)): - raise TypeError( - "Passed a string or byte object instead of true iterator or stream." - ) - if not hasattr(stream, "read"): - for item in stream: - if item: - yield item - return - if not isinstance(stream, LimitedStream) and limit is not None: - stream = LimitedStream(stream, limit) - _read = stream.read - while 1: - item = _read(buffer_size) - if not item: - break - yield item - - -def make_line_iter(stream, limit=None, buffer_size=10 * 1024, cap_at_buffer=False): - """Safely iterates line-based over an input stream. If the input stream - is not a :class:`LimitedStream` the `limit` parameter is mandatory. - - This uses the stream's :meth:`~file.read` method internally as opposite - to the :meth:`~file.readline` method that is unsafe and can only be used - in violation of the WSGI specification. The same problem applies to the - `__iter__` function of the input stream which calls :meth:`~file.readline` - without arguments. - - If you need line-by-line processing it's strongly recommended to iterate - over the input stream using this helper function. - - .. versionchanged:: 0.8 - This function now ensures that the limit was reached. - - .. versionadded:: 0.9 - added support for iterators as input stream. - - .. versionadded:: 0.11.10 - added support for the `cap_at_buffer` parameter. - - :param stream: the stream or iterate to iterate over. - :param limit: the limit in bytes for the stream. (Usually - content length. Not necessary if the `stream` - is a :class:`LimitedStream`. - :param buffer_size: The optional buffer size. - :param cap_at_buffer: if this is set chunks are split if they are longer - than the buffer size. Internally this is implemented - that the buffer size might be exhausted by a factor - of two however. - """ - _iter = _make_chunk_iter(stream, limit, buffer_size) - - first_item = next(_iter, "") - if not first_item: - return - - s = make_literal_wrapper(first_item) - empty = s("") - cr = s("\r") - lf = s("\n") - crlf = s("\r\n") - - _iter = chain((first_item,), _iter) - - def _iter_basic_lines(): - _join = empty.join - buffer = [] - while 1: - new_data = next(_iter, "") - if not new_data: - break - new_buf = [] - buf_size = 0 - for item in chain(buffer, new_data.splitlines(True)): - new_buf.append(item) - buf_size += len(item) - if item and item[-1:] in crlf: - yield _join(new_buf) - new_buf = [] - elif cap_at_buffer and buf_size >= buffer_size: - rv = _join(new_buf) - while len(rv) >= buffer_size: - yield rv[:buffer_size] - rv = rv[buffer_size:] - new_buf = [rv] - buffer = new_buf - if buffer: - yield _join(buffer) - - # This hackery is necessary to merge 'foo\r' and '\n' into one item - # of 'foo\r\n' if we were unlucky and we hit a chunk boundary. - previous = empty - for item in _iter_basic_lines(): - if item == lf and previous[-1:] == cr: - previous += item - item = empty - if previous: - yield previous - previous = item - if previous: - yield previous - - -def make_chunk_iter( - stream, separator, limit=None, buffer_size=10 * 1024, cap_at_buffer=False -): - """Works like :func:`make_line_iter` but accepts a separator - which divides chunks. If you want newline based processing - you should use :func:`make_line_iter` instead as it - supports arbitrary newline markers. - - .. versionadded:: 0.8 - - .. versionadded:: 0.9 - added support for iterators as input stream. - - .. versionadded:: 0.11.10 - added support for the `cap_at_buffer` parameter. - - :param stream: the stream or iterate to iterate over. - :param separator: the separator that divides chunks. - :param limit: the limit in bytes for the stream. (Usually - content length. Not necessary if the `stream` - is otherwise already limited). - :param buffer_size: The optional buffer size. - :param cap_at_buffer: if this is set chunks are split if they are longer - than the buffer size. Internally this is implemented - that the buffer size might be exhausted by a factor - of two however. - """ - _iter = _make_chunk_iter(stream, limit, buffer_size) - - first_item = next(_iter, "") - if not first_item: - return - - _iter = chain((first_item,), _iter) - if isinstance(first_item, text_type): - separator = to_unicode(separator) - _split = re.compile(r"(%s)" % re.escape(separator)).split - _join = u"".join - else: - separator = to_bytes(separator) - _split = re.compile(b"(" + re.escape(separator) + b")").split - _join = b"".join - - buffer = [] - while 1: - new_data = next(_iter, "") - if not new_data: - break - chunks = _split(new_data) - new_buf = [] - buf_size = 0 - for item in chain(buffer, chunks): - if item == separator: - yield _join(new_buf) - new_buf = [] - buf_size = 0 - else: - buf_size += len(item) - new_buf.append(item) - - if cap_at_buffer and buf_size >= buffer_size: - rv = _join(new_buf) - while len(rv) >= buffer_size: - yield rv[:buffer_size] - rv = rv[buffer_size:] - new_buf = [rv] - buf_size = len(rv) - - buffer = new_buf - if buffer: - yield _join(buffer) - - -@implements_iterator -class LimitedStream(io.IOBase): - """Wraps a stream so that it doesn't read more than n bytes. If the - stream is exhausted and the caller tries to get more bytes from it - :func:`on_exhausted` is called which by default returns an empty - string. The return value of that function is forwarded - to the reader function. So if it returns an empty string - :meth:`read` will return an empty string as well. - - The limit however must never be higher than what the stream can - output. Otherwise :meth:`readlines` will try to read past the - limit. - - .. admonition:: Note on WSGI compliance - - calls to :meth:`readline` and :meth:`readlines` are not - WSGI compliant because it passes a size argument to the - readline methods. Unfortunately the WSGI PEP is not safely - implementable without a size argument to :meth:`readline` - because there is no EOF marker in the stream. As a result - of that the use of :meth:`readline` is discouraged. - - For the same reason iterating over the :class:`LimitedStream` - is not portable. It internally calls :meth:`readline`. - - We strongly suggest using :meth:`read` only or using the - :func:`make_line_iter` which safely iterates line-based - over a WSGI input stream. - - :param stream: the stream to wrap. - :param limit: the limit for the stream, must not be longer than - what the string can provide if the stream does not - end with `EOF` (like `wsgi.input`) - """ - - def __init__(self, stream, limit): - self._read = stream.read - self._readline = stream.readline - self._pos = 0 - self.limit = limit - - def __iter__(self): - return self - - @property - def is_exhausted(self): - """If the stream is exhausted this attribute is `True`.""" - return self._pos >= self.limit - - def on_exhausted(self): - """This is called when the stream tries to read past the limit. - The return value of this function is returned from the reading - function. - """ - # Read null bytes from the stream so that we get the - # correct end of stream marker. - return self._read(0) - - def on_disconnect(self): - """What should happen if a disconnect is detected? The return - value of this function is returned from read functions in case - the client went away. By default a - :exc:`~werkzeug.exceptions.ClientDisconnected` exception is raised. - """ - from .exceptions import ClientDisconnected - - raise ClientDisconnected() - - def exhaust(self, chunk_size=1024 * 64): - """Exhaust the stream. This consumes all the data left until the - limit is reached. - - :param chunk_size: the size for a chunk. It will read the chunk - until the stream is exhausted and throw away - the results. - """ - to_read = self.limit - self._pos - chunk = chunk_size - while to_read > 0: - chunk = min(to_read, chunk) - self.read(chunk) - to_read -= chunk - - def read(self, size=None): - """Read `size` bytes or if size is not provided everything is read. - - :param size: the number of bytes read. - """ - if self._pos >= self.limit: - return self.on_exhausted() - if size is None or size == -1: # -1 is for consistence with file - size = self.limit - to_read = min(self.limit - self._pos, size) - try: - read = self._read(to_read) - except (IOError, ValueError): - return self.on_disconnect() - if to_read and len(read) != to_read: - return self.on_disconnect() - self._pos += len(read) - return read - - def readline(self, size=None): - """Reads one line from the stream.""" - if self._pos >= self.limit: - return self.on_exhausted() - if size is None: - size = self.limit - self._pos - else: - size = min(size, self.limit - self._pos) - try: - line = self._readline(size) - except (ValueError, IOError): - return self.on_disconnect() - if size and not line: - return self.on_disconnect() - self._pos += len(line) - return line - - def readlines(self, size=None): - """Reads a file into a list of strings. It calls :meth:`readline` - until the file is read to the end. It does support the optional - `size` argument if the underlying stream supports it for - `readline`. - """ - last_pos = self._pos - result = [] - if size is not None: - end = min(self.limit, last_pos + size) - else: - end = self.limit - while 1: - if size is not None: - size -= last_pos - self._pos - if self._pos >= end: - break - result.append(self.readline(size)) - if size is not None: - last_pos = self._pos - return result - - def tell(self): - """Returns the position of the stream. - - .. versionadded:: 0.9 - """ - return self._pos - - def __next__(self): - line = self.readline() - if not line: - raise StopIteration() - return line - - def readable(self): - return True diff --git a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/DESCRIPTION.rst b/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/DESCRIPTION.rst deleted file mode 100644 index bb6bd75..0000000 --- a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,18 +0,0 @@ -Decorator for flup's gzip compression WSGI middleware -===================================================== - -Usage example:: - - from wsgigzip import gzip - - @gzip() - def index(environ, start_response): - start_response('200 OK', [('Content-type', 'text/plain')]) - return ['Home Page'] - - if __name__ == '__main__': - from wsgiref.simple_server import make_server - http = make_server('', 8080, index) - http.serve_forever() - - diff --git a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/METADATA b/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/METADATA deleted file mode 100644 index 8bd171f..0000000 --- a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/METADATA +++ /dev/null @@ -1,38 +0,0 @@ -Metadata-Version: 2.0 -Name: wsgigzip -Version: 0.1.4 -Summary: Decorator for flup's gzip compression WSGI middleware. -Home-page: https://bitbucket.org/lcrees/wsgigzip/ -Author: Lynn C. Rees -Author-email: lcrees@gmail.com -License: BSD -Keywords: WSGI middleware compression gzip flup decorator -Platform: UNKNOWN -Classifier: Development Status :: 4 - Beta -Classifier: Environment :: Web Environment -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 3 -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware -Requires: setuptools - -Decorator for flup's gzip compression WSGI middleware -===================================================== - -Usage example:: - - from wsgigzip import gzip - - @gzip() - def index(environ, start_response): - start_response('200 OK', [('Content-type', 'text/plain')]) - return ['Home Page'] - - if __name__ == '__main__': - from wsgiref.simple_server import make_server - http = make_server('', 8080, index) - http.serve_forever() - - diff --git a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/RECORD b/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/RECORD deleted file mode 100644 index 3f41d0e..0000000 --- a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/RECORD +++ /dev/null @@ -1,11 +0,0 @@ -wsgigzip-0.1.4.dist-info/DESCRIPTION.rst,sha256=R-PcgZhdIoPzlvQcxBeHzNaUkT3lwVwSmFiqWGj5W4E,466 -wsgigzip-0.1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -wsgigzip-0.1.4.dist-info/METADATA,sha256=Ah_GD4nu94UUN5W9teYsDMjkgo7a_Pjgubx2a8IErAo,1182 -wsgigzip-0.1.4.dist-info/RECORD,, -wsgigzip-0.1.4.dist-info/WHEEL,sha256=rNo05PbNqwnXiIHFsYm0m22u4Zm6YJtugFG2THx4w3g,92 -wsgigzip-0.1.4.dist-info/metadata.json,sha256=tzoxHfA7HJ19G4jENTm20GlB_t18vD6Efzq5jWiEbnc,874 -wsgigzip-0.1.4.dist-info/top_level.txt,sha256=9GgubjIgz-A6aAE-TTyj596IY6nXE6-A-7Nhw1Yioyo,9 -wsgigzip/__init__.py,sha256=vcBMo1vEvNx0UhY9lZTqH_EF6ORMoUo1aXH11Zsgamc,2293 -wsgigzip/__pycache__/__init__.cpython-37.pyc,, -wsgigzip/__pycache__/gzip.cpython-37.pyc,, -wsgigzip/gzip.py,sha256=CzAvSL2q2r7bPX6myUmRKybG91u_onbdvg9LrNLwS-E,10006 diff --git a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/WHEEL b/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/WHEEL deleted file mode 100644 index bb7f7db..0000000 --- a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.29.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/metadata.json b/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/metadata.json deleted file mode 100644 index 48140b3..0000000 --- a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 4 - Beta", "Environment :: Web Environment", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 3", "Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware"], "extensions": {"python.details": {"contacts": [{"email": "lcrees@gmail.com", "name": "Lynn C. Rees", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://bitbucket.org/lcrees/wsgigzip/"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["WSGI", "middleware", "compression", "gzip", "flup", "decorator"], "license": "BSD", "metadata_version": "2.0", "name": "wsgigzip", "requires": "setuptools", "summary": "Decorator for flup's gzip compression WSGI middleware.", "version": "0.1.4"} \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/top_level.txt deleted file mode 100644 index ba4da26..0000000 --- a/venv/lib/python3.7/site-packages/wsgigzip-0.1.4.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -wsgigzip diff --git a/venv/lib/python3.7/site-packages/wsgigzip/__init__.py b/venv/lib/python3.7/site-packages/wsgigzip/__init__.py deleted file mode 100644 index 26080d4..0000000 --- a/venv/lib/python3.7/site-packages/wsgigzip/__init__.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (c) 2006-2015 L. C. Rees. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. Neither the name of the Portable Site Information Project 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. - -'''Decorator for flup's gzip WSGI middleware.''' - -from wsgigzip.gzip import GzipMiddleware as GzipMiddleware - -text_types = ['text/xml', 'application/xml', 'application/xhtml+xml', - 'text/html', 'text/plain'] - -def gzip(mime_types=None, compress_level=9): - ''' - @param mime_types Mimetypes that middleware should compress (default: None) - @param compress_level Zlib compression level 0-9, 9 is max (default: 9) - ''' - if mime_types is None: - mime_types = ['text/xml', 'application/xml', 'application/xhtml+xml', - 'text/html', 'text/plain'] - def decorator(application): - return GzipMiddleware(application, mime_types, compress_level) - return decorator diff --git a/venv/lib/python3.7/site-packages/wsgigzip/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/wsgigzip/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index d2a1bd50d0fab1def1609f6269a2bb9d777646e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 915 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 diff --git a/venv/lib/python3.7/site-packages/wsgigzip/gzip.py b/venv/lib/python3.7/site-packages/wsgigzip/gzip.py deleted file mode 100644 index 3a4e12b..0000000 --- a/venv/lib/python3.7/site-packages/wsgigzip/gzip.py +++ /dev/null @@ -1,277 +0,0 @@ -# Copyright (c) 2005 Allan Saddi -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. -# -# $Id: gzip.py 2188 2006-12-05 22:11:45Z asaddi $ - -"""WSGI response gzipper middleware. - -This gzip middleware component differentiates itself from others in that -it (hopefully) follows the spec more closely. Namely with regard to the -application iterator and buffering. (It doesn't buffer.) See -`Middleware Handling of Block Boundaries`_. - -Of course this all comes with a price... just LOOK at this mess! :) - -The inner workings of gzip and the gzip file format were gleaned from gzip.py. - -.. _Middleware Handling of Block Boundaries: http://www.python.org/dev/peps/pep-0333/#middleware-handling-of-block-boundaries -""" - -__author__ = 'Allan Saddi ' -__version__ = '$Revision: 2188 $' - -import struct -import time -import zlib -import re - -__all__ = ['GzipMiddleware'] - -try: - long(0) - P2 = True - def next(iter): - return iter.next() -except: - P2 = False - def long(value): - return int(value) - - -def _gzip_header(): - """Returns a gzip header (with no filename).""" - # See GzipFile._write_gzip_header in gzip.py - return b'\037\213' \ - b'\010' \ - b'\0' + \ - struct.pack(' 0: - self._size += length - self._crc = zlib.crc32(data, self._crc) - out += self._compress.compress(data) - return out - - def gzip_trailer(self): - """Returns the gzip trailer.""" - # See GzipFile.close in gzip.py - return self._compress.flush() + \ - struct.pack('w&@nR7vC|n_ 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 diff --git a/venv/share/python-wheels/appdirs-1.4.3-py2.py3-none-any.whl b/venv/share/python-wheels/appdirs-1.4.3-py2.py3-none-any.whl deleted file mode 100644 index 2b196a9a441fdb9cb38a63c098704ba0349a1ba7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16543 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 diff --git a/venv/share/python-wheels/certifi-2018.8.24-py2.py3-none-any.whl b/venv/share/python-wheels/certifi-2018.8.24-py2.py3-none-any.whl deleted file mode 100644 index 70d36408a40c46531c1473f83e320319ec5180e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152671 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

    ua?3 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

    5pIrwr3*R&H;Nq@F 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�Fz{WwD@^tx02XXv;THh~4&Lr|$h&DB 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 N{~*QWLqpO5@E=MMV$lEq diff --git a/venv/share/python-wheels/chardet-3.0.4-py2.py3-none-any.whl b/venv/share/python-wheels/chardet-3.0.4-py2.py3-none-any.whl deleted file mode 100644 index 109d666cbc6864d6f1d161d350c1a4cb92b5e598..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139269 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񬽺mX^596F^m`Kn6FplJKRx++U{CIWlsjPr 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 k@9|&yKXCuj|FnBctMIamK*^_`2p=zY<>s(Mwg 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 diff --git a/venv/share/python-wheels/html5lib-1.0.1-py2.py3-none-any.whl b/venv/share/python-wheels/html5lib-1.0.1-py2.py3-none-any.whl deleted file mode 100644 index 9fed431c0352279c11207bcfd21fb34f08aed798..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117801 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

    &cnmn!Ez#KRP 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

    9QNQvT;IKt=|4!u7wBJaShjhMzB7F#2ZX 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 diff --git a/venv/share/python-wheels/idna-2.6-py2.py3-none-any.whl b/venv/share/python-wheels/idna-2.6-py2.py3-none-any.whl deleted file mode 100644 index d16c36d5d74cbba616f03a29de903c202f00f9ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60445 zcmZ^~V~{98vn@KdZQC~X*tTukwr$(C?LD?_+cS5cd+&?)z7yyD$cXNa?yRinm06W5 zE9IqtK~Mky03ZPBb)#fAoSlCzu>Rfg0RZ6rdum~9Ye36H$3|yt;p9wfVQXqfFQB3< zE~ltO=j`qr<0WHvB<^|Q;|m(chDB6aS;fQa&yX)!nb=99VnNa|xt%6Jf+->TK&*~v zT$)af-Q}eyCjK?SA+j zxu;Nian>$hx-J?9B|PX?rT*IYy^MItcV23=9NH(LX1j8Y-49jChnr^Oc^%D z#anZCqyypcB*H=O$4+UjGFN{FDud;tc4`TMemZ>E-=!9aW+KPd$ZV`KOSU9r8$%`3 za@lwz1khz;WaSu;;_IyR49skGzCbCf=EBDSKNgCktjK7SBjsAt84JMib*{#p_{o$P*=uu;j|6LMZ zQ+|>8(E)B=tBjR|GAY4OK#a+OORJ)JODI>(Cl-{8B;ou}5?+>{6XY=JOm!JLk|Ls= zI02@zo{bHba7N6Gw<<@DX_J1b88)-Fei~tWt(F-T`>r7QsYN16VJ2%PQ&cRi=hb~g z@Er(xfW6-;_=4=CUKV;$pH!suX+zcOI+x#%F%N>MPWhC;4vS-1_E?O;sHn)YhQNZ2 zYq7Rq$&lGC=GyyJ9*(PbDCBA$%nNrx*Pv{MFehRrWuW%phO*>oy4`|N2TbM+a+4ma z<%FXJA~pUx>h=WorRr?Sbh2ns+ZRxKnxN0?cb`6Pw%!C+h_ESM{01p;)zKMtx*ps-h8ln|Nc&X_*q+wry) zDCiBiQ%>o(Fl0Z()gUJ>OURdhMl!&FZk-4DsKSQ?*&%-#|HR1v*qesQT0*0kUR%|M zziPvi_uU&F;}Iz0_NcuRz!tB0E6)$RLqcC6~o4F+?1E?ENS#EYakJWZUz zG%nh^uq$x}0Gu;qu+1`T;%hD!i_EGZiW-WEZk@qVY-F>~6ql%*+3+^MREq&n^oRjJ z5n(|ZSBvxYvtnkphZkAdc>57T+Fe1tFPpz9O~I>e}1)}R?rYZWHzlTx0Ui$FQ~ zZ?m-3%H1oz9+R`YTCENld+)ul!f948R!lSKeFw1}kf zmmXB-3URfp%{Lx%lnba`wng=T#QcU*+*_$?iad`Ldv zXG6GNt8UDP2W*lzG!hmw$ED6rTpx>E!hvaH4h&{3c@k&R1$kh+$r;77&fgH-vn<9Z zre8#cPD(;2ZkFAcZ1u!{m{67CRkdRy!DA)9xR=h#zkgP2+2y%EY&K-@Ys zq|P3z*+^x(D8*#*I31Nbrz9*-rY>4_%@^}cPmDwtoW`m{iPrSgepU|t1G{#C;=>OW z6%yy-4r)>6;aSLjU|a0b3rB$;u3?4-gyN%^Q(ocRlAxG)9@5<*4ciL!^$YK7fXkSX zqKI@wZT*IJ!pWgIh8A^rHm+Z21-qNWqK(P_O!mAwq=bM0fe}2?QLh`ecl z2$YaLm}EUu&|~5wtA91OaqD?VL!2|4!SI63De!$MsW5M-qPfXe-K}5+Tn2=TYf7ER z0&dYaXTVw9S%(mcGkB$+3MWb~uf}z)?{HUI z0Ez(YT)MC{=oA!Jv#_>?yC*%c?1)6d1oyqQDILA9Y(q^oSiNW07%W6o*HrBm?zUpo zz;&savyK`LZYTX$CSWaW#|^{n3iunNqKMi|DX9XoGKp2yke&aoWZz-R7C%dKB!uC_ zrlzQ#I6!mC)?2=&h!{hwy>nqslN>rKp>5^{fh;QaVMiI}(I4PD9}=K6M3-d!afC%w zRla7*$epT4F|H-=Vy7B)6&Mw60Ce(`R#(2R5NQYZyq)N~-KZR*Zr^5c2)^HS%pHrVZozEV{2k+Bpdgn*$C)qXj>z@7>k!$<8u}cM~?Yv0PwSHyjfzm&)i< zku|chw{p?2RCfPF$yh)2hJc>gq2LuK2MoS!?`tb9DTMM_m0e&T>MnYR{fi$4)L1+E zs0eJ|1$(sTY;}_@%Z27kSDmS5mtOH8f@UynjRl2A9yyFl7lDCFdulAO4vHgYZ!UqVMV!g#FV;*-S4Zem&F^Qx*bIoc*Ymrj+#0lbQqgq zAA+P=OVD14_m~=L^LoEzvMfH%B>NTOZ7+RRYm1Q1X3?T9z1%Qr6XS5K_Tp4_nlccd z(TW!hO_W+z;|+@_h;kmzsIX*OuetH_6yc2LtngkOBQAR>8q= zMoa0n<3#aJ2wm@2Ktx(Xf^w&S6aLaQoXg@_bOZi(@mA6vk__$s$bO@I*s&lyQ)C=s|VwUu!Jf zUhkLfN44Ev_xG4NIf#|>uub^2_He_D&SBy@UGG;J-LH`;GdW%mC+bliPvC(P_&H7R zOAGlKMEF_VYW#Y&0tzMv9mbtun{%9z(vR!9nLC8X+t?kBHW;YB_vyM=WV z*p=3DF7y0v!Vptm2`6A7n(})|n_*x|Z^PSzr<=CEkKE10f6LsTE5*|91}g*NCPE%* zkgqH0iQZso`m{>ma63+PJR(x32q53QKF|9vgJ+qt4M}E+*Qu;85O$p;)vI&v)cYw|;u!T2M- z;8&h=3W7R-Wf|S3@h#!);Eyxr)~-3AH)iVna~bN4Qcfa-lVgN2wnG!!i zh0OIwHS3FXEIySn8e}l!9D(viip3vch@jcTSOgk|gfqg<#w@jnibJiXQhy%{@7*OH z!d$cwNw3No$Du;KB^F9JEPHQ|gjmY4meiFx5X-Vb$Kh9GW`D~7K8NwqnBDtSk;8$} z;p7Y~$1svmV>^|r9mGr=jhI(V$7-k@8mk-zM{JaSFnm1M%Crp8o{5RtphmihfU%{2 zgHi0SWocBfWd4L?1lUW0T~3XajtjCY=fZ?2Jq9>SN8X-W4@p_znC754W&4Ry3FImA zQkT39q$`+rv8WT{0hnmHwG8lSLo@AH>4X#4Z2@87)Kem(s?aAG7Fj)-C)WJf zBmkW97MLZzOTk_mE3OeT84$H-?w|x3@hP5}^HTt$;dCsu0m)8(&k7UAM4pcMlyOd) zjZ(m!BAqGTCMZvsQWIP}t4>X?ZaSlhXFyx4%8>XGm;ePy3lvV}YcCwMr-3FIMR-U4 zG&3{w8C`y|3FrPQx_pod7aFnzw22baU7=h-Zfs0;filTK@^E#Ht|N#18J<+aD(aaB zFUbXx;GmD%vSK>sTGWo{Z8Tbt>NA_J1n2t~r*cqBXB{r}Z?jFshs{CFlVC* z+oN~FMN%@V%f*>BN?58fSB#f^b#bmR+L6O69r9{lqf9}dz6~ttrzo@8+-Wt&ev zGd?3H_1^w>tPd|!Ws2V%I>W1rIs@CW{VUjd2D-=YqItn(wk{4|&%g>n1)@b@-yn?c zZ12tO_2V6n6F`oYj)R$NBFT=bJp!ztpYq}jY|68uEIED13O1a`D-`f zg(tTS*|qM|F7D+z8XK%z*yX|K6b6fpC)XW55SmT{Pi0vPLup!;j!~_G!6be_#Nq5I zQ0R`7eLNb)N9B^Hc}$)mzfY|x6|f8x0;N&{g8?hD(^TiDyzyzqAof4MaH!vX8=Wv0 z5O9$fP8@oGk9e6;6+j{o-6lCSHwP=P1BSimuNrVE2NELe)OpRW24h}Px2&p6p5T2w z1wzu6EfG^pStVpUMly3Uy5Uv!}~G%gxey7Gg~ z>t2ST`zEm9K6RwxErO%egveQye`oC5=IB8)4TJ99(Ae5`=(@aMQ0FTgx|M-ru6s1s zdVSXl{4w-Z3dH8@uO-N_HuOT+KmB#USQj7fjMtTLwc3bHWptVBAjI55Mrh%!ZMd_R zc4JeXLT8Sy(qk10kai`w` zWIctY?#?!)q4a|KyHg!|H^4*>Y%G;ixVz4wbO}QSnmRI=+7^w_Er}(|YVa@*8wzGp zu^jq#T6h?9=W5itZ9Qud894Y>)EJwK;~xuvT_WN;qztfWmVs9{-O?D%$Z9i_CD4WkK4)gfk zUwb1s@;O;lNe(0I&`HTj`18yY^;V$I^;Q~q7PoL4u5|8i@2xN?%oE9`9pLm+dxG=J z=V=S6yltyEib-Yk9voGg#x4xAA^5%$#Am>bJE?~N z{sw#>k=n7lp)NZ&xMvH@{%#A9-T16(P_vC%YmDaWs4;QXaSOkhM4LAcO8<2WS9el) zHcKR2#31sCv zZ@SlvDe}p@9S@IuvC@!g296fQ$D`8UXh6=E_vG~+_Y?Cjlh{dK$letv zHT&0W#U!k1)~2rIYFmeJ40xuxOsZ~jX6^} z0yFLoM<)iR(ya}Z|buB_a zq`k%-1^+8QXWfuYGHH9j?|yzesAsS_ZvF%jNmhztqL4hx+h4H zHvW50aTw|$DElxvIS~n-bBE9001<Nt0DlCtTEWT{ zJ<~8!PZC0v!SEQ6mF%?@Pvo!E2U8VLVV1cB4II0!h|4jt5r;15Z{4xK+deYW_};&0 zONeik@D$B~V0mW*Ne0QEIxv_0gmha(?#1lPCvbP8IS}oxK|g@ummC-F7FF zeuyZXWbGWvFr}v1=GDVKf9$V=YkLoBEHg^c(VPgK>mXNRr#EBvHidswQnX6eWWV)u zb@p~L^vUi=*CQ#@9iJ&&l8ct6^mtaG2gX;|OmTQ`@9cS!PvVDSw?l>H+3wD6wyWp+ zd#IO-@55DylC@#|sc2*R;GmVB5@(w;&ss>C`&tNFYDnFJ(01SIZ~HW_wQbEfE?e#{ zVYw5XFY7U;*z0hiJoB*1z>AXV9;d^HmSo$&Yrc91v?oTSi1|86C>&*U4kC5Hc{e>|hkh(Pp(Ljhk~-c%qQWt%N^L zoES`e1XHTV_bQKBr}-C|7ibO&4;Sxf2o!>oS%C9Fjs^Dl1Fl?>U|c+P%|Nzgrq-EDm#4?&4yFMNJLy6jDSv&( z!z>h(X}apvXm|4`zvP^Y&J&A)W%tSVM`c<}WnaKLh`Hog^TE@2IE2Bq^`}UJd&lHY zN_tewTm$@5wS*FsW0X%RBuT~_?Fno7NE{fUtg{lF&g(HgBmkyYq9r<(4+|{ME_O?y zQXkp9mz<%mEV%MyQYzz0ec^GI^!fBx_G8hxGAOt#?HOea`q%djy=l0l$=YIU1>kHE zGkKpJM!p=QYp3obQg}N!wyv`TQ`zm_yg1xBvLKbl9qbpoGQkc+)SJX$6AjnpqhWVJ zFJ!evRm^(-*#lAMTrOqQkc|FF%ACXMG!VLPe*B~ETuEZ{wQ2ETCJRs)!snQe5!_sY z#uHtd%QrP?MpD}=KKxDvtMh{R&Fj4i#Ujn?*@`MKKgxa?WAwz$)dqtze4pIk6L_&S zu|$W0!DBV&FktVJc;^5p`p=1|kAPG8a{fmiFpx@*pM&=(wa>$^0m1MhYUM@(B%C*& zC)t~JirE${(_O-!^7jIL=k^r6;J9gbR+CDIKDq9}xR8Wx*TEQHbxq%o^R9gXmfu57 zyLSt8!(YYN0l2nn_23k&xPzZJ_Aep>Y#n{jUtDg^)m00@Ho z|5nMQC4@v|l|=rlN~WVEXSczC(s!!F_I=7epOITzc=n_s|CL-U@cnj8+54t(9gtxBQD$mylBOWBMaTjzt9W7K-_yN zXzaO;QvhYvESQ)hig63GuMiCyf>qw>+E5(_kExm^Uksy)$K(8CRKPl4-A!ovnj~&i z31=N=4YrfJXDDHX`#R&Kwy?=z|m2by9 zf;ICw^T8I2CAIYF)GsBM)^ZLR!r9x2*nQ4rSbyd<`Eg^LDUf2GFE~_FDDk?`xp+#V zKEKcNLSd0fSvxdIHlkMwH!OGvzUp!lI4|F5M??CsTNIwEb-iuJY|>HN=LT4#OFIV? z`dYJ->#bGr+7nS5Qb4z&c`oBi|?$0_!W8m371oJt8-7%Vt}p74NT zT0Q(o6I#=sw=N1SOObksJ5E~f4bCr|JBs+LL7|&UfEwqn2K|}NRiet zo(84zmU-$KTS)=>1qv@;tDY*O*v1d}E@j-Hbl_29K-!dicpNB}p&u2kSHhs2$k-4| zXkzv9mpoY*4V1;zsZHnp9O@av7m3yw&wxDQZ_A)jG-b*U_;zICSbs7_MSMx3xSR`- zpe#xF)O$)uWvCqX03w&2Ac>5g0~=0iJKA@0AQF1008@cF7e8U zC<_P+C<|hIR=#4sPdM&(xZK zP{jlkiqv|o5>do|f|)B7|M8>y0-B^A{xd&z<~H+}Cau|8N+3Q83QW+^Y$kj6*4v2< zUYS-&W9lcYvT*}t^FY*_mn*qr1C5K;cP4E) zh0weV^{rkhHAB`t1hwkZD~#J}{*z4YTQQcvOMA6sTUQVN+;a=&VEE`VDQ>}q&#|mx ztaJnI)rIcmC_{DScS((dcoPjd=a(Y`b(Afou%^Mf5ICoNQ1D^&Xokh3?{KqIx({EbJ8?|L2NZ3U!JkS=#e#D5)S+Po(#LEzoN>b?0?X!O z^UyyiYU+}C6fU)$hc(nU?H8IfQ== zU2gB(uMc>~Ox5K~O3;`*vKr0gC!kE0IX?lJxRhQD1>!7o&ND9hYU%VRc3$dDJHv?_zEr7Z5x!Edi4wc2)j>3qfQL0BqdCakMf zc%x-lHSt$HT6JNOHJwhM(j1(bRyal*nfl>OtQ=166w(QQx%jKaElNO-mNT2HmgH4X zWouzsB6{E7;EQwH8yXxwv*La+#AMw^8!{j>G=v6coFjW$55vVmWTh*IBP2)PD42oD zh*DIj*xEejE!<}o++=hIv4JCZqaWxMAm|t9)wkN0t!+!r5V~~Lva~L(>lP)*T1ZbN z&I&MZ^`$c=gdIdf&iaW6(j^G-_(0-^XcC-s_dBYI30SQ&fbKndW_hriUrS$y^D9Cq z8#NfRzHu{Xt|9$ZN)Ytg6Rsccoe|NiaOShJ?CiSf3Y)>uY6ph97Ko<8WD?qwO9C6X z=pA}Js}sS@Y{V3BpdXa{;xmi`6DiCf^%;=fyol8ullpc#oW%6GL!!DgKCyd;uLxQ? zAHL3SbNRm)ALaP`exB&>AIthYekOMF_`k0wvFh-udFVcTQlv}IO&?T|7Td@tjv{dC zninP|(VwZNq*IdK7i6qtuSU%1*6j}$*jVb=4jS3Qr8e#)kzB!?=C_7@7%{!UV-E)vlGMrKaq{XQ4*p_KlOnb5! zts<`1!=1NkO;{CMw7wfh5CJKX_@_7=v|4&Dz%K5T&RE8RbJH_KNg5Ggt0`PO1T^7_ zal68Q{8gJBw+gs3#^joVV%y&h5H5Klh#^SN(gc)>F?oztwvz`HDpzx^sIy#$k7;n~ zK^&BnWO#6bkD}T@`hy2mpD_f4Oh(u@!70|y5<+4V+*ZAU`I{08>I=YmS3aMXNH5MQ zrMP%qI790mHS;W)v}950X^&NrP?xk32SXcTTmv}}C5Dlby~XkT-(>ldfKxOUt`y$1 zDFaDP_uqc8*n9)7CXS<%624>>kPx{5ykg_>>CXa;k~Tb4Mas&mLF@#@wX@nuW^}_9 zWS5XyS*TC_cz;*l`Dglgeox=g@88w*em}l;_541b$xrq6!s=%Fv@LX`n7WB4z}wi5 zIC|*BEUx-wMuXOi-^`uborfo@)asgjZ*cCgN(#-}WLTz9x&BBZH3?u!l8}}ZOL0(f zZ{Jfdbnk=TQ7$|@DSz0_^PE4+qeQyk2(w8+ zVeQZ)brHU7X1Ekk2^x~>VJgKa6A+YTOw%37dtzOmRk(LkTN9XTsF(z6I~< z8wS#he(qUIc>gy*pe_E-I^se%R3{hIg_i%7HlSzmoU+OAH!-DsN@!gU{YKB-t-49c zIO~mRiz6jKW5g2#$oEO$+*%9Hvw9#&;W|O}YuovpR?4k?JSuV{x)&W#Se#B#YUf6g6~<^sO;WR`_ecWahz{mARW#6ktdsI6q`$)W4 zQFIK4#wIrEij$cwm1xtQ7Y*9Os*;}4c>)=&uCR1iF`r2s{uK@mL|*;a?X9;xNo-xj zvRPgYqx##E(Rk@&8Cj=2ajSaQ3i2XjzT8H>$lP<_CN8P-(g3R-Wo~Z8Q=)~}VI$?n zbodUCt8-#8vb`1Okp|ORdg1SNl3Ro@mU0zt7MT>Tny18Y1_XJd1KjB+y*E(2Dq>2l zORgq>Yot%9C{qTc9RL3Pp1`lv&K_7W*g_|z<}#xvDz`c~?st1AAwK(+ucWwmQ3Pum z4SImpa1}q%dx)b`j6d(q)sB=6>7?RZJesJZUldqBlW?XcE#p}5w#q{`YFdIIFPZAJ zM9N$2pc2HUF)Lsr`RDZ+;FDRwV|T2Lzis#FCW&GEfSrxOdov~rSJkJmkS@<8JSTQGkv83z6RAn%HD(;lbIO41qQCAFH}7&5&i77WH)F#70P{eJnMH zjl~KclZP>}kW8@c^nBs@p0Nljou^Lr8C+*^6_wqQ{%`mjX!bGROCS}?|-^7h@KOrVK04cJ^+Rqx_<7-KO*o%Ce&4# zAaT_@rTxly{VKc$7*qvjY9uyX!B{RY5J8%@0+Gg=K=tav@NaOgZfklD?V8YY$Lcuo zR&}PjPFunf+LQz^pv;0zCujD)f5fM~T=DU8w?5w|h9Kac^86-=x$>}^3kG%~k-808 z9E4ba%%I0KGuuY36r9mXmv&%Zn{iOVCUVw7?#C7=Na~R{4m4(f@=7Y;WE!)ORuCKu zJd?-{yT_w5Sk6*e8jL?MJP?va2Ca1vak|Qi?*wxdMcBT2g=0xz89?B$K#8KXAO%ZI zjy6}mHg;V#yapg;%O$x1{PX^ybJn?lh+Rj(`Q3D=h$zrdUwZHQsXvA`v=U6KtY9UB z=3-@1-Y6hsmh)qfA!u(vj0SbUEWp^@6Sp|5sdi$#Uo)C?S-&KCPYb?YL_?df?%ms1 z=iaw1?%VGe58yCBM zCKeMo6A{E;%(wiHV_lYmOtDK?^N<6g2C_xWqz z>gPu4TU);Un;Scxf!ocF{Jh$W8|HMp!X~*b@UH|&J}-z_(DZKR?9t$(y*8&Wpnboh}{P60~G^+hL5m5hMkXXiKZVpvuFHe5L^G4tyDI z=0=Z}qrlVMxx;iTy2`7hgzIow)Wf@ZrdX26qrp=aixr>3zXM7l(7cpac#ryFyG(Ok zjI6iSl1NGo zri$>u8vYmUGr5RnYkhCi64P;?5hut)zjp$4vc4dGXcKSS+L|mY=(@$--poW#{QsF@ zDSZy+B>bZXApg+=nE!Kzr6?jKrzmW*AQ4w6j}p4?^Nm)YPEX_MV1fdza3nYpnx7_- zVT^FM>ZYcaksg`V?2}tx-_1=7L|Joq3b=>m#!3ZxR|7{1t-P;ub(wgg*JdX{9_?a>^G9nbZy8Y zOyX0hU#1kVk163vVS@ZD7cFEOT^ujCu6pwQ#yM?rNsNC4*f~u?+}_2Q|G*6I2!{wW z#gokD%k)Gs;p4qlv(nwg|GCyN1Wy!NiEBXU^v9LugPfsTm>@UF0I=vmtSLTGz+b=G4--6_p{V%v?0^=0rxzmfTx1 zog*$Lg=u^HZ<2ju4P<7bZe!|&AZX{Efo1?yY%-zhjXtM!HSROfGUx!xOtLiU$+I^6 zhN-QReLaLip>AexK_xys1C9*rW*GGNx`m@iOFjK~_xf5dDfai7IHiX)NV8K2-1p|L zR9#(GeYl;&J&xawSjAGsHgwK6j3w>iO~CqEB)Kj{pkE1Br8PH{ zK=(K3f8toWG}%+{AAW8B3C917V>NLR5ozdIahd6PSSebnnZL75iVRE4dyaC`QnZpZ z6ZDOW;*t|IbP@F66$*0CxGHNKsGDs?1S~OV7wk%f-k^&`2nc|D_$L zr&0)yqyInijEXyz1g?^tp_dGquyg?YZv#AvFP&on0{|St008{sTK@MrdU_)}V-ur) z+K<(w>=yqZ^nR+*+zhl@R-=%>C3sWVzyl5hR36MJ&#&N-N3nIS@F_zb^flED$F+;# zXe#UrWnXzSKTf-!K9(YSM@2?L|1sWlEI_D_T#YZn`odN6hGr4t+Co3glcNvbBZ7iM zQ=QnR2UKWYh+bP(nNHEpm@Cm>lW3(ah`%`UtT1b0uV1p8wyDT61$%kio{&itQ4ncJ zKKm;w<8w9mJ$|AP{8vQ?S-cd<+$h~J#0exdi3Yg>q(Zq-XfujsAW}EQ96bGY`UNRn z{LE77kebZJiaKzEy9m~lmDD;W^?r7}&IAV?7G0}a5ubYs3=&fN&nqYxyGM}s?n57!>#0^*|ZA=tpc$Qpp>T94jQ&q>t^=?16c|Sx9+`N zzgQ_yg}+J1VGTCOoc`S&Eva?j1!s?3h+cMIfLd296a;oNH(AppLo@bvPJCkiR3GXN zh-cU7gSpuNlcLJ$3V>0}bejDg&*`B4+ z8|JA|xnWWMqjN{Rv@?=S&6dTZA(y{#bKtgTTZkP+4itBGYvIt*(er~@9r z=)8A`wF0%Wg;32z`6?1YCP6h#QdfESdBs_eAKWGn{}I!=gYa2UEYSK>mSz?uvd8Sd zhCmk35M8)VZ48TJL_;ljV4Ybw0-|Z^_rmpp161}49g}=$T}pk1KYxlnex-0gS!9K$L{5@oi(%@Xxq;f@RD1|!xJYn=u-^HBkm2JRtxM_ z>t@oIU=(gIL-mRK7*F#7`=9a0J0R6Q?w|9V{S&zV*NJTG4V?dZkxn!>+#mx2=x4TJ z%A|aLIMlqzpM5e|dw+yJ@l@-&mi4VX;m8rQsdW!#C^0S=8UlRgsD)lE_7etg{bPoO zpv}(_P2>;s!5i&)N1z;1#09Q3z7b!tUlG4A(x2NhJ|gJGjL3~o$fbsjbYP;y!EIr6 zX`4D7sj*Vd1S9EWbqiH|)jneiXli(zi;`ck|1=$v?!%!O3IM>D1_0n+2>5^e-_his z;mev@cAFe%zOQxqJ@AbRoAw98O|TcB8!YRtY)Nz*&J1fy4CWb;oC&0~l&lkIkGrpT zWC?{wQf8-(Kty6F9y4yWJS3Kr=-Uuf2Wla<`{GkyMT#L z_nd&iE_At`Fy8OprB^+ZJ&Zs2@WI4)s3j4bkBHB;iqX^Y0x%W*1uwRPM5a>GTt=!yE_aPwq8zzHE&NxJpI(-{GjrLvncaLgFKKqDxGtHTK^?p-v8_f93g zf>S~EX`)0}BA$p$1UE`?eA+vJBGdO7!itG0Ax$M);#H`ui6oxRE)WrnefC>PDA|Gq zKroHPQq4`Gfnhf(bI#Cjlw$$xSMo8T0wXh#?urKS7QKKR1H6KYnR1MhA+#HZF*$@IGl5 z02(&;gc$w|R8f2M!JX9F$Ig_z=d?xdc^z61xu|bDG$zWFXu02%bXS}ZpOrWDWss1k zhkt+xMVY6{)3}ikHkj>Hl?QzvT&)2y8z2{qSgFo`Ey+dz1 z{M}>iM|-=9?^o_+StaoFWPXq8Spjndg18nQDUmVX<-+%O(LlOT8?&Az23y`GgWM%! z^H?SELts_kn*PZ$_S3pFxiLxp7*}Rb&eflucFA8oYt>P-FRoqNjuzA1XIs6>sWF_V zshkBKL9NIx`%pM==TA+wA+cy6ncZvPWu0FYB6{gJz}h}Be<AXy8T zj(0i}x#hp5X&M2vt|6NP-6U>>j)~<1b<}&ETeTOI*TXjPt8$n$aA@Z}dR>z0V`k(~ zC^R%~g_=gT^bROCn0m;qi7JDTd#revPdcia9|i=aV#_Q%Og7veQ|GF5TaGYR76gE< z%TNpAuH{4#gEe4M!r{YD{PnKwy*%J*t1WDAm0x!J;qr+7e6_5!G(F!)xpN+SbTm(v zS7yw9K^rjj3|fEk1do&(2oyU5UmtxTyDyl84#y7fIe45-9M52*g6}nW3wxGxh5%sa z=eu{&g|%GCu#nVxfKb#tZ>QymoD>SMJB}^^+xF)HD*Ae*UQU%AmL4TL(3&^j&ti|z zJh|#f*$`Grijpz6Kz#Hd3}7;s9944y#{&|FRRCJrziwsb?8HMAJ?TLsrBv2i3xcJ} zUg==Xrd`uz^Md%QTn>ISbosv|dsd#(cG|+GE@lzvu3uE2#ihXcBZ^g#FqN}xZ!W&~ zs+sWU`?#B0SVZYdN_92q*mxe2SMrI4?6D>-2Cwh8uJ5n89!b-^-8@y>nxb?M99&gn zv4Z9|W*ifQB%a(v$9q&{Zo;lvGQ%zYTJhc^c;$A$F3KBtN)eFZ!GW@3icK+-_XKNn zTs_0U-s&qOhUc7^ugm{!3GuVBV{nHaa0)}lc?uD|u=@q%yy$(t*2-ov$p!W{{o=?8 zw3?;T>CT=QMgOb<>J&>1-5F3O8C^URp=M!E@meeoKw}k%f(v4^31s^wGglQLUH2eG zJ(lk{;eedViP(9dB#%!UhBt-bUw=$ok5B9?LRH9W6TyT1wM30q@rGjGR*cZGW@>;e zN^_&SU9RM>YS6{is?)UmmTkc%cCvZ2jV9HjyHUm+}!}8PouV!CH!K0JB_QW z-RXfmVI6xtkl~tdW8(Dl^KrUgoPNc_HX~ip9`lSXfmwF!M)b~u!kuER&bL;@XpvDU zIIkO9-YMT$U>|%UwNn7-z_$IB(&^rnLO-ut5LtiFsw(O|o{z4AD~BVB0fE3i4e+nd zubLtFs|m?Yl9A2Zat!bE7UUsb!TQcAG_11bOr0}6Susf-^HGsFJ)NnJJ@_#WdnweW zCggT0GNo1b-ImQ{b6k^}?U7l?A#?NPp^J2`E|_7oQOr|a!%=?754~Iqdh7Bp)}VGw zG>k%d@?MuI$!(hoyCkkYE${;Q)s{T81+`w-wcT9#08a~g>do)@WZniWW}o_hzF*_D zZWbPjrk%ZQi7YkdcIhxDe$r@L*FR}9H_Pm_8K%~{|8{)p$ z?#~(TXXi>Cw+} zOh(eIQ6~J%gvW%#gQxB4+x2Kyv=QoXAe}>iINa7LTA*8PJ*pd(mFzLBU*SS zAF3D9DVRY1akxYx%~qqY9v3We)yeJWSal=uO67w{1)Hd0m8Ai$Ec-VBXR7II`uSsa z7UJh7gsi2WL;?^w5o7<(-;2RYO&Vhys=Wk{0a%27XRS+sN6BcR_kytPOLtpK@kNrU z@dz%uK3QZtp9SV>)ACOvbe2O2V!E!?EL#srOD`$Eyar^}R!8o4b7)|tD1VLJ*#?}0 zcj=8S4_fG4EKET8_(U3O1pX`1Qg9b~z!pcG5o^>DplhjONPghK+s^Cdlxqs&XbiWn9u1JZI7pp)Na1GTw~4 zfWQ0(wTdf$K!ZK%6SHkC{yM@|arGKiA|p=9nBGhtZPT8jMGRb9mFe38I}tv+bT;w1 zWpL)T+!3M4v^fn)N$6$Opm61mpipflxJL|= zZLv9GnjdNV4sbvn**eL&Tx?#Le-K1^;S04;UB)OY^$@Y;g`CgL>3XP}f9)IO%i~=A zUNl#eg0+6SO8rUir<@#rFAD581g`z@3jT9HO(+ji%Z#Rr@`e7NyIZ5~4@7tz0Dx2f z|4;h-U#;TC2F?cmcDN-vQgvjUircSs6a$8T0tvrc#S8-g?ooyegV$OH>k86Ky_U9l zM9qJ=dsk0)DxEw%84HUOkH>GhW*dl!2WRRZ;rYJ~cKLi?4g9_=eK<ig-d~gcb(YoWeIJ?O|D3gaJlwwL$>*;66%6we zIs~>it`X>x)ZRy089Icv*S8C9Y48x_(&(yL=MJOQx;MD%ae>dC8nS;=Co8%BYjZhX zZ{j(8)$rYYO@X(?Z*$o+N$rAqH|!X@E&Ad+cvbMtyZclY*&$$0a2pRBCqLTwIc|v> zr@q-lp8CAb;}zy3$V)hWl%aDcyR$x@-4rNGeqrBO|8(kbbMuyys64@Yt;{H^W{St~ zKi?JIi?h2=>T9Vx#=O6L3Dk@6d|&!Z`Pa}^0Q*xyf_$gE-00-GYCM{M5{QHotK_*=BcTlRvCHjaLjb=+1Y zcP@fQkoGz1eSD5si{ICxx3O9(`W}JtHk$fq@i-ZSpY~IDaQaKR9^12t`ODG!%#SmB zU$yIEHB`f{b!xV&#obyBSW54n@CnJuU$LKgO%Bp(d^*tU(>yiwa8TP#Tk_@qKyKRi zeX!g2{`Ndp=l6d6+V}qaarBY<%Ng@~HI(J$S;1B7SqoMxTB};?TKVBrq|LALF8XsU z`lG~Z&+5qP!0I#=Qm5Lx@m6`iJhMEoJh42oEJGU>Ruxjf7YONlti()|Mozn&r4UbsRVDYE! z9%x$rfW*P#i+8F-c_T(D?h!Q6iaSgtJYtDi-IhAXI)pkII=VVLW>x1b3tznOqwTiN zZLFQ}{**i&k@xJo%m1Lk=3wLb9bR zZy?~>{S&a;3-0jJz?-OS5^PrSq0a4fKk(e$6M{f*cLCsX%nzWjink-iw_YT$%whuN7 zQ%K+(`vDcq`jcL~m)D`Csii@sWAhvxmR^bX58djijBt)YZ<;Zv)b9sl0aOlq!@OM0R8+Uy#^b4FT=Dm>SK`#T;}x`~oPO>Izi0R# zpo6>PR#GQ&dz5DK_rE5~u@%RS(!|n8Uu&;=Cl`AcM;C`g8E=zA-9-=ehPA|UH`&;< z&mD|&kIHw7`enC!s#;t>2nN)nmT3o%6SrHoirQ{1P>GsBo8zX{G;bX<=Q1z^VbUa^7#rn@;jP|0)5e* z1@GWCi2oN5(<{|175ah^5r%r>(AGtdw8MSm8(!`=8N zAZ{3(m0XqPmEe`)mDB|Z&pt}OsQ-SUdD1U0Liq&De@VOY zjeoYAev!T7*Z>ClVm|*1NIT=$u71YPd9d##<&GHh#c0!4=Km>Kt^T5XVdk>%0`y_(NIjefdVwAu z83)yGR^77N^`D3NUqMza;7Ca&{Acd&&YwyW`z z;37s&JdP8>&0qx*;>{Zo|7@hlepsd=)gZ`o<8%KMM?oDCS1Dw=C^V;&dD&d9&vNHs zU+_rZMC_Lg>0jnl{dsT$f!lT(V}rrLu>MYI`6B(oBL!29usCxS3tswYAdg#&7; zoZQ7t%k|=xH*TgY@0(b*Cc4Jon=-uNpn7bAS_yK% zUEd{84JJ@kf9D2iE2rxsq3dF8sQYyQXKn#1lD@23eV$02FdVXqxeL)R5t8)fI{{x565xFjVIzTzS++dvEkb%jTEsT5VM4GW)Vi@BCIpxKw5;>& zcE$Jo5^Amzg^*$0pzJPsA6J}#ILzGD9t{S{&QD3(=c7$CpN&-g6(G`6 z`@37HlX1ew%q6gG_Q*tk83VKSu)0%~^=sZ278Xo+E` z{B3mVdvPT*Kwm&V=I4nh(fn;LrHhaR9&xGvpg%Y8h)Uqe#9-8H|KDWj)b3yzDaB-L zocRBU89eI*eTx40CCZzpf&5Ow@-OTKJvu~3rXkir;ZHCr7$qLF#Wi#e??GOh%_%%3QgzMsvD(?xT076-kjuF|{H#IDVu32w_#ZtUtG0 z@s1MJig;lOPUEp_j<0J8uHgo9j<2d7wd&?;xwl_EYFjm#HN-X{CZzIG6@IwGsO$(% zj#_NqT1YX6;|xCfwOEt~S?=19qMgVLKG#8HhzFT?JG!FXb}>Vb(^!RSrpSOpY9If|D1|ZP6#n-km@$H>N2=VPN8v+;n(m2dTpqFCb z9ES)19J2}0&Bfo=k-0947_Gpr3^buMaXm+cbdn7MfBL0)3mvokKW|H zUCD6hJ?(q7oY08T`vzaprB53tPv6&m^v%9aWCufspr+~tk`p>2wA%6>x~(Q-40&fd z&w0+D)otDka?W(8RN-fU*eAI_VCaz>DM-$^6LZ6j^f3dz6LaxY@gkY=eJCqw4n`#y?j;x-ZKU$5q=huGMKtKjiG9k6 zfj^`+e@OMHP@Jn!7?#9+DT(`}D#@cNnNmWYSwb$OiXpFxQAiV7M1$~uQ?79?-L{#G z)Ep2@^{biZ>y#~PtQ@=M5zLTp7GdIil;Ya)P?^{J!ficMG8;B-bCgN zels*DxMPF%iA)CICjs#7*6rYT@FolJJ~s@EenT1k7Ksa`eTxQ%6YzErtsJ;vakPg& z(@`yKmnS?%h;+KN(Av;AK67-i1cl-H3HH&(x)|l#Qs%_wvg&R~TeszRs+C zrv2>dw|LG|U$_mY1h?D+1mPlGrm_PDxXr<4@jTi!-eESFldTklvpK8G31EN6L05DB zx$Yl2*h*nIz@b6#+Z(f*J6BaR!lS9~3GRiQfDD%^VK~oqZ6P=St#)wDaKruE@`Ex} zLakZNQjeBxz;gH7)7izhuI8#{fCWQ1fPB9v453=XTa!bt29d!~iVPIJ!SM8n+MiJt zW_BwQ!da|Dgeh4Qm!nak#vCVtZQp+n*a-V_TUno?IU)aK0vuSg0SW~(*l>Q;71a*7 zzWX&XP$z5zusZS^cssWM8A(`Hz17?VXLV%X*a<#@S+#MraC*qmDjGT;cC~w)Q2(y^ri4p_4Nk?WijhcRyt{-e`+LCgx*s8d^%*Skn!)w^ zPhSEuP9UYMj7on4a=)FAef|; zS!0f{Yc5hI*f{d_1wP2AWg%RrmhoX8u(&^Yl72O)G3lipFssR2-_8XeW!j!I2}Wd# zCylRD6|#o+qQ}08alXscc>BH0n8gr@a?;>T?J~7(i8%)?K3R3Q>BjQ{X%68g{@QpG z=5SjzJk&^mQvMQmY;04)VuK)~-zfC#QIm&TWAh6Re?QXsaLEdLAyl~hh*rJ8iiR~B z3r1Ng!&^r+;pMi9=5+&{)`%dA;eM-VB&+D~c_Q37BHT(|291#Z@CYP_(M@yj4V&lB zz13BljT-W2xxY27<#CRNKVNHVlxbVbS4mva=^<%XQH5VaW3FOCa^bjzgi=i0c(7Lr z3(RMZ+mUk+jO~J#W_MZ!k8HwLvpPE1MRjs87qWM%ILXT( zzW1xF+%J)w%n9k9^v<=xVeKvX(C{+cBE1jEt{6+PDs0gS?-(uQJ2r3QZm%+-sHp{? z<$C3)QxgckaPM7yG5&e?;TXA&B|qbeMtYMx>KRE=iQEBNKPH`5 zrcc+L)OWNlA@6MST94r}&-LK;W9L}r^US$tra321H3Oq$L_lVOIP;b*^mdpL4-A5m zBXoK%%So8AG|s*-I*20gspm=O1VxVeI2$O1%N6yJ&JoM7Svgi&%4Z!#MsC>SE)(J7 zu)O_Q5f;}&j@0vp=Nz&80Kr;#3k`yT#)8wh!%N%V8!3!WbIfwo7x>mKl+-C-kUXS_ zDq+)QF>cR@X4v$a?Z2RVNF^CL{7NO)G;;Z+8K)z%A0SCtxY{^5QBsHcXdt`Ip~6LR z`{Ma6#~9j(-AT%}2qv^*t zTkB!!KJTLa-Yd=$mFdn&EEvc8ClsXgF+RO0fp*8Ad+xZwtJeHU^&dHJy*rZb$V4`Z z68icdqYe||n!gZkP*b>^ckFN%Y%{FQ>l7ty_v6oIDAnLr3iB4^Gp+?yC-X=r0oIeB zkVYXptqnBZ-u3I#!GUUm47t{E0ks5YqnGvI1H-o+Km7(KI#f_iw4wWYawPKTo6aL+ z4Wc^}+TM#UM$h+2a6UhmcfRVove4~cVtDI8-UU#0K>4D9An#1_dJ(%ACr=T(h@ts2 z^C%{Nz9L_U=Z|+}XX4$&U-=QA;X#hhXJK8$Fuu?})%>(joeRA%t##yYb&UaDb!$n7U`>* z&qiHC6Tj-;NS7glY79SjS1>Fxf!Xj*y^zDCqf`x;JCk31G+m6(R@m#wHkhRloeTFc zfX=XW#x8wmUr3*GD9%&*Gt_Q=KVSG~NRaZG{CbwZFI4AP z+8p#V^&L}|7IT&s=ADUN73JBe;u(^7H)E=AIRdB!Xad=3`$e;>5}=23c9@h518UiO zr98k?>nqg&rX2g8mbyA&USNGv^~+E|%Bv3jAw1s;KOk6JB63TqOUE}{jlD71EJPbV5&NR-v`>l*L&95=IAnnsR zg_`@4#aG{D_S6cH=PB^=-{@H4r0|6@FlZcGzwaRCIN>fh0Z7K+#;Omc4WV2xTtIT2 zs=SA}rFR74GiE5A>3efh*wwtpK31_P$|a1_=FuC@WDai=(EIy^DE4HaSE!dh*C2h- z+yClZUrZ3nUD~=`7bEfbyF2p%b8v_M;bhP7&(hX8);YTEy6pUcen4pONI>v;IffAvLtM)=d)$5BnExQkzx@5+Mqg?c8x!#tzv&hq0&c!maPo|&yr`t!f>#R0v) zt6iV$%7XEQeWtr(IWz0d`q~LU0qEo`IHOrt-MPhXD>*A!r%0V>_E*Q&`^!=dQirLe zX`}ffN#jz{1%&o}<1<`6@z*eTwVo;O@K0K|ZzYZ=;@tI59aVm7~5h{1;MqSew&j9ru4ItGbAAs)J!}szP|_ z{trRH(xlgG5}rW^bLXzRGxKN8++%Sq;kIfSsE04iLbYo3Rp2bllDgJ+RV2}H(w<4Q zDcV+CQ*(?OQiU%JLjg4Vu zhBWzGdrvdKWA!#(-91QWsr$KT!ri2ZkHk!GVZlRc@x9BSNmwTFaU1a->%<_Z3tV%) z3 zTq~EZwpO#k>W9h>Ilp0Aas8kBt?F)-4)hJoO9{H&q20_&w{_cykC)Q*&YDP48Rdnk z*xh$Lpbzz8+zL<~Wn74l!bvuSej+6Yb3GvicgFDiATz%en(Bnd#%Pi?Lbt>a_tlKv0-qPmd5kpzzIb?6&BfZu@;CzrdU(S276QS3vaE{xSzZrw? zGg5H7&_u!r2b|n=iR(YqyGYb$l+fqO=K^qCG1@y(G5YBa=o>2%y8##45*&}{Tl#{> zU?JcHn=hL#gCfM~(|CyO;G%cwi$+b`^v1QLKx2~^|OY3 z9%U}|pFvqZ=kqTQ;hpn&1zDy1MW9vRGpGAE>D`z1$#4Xe*qpc@H+0Lr`0)XwM4Imf zllf9zew*Z+)gSNC$9O&oT)sg5_a6@%jjn2T!K>qEVId&U|FJaA!q(Z*(ALbv3H(3BC$n{nWJJ9^jR@cyg+_oO8wAd1T7quWmV*FW*KqEXmc;7w0VJZOp2b zVx|Z#2ExLX(-Fan*Kz2;tzHKRL*XBxXsO6?{=n|l4X~dnl%Ag9Hq=RdQ_?c#2)`xH z?=zPDF|5pQ{@XQ;XJPOA2Ty^+AEsu88z`jSq>1`-Vww3EkInUhlRX5ylCn@;twQO61NV?-$q>_ z)Qn{d(zbbtea2M`Kk7NGSbu9wL@X#eEE5@wnf#$&&k63^vVLG^Nq=7W@J=kbwT~Z* z5*e}$il@??i-z<@Ohu--!VH}xG{nk)XSdY60CKX8iWfcC>OwNz&if>z!|JzTVwrdy z0&eG??)W_l>c)+Yeu`rRa`0ysfWf%-?+fFoS2p*RwY=;~vw4*Zes)zq` z>A8B9sshI}i}K#)zprc`4hjmg4TFHNpN9J9>~e8-VrBn3idVa4JmI{{-eZM4t*^_#F;QK`LJUHepwyG0Y^M`W}(pzg6%Uo1Qf{tDZ=MW#gAjEFk&H? zT`}-bB%=Oaf;k$P6yRml&bcIW&rkE*aEKCNOPympsaD7JH%nIXzRjCinH~>2*z!D2 zM_aTdFZ%bj>Uv*ncWCALTP_yOeCs!d2eW)Z1&NhB&kJG1FP8nZjBRH}qrSISMw6AG zv_Z9wnhO9p%$_{|Z2&eS|MST7YBc}LK2kLA6DXb^v`8xtl6C4w?YPW1^|@_*NqNy< z414Lg=*Ok4+RRdWZhDBN((~A8#(vq#dOodtZk&Yy-cPvsT;*l)KTnU!cb{Tjl+z?J*14%W^5BlOo{}y`l1^+^N^F=7y=)MuM>I(_$ zr`J@*qomD0{djSA>U;f!&Hq@MNEekH?mM<=+hE_vzocVG4%g47I@V_JiR~9$ z<2P}Lxs|4Sd*PD`wkoSQhaSzq)-zXlK$~y(CdsLO4VY4YrP#u4R?8P#v};`&O%H9y z=T=+FTV1S1UsLst@1vZ#VxAto<*JtFza`#U7#r=WYM8ml+49@c z4wY*#7@6Rw8afJW3TEEgXpL=76-rK$^rMzj!j~@%#?v)IS!+W!P0Ywzin@-Ik{njK+qjclTSMHe;6*(*Y9Y-I^Gr zTDqcsRmUwmg1uuT$viz&x(?ZpODP1^JiOy7L)S2yzm6OHAD8Z5uIN85LhSWzJi!V( zM6m0_yf@foH006=cD-}t{Rpo0O$Qa}k1Oww>$(XdmNpSfat&&U;5l8Y+!2LCw5z*dXPRI(hh7CCvDkfbmr|)^rO^E0=!)A6fgbeo7 z?OKve`=5pb%A1!$($^n1<*X)-V$rtUP20OefGb0q5E8dUS#+cYOLCP;a& zW!=fPRr zt!R{43|tb#NppyyTsf?vqk*~~H`R2XnJl3jA3B<5zd4mguB!oY8<*^D>(N(e0BnlC z#Lg92nidZ~UyYNjqLQ22aQ|ixaORK6uK%6Cj6B`mAuDj!KpfI&!)^C!KDYQOxL1ak zTEKqrtrGOZbYxMPMeWyS4Unh|cd`t^^VHQ*qz$hea#}CyH-7t_0+m>*KKIAyR#CY52 zx@LuqW%*Mu)wA5D8IqL-`$W5hM{ z=&J;_yyP^YB%g&N4ymrxkAg%^iUXscv>-&tPL_7AbD2YS-~9fRaF&H3oEQ_6(k6W; zN;cUqdLi_UbHdG}FLe*wuEK(ag zY1drayXGz{@T_kh7=qCQPx=wISEb`#BBV^YIs|5`wPA$yM!hUl`gSaRTZ5=yJWox~ zd;_9=oOr|8k}IU##So6(GWfhii#=AY(450$+FxwI^WWVVsWK8g^F_g`H1Pb6r3bB} zfJg1Cnz3sb8?1(d;cO<={&HLeL8T5>zuqpwz^B@JRU@^zD*46Jf*UUfzDJ0HTa*G; zz0=+;t=00w`@%*2cAwB!Pw{oQ1xx3n?rL;V?&cxyY2 zrO<(HvCRyjwFA&|cgy8aJ)R)fNO#1-F&&(BN*YF0+X)CMOWP4vCEreb%ymj-vg_Mc z2S{5rHYH!;Vd<6`eg7HYDFY%JM^9DZ8f}>*o@k-w zc(WI_9BPX>frx{c;K#c_KZ8MLqIlMT558VX0{ge#UQz;QS;Sd522`^Y@D^&9F(UPPL4k~TL_&naFL%bVwheUgVffT$V z4hL^e^LQ5r5u!(jxhi zq=%*tv#hn3Lh*DTHwXN{KKuYEe^Ogyu(pYbjs#4GypmSX(4s3Ew68Wdq#!!S98%R+ z%^KE2hSQ5-!o8yyt(NXJ34eEEt?F3A>6V~WV;Xky?=uig$ui(=#wf8_P2(+s?0*eo zj8U~#OZ#bW`2R5GxPiB~#i<>#jX29|zUvB^Qwa3Z z6;S9OCxj9T>TFgPm>L?_h4L4(J;6cqx*O+(61wheRu`CB7*~W8G~xiFp|QHg+fs?{ z9>%jk`48~D$3$bj8P){*vLcY+AMUo({j#IwC;mYHSIB_)%EtYHf7q~BNC^$??Zr$@ zvcH8{4VOQ{*G%&YVL7OoO*zyN{9wv)Adn7lA&~IUARgagfing;v?+1Tsxof?Gt7W^eUWca}tf!l_O$(h)UeV5{!lrlgcJe>%I;lJQ zWfvuxO!f*nu^UxB*$7l@%IethzLsKme;%(O@!sM3_uC%Q1meGjv2~BNKU>J&R_t2> zF)*!K+(gwMlNQu|wbN2|uf%=I*;&K(KGN2PY2x;qxTd$bSzSrOYCq7PUTf4L6mWY; zV!g6ek`D8^qPN)4maEto0LB%z?`(%cZxSrl1XZ&(4%*96uo!?$7zIM z5?um=`i6K~=99+0()tXYSj$cdy>WU0nONgjV6v!8$Jh4C@XIj8@4lWqp0Yo;_w@{M zy>&*oZ;CW*zG!b|M~y2LX_$Y}hRTl0*pB-gxnUFP#oe%+^toZu2EqLgT3xpZb>Vi6 zlMbT@XrvhWy?`tqHZ0so(c%yvtVHf;8=g0=TQ35;*TA{7qAHzl`!_MM+rX)nTq_w{ z+e{xdw_~leZ4LIgaHU~!r7dro>rPOLf+fzGI)8yC#lN+-GkHqu*MBMMkb{Pf}`N3D&k{J?Sf8~nZc9xskLs{-4ALSLAD_t!O4 z*|wELuUCtrU!oVveX=|U0{Bt7xdXnfhqCM~`AO$2_3N)&l<(|{kM?g{chEU+7Tr0DV0?R4?m=hdC+<)QFen<9${2mBp; zxqDR$!#`zm`;8L<8|)AgtQ!*bA)0K)X8k zw5Y5)IJSe)drim>N7Su<60;1EL~TX+yt`d#zPh4NC@njoz}*$+rh) zO|mJLvbUJFLL%cP8kV-01>dF1XSh!qSK|D&Hhe~HjumK+*QBob8sBRga|o4)+vZh? zDGcETpQdACsW_TN3JRv^N4~=v+n(SKSXnb`9wUqeuQs-I)^cNM$MbgOFB03n0Z5lC z;M;EM=h^HrvvQws6)gLdPU`)NSoP6nm|c}QV$CrAA43qq76JHTJX8;%J0HiKg2Qh1JGH&IjOID(=^#baAt#q)U}0^ zcZ zLw(V#Yg%`6fl+w_uz9>tQ;V?CL}yUUwLHpmFDlYkn^0X@_arY7;QhhQ;dZK{HCSY0 zp<(|dr;*+nFtSt36D*fDx;iIX-b1}=!!tuu4j9srXFjZ*9M-91JgjA)bJ8uQtC5=2 z3H}&fPFk~|mPzL@>9Blc3SWCl#N~NAlrL~AXbXr$?!I0nOFnvI4H4T+|E0E1ZG23& zV-my4F?E@iOuGENv8{(^68Deh;R8*}Qsvzn{~^nU>XCij=r-Fvfm09T;GnY#@f)pu z5k;rmY+_!=6+VFoMXmeHv`SN3yV){Bx9G9-)4$V-ZA$88M(Xl0vr`Alzb30zH&-&0 zSKnoZ=HT$){Y2ST=9ZV)oWq5~2g{_^Q%44Rr$33dJbihhpgu#|3XnW^Qp;9ztfRHu zT-V@aVY4^A^j{uVz0%`0wPmi11}E<0nTBASJ%y!-oVpBQ3qbI6MYAl6RRgazO9glJ z=?TK3bG*ZBXe0eq=iZf~8?z%j(3MHG^|$e{b;oOJu{$nwS+l`qtY2k7vuO;lS&o!w zT>Vyeob;=7Ij-TjLCf5XUCp{xaNTwHAb5EuJEQs5!Lzj?!`Gs5m5p$@seYAHce&rx zhT~w)^|{~}B)xo}+z<|2V(_s7yiB{c*GFA467K19Pjot``~JStynii38lGPZ&X;M2 zj=a1MVZ5oegM_#02t56*!_{{bkgu;RQFvB0Dmk4Wp@JB3AbX8fiUjBOtXOIWpO^c zW;?gx_LcFc;pK+ljMh+A_vN|!6$*sQC{JQDfcxO@b|c|@9ybrS$Ik7E4#&oGX+2J^ z)^b0mWJLxYWzDK0ANQ?QX)~CX_5|Ho@E`VG_3UsW&6m=y{6rG{^^^qg$}zvu!N9v- z(XX@LW5kkebgxCCMB-qowa*yK-O*blbX90FsIeC`0B^^DlM4RFJ+hE=%vO;>X^-m0 zC*C?pD#miUwut&)>yO;1*w@-g>-&!RRGVN+?J-vo&76Z+T6)+lgREu{%~FEW1k{?u z%I(iBVq4uzPtHcpTh(0=#;{K?_g!yXcePr0JVR44-Kge~9JEc0R<2G|URFzSVOr=r zm9*H+#MwE^n;bxznB=^aRauKt)m-m&#{xKS>;Ss2aWJQ#|X zEpPF>ZWCzaa9?G=DoA6~XaBfS-KuN`!;N4xWAppM2`YBH&Ew`|Ruu{#sx%E{@C>|v zIg&Qi)A-49^=*FVO8qRwoB^=?;k#m>lV8D~M1jKrY;T$8n^t9&$?ouU$!cD?&Kix_ z+d>zqW^g_zrBdSq^Gq?T&KSKe`&)W3@h8VzrJl zl#niKsE8_2kQeT^znJM#7NheZ0DkokoEiaDB zp1`EuTn@9dj^6gfG@ul7yC&ko14r4gAaUL@hL{BmgC)X+k6aXNbj+>h!k4FfTH@UrVj71B6* zI1RWcdHtb@F6wGqsx*EM55ijHa30WP1-AFFbX`Kyi-7Z@^t=B>ifxpJGx#qmvq z%EaW`*EGJQLGoY334uaxUfJ{KvxUmsSs9-0I~pP#N{~?yfP8Wp^1Es%b#cd|nY$GK zDJyp!NOo)@RSXXXc^Y_S%`7Ff2YY#1_@~CKkMJAUEQmry$C@xXZ_d-9tR2g{W}^t= z+w>LC>PVLT)yT~^L}3ioen~@p8hylu5ya(JMsq$#f{~2Y3ea4ecTu;Mx$Ni=l~fqG zYW5M0BvM6TX|LBaENq;kJrQn}mQ2yi6Gz=%iBWP}5VI9M%pENi;VN{u%IIOWE9Xwx zE#F(+mY6md?dGxL#ULFNIsNTaNm~MWte|qL*dBBHQ!7xjKr8&yp2b7@cUDuL-wtqG zg@C8meLeTy()3VTnI#$|*E>)wn94S+Pgeg7I%-r!w@zTqg@%)--tTZTPcYg-O4Mqf z6NXrL>G3jY|9MDTjsDI0SS40%vU1GBr@+l%$YL1hQ!KG!n4@);o9^w_;KhqL_WE7; zv6Mae&U*?@IN@^K(x)s1KVCzZEHCo%ic@8%(O(ZCJ1-t25>cyHSIDshj}SWih2-XL z51_zYlBejIuBw8y>m5)uv?1^9TAA%zHiL(r7(R~TGcvM|cVkQxQ#qE1_=x)(lw483 zrV3R&0FsV+@6JHSUZOx~aso7kPrfYL4c^qHm?P1!gAT&Yt!^o_nNyiEhBK$PTq&(% zf`^YplsCLF<6amv%#)Vj)TH>5&=%)*bY0NE0JKN0#M-wxMmvG{Usmih-Ww{<7vpnTFKBTAh)fN_TnPy<0)ZSTN~MkXYyaJ zygx2+Ye%nmgHB~eJ7=aM#?lwL)^t*6u=*v#!@btX zUGu3iEms#?a4mV(x3&7Z1pcCF%%xEs;o2N&N zT!uAb1Fe~2443m~1pCsDTx1^alxzEnoPFv}UO7z%i_U<;uB(1%qigE+g8yZTuT`#mZ~om>-Hn zGhSNnah4AlwCIhlen5Gm16Wk!OC>g3m`?3=<`o(ee8E0=3qmzrB)a zdTX5ChOffL3;`7bz|e16yxdll52d6-k6{mX9M_*{s;IZGu&;r(1==cgAML>4(Z3|* zLha>PZAer!{1r^{(N`sIjYL<_So(G*|8feqD#<1BOV(H0?Bw6NJt_*L-SLCpC7vyh)W}=e_u$4d0P%Y*vdm{_CfE`XL8Q+ArQaNe9zXGdnHySgPpYUYkEY*T7b!IB*1iP|-9R z#pFZEE;UhbXX*G_TmGedBFckvvUu^j4s2P8QkR6INmWQbjA|_oBRNHIX(nVmeY?$@ z!!S>88c8&^`gCLY%GnVh1OAZy<^LudKZp)Xzfem)ya_1_1NTp}ZQ9W5l}SFF+f@-w zX#6&2+pViA;%+r`bQ2x{md?d2+Pr`7@O*U@2=>hn6%SF{p`^B^b89Pr$3rUt&tGLa z@8356-?qTtw$R_U@LwgNsPyY#DEf&*@j6P%2TNXCac-+U{8#@>*3nCWFIVHTPR;A+ z@O>n+36Fd2FZp_U&P5j?@MGdgDbNMUzBHeIFo1FB@aGfX?|rReeE z6$*=Ha#K0dmBI&j5`I(Hn^VGp2_{Sv4=MU3`5eY4ou+AeN^rxTE#qzP-BkN-)wG>y z;qqz*ZdLKGY7eDlCQ~xw){Cw#ain)E3ukx^LF8=myVZXXD;U-OL45&X3LlDQZVo^y z^}PHj*WC|=aO$H!JdZw}ZuV!L5P#CL;q}@ww`h4jgVr zxFdeCgZeQeB}et%0V!wl6&9)9JN^yJRqvhtg6XwvI~}$6Rj1axM}S&zghxZ*qWgl| zE;x4XqZ{)ygH^)d*~g6(Ur}}=}KrCCP}M@1DHp6 z^WzfO_LL$vZ`A-jN{pg0T}~MdZO3iQC-sX27nGJ5jXI7*UOTN3#^?7>a$C~{pv?<} z1so;Wy|L4c?9^yREm*dUnz7R1V@w5XLD|ySL4jtM`~FOi!Ez8OZ6vM!BTM zAD+a+l6*?r1LZy_JR%S(CZf0KA1iM1Y(&=wWVEW%6)flE)A+ZoF`)|7`-pqK86%dn zc%cdIVr3rlE+Q#PZ+OqO6C{wREXQTT;&^d*I|AjX1aS7GRu{zzyP-lv6n(^$xscUW zoM9<8sW>G(X2HUmz#~h~z4NKu`c3;T@RA<}{EDW86z?Mc#~_7Vsh-t)ITfE-X1k%2 zHegA}H|r;QOdsWBtm`BBPp2GgKj3MmDxju)pUHl_!FHscRgTrQ!R6Q3dD$z)UNFg2 z{rQCJVQ<`=w9F^FvNvt7su+@RQod9+RslPa zmk(HwT#^e-Y~S!u#L70KYoI)?sz`X7UinOI^X`D*%wI!Fn)fcV^A3rE-AD(!x)7PV z=KWR^BMRPqu&=^2vWTxU_4(D_Jk#w0k?V@O)fWV<4>xNvA5NMX?OoIv=^1yd>*D5* zmsUzXUaM=0W84}}%V+s3oM)*SG~$+q3DHYo2c~oulFa0^_>)Y0^Iz}&j_ChlNj;Rb zb32ddf7#Nw%O;vb`K$o`r)$w4;b+f15rvAM+x$!!W67*AsNu_{%1GY1~eQ#%- zJ}QVcWsGF?w8&qSCL7nov$&a)sQoWjp`Ap`wZ@O^$B`vOXMKRi*X(e8nl7k9T`7O& zOeM60^9cX!2s3PG6P}{%**rYbjPqPDk&GQ!_=FAP`r*sUUQ(vI=mxg_G+e6%kAwa) z!+iA90JlTdaxYmF8eSQwRUBJXfRPqai|rP={CPJ*kbR~+%yP8zY#-R3UHtZnMO5%d zjdKHOMR~-hiTgAb`HzTr-b#Y4p1k3o$nVz-KWI!|)cH4gqC}7~MitMspNMMYU9^P_ z(<}Z6(^{pq42&JmqJalK#zD1Ka7IGUe_kyf&^my_}90 z`iF0-7Gz$tmVvxTeELyK6lVv`S;GarVrK$`(btD%LiRc)c8^t<*(lh=D^JgVip4!jRMLs+bH&VEzLTqELS|@F3 z^r*`Dgt4IX4k_Xxfl>%FC`YQFXl{Grdr!-Xg+YwUreTcQfuXcdZN;Y)m+{_)l|_|> zSX|~$$%AmNoB4)b*G43o^vyk6Aseihe2sBK4Lmu4d%& z8eQ>Ff6C<*x#G3g{o4PLAqL)6$HSuNr}STn>8NFmA2c;-qUxf2u)=0#llLr*_bLR< z<3*eAzIL^<4VL;!ISH@AFwlgcW3OmCl{`?f{$`ocUH@JThc7{?HM3LFqq}1o)Q3Qs zGhU{Z_wkKZ>5yDd1ZLy4>JbN9#IFU0{b*$lw-Oph!d$FpRwXn#b~Q9)c15%?HdVB; z`a%*7D_y})bKm?8N@QWW<+Kr}uCA#OJVM4A^L}bSe+dP7oP_GF5?Fc|Lt|OG8#l6Ft{t=xI z8{~CB#ugwXbRF9w_<`a|qBq-BKsG=~X+JhePy$KR`x~}_8WBYbxvmq7dd)6O{8NcHrEOButKjyOf~0cBUHIcbwm1MH(A75&lzEJf$Rc zw3F2E<0F@d9>%)Uav=zMD&W`f$}ob&jMVTCUo-`$25Aw&FXIcdA1S|JgMSGO^3RUe zrvZaR|7=vr{sQ-C$ZxFC9y5Jy;xyd-+gRnH8VE&fOqJKgp&BS)V0Tp<>K+{^_x)C4 zKi@q%!YGW3UJJ9DSw(ds@yZyz&r03{p@$d*ElyfBQK`I@7G!`Zg;1`6f>2R_b^r(&3&ywv==}=fr@j z!P9KwW6yRRi&5C;?AowTd0S&mq%wP)PI8JU`)#B$`vm80_pDJXkr~Fk>yIz-jU^M;KMbof5!kU*8j)Z zTYy#3eGT6#At|6Vg3_UMw}2pd$U}E`Hv)Pn>F)0CZUG7D?huhK>6;L~eeV1Je9!Y< z?^EA*U92^0{q|aW&+HlI%-RY4oDC9ir3zONxYC6y z5x7zW>aqkL7n_xIvsm`!W-;f>ji(&WMLiS8;3%O&5`o2l*DJJ8gr3vy7&Ul_VA-7TWr6OL>*2SXHkYM|M*x4 z>3ymEtFMvIh2fV!MJrz^Lw8@LW@7Z`mWpx|HifwvjwoQxtQ}sc;7zF4^*VS7LdEM4 zZ6M2wjU{v{?O@nt?bZot-Kny8U*htv#nX1Uxy4OYuyM(X{z$)LroDEEObgbLQOKm? z<`u2aH``vjH@xC13&pwX)o}S~%U@7};`6hN&#sYF8H)H|ubSSl6j96o)8i=}U9{=P zb*uX8U{%9q5(G9)pv^daBxZ(BS)bgVjgpt4&h{ZJbGNUi=`g5&6W{t`N+^ z?2nbhLtM8-Kn?+c$J8IX{1fBp+1RMOEV8w~+5}EK8^N-AL|Q2vUAmTlQ!EE?iV5QV ztmoSQ&6NFj^XiJFy!1dWsxig;j>!)$-kI z_*^y$V+&ov-Q3Pjxd+-W>HrYY?xXp3gp>YZNfKAwnP4X56)&bnz~3$yKxhq>r* z_=c$odSwzx{|Lk)zh}>H!3`M~DSotEasOMNgOk;CK{bbgZMhHMEX}YDe>vR~CDsj; zu;#fBxYY0VQ0;O1miM3H&U~7l_$e9IOuBbmO<`yoqzWwyPFix3P*m7m){Q4`Xh~fv zE$0Ihegj>~9jl`}VkWp_(Sd%$myh?_L^k)Pn=QO~Y6)~);Y>mGd!tcz(z3B6ej_pz z@7+gc!SzIEr87=OCVh7)Mj^!SG{vhKjC@A?bMT`)pOg(G>6Kn!@3U^rSqcQq5T03u zXTdtQ=F%0wdV1K)%6TqXgGL>wzSU?s6&~DkriDe1c9XK!pse^LZ-l;2bF0zfuov;? zwTL#LRSHi%m z!2VF6N$nYOW>>OnP-J@lsX;P{QNUM{#2{>8_|>H8)3bo>$Pyd_hrT<9c!5Bdt;o`~ zuQy@WtY@d=b4?y%J61{;0T)DPH7=&wh5>zdP|W(O_eS?6mPEO-=%pMny*yLh42PBa zc@_ros$3YHjAfJZed<%)mgQXP>z(73s==&<0XX5t)q}nU?^g(r6YwR5t)@TG;30W4 zmQBd_Sv~}CYI?Db*HuZ3ybP7apDp3l|7u}S9;m5)(OIRskBppw?`oq0Hc}(Gp<#oNiBqI|4UZM&Ob79n;;qILcLRYI7i(swn^||1izqEId#3V4%3#BZ1 zY3FzNUB8%=%A=%?v9|Lz5OMV*{`Dayf+5$SBmS zZnqCVC^UC#6FrL?H~!t?jX{~UgNiaTPmt@0Ts?bOGGm8_63)3vigH*wV@JN+z_Usp@cG80(rYs!*BEi^15F4P2*!(d<$yc4DBB#5!LJGeAjb# z+PkrZnO*r}QLpReS?`NQtRD5HpQtW-NoF1HqN$`|&5Rk-RJdCy%n|!m`Uf^AHNs;9q`4jI>XzU{CH}#dDc|L4g+02k)zuu&kpK%RFys@(km|-i7y3h~)*E^wV zBP5IKDS2}=c6e1iI#5OTnNFyFf8_HcJuXT`oyqNI*m5^XU!q@{2PEyhRPld1)JHDv z`t|j$%%S#P$$)Pz$zM`8%l@&yx{d^W6BcD3m`q4(Rt68M)S$Qw)3OgK$@eazD+&^m zYNvrG$&XFhVg^PCou4;XH~4D>$YNC}`TxOx3I^XWzOEaERLP&{cTyZE349dA zxuhc#Dn{{Qe)f#6dor^G6hgbvw^T2^?1%GBRcVL*}3{hVF`QJsTlav?srL z#pi9^|7v?proi8%g>%6P4xoq?5xp@jN7g^r`wj8RpptuKOh?;a#q4&~-{==P+ow~M zIJX1w1CmQox&Ek)s>x(Z@?UHD0;ga6ez%;h41No;r+^~objw&_&D$D9 za15GW-k(lP;l~;zRdU+S+a>3`Y9S4QG^Gxn|KJj@D?JR!D#W>XB;aoRUhokX8IfY_ zMi(Wer5XUnr4&0B#zAnENU=Brer~1)ie8hI@t+n@v`9M<=xmaN>@ch;y;m#dTF&a2 z4)pkOl$E0G=c8~K^7Qyw$qC2K(;0X7N5@&j@&JYhJw5ps#BhIo`~yk6?hPh`d)@aa zRYfvuw!Dj|{*{EqU9B(l)3pjY1f^n$wUbqMv7nF=))z+0O8_2o(LxiTs(o>+% zSUr`9%#f{Y1S67#NOk)wf^1;D;n`m?1~zHSTj{}TB?SyW-xJI*)Hw1n=ZhxoI7(3> z8gH6j9Vq$-GbM7kzf(Qhm(lExj=#N$>BAcs9I>0Sgq5X1dW#iEusDhk@+Meo9BZFW zmqk0Ku9Sx3cp~!2&<1~Wd+q4uP7|Gqlkh&kPD9!a8aDca5=#5S3yred2f?WOF~W;( zas=h>b(4Xw?7JT7A6$IHuOgFz=1}K|=U;2v>BrjpeP--d!yHE8CYq;Nw$=}_5BtUC|v@ZY;9srY}!hAKWo(AVP_MsDAMOJih&^ z5sMhb`~C!zQs@BvVc^x+OIGZgyNyjJWYNqAA^mRzBAE{zUDN(3H+NTustq9FO6x=< z(|6eeyy-y_RydpNz!Sx#00A|FTeBT zS3cjVrm&_i{zwuO9UpIx>32Jht{avJ*+b3k1*3iAn|GGCspFf=M9RKD(;_)JnFA>Z zK7>IxqCS5xz3M1t`7E^U`jP|tCe3R<=`*X|zz#bgSlXO`th7zM+i~(aG(pH73#h%t z@COCN@zmqn2Yi%Eh&OkhhMizh5Acl)P|tb2PNRTxM|P{ebG9#~9AwYYO^Loy&?Qwg z7T))AQV6XpNlf}Sjbnx?K!`vhtY*sJe)*kj;ZlbbPEN&8YzWJh^p*z{#R(IV{B+S{ zT`J7FKeSSy0_ApFT)OIoZy9206}5C#u5}63M^kNOSiAAQboYloOltC)uvBSLeWJ!V z|0cFw<>%dl-v%D>_Y)KOXR)!ep|F}58e@wNzBl=L9#{Zg7QoH%nS{MPyLdin7jvYs z&&4%02(Nmn3=cB-(hBcF_Eq0S#%@oN#j_EdK3OO82o}>6F(-f4sh25~VaZ$LFAc&t zKH$~RqwSSEX{f+)7^9SnAxw^9$ccSQ`9i7JDFh~6Y7PO1H?NFK^aFq+2^Mz7S@^1VO}4yf6rrigcB1#9aa7;u zQ=&OrVq)li@1~)nNFFv=DO7?&A1gvBmM6=N5d6?sr7bC+qt!qZCvaH)5F8<=b9D9w zH*Li_4Jg>aYwN3*>wlZiAdT;@Azl0Qk^${TnnSmTD*yck=ddE&#Qob;kml6wLCjYH zR32`g=fO<~-2C;oDJLC{0gF+h^vlYf9(Y|u$H|65TvCj|!bo2uM0^%w*q=q&U&Y>F zH2-pm^&s+)uwlRzqt%!{FuaCzLwDhsW2^PkW}^l_5f^#EVydE}lSB-(7O%T)Y1mPQ z_a>`IQZC2TLqiUVWRJwKV#==C+$UaX_CG@zYN9h4L0?te3Y)ar1q)b5&aIpx%TY{k zW)cmpMw0KRLQ>utg;WuEcit#j%dt%P>MD{*E(uvHvP@N$vo|cH?W%2um7|&76yiEe zj`72)OuB|YdFop?^0H@<^E5Ce5sh~cUQTh;h8i9e0fzbVaypG@Tot3$aumb-WvDl& z88SzA*Juhm!lGQy>OYes_+-8N9-SRw2^>Wr5U=aM3QT^CS%|)4^#c?9qNoiCxhAeFGH*V;NNAy(}&}RypFm=btOH^A&}Cbt)xecmH>X?JfytS zp}%T&r81ialRq=EBgFQR#dJtk^6Em%lJC7e<;v#5#xM@JI=FXb&Qqi)yYeCmo_a&GjIQhA@J2ASSOs?O~ooo9St7=vDq=O=2ECUS1p?7{B$dT1|*Tc(X< z?7TFX2hL$qMi^4BR`yTwnfVF`oPWVS?>Ql-!5rJSj4!aSN}OA16Dn8@=`UaoMu$@0 zN*paEUXV-SqPAD^dw>4InRj#Hr=!azeNH~pSmrpFcas(?Z560`VJ2nHa9L!_Ofr9! zwY9`Y#JL<_*jn`3&}R20l+m|qa;zAiLN#gXih5kQS>?^JS;Iw5tPFFfVx_?dkygo9 zOK}d2vF;x)fG_B(q@6Gty_xJDc36`wWfPy!VVADC3hT?OX&=g^E&!Iu$k>}JHa%*4UYP`dA;KA zNLO!mY1*?Y2wrlpv{2dXAZ^G9omP2isfKZP+7JzMGB)@5lUSJUGzxwFh*R1xM1r12 zD%RT6!;xs!($G#{+W(n}Ra3JC{T!8ZHcAYOLb?4D=dXE$&V91y`p+j^7{5mkKe|9%f0fhq<*f2?@i*`8e_t`xXYR_XRK)4~ zn8{5=cf29xXYbrdF5)#t_&n}vI5Hk_Q_xIOVKp}JhjC^67z5g%S6_8jJ3*$x^SY}x za?*jW*Dogpuk&)UYPT^^Z#*SX13fcu>SMC<&E9rP>ER=B3R)wrJSNp{SBvBzlYxX5<}?(DnLv zEx>g(GUKUhJR4Po^}?w8S?xEPOlj-VOwAhycD(A!=4J;Ns)&y54Zv>JsHOz_}TYPnYxMr zla2-Pu1Hk?GS^5z+{|UGr%u35t;~Z&wKRzb?6dh79 zzH2Pi^&L0Cfi1u!P1b;jR$0C8|8!|$>EFhE$HgBsMnm^#Yw{B?SQa5;J9<4v)QD}= z5*>>r;X+CKI&5D8B1*Urp6<`mK*En|;LPp%y!$WP11f)<)p;otqc-?9>tV!9P9@#u z4-*20b5*-P3(=|!%Gr85Aek8L&x5tS$b{qbyj@R>QyLGq_=?w3IxqC+$aUi{n$1is zrgY+4T$(iYQmWp%ko;wKF>l+FITKBKZ#riw?kba3Lf1Eg5OUBb3{?y%4Z>XrH!sQI zs~}S}ZbU5!Non#dr)ZUuhsLe%U4$H5zJn@0RkKqub~`K%Ve#;tqY-zFa8s>RT-Cz$ z@R*}JE(b%uR&iIZV33z{&?^Xx026Pv%Yd=o@Y7XrqgAVfMxsV6xt?y0!A?f`1QM~!F#M^SQlx>HdI-7osT*Q@O@DK= zNJS@d`_V2uZ4~`Gxba_D2aXFT;5X$F34|Xh{n{M)Vc{G}!E6T_%Ke9S6#rAB&_6ZK zSls?7?)qV&lHP!oK@1xHAAt4(e+i`ZXme#}-=m(Nx`n}VeeX@k!TKCjkwi_Nq2|Lg zRdMyQkGg`6ewlepljRm8#9?G>3Iw~k{m8lf+|%MWJJnq~CzvkLLY~$vo*%_@@*>Gd z2%Yb?!ZAbInphUyb@m;nGCI`p7Ere|{8-mW_U1nh&*=|e1@dvdI^)!I?JO*dKG~kG zSef_+#qot4E|SV=<0;ZJpu2H6K;P#V>9pnsmr~4MkXX(gng1-Io4>dalRl8p&_LKN zyGmFSGtA8}6M%9*mHDW5p~xp@eM2QXMQW>ow-Ad}Yr0oy*<{|b3sD?Sk=dZ|g!V&+ zOpkmg(wCArWv(t6Uv)NGR*cqvJe#y^npPd^^e#2xrmFzM?{`a$j#uI3-L}DLCijQ6 z->9e9m~Y>@9LLYxK{>B8ned#?Nlh=}iVR(LhRs;|b7^DOJWxVFFIQojG%r}9;jmB!#9(A^4 zU{J`8XP-_>oxhF+Tr%TAop*xZK=`ALco_VrAbleU4w{M9VS40De8QzDPq%FNicqw! zhE`AUx(84Fwi>I1AHIkr1yi@8LQy`fl5(sCq?1T6(RJg<$IzByN4U4}QK6JNvIf&!L)jY&d9E`1XO5wyg=IP-?wDC87z=?1tp3g_&=eG6~!->dR5XeW_rXMI6 z#sg#Xk@VfBiE6_`VtOQFU?d-c!2s)+O_J}sX5*Jf>po5DmAUyYKz)8^Dn4(qk-ib4 z|DK@TLGp2=b7cfUc zDbP#7o@+?^wt=E)_>ZO8KmcP{X;2SERIea-GWSL5O667r^i{3V7AMQpUtd(MGoE`o zG*S$+W=uCA$?$KDS%iyLSl`EV2qZYY9W*x&$f~@kq=yY1aJv~e<>1ugmMtWaPAm>7 zi$*53W>un>nEaZ==dv&gm>~)U?|>48*oZ(ZE3hFhI+Z`m74>25Dl3_F zR1tmMHN9~iZJbI~PQl86Vy3uD?_9En=LQ4QOl@M7XqjKdI^K|-fqwE@#^1(M^Kk|0cz*gX7rmDM`;|< z81fmm=MlA(40L7fNnTpLU=jQ4N6+HM>-RdqTsm+*rFu>9VOpOgjC&g4H4bm9xD63H zqqA2HTGuN`8vMG^_z}|cSf}G6hU!_v`%klURCEM-bAJ((GU7+3v|`(7E3)@HhW4U{ z|HZN_*b3>fHx}ByG=KkXc`2tJJ*%Z6j?owFTgKz0csr1^X03~GS+5fhqb54L z<(Qf_AdpMt$#`zr4J{iS7j%E)e`ysy7zH|PG9=uEsJ8SRvzo=|GR=no-*i|eshGF6LV+ga@ARvf1N z9F~0`EPc_t|4DeWBBvm@j20^v@x~w9arqAaXZXmCj(QqvrXn#a;%L#Ab1(s$-pakWTGe^R|m+-98qUUoy zAv*tgV->cMLt`J8dSEqA!3B0G3x1_J7rG3~)+&oz*DGCZuBU;e7Gq-JC9TQovwMEv zQdj@XC`+24uV`xkVOfT7so4VwGkkTrII{NLAK65o^9EOnvUHImFHD@X_0TOIbgYCN&^bU6sSlL8-n$Y@LBF+S zODBmLkwnnL#1AwIQScq~m2lqv%(`Y&|JLOfqK^~AMK7AmQ4)_PW^`r-c8amBeE9gnv7}1+)9!wS`R)^$khb5fqxDUL+Tkd+@AM`|GAcsGB@Tqk!Pkrblwd`ukn-f9 z(AMjXOZyuX^*)}V2+YQJlUb$cVVRy&lc$G?5%H9PQ1W^y46%_tLW4kqA`RZ~T+yN< zl14hw#fu9?@h{0PzZo`I_gYl~1th#PiFqRxeV3Md4KUA6?dgmp0tsh#)(TL()5y=X zWYMKK;tdEbArY5l*oIYymQjR(DN|AOptWUNa6vMAYjqa+QICStcD=;O*F2d$JXQ=& zZVO$6BMV8BF9t=|oc(xRf;L=OzpApYna&-a6=8L=Oy7x=w}X1-u8D|(vY$!2CpZx9 zWwnT6i0z`{;&oT`k=HYWnSV9e@)^{St62@|^tG<1;GiuW(J_Z`cqf86x{pCa>rpsM z9I+G8QwEnPG3u+N-;jXLkbp3VE<#7|i?I8c8s2`$d+vHEz*{uT^0MCk9W-RUC_t=4 z3F8A}+PHkb{d6~~w=!_Ttjb`Z#7T1(9(Dnv_~j#e8?as^&fA$Iic+`w@dM6cbt8vk zkNx!W-dPB2_1;;(otU#P7k~CZ#hA7+o(MU$qa&}H5joW~=;DgRI)A#yuxfX|RCAYg zo`XLR564fgwr7i}PHCT$rC)#Qz!P(uciwoB>lv5LS_MjZoM}JX(YeV>Z$Cf3y~O7J zxuuPeD0&{AB9xUlzr_ZJs@N0DKWl`UmV$)VO<3a#qfIvO80nJ<~g{t zF0lOMoW%AFK#SZ(TVJ|pmQ2s63bPw=yF6u`M!RU_Sj_~!Tf{OTfw0so22qu2@!p}X zg2TN@o_XUIM#q?`XX0NNE{_!bi@KekvBYq=DS1;##0=Xz1x8cF?hFIMZJ>*AlQP~x zDG_6x1dGnQh7ubaQGJ(SA(Tq-6{Fn6-$p38{V6%gcPOAw_1*O`YYa!Hi7ZY|hz&85 z5tW5cDxZ58)yT2Rs{oLjZU^SUz%%Ei)MBo5m*iyID9R{kL)en+OOc_<3Y$dC)|Hj+ zXIfrTb{MQfR`OeP9xEl?&VHK@0cid;yb38y3Dy{6F^VuMMr#$VKFP^$nsP2eDNRD? zZ8va4IN>EPCoTP=sYuWas4Ui#Bwi3o)ucNBY%a~*BN-E3z9>jbX##S1D&!u4dfx{| z=LINhF0jNHQ?f-+$?ds)myEgbh@c8Mo1uandRT)aEG0ZEPPAY8Q%oZ)`c>a0J`-Bk zG^aj8cn^L9t!t_&kyG*4l;RDmz6Zt=T5Aeq?#m$Z`u_RtgtlNa_D zKNcTfgks7r=VaG}Bc8pGr$c4){AocgA}TLXO4T(rEJq*J{03!bQ!Q>DN@qgy21|(l zY5~cFenG^9vu0xuhA-4=nYr-8n>K!7(;TW;)Sr2L^M}`jDSx?-_|w?fz3%fjHpT+N zzFJZWBipI*h%+BMpi)sw+e>kX#oiqsq@otKz2Xsry@g7s2KLV=rA5>K+$F`>k6-J( zL9yLB%gwA*ou%1Vn|*xyC$F7d&GLxxwRUMtjI6c~N%BmH9D`qXgF142yD3pz!wg%I zO{$5)vg=S*%N*m`W#G5HZT`beMpf6Itd^Ao5f`twetVairUVMA;^VUl6O;=B@o<9-IOsP_qGa3I3#bT3(ov~J65J{nQ1$+7GElGoIg-??4M$uf z^|s5~I4X*Z61YA66!V*3Pg=D!e0nC)PrCc~BX1UBCwm!UCuMUnmlBg6({?iT<$*`H ztcz38jGpay|4(W?=<|}DM60+T7j6uwGY3PA(!UL2ZY(IdPc|*6-5VXK-4V)lck+FU z@tz2tFxUUgUb~A|Wj+t@oJ>FwTwt!R$yvLO_wTVeXY8D$@hN^NItf^^XtJjK@<*wM z2r*61qFzMyI$o7i7J4In5xOg>7rs0piEvc39yME{-1h<{ss=$&=lv(4+waLhtUX>JXFpDkO}=_B$7i}$OEq=%?QLAhu9qR}6+!=qm!Z%gm>g#-Ls`$f z=##GncaHt9U7brhcno~8Zul+MUI2CMcMn;(Wn(*I8egNomEEyh7GkGmAA38X(zrA0 z&1&m|wbH^onrfC~bk*zO_3GTMtBsb=4Uc_H_WQZu1bFos><_3n$D8KdZDRH5ADtSE zn^x=2$3TIaE9P&rI^SG&WOeeF9(p4sUw6dFngsf+rq66$jgOTkE#lmG;3@Nq3Lir{ zJqXUvj?S0XN~4q4N@J7P&~IAVv&!|Jl6Hg?509^xCczhcpbXR1OhF@P_@f@gw4?I1 z*1Zs_sTbK-rIlxRSSe%gnX3(Nl6R<8Wrbf%*&bn}$cwlELchbLDhmxr=5`A_@S6QT z?8P-O>?PVOb}6W3yd}uac9x-VQsq7N4D@Z7bfCajqUPq|s2Z8Y8G-)pn4HUm$IArtVM5}h~B*4*BB zMa^kBnDwMHqRD&>M`n`izsB#dG(c?n-c4v<8-V%)|E$3UxkN9FzBD==+K0Vjj==83 zz*SZzRgh95V_un3!mdz%ygBNFMn5JF|VC)NMDL0dGs^cFs>tHwDNxwD(*iElh%0qn+lq~S3 z?7j-Tnmg6ck?%bx(X>Vy;jWuUTeQo1;3zi>y`QSfV7!r^@@z=Dsa_kWAyJfguviPY zpXxyWQ|L`_l6k`<$*C&4M*ZTU_&8?5H_$EmYt!~M)6AiB^_B~}15mxaDRcRu^;aUj zTtT0%MVNv!UUp+Ts&Z0PLH>eljv1g z&t!MTwy+mt(8uk}*$MQ0DaNfRfyD>P3ao8jFFgs-3C|cw-Ds zZe2Yx5laF^dbcq*vNn*0ax!RQoyI4UWI^E2Wk+4%_g^oa+YFCOuQ-wgEYIQU60RoSy^VF<@soT_?ebm-gRkYdCo328xg!SO;=9-VS-GU&Mp$>u`CECBNo~xy z0XRI^lFDt=jxn`srYa8_p!OQze&?I`*6;q=nnvZY+|;PDSA<0J9964L%nJ{>Q+67` z=sBuh$H~>9*HZ=Lrzv?Ffd{es($E+}Wz8Ihp%faegZ309RxTZ@H&8q9H3)nNaf*6% z=Nra^iy+Q)bAzMu57HNItc_xgGeH6uDW^Q%`(``_# zVh^@{&9*Y*_r2ex`&16JI9+T%=SM4fn?;mi@cnVLHmRziEI(v}{p^tJmpUN$ZvLfK zFCqxzB$TS^$RkbV;!^{-kmwvV-SYHV8b?=-bMihJ_fS zC$md+#u1;&@m{_na;=9^QuRQN2`QU1!)mS?;!?bL6E>~$W>hVYOltalqa!@$X`NuX zXP=WTv@YCS4tj(%J_uXCOtWz8UoGt+xzvTYo?kh(r!TR64Ujr(%)&pLLEn-?B)>hmyBnmWpn0rcjS^&heVp*7BaFyUnUxVJ&Vq{<;cp z)f)7q$$Ha)*BxT#Ya@Qu-_R3IdxTNZ^dKzLn9{gm+)&B2+$q{DIMcx3$d8LB!#n01 zmqRzKaoYjQIwTT|DE_j1lSYB&H0_i1S_j#;GOGdOUR1=J=*|y@yt?BeE|*0bqIqPp z(i{Yh))LcvE#_c1!zIo-t|~5qEv$syafO4l?$ueCRgH0<2-{-&YYj~k+s|VY!@Mb9BG0Pf`Clr=d>Z^>M5Lx-xVN_1r2hx%YwpmR(qjC?U@{5}9nnk&mz4f|W8t7}~ zs$p$m^%EudGjDHGCt@F#jZOQLt0Ip5fi+d^MyX2K6!V)MeW+R^Mgrq~grh5;gHZ!q{cDY1ka_v=+c|4~>Dj#B=^HJmq!;pQd zr<$?T5!N2V{tvE;wluERK{kl4ubkrdr8x4=vtA+UoyLxG#K$W>)F?C0=tQtx6;QW@ z7(@y#s-BOE;lj%L2tLHKyeRjt&5XCVmO=5lppF0G2BGgdPE+lk!I1uqY$W{}A^Aen zo?*4=d4vhQK~yQC-D|HAT+%Il5XnTp9>YhS_M66EIkhf$gDTI5TKgv7-{T26lGmwp z(y>yvg_QJfe&S*Kkl;Qxw&3@{=a(~NGNxkT;t6bra*UO6#Wt1(`Ae;N>M6?P-d}3Q zs7Z%9#+mK|U_a(NmpIuDyy?^z2n_c-r-P6m9$w-47n})$hp4{#Dq%lK@%{6Ly6ZtW z=QT&xnliTbgRd$!@pz{ycH8|Gp1W zDsmea@zz~e#J-amO$uO4z< z&j(#H3{nvebkd_BpFS|4AXBujvSA{h3gex#Mb#yK&TGe@Iy8B0!Hgi~MI^a6^lnlY zIp*>|FS2aM$eSH{_diY4U^(w$KOdB_4>o+?pj@6jyg|8Xa+7>A^?du$^3;f(%rMQw zUsuee-+kd_uwNw5ODcQ z#b4X}!QgKb>aV@?>6+0v6?xc>e2GKf2R(T7@osvYdVl~sOEF4u$9*H7NdBLvxIlrM z&hr0!fUEw$6`rCVEs#PWMj=I&4&u{u9^&I_58`lT0#xU$A(evZ&8ABJ^Xu5;dpB^? z8iFNj5)nH)OA*Qqu|jBH$Oe&MYoqlf;v9VrYK0oO4Y`Q+tK~-W;|oN|`C*K<5)d|@ z2b8-U&Y@K+#o`=9yslC(#9Xfi(`O;ayS*4Z`Xz&Nksnbc?p+LRC}OT3#J|W_UC8N} zX3&~WyeR@6@)Gd$wWjA##itV&9Yb%Fv}_giEUOq7=a|Inn0aq=hd%~BE^gfIf`%Br z=H!*lPbO1+Y(O@0uHTtMe5CZ)0D0uR3Jqn-tl;TPr_s^yd6uToq~Da^;;_-|@cC~d zahul{8A;6Sf*(~CpXGUW%O+b0CO5wybnsO7X4)E%#VSEtnojhrgFU-s|&rUR3KL;RS0hF>rb^2|x4Ac%vf8!>*D{KD7ARXX^h8I(#J zcpTM{<)|3C9Gypb%KS5W(alqmltJ|vf>qo(&`vv4jNwAg8}A^E z6Q6y=UC1^q|4SwCCOB5i{l(w)%EP`sMX3Ck~W4|a7&hAsz!Q_6J9zpa8ftFIa?Hel6$UOkq_>Ns9@>W8H0 zhR2wt?M8wJ?d#eYx2vo znwfSTb!vx>8(QvchxRE4TeY`ML&W3x?pz#(Qp}+V;8h(Kd5}sOkQe;1U3z)B?AAn= zNosPlWqOEu_mos>$k%T2^n!ZV`FbUyvhaJ1^31-{Tju+zt&tBHVJMNrgfGb0S;z%! z^`+grzY?!YA?*7XVpwBma8*gU_kG1*Px?%>u7R-Rzk%$EGDej2B7?i?b(_Avl)It< z)lHjm*3MbY=bW)O$RR?s7`WaLV!E3&HidJKnRgT0{K!g~TB<~n-nJTGlWWdjd$;E_ z^y%~Tc7g~(@ff2{;_kF3nV`#qPszujDi0oLhsk>b*?2n*qu0PJ|EzMI;DW5QsWnR? z8E?0s4~MyMsD_z0*l5i*-da}|8Yv87&vzvh&rm@f#fiY53 zm(H@y%Khh>f;`?Uy4zx3%0km#r6Jl@>_3+l;xS#+Ry%gonHp+d5g$Edy14K9EV0$X zbWx{swzg#Z*LdB^j-yWE)xNVw=Tj2aeHZb>V{aBB#fs1tXZjo_a<6H%TG~Jr6U-|g z#l)!g8*H;}XmaV*Owhc>6f_wty%ft~jpQO;r{Yce9|@fnG{w02-IA-Jz5ABwnQgkg z({{!FPQ65?chIf1%GFH|mt*c6&%z-W(yO+nP@j#wqdk!{*Jh^jR!`!>aIhh!X~!^i zrsh@ORUp0)9DClvjB{1wxs{saxv<$XNtz9f_efM^Znv0zg<+DkuMH8fbi1A|8HR4Q zffHZ7U2Tcg{E)5a<90QZQKU_rt%U~*XY&siYkpg>7=nXy0)6${CG?Vq3^oGs6(&9# zrjS-0=RWN?=T`G!?Ks!gowDYEdKHgff;Q0E%Qt?YS=d1G%RwdwmH&l2(eoAud6MTh_QI@G&Ob6(siwc1 zVWP&L@QR5teq4=GxX@*xnr2s)KUeusC&IQ<&o z)4TF`->70ES_fjfyyrRO49M4@jwgJf$X`;ZgCp8S;uBhXRJ?J<2#n6BO8whd@Am$>!;vJ-d_V+V=cnnD z>laZO8$|~dU5X2uez`T3$RAAlF(L+CiC)IHv+*#HnAoehe*aNq9Ss6rfdF0*Ub4+DTf695YU3IND~N5Fv<02Kgq!y~i+umPX}fS>RP zIIu(du*t07rFe}nU->d!gK;tO;-jbg5A(Oagg_6pArf>u?+QF z^SAj`0CWR@0RSfen{dzr05$;P08m#0@C^W50H6Svz(FqngaDYp>!{9hFh5`^m@|z1 z>MOz451|i3;?HNpKZu)DuTq9+An-Un6+{guo-<0KU%B0I-BdfR$Km0ze!9((nj4FajV900wx3 zIsgU$_yd5ZYG0?Z%d#W6$uLhJP^!OOCc#~6U&mZ~eXjl!WzniclC&6t^f;df5AlGr zJ|;pX1E#O!js}xjp+})HDSWMN2icZxrZ1wNDacB|O@(PHS)o}<6$20t2PpuU0gwy; zw1DtFZvYoDmRK3PY;Am@aBeS2|HnS}a^G&fCtY_G?Q`-#feEB89vp-&9$uP9Vi~x( zh6AyhDl9b`DeUd|FA4Gy@wDU6R4`mm@rhWJo-se7%ooKAi+ciPQQA}PlBAbMqRcA?p~7h4z67$~)7xa*>cIsYMBUAimLqMXg! zx^zpTMMyn{O`&FBgEFJoQgK4|p$Z5qF)`;(9LqjD9~^h}G?7fxC3;?{7Wi#9p4{Od z_gl?1CpO6XR-8cYPy!+>LBxORx`0y9j1nlF2EqTin_?0P=C=}~c#3C+xYI!RtLYY{spFTW$Bd%}ULD~p} zvpT0u62bsBzmxlZo-#!!W>0K{0x`nqvIryR31>wtWDWem(TAPZM+o~*3wJwA#-e;5AD{*>zwG09WQQCCTQeO~o~(r^B4Ry7cZt+;{LT0NHCG z`xs=qfo#z1d3ra|4aoimRGrjW-(@^|MkEM0nxxL=|2P$a>=@<5e07#P z<0aW*rGd}>-BIfy3RHbTswr1jm11tdIniyI6EO20y)+nK^#x-Yji&m4Rlp<1(U3+% ztOa=y&R7`SmoW9-XviX`dXr;f-Z918n)g2xt9>WZf)IhQu)YLk38NwU-0DpRUZbVm z-0H*giFwx>b8CKYj)rt0;-!ih_J(xnf2KOrX4b9JqoCXplyf$ucMvZ@^uoa*PG7^6 zn$gemnWQG^(IlRDP8x_wc(AgD(NC4x|D9V5g7-i$Up!|4$o)5WR8hk$A?9*~G?UC# z)LJ$jn?#xRTi-NlHLJ^iaN|GrO&6C{Z>Y@9J1|%sfc9O}28sDWJ*0&-eG#DQ{{OL< z6=WfU=pQPxgdo`uB-t}qVSqZiip&1{LNLz~Aae&~rVkS5f=p)yt1yr`0W$yFLMH~R zVbB;m$Q}l<|6kndeXz7HU}-@EuAtdg(4G#crvfxT2bT7~FJ^TEErTp4kg*I}{?FYr zUWQU8>RfM*9-C`To9m)H=N;ug*6haDfhQHS$u&HXBY~# z^Bf`Z=MkAIA9h!a-nk^L+B_-o`+bC(#fNs>@My-s{R&rsG|25v#O3v>U}nHKCC{rT z3Zx-!%#UZP-LKFTNWXAzS{vVNdaPtY=H2B+m3^#wi1s`C#&HePtWk2+<_YTRDdeuNqfUu@W>Nxwu%-ha$VuFQVs*rT;t3Ge$N@zMAk{!lfUrj0+c^lc z2pMuIIOIJGpG<8XW(-Kb61UGJI@9%M}0lwwn8!rXdVZs0%Gq zKR~{!n^t}OMcHpuRdd+M3xc=ay~Y&Yy(U0RpLnyMBwOB$mMI*DiU#eFlN&$To=S z$!l{zKT#>YYL~JlYaGlY`Byl>28=zGNibbJ2DhEylwD`Ize8(+3xAAgw#-Hs!}+w8 zF7CuK8SKO!2Eht~9Rw!`ZiAfy1R8TTkvstcV+f8QFh<}A0)qrc5Ex@{G)~ONAQJN@ zKwz}N5d=mD96?}oPr<{+?r3@Ez6PG=^0}?%Znd^WWA^DqQ^zW$w`3U+`0$>*U)@*) zKCdTlwo-aW_P|ZB$#`I(EMvW&lrq;JG9|vp?W?#W6o-K2_cYJ`<4%hq&d14~aL52b z0#Og53&b#pMcEUlDKwmC@XWl1AWT4*gSY^~282Bb6rOqIV&73tcf1fc6a)+e69`ri zoFI5X2ojad{eHZbHsj$Jv*u|Xu8Q@9yIJSo!ddxb8`SpX4ZELTu9V)iOQFhk;&`SI z_}_;ewXzMg8o#q`#xe|2{zvbpos`;;#SKhAehVrBebqaR{3|ft;JNr4xU$Pd?R4=a z34dYZ36Nc!KzBAK!5}{N?g0h}v^=}zg$N$L90X5GJ(~N=wPt~YPvHr%Ted4@G*?B` z2{GIQ59_Sf%f`|W4u+4ls81*U0Ke>o@JMI=o?qyDb_SjKKz%WPwG(3gCtv8yqrd9B zc{}2pfV}!R9AJbU2C(L+5F!-)Jp_%UA;dWPJ#&#Oe!H zqltC4gNQlJ!0OI7p#xWe23h|xPQ!8kP2qgtj}?FLIf@8h?8tC22|g={$WMBi_ysI2 z5+OqKUTw@H=@ZBoV)oRX_CNn85J;5-S$dCP3+V)GO~$Gk4mu^;%L z0`ne*^Yh8l>&TQH31b|`W8ZMX&f=A8f|l)s4lx4|eKVdsv7h^ba)mOLWc6k6q!I z_VfSNdi8RBgLlx|gu=JH81u62)ssOXDkwV5hUr)RYJ~~;g}!SG3A1*>KgtCJ?<|=8 zC&9!Pg;F2XZSe>om%s(VJY+F zWT{Q!#_){Avaj@}dJ0vj^GAu+W^oGDsuOp7%6B?7%l$@AW&MoZNcyMrZrR;k{Plu_ zZRXkk-rshFX7&85lY2t{&pz!DaJw~c6*E6q^%7r94G2ItMX&*80=(SxqSN66R`?0?4hh3Gic7XFj86b(uRmokGNnx80 zj&?+D6gyGVt7nvxc+;y#n~hipS`H%BtEVhxAhTvBJ9?l2v@ru;YGzQ;>mG}! z7`gW!vC)UGE{;YY_E;Q^;XbutkB(_u(T+y$h8UVoY#vsM8GYU+5z;6HU!_99iD(RR zcQ2XHw$ccu?CFz4?4NID?YrGvp&MHVs3v0T!CRVQ>wa5rP&7%C$$PX#>fKca_jl;n zd>5O!lwOILvj2Y_-M;%8Gy4E0UW;(V7c_PnJ2u};MOCDZf|@5!h`H95bvs3Y4^NeIEVJxuCPhUd#SaCZ&2-rm=a+(ricYnViZ8n>dD{T_X9V``t`L-xU%X^VVDEO=jQ(On&_DRm>l{rLxE8nx+H#r*yeP6 z1qUPTW%$kXUeI?Gh9Lbi45~u1M4#7|4ny(O&@@^QO z@O|}$^R1?3Lw>#XjIu`1tIPZNX93|V@PrZYp&oLayJgWN$Iq7d|pkWwp)c?}yWWR?Ug`u> z=8fOsLOG6iP#<0rn%<36!0NZ+GSxTzALbtN9rQ$vJd30vcrUyi;hotXQ82WdAQ#x% zx2aog``ml8i2IZ=N}a;`u94?jo_M3)QGI$}ci|eQXC!|p+)CehUim@b$Ah)HKR0|W z{aib0D7%NttI<7S1JIFfJh-&Eo)tdd=ymMc8|-MT6R?`t6(~Nu0Rku1G*H6^^6hF@ zBo)&PHc<5N%GY83Xk7FC&;erTQspRA(CC!|#@U76YgVFMubfgzkZpZ)Mm4OX>E$AJcB^|gsjc}>yO;-ttkC4l_g%+lIqx&x?tNn% zOx>kJb2LvHh8i@-Ly`dz!+S20jv}xnS4qb#HCj_hV0hytNFXG#FLeu9ePJTtJF{ZU zXopOb1f98OHwOHjXmbo(YHHw(?^0;tj_A+mBH3a?st6=mM^+dL53_~zxgfRdYM(P& z9C^BSR57OQ-BC10On-Dzw6~<;nZ(J?euAU^J((U^NU~8ztrouHBKb5v&Cq&vs!WSTIJ|?`jBb3AG>k_sqqayI%4+PltH;gO7(ZmuJ9vOsc(40 zka6vE-Bre|9PI`bc|`WVp|bO*ut7F9+021VEWrdCBG9A3{MjVY!><0Wpwz&A?Yh}ZFeqVLM=OV`LbA3y-zg8US z$)p@=^*z|Txnv3#h*=YcNW1ZPU@Ysw@_R)^VS!G{eS~Bi*@(MQT z<6d-M@9YhnR1C5=lmAHWj!(>8l^nFR{9;4amp8hB+U78!FJ6&BIUR=6g(Pbhc6Wzk z_EO3eIgIX(etpT%C1Ba9>ZosNB!}7-_yXs?`I$&K_t*tn5yVVXJT{b05^jDk=6Z8V zFeLv`zaX0}<7TzZQy? zZ7j{|%#+&B(b?Kt{ACjZrhF@nFcQmHH%CZaM!JQZ^G;$iXNhYZ z+~+#@YO?+?Bg^7aYmwB9l+}kEqt^_K$pey)3Wf5@ajea$&Riv;ieKO8G7fCM)=@Xk zeGxC#;lwy_7$GI!JkP&Yol#`*rAg?h`*AB7wwkY2QS)&6^XfKERD`9CnRSt;u4ZB- zcgZQ2q>NIFC(cqbGcr~Iinlu%n34x%b}f+2qPqO*ZcbEj6?dOrJ%3)mq}h`5xz)utk~GmU8gr;jwdRJ0s%)n{4HU-V*NE`C7M7TP(^l)PXr z_Wt!Ys4Kdi%F*`HJmu}^ymMEQ56hW#zB(uMnA{Iyw^a(#0ZLd1? zMu7|OwDJeK;z}^1NUWXePyjQ*YH5-BV&XlwkK1U~+T5yx2<&cEIZMBm>v)k?x(|Gg z5cD@c(xH=bRUdp3;CI88X27IZwYE73v@2Ye=kQCY5xT(#Gi;ix->Xp=W{yTrKl(YD zkT0{$dQzb60-y5*m1D8i-I>sp$3C9aQ$EOGa^H4(Q@GzoYax(-I+{j%Kw1mIWRd4L zE?&;hy#xzQa(>XHue1YK9d(4&?ciaN`aKfI)83{`P(Cx|70L^1ubYpk}s}C*w#ens)8TDmkSxW41LP0jeXW!ZB+f` zMbsk(fi}$rV8+ybVsJ@z8CHw_EM8+Y7E8Pup2jG2b|CE1=5hD=UA>Gs}ql6S|E_z{;S>5E6DycRRs)Q$~;Gd10qaY2$;+vjvrW>cKh z^vJ9n&q>Vk-H?epgStX1uA@e5AG)22*nF`S*G0~A1z_u0{WuRMi47NDN1$e=)3_^e zANto;OFhNSF!Jm$FL#DZ5-ekZ+HP9jz$+LlkgSva^7K)bu`RKd$1G#QvPyLVGb>6E zzk%yJS?2R*d+*glOQN${O3Y1lhTLljp_2wA^EO(c#`b!7_*geTb36tTpWw7FEi$&n zw_|m>X;sOz*{9d=2J-@I70gNgD~2^*um{PU&_Dx^o%QZ&x++}yrCms3aC}Sc{@R34 zy!khnacP$R%NSoZMAVOLwL6oX!Df)aSnYDKN`}*1GhV@N)`M@`)rGQYnLwMbp};%i zRUcV(4@{N3XOr1_%9ArlV>k~j#=GEEQ5~bCTi=>V3AWG+WC`Y2@e2OSipVIhvPdo5 zB`5MZHmM-HT04e37Dd~&hHC-6n42}eG&gy?S*1L%tDNnK43cQm#WTCDnM|{)tE{gc zJdNVm_X_40=kW!t71x11o=J$9lxdT=ZBu@W1M5{EH&q`PF-cSnMG82!X6e^Aub!CJ zTBU#W;iG%f?NR4r18TG`LFZ(fS6QP=Y{MtH<0u%0<={Kjcu6&KJi{e$gFmwZhQVx* zUu~846_M{u8>dhi2E%UdHN#P$a}cs!h?c6sZE!1|BMVx<+c`5xqb(K+1!LXZrW6e0 zvO~MTdDG@qVZUNR_@t=PL;Nu{a>98%Fm#mJ9m8lgC>n8Vf-(LttJ=)(PnWIpiQUG_ zbl{RhbH|RyHO6+H3=#?5E>0fX;;?0_;(ND5! z?q~{*MG-)28x#{zLxrAITW3)sHL z$qqN4@q($-g6I=6o)t=<8G%|C4lVO&oITv43Hz3dVOze2fWh^;Gb8Q*o%Mn4iP^{P z@tPltHrkF1rSS1q{UZ?#O3XAI0P82nBvH~fO;vBLn+ zb_4)G^3V1tY*P5QTIUR`boF(ubbl@C0<|SG5iE)UEQ0pc69nJCWDd*!R>sE2z`*oZmBJ4QH5kaI10nV=mAv1p_+hiipOaM*pX1duQbg5@XiU`_9y_(}cK%gOIITn70a?`Mnv5F!fz;GTaraJS&G z99(eVZhc&T!*s6SVP_QrfSJ%=4;Kzzy#HYy7#Al$r{A!jJFittgV(_TJpi!(-0MNj z&KLh-d;0k}dAhs${)R3%gUjOuY1|+V?w)_zqp-kBf7893oIRY}T~Yr_0Uc3MQJ%2? k;PnpjO99RQDERyNo>cisrvocJSYH;P7(7jm2a65-7i`0%V*mgE diff --git a/venv/share/python-wheels/ipaddress-0.0.0-py2.py3-none-any.whl b/venv/share/python-wheels/ipaddress-0.0.0-py2.py3-none-any.whl deleted file mode 100644 index b61750163345590048717b1bc65151a9cba7aa4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24530 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 diff --git a/venv/share/python-wheels/lockfile-0.12.2-py2.py3-none-any.whl b/venv/share/python-wheels/lockfile-0.12.2-py2.py3-none-any.whl deleted file mode 100644 index f600ddc1beef524f8b249b649b8fd4ec6b19d439..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19752 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

    a(_OLs|R8wJXf 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 y#s6z7W} zO@Q+HnrIsD(ey?ldgeuZ4)f6iRk2xnXN1~NU;04b?;f!ho_}#B zfkx1|R)mj47{pK=0gAWy8ww3`JmuO0=ihlNv=5E|pI0CrA->`EV#(bA5@FlIl(_&r zvtmMZiGJis{;K4tO`c%Y5#q`{B9LP-B2jrjys=AvHjKLVebUg~{Ys!nIL|Uit@GM)r05AxjR7-1p{<9$vM({%=Hv6t;}sK{|~qR z!_{P!Nt;c2gsw{}RLTIcvPx18u)0W8Gd}=#Y|K1S{}vTiL7aAoK2X8bo1bOu5CO@08iT-ex;XUvEuO=z zw45-4e}S!<1vD&(>Br1*lrmB+^+Zs;Ks8BP%cgLR-~#3fGT9-uz6|OC^Z`${t!bO7 z=YX_F@U+-~8|$AKGItsHL9l#$3Sk@x-&O2`<3-|Uv&xDFzQj|cSzj0|d^Zt8%2H{G z%O!qP^fej+ir`!)>19*|ETRrr0d`f}SnPhkG%3nE_#*71MM)wCw!Sr%RfM+jwayS| z^Lo{>vDe%ehy|Gr-u27!lfbM5{D}R*D|T_oQ`9X^Enr@M$O9p{R7|eFfNDC@o8xpf zb-*V&qn`&OE9$VGf=^!HT4i$jL&~Qxh9m~07u0#lqo`tJvhqWo?U_~>%bP{FjxQ^p zzD$cGaxz%bPlt^mdt@N{h&JgEUEJQ`2@;nT_Sp72jz<9so4T08rBIsnP52l}&X=k& zhZJBl?l`t!-j^S&5sD5hbr|=RHzOiE=42FyZ!EQ$zy*$e4~hpMtD2K$LM_vyYUISo zlsVjtwONI4)5FTLo4bsUGFs`*%#JXCSA0m2S!=M!^zagTC`G>!Wk;~BdGFr&l3NNd ziCCa60k6>6UO<}23V2-x66FTTo-&RV-VOH?_h}Dlm@?0mN-I~nc=~6$5rWY+P($9u z?|y!{dK+Q1>znzuL{8y~Ztc86B4iGS_M2S$x+16 z3L4kuxeYwi+B%5aWxA#0xm-w^*qjTiVXd5T79oXUW#L+Fk-Sbf&hn?pS{`+Qr(Ftu zq|_3UP@URCfyi8b#3Y|ruyF>e&A^2{8r+>lA2El;)%WAdR!Q>;d?2fwM`#lg1!O?8 zIX1S}J%?Pyb3C1;M7|t2&v#VEi$?yZt_VoGd>sGj3LORj0OP;w%G%P%+~L0ot5{{% z@}IDLUUlu;f;On#t}O|It()l8TKPZe(Fe)vyUgl~l@eA@dUvypsO+swp%*2IPj5PP zce9l&lm&BAqpg`|9TA>Y%%QE!m6p|VJ|D56?lsZ#jZm7ARF=9nsTQxNXsy~;6olo) z!5ZM$-iuT+U#IRk=5BJrBhVb*s;F@`uLon`bPgb=%SL91&T3tgPpa13tC=GTl!v4I zL!}9t1V#4rsJrbi?6DWo$nSa8ZuEi?RK{}q=((m+S9ij)0+y`RZh@I60a&_K3OjhkvaaxD%;% z={F@SgaEwar`5|P(HDmdIzNWkvm92z=4WSC;9}d7lvF8`*NJ!XV?I-YrB6@g68Vy zh5Qvk3IJJE`!xVE?3k>5t1WaY8f@{Bp%r}8r`gsc@tUHuGQ@b%+0(GxnaQ6Wr_RDM zhgiAbqgPAS(|mV)FJoC8iqAeYN0nuPAz^@*Oex;0`-?uN4=2a$$OMlH&HL5R*=dW1 zmm5;nMB9OQ(vgj}UWRhuf-|5STu;hzlkbG>GX*lubu?Jib>ap&M!_o+Uvi9&RBAZU zqzWzvoCC{c0Hp3?2TyF@X&;ooZmqnkcAs92`N^S432Wn&Reqz1O_eA^31{xpMZ1Ss z>T!0;!empHV7Ta9aLlyW35tvzXru5N;p3y{3p=g6rIclhTrnVL#(4w%mX}cxm%6gs z!xeOS!KaE%{#6toHC1NMc%#0*3oowKp?e?@d2t(%n9X}pxZ%KIR?jg+H_1M&lFS&I z$ozKrNebgJP35!${}K2ibf9?1?xgRan{!m=>ut5qy|kQ!BFH^@F<6QE(`Ao1_0Fbh zT4RA{C~3tE+eb}1*aYS_qrWR)9NSoQv|EuSSKv2lZ7-zv>dB8H03 z(CX@gJ$)27Q}SqQBtJUotLgCDLJqpgmVBX7&XCx=P*qzqKyjAB?3-r+n{Ep4KQkac zmjewZ1OUJU8UVn*=l@>T*qIyscb%$T+8nn1`LTT>fB+9%(-s{!X&q*@4lrpD$HLEq zL2B&;g&J!T8XgiWNG&>Wo5y>E``+Z?(=Ci;lwELy6W6xlNI!=FBvjG^!y&%L{K zy{aZ(Po|cvH}Or2e5gF$pjCPob(=P0NiZL(WCBX3Ez-YBH77`uPuI4mky+DFuG+KQ zGj7kR17e@p8~w|f&FyC8QmjYR zinL;5L?}T-dL?ca2t6ug&NsnlguzmkHaY+QZwmO@^Jk`vAU9NARo$M=P}psN1O(w6?2U zPuLuuDu2v6dzFrckx>swml$G1pr}ijREX;hH~kB_yN?Wr|D;d}(&Z001YtMQ&oS7c zZAUNj;7G!9XUM&%6VlkoL^fzH%JwPp2MA*W&v%B^0p3eo7z`K4Yl9sZBi zjk!`xw$?4iq-92^w6y{zq%Sl92wJ_rPAT~_CEem&Yc!C)86|_z2?fpa3&`V z6)8JNrRWZ}NQ+nGxnvJYo^DoKWt8R5O?ZXEk5)K(H0(q^Ns+~p-{~+uEPsoTknd+= z9qrTn7dm9iwSxR;seJ3cHZ(+cLr6?Ks&1Tx(j&c1S{&&Nh0#Y_8kAxBRK{R`a-xK# z-LKa)Dxqw5W02{_Mp!Pe{q=B~ExGps?LCb6vX$ObSRqV3PW$(_!%!E#I6eT6GRnbR zXg(U%kVs^y=Rtqnx>W@gLndevEL2oOz@`zwSgyrG1LaBFYP2%CQNz_45oQ-YOZfVl zX;db6MgPh7m(qeKCfy0!*ToBumn;T0|Kmfh}z9i&ccl|oYGY6vNX1c%$%qJXAtNTk3$Sirx)kjY(!{jZ zMj6^*<-8@D5~|aZ@6m7N`*i46wf2ap;4e^gTvHrCnsWbm2%Ug6uVAh*|GMo|T=%=w z1CEIm?^$y$pBe}ZIQ${}A`l=}Uuju^hrdnsQ)zs-m z%lzCs4ra8LJp1(RK@;Bk@sx}GH0aWGkAmGT&$BU?*Nt#~4r?RsT?yM*M|0izLmuZK&W&cHsZ2)jz{(%kE59SR(+toSkx0*`0w|3jse1GS4 z?`f#|Lvrbe=<={ZNV*mhN4uccA<10O-2+uhcHGOvYls60P0{#Evc9-F(ONk^W*KnM zAdNmix)<`=NEWkK&+U?_-&k`~CcCY{lMH7Xq~gUAZ#&?jk-2>%Fv=+TU4gli3Iq*O zZG0;aeXBEo6>=8(&Kw%YMJZ7){uAahx^@0$BS?jZ+Sne}lIg%c;JYrQ} zAHC6ew!MBxW#P9&aVY^)@=3V& z_rc-kXMb|!U>6BtLVcSoKK=>EW(PwesYC+)$H)9TWhwikT`1s7;Ab@*!Ab-9*Nr@1pw-QFS7X`zgQ$3jD^gmy&?M8a#1`o`*Aq- zMYl91KQ(9}h>XI1U#$B^;eUZ5V)1^ocOk8m$}vF`A@9T77e&MVCU|Al@NJ+Wa`Q*; zW14dKGUqKK!qB_k4}TxOCw&Lb$4=(b+6;WgzPh%u`C_p-fd&D_;gs+Cd|u}judoY3 z14_#>n!#l;;~%m%6HPC`*@Hn^`!?UwJP)Vq+uj9Z>_ayIb}Dp?Ak1RZRgUhBi?NkW~w&5pL}=%xjBZvO5l3NdT%oh|hVO?~VNpj4W9>+F%tH z+6n$1+Lg4z)@%Rlj=|Fv`mDU3VT{=H1R8b)(quyr@?$-%K7mifa{+T(UOLBFYiI~j zCivH#QBLnvYC_%A=mgq~M8NxDalW8Np6euY2BUcnHggtUCes7d%~|Z^JXaIaIWmf4 zczC^ieEk$W)w1oc=*s@~KX9Tm_^ulg6aXOL4*?$!MpZf_oC&}$j{>Bc@r+b5#3JtA{o5lLkx(|;gN^4w4oIYB zpM!Ubm7p#zpFpj-+>sJz9F&Yjz>+UX;#N&y=|fheCo9Du59*&dR~6(!tAt?I?umwg z?L6!t&j&EeVa42DNb*Hm92cnEfG;tLuZHnze)$|YhUZfPh2%ii^bQ!D?X#7R7q0yq zVBM z0}D)5%zthWPOuXWl_3jSg+QXhkZl|f)FUw#a^WoSv>^mIe9&0MV6!dMN}n-P`ivE_ z{dICO!YTAws7IGft{>bu`9^I{7x9{8`2X~A=h0BE4;;X!q{x!J$Ub4vm@t?`C6}yY zZ!#zh8ied6G!of`EM3Mr84cOVl4Vfp%Gxh8E?O*u3?*t1*H8DJ&gkvbJAb_AJ!j76 zJpVlJGtYOv=c%pfBPsME*s8!qv#D`}=}47jh&UTZI?WyuWA0gPiOR7#V1e;$ zK!be5dT$-ed)}cpEi+Ci5I-K*CMKN~Pr7Ljp5wF=iT#3s&$sKUYG~>zx?eDsA!Od@ z9ziNbU3!+nu*kw_OB%u*CUUb)&%HZcE8$cd%(}JSajj70qLpyVrWBIfeKmb@j&2j% zc@j(sK-Y%90a=Rq6UXLt7O0M$vuY`b&T010!lU=Z)6GUBn!gZqlljk z@`|I@u35;TZLwv$idDS(iy+||@)Qjk1l${9G%%Ee9fSv$rNv(5*D*6VC*N*_Nw@mD zr`ucdUSU#rY=3Es%csCRNX0ui>=AooV&_!W>};2Ttel>xnF-zX9cOD>*)H-Qp#r#( zOsG(4mw5eNX@yqL$_pG9a9T+kn);bjhn+t_CEKQ=h;g5)CCLhSCo;Rqn!S?Aj z?M`e-S;i{FH2RlFgC)RcD~M01pddMQ-2GK{A3g_SL$~xRS$6wX{t9C=whK@w$ZCLw z>rCVQIE7%TuZZkRNPDX~NhtPyTANZk$+cGcS`u;bEng>;2XWLTqQS}Ci68$e1;?28 zpvqqo+ql>@en?=+xvDKLJMkE3gr;EjI>`|`10IKx-##2Jr0MzlnOD0Md!iVa$H}6} zi*UX5x=R!A@cyo;BMXyF`~-olg4k{?E1Fdy=kxiNJB0(LXl*O2MK@nQaI8G5otL7P zG|bvS329y9>iAl4X3%3Gde}P9&O)HIFIVsV-$(@kL=5F!W<(?P`r$-c_EJFvUFr)a8cSb-O%f{H?N{1(-yf+^~d8IdW+vH z@fVr6C0?q1F{T<^u}Ql({`bt{W=q$8m7t6hH^U@5ZYWuYmI)Q(^JBrI<$5%gx`L}* z6RQrFA#17pGaIjiDv4sPIn*uqAsHd2vpKK(_}bSGYegdr4Rsi!_%`=CB2^=9 zt96}d)&_e|L2eMh3u-U5gDxM};0W|cyMNq|rGVK-w6~KJ#C9Ti_=gwhHLssSNjsmH#{|OrD-bRs zM+$Exb{n!rbnW3gc0_gwXFf%cE49&3s@Hwq*4>R9qYWWzNW;E;(j2lzy?m!Xd11J%dA7D*zhn9mA1ZBeD!Ib^F|av2jN+x_c%4W9-1ry|3|Hr7HU zbHgN0N4R`+c+U5bVQU%{M1Pfrvfe|qAHSzY(iS9)gQT+eXqK)Sgau5ycoJZ7*Fa#a zwA4TUI21z6ZZ;hAa_ny?5H?hOX%@9w_Fyh9Yy&Q2&vMdYTqa8v6=Jy*AiF-zB5E&g z82TXAg?4~Up}t(wjvJ6ca&$Qi$xW%*U&P~~sFBYl*>1X`j62>&3K)w1simkhSMLnj zY((Y=*`p{xt^9z2_#pPUkOU|x7-Y93se@rCy9r(xR z%met%84J#l9EI~1`C%?tMSE7I(u;s+`;Ih9P+z*{6APTHH zG0|H)(4EC6paA>_iYdU9nZtqsUj0A?n71>P+wdIC?j?-KSqN<1h@rY rBDm8#ke@aLKnJ)IG99wsPUoj}(cGAI@3${=ZGT3$mr@PGZ%_XRyQ!OS diff --git a/venv/share/python-wheels/packaging-19.0-py2.py3-none-any.whl b/venv/share/python-wheels/packaging-19.0-py2.py3-none-any.whl deleted file mode 100644 index a9837125882fcfa90289fba86ffe6ff1f7b43efe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29100 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%0DG8pw2$N~g=kOcUK`a)J1n(_+F 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 hhvVg+KlY#DjiLG&2{|BiUwxj?6 diff --git a/venv/share/python-wheels/pip-18.1-py2.py3-none-any.whl b/venv/share/python-wheels/pip-18.1-py2.py3-none-any.whl deleted file mode 100644 index 2c21596ca571545dcbe1184b03c6e02a3ee6527e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198470 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%0DeCxw{tMRUEX1!_bG$%#xo9!fS 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 F{s-#4F(Uu~ diff --git a/venv/share/python-wheels/progress-1.2-py2.py3-none-any.whl b/venv/share/python-wheels/progress-1.2-py2.py3-none-any.whl deleted file mode 100644 index 13221cc4da71d8fc72ee853fa34c94116d5a21e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15676 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

    6U##tY&9EoX@qCkA44fNElak2n30w@i9 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 diff --git a/venv/share/python-wheels/pytoml-0.1.2-py2.py3-none-any.whl b/venv/share/python-wheels/pytoml-0.1.2-py2.py3-none-any.whl deleted file mode 100644 index 816379629f27772e9aedcc2a512d9af1fce8bcca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13896 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 DrVrC1 diff --git a/venv/share/python-wheels/requests-2.21.0-py2.py3-none-any.whl b/venv/share/python-wheels/requests-2.21.0-py2.py3-none-any.whl deleted file mode 100644 index 8636b6c821b0fde348d98ea8b198e97be0034cad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65295 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 Qn8O4Fe139&{MWbt2Yf9_h5!Hn diff --git a/venv/share/python-wheels/retrying-1.3.3-py2.py3-none-any.whl b/venv/share/python-wheels/retrying-1.3.3-py2.py3-none-any.whl deleted file mode 100644 index a69ef987635bed7c0df952c2215538aa4ae68a91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14137 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ϱz;TEMOZa%03bLzZxE32M%7qgTb3FH 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 z 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%0Dl2S?l;c%x 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
    +kchJ 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 z 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

    mmFt=( zbiG(_m?A6JXLE0_iQtRegVRp5dx_PIIf~i=w;Qr;RlU|`sj=f}C43+|zhMwd z9Jx7zH1fj6wQ@#Wow1V!iRY%YakK7#BZ3WjPH2t}BB!&dlfIEw5r1phY^_KOKsts% z3q6U$;PVTYSb_I2$-0QbC#0_90C&Uz+8w!y$xv-Rx*fmj5LV1LChv}h?*m2ZdbYiq zTYW-&yw^eKv?-$AeZY>{fV+w7!b1S{uOG&SL%;?)85qn^?N(=o6J{p$wkFxyId7i$ z3p6?68zp}N>&@jY!PW>(*F2WaR+i3gXkd`6B`34JQ@8*|Fd5vP$?R*~Q##f&XRH!vI#B#rA|J6zebG>1!3hFfw26C`Iu@*e-?se0;!c>coP$U1OYXF}@# zxHU_Kwju5kALcxI8(~{vaBz?tySK6kP=Ca)$es^q&|5y!HP3&})k|RGbq$jl4)Z}n zll4pFl2Vb5_&a~M<{Fb@4^hDhX{F!(IV<@1S-^=6kT4E$nWRXWrJxrSA#I<8Z9}Tf zT+`4czMF}}wa2+%*L0~I(XE=guY27ae*ONysFX1nilM>e?$W`U^S`FQRkf+&@T-i> z{Ie3OonNIfPpi;M%%sEl-%p=T=brYkN-a#kBqMk76Utp0;Q~=;bknH%@@8R)^Ma$U z{a>~ihl(oc5 z1Tjw1gQ3l$JukpFx`lz6@8_m;7;2ndf&=|LeI1f2u22MiQ7!iweZn*Fs?}F!G8>kp z6Ip-XEn|gn#s>+_+f|y_Y_c=q=Q?M7oX)1!CyvJWx)K(uJ+J9Rq-+BYtSZe|N|MBr zCjxs6{$Zul$9t%^v$V8VW57b`-~YK5jAKg7N1jzmFT55kCBYa7!#fGWV}>kT3L?@o zQ5R*L(G|N`BQ=7aCU`2VM!Hj>IRy*6j7b(Arj?o_PxaSBtTB{iDXiThmK|drq_NOg zES)p4Gf$aA?c3QkifGVN9-a>8(p*3y1bv3>*E>0OxM1F}YF|q4L$LdhSd>nZIY!)C z4VtY*HM$uqZY4yo`Ll#o%bhyT;lpqB?FqG^zadDO!f_5(%ep~q{*@)B&r=X++eqK& zWbwGRoQP3_+3Y|KZwG_;pDgv)L(F$&aHHoqS0*7cyXNss=yAM+5lEEyK1l`zofbbS z4O_Wx#HqNa%~PorrmgVce8+>~`@HNQ_xTd`6z|S@Q$fLu>v~~>hLg?70CBQv(QgjN zCv3*-hn@3nUcg){(@xkmUbpF(*mds)|3jB-X!Y%?^%h*5nyzD20IL*XxM!i&lN*Lm zqXX(%3q-8@)#1}fTbiC;Pgm`&q;-BpYb=soSDQxOAj-OZ^U0@3toStFm?{@k*G^Ia z9KS6uCKz8n_CjMMhLkk$sto55#3>5bY(1g_xSy|hQc*29{C@`(zu_Vp+vh9i;$H(^ z^1``BUJvfea3pvaNJ1$8X;O}Y+!D6+r7fkowGt)R-|ah9L3+#9XBW5KSn(9N88DL8 zdTKl{AS)p6&&oi(25ZICGl%)V!N@l5ywt>W7MD)hPHFX?RhTFLkFRqG5(Vh8blLUF zw(Y7{wr$(CZQHhO+qP}nuIe{2i|M~(q8GWnk*ljb-$_87zTiorJKUBwPfsk_(?$S* zZ^kNSKyk~H^WZ|ey+`*|2g_Lps&q9@q*2S#+*z@Ui^RqHy$KdwcxBuR0g(xvs6I3#ol==eO--{ySZ`7O`v^+V^k!s<2H7%t_`fQ=0EZ5vsl9H`K* za!m+mqVuKwk9aweTB1O}OHoDC(nyIrlHb8>6Sj~Rgvt+Q0-ib zaX3nrj7$K@M^K>$e+8LFj6A_xRkqyr?xFh*-4*iGgO+64Ei`NVYM4^n1ffE6+pl6j zF^;yrj_7zd;KN9_#37DqdmzqX5w0$xk9t4<@}vLFnx29jC&y(q`~iAMch|Zc`iS!! z4GiIfnj{xr^Qoy+u|RB#A=1PU|9ig6LCLROK6JDqf<+uJktwV6ef;zEm$$=Yw$w)W z+;&&aguA-0{j1?`vuxLNApQG8TU=0Bwz;Z3gNP0mFeCH@a>aGPQX_kYzJ( z$0M(NkHcKZQSO74mZ2MyWD?={mgR-(VHC-qF-)y79Nm41H?DGRDu^H;_QJVcuW;4n z3Bz-fqzbbL4lGU=b*d@-8oV0r#d(0zwd*Ia1t2KKM2PeEFs>1~rw^0LKFLi5yW;|6 zWV<7+hd-@QONm1AlWbmyE~;drg*PhMuY5L*)kQNrl;1wPtBiiEv^(aC59^x3g2U~o zjh^uJC62zEFKhg4nKHUpl1i;hU2LLPYqJ`sm$N1&-8M9pJvG%fGh2$Kz0vm;F@sRn znZ>HXYoO#>4@gDY8gQE=8Iy%FO*EaenuC3{{{Wn86nqTW22Ei1L4467B0r$!&Y^|d zUPc+&Oec>8;|zb1C02k-r|^5}t*)k36~`=~x~~LLEYoY!O~|LYSEVJh;-c9LzL_$k z-e5?!W_i56?B1ziZ17E#*awT|4Gf8s9>^I(G=gT~6|bLj#q;ZMbcx#BoAyX$VT3C| zq1=zr5UgZ@r4{xcrZ^yXY)1-?>3v(c*M_VWhc2US6rhIXqSH-;(oeOlJ#HU>5pF31 zD23x}M#g*f?9JK9v)1gO695i${w@GBrm2`ko;Rk2WYaDdOyoMPJK9sSvzD(%K&w_R zFMK%n#zokHSM4gSx+csC02#8B5!{imx6Kp^;hc{5dB)i|!!W*o=P2ej>FGP_$WR zsvTZ;Zt|0TR<|1jP!|M;nK3`F(T=rk7CS4GPoRz4Rq^I=YejFrq?xsvFW_YPn)Q^idNeP+RkO_nThM#m2Gp<_7JM}25<3GJq5VRye4+|clB z*~0|i@CE+MLF*=g!R~G-=6zcfw3X@EAKiOQG#y4KRYfox%=GL9zc^_7)_5`3vS)vV z_SHc1mP-AyTjC}unKXT^B&YXB2G^>YU{14q-&*{vzY5Az+D|sRx;na&SfE8*i-#A4 zErARX$XJ&CF{~}O0Jxl0fhA?PX8HHv->m-9Up|9`tdc^#I&Rhmt$uEcpI&0Wa7ciP z2cpXpE?Tb*Dsaf+N(wv8NJ+jZp^GF(ud8jyF|-=Ji(}GqJ(Z?5PoGIL8^bd$(3tIw zungTcI(Olx^`+w6L*0TqW3_;4=8Dkp=g1*NIj;Z|hoVo~oFzXF5g4c+5fPWTwat%zq#Prx7x&HxR$N$KsQ%2^fQNV2O0zgGKbTvP#u>4Ysc>SS&1>q9I)TzJ2`Pl7I8;zg~UcnchfT25)Q zb-Q7Y5ms}LWPGV22Nh1tgR09)T2iwQBTIWbhL6i4(BsKAXHc&jG=Nb9sn|I;KKp4^ z8UuE_{qk=AI`VqiAthf!-xOZ07I!oO;T@aR%A>g$Alxs}l=r^Lfq!7)G6I#3>VS1@ zx#%N2srF4{b$%DVpFsg&E5ysUPWn!DWw16I<(wF6fgFHbM(;kO!{E9-?M!SMIo^10bG$9QuFrFzo(m}*h1PVemBY|gyCsY0n~*74Sw_!Ej> zE+&-}yXkWnoeO>zud;p5C9pk8^JP=lQvzANb;GP>D&C;YSgbq#TNYD&XcQIXgqwtw zs?UAaTd-^NMyq4=ReSA!Z26h&Bq<`BQJloYC8W@x?s{1!#HhVy1x&6vK)!S9!gW5~ zSLhfRI47EF+pf2CK_Ly%pntDBED(K_={=UrZSryGT@#pmeSO9l!!{ta5g^@-mXTgA zE*8b5Z1ILLhRShdaJV2pkggraS0;%HLOEQzsqb^$BZ#JW;oUNO%#dMHmirx(oP8}3 z4Q+YM$~qahW1_5~+U~JfH((f#AKkHDx8wxyw`^mJNBCOg)Kit|!OI0rRG|dkOClZ{ zb9z>-T!&f7thI+f8>bve^TP-n$Bq|p{4wg!Du(LI9GrC_3BJ#I>}Pkn*$+xC^R|n0 z^A_W7ynBN@r<_{MGhgrM_k#=Q-1l1EsEO9)lF8jax$Bt8@|ue3#|D?JU6qpG<_g!A zRWw?wRJzRub++NYdUF?&K15^{Zeq**XHKq7W42zHPqR*M!VLo=)*nzbveqg5xvncs)whleV&bv!aJ-Os|k*@d6mmE0$02%obV1nBS% z)t3xryR(YOvU9o#m^`VfgbJ`lc9=>UPdKQq&X*={uFSmmH}j<_W|cf#zadG5wMzS0 zsNt9U1spPIaHhoz+zS70ABB#!PzHU`bSb`mY7f0nEX`m%$50(8i~= z)1=2cH`@_t`il@|V#eWsA3%p_v~G);U|bPA@x&H^2iT<>)j)3$L`k()+4uyeNf%*g z5P%a6L61D+Dk>osT~Jspfo35r(YA9Pn|Py@>Tbb_GdWf=AZ~gzwqK`4&b|f- z!t?xkMElc*dZzDPm_KAIiG9UrD}Oas0#YUiqY&U2{H1{7*zbdEn7LO?U>XJsL^qVI zBykE6#jjrBNWdxGy}2qwFtLqm(yFhHsmi_<5ABAU^*tNB?tI<62b!B9ZEJh}Yr*dx z-|{LO+S=K>B5wL%@M-ud$(-YcU~7)4Jvs`>niFwg71&@O+momFnJjh$x9w~fr%qa>_ z_cZFUj9z>h-7t#vl!$sDcB|)c`TIYhqcT@l9u{x_054bo0KET=*iaA_lvNOFP8p9W zG(!!3eWs2Z=A!oS2gIUp?1#Y$!hlJ0XFNI2lyfyf+%HooFW$iz|M>Bo#hJX+~iK$G43MdiqtU5oL#Btra$8Q3?f8quZp@8@VTm38D zKAR?B`GpviK1LHX$T>E>5_kv^8#>1OINf*NWeU}#c@FD$Ko9yWKq{Hkq>EJZzA&f4 zGnm@0G|gjDF{v&+{)o7;&VqmbKENQcP)-g32qN?QhkiPd@rM|Pm%-SAk#2$vvF@x| z>5qZ(DOZ>#tni%sC-XYmab6g(-y%daQL^|Z%wbG0K`eSF%De|=URjUFxH$DtlP+UU zpmay)#u6oUoT@|-AU^sR=O|o#MctoU@!mmYDXa+vYA1wdC%9TrPM>KkU~O#=O4L^)1vb3c54R}E@&gY=G6j;5sZbI*t#Ze= z0bBE%qua#%?Iu|l>ZLj%nnrO>oj*+^#FqHeCh1$KvP(f?%*0}sM@8X%;(+kjrDxur zQQkhEHpKJ^htVy0L4zb9z>-zi@TqG?jEIl&`xOfkF}?zglTJ;5XE^9B)(X3i9FPef zGoP~8S|&N1cz1d1*>vMeoky4jHmKP;UF?;?mY8OQ&12<^a-jJ753oOx-G)5G%FRdX z#IaBA3NWp8dc8Wj!Ni-)u0xrQoe2{JOp2mgq%k3LtQOoU%c%tV>M2mm&K;~l;@0kS z%Q(;nOrmD~=0E6@w(d#`KG)wwxf>Z-%22w$>S~tqor+Y3BnEG@??^U&1#7*%_fuBwb#`CPsmBC+jPM=rX9tx8M~y#U^%H6#Hy{?% z^m7EeyuLPy_K^ID-g=_ZAiLxwTC@A&6yB58OO%`#v_> zfSZ(2d`x#*@bDOXC4YB^enYf_V~-3WZ`T9^tDXo{Q7+>1mst8oOBkQ>EaLS#?zb^h zt*AavosC<|hwKh;dZ%UNf(?^E*IPC(>m+(6``NW@Bkj$glGPP{%R?Ru)#nDaCs0Co z#FRn7&Y41>XxBQD3Vzm^+?P|tla~zNhGPPo*eww#Sq0^Y>V`Se)=*Q7p{zNPWs!3) z!=t7LVHA-4kd|(hnWEj_wcmm;R@4TyhS9+473c0c6f0FfUbqgrJK@RF8oe9D8w7U0 za0cpT`)p;w;@q9%&7~`7q+oSM5A_5$xXY5!JPoK(z1*@*M#1+fFacU%Z%mI)R2F+; z7PJ8y1N=nx=i#RG^Hx<9v8LoeFYFhn6S>OC9*d6wK>^Vry+gV)cNx!V55o=}Yb3fK zsjRX0$f_NEZ2R2##}+KGX$D0evjF7+MtUB0uSn)8+$C9DY$IC<8GBc3<5B<7r?Z@K_M5gnOs zq^XKCT`v|HVdJwx<%xem+kURqbF4sv z^t+sb4dhPsJ(3dbz8h2DMrtt)4C5Dq^!U3z6##&Uc;(U?T;nC3I5Y&)H z^binnUJn(tK%TP6zzQ}=yA2nE`x*Aqpa=Qlufe^EX2B7qt(rfQ8EOWY==elUz9H4f zrXhXmUlRR&;Ns0DDUln~wNNw+Hg$%rS}`}`xFNRVEVqvc_{pG+q^{L@(Dkdx}1wAV!Jv|RA zNkcg^HQT5_zr?iXAUiEdBSAe**PtLKF-}bzP6u8tKSw{u^ml=2QbzN?fW{fxL`)VR~{_a#?z+GAJCKNT}_9Gy_<_3Vl%jt_1P#kp6F1 zbF#J5wK8@ww)#H|G8N6l__!3~3DEzD79RyH&GnCEF8CJ`>HkHe)73S%F?Z6{rL}WU zR#CUz`U~%~T8nO_Cx%r8T6CQV2<*H#2xef2U^^%3PZjN=u2?iMh;_W`Di%@My_M%f z&$Y_BTAFX#sD9D}@Ab{3HE2;8&$1fQ4AGo`XgQf2q(jkv43=iaci7BCoU|S#(5O=R zr=r4n#k`7gPrJ4WwB@e^TcmPQqkOlahC%5)>lMSwSQK*f$PZ-PNh>qXGOG6QYV#0@3oQN^H_6SL+(9evkE7H#^L{>qr13%%k;M{#2bM}j^i z+YG+ql6XsP{Rs!W!Gw_&2~~yrvyv8iTPF5(>jpCV81|4enA9LW1#Qx4y}$RHsl6wx z1ns?a`+=hK;4bEG7jEB#U~ot`2wa*RYTMsK5}m?fVq_c(YD55&W z{GVjKFRMm2dz3fRWY7wsBXZvV0Kijl7TgDYDMzD{q+Bi;Ax_3% zYm|5G#W`klp#`lD!TDdXny@Cjt=>OaGBf*S$;Oa)pp1|;bm0jHZ$R;*+3@E^`*V-7C}4nRV7!>9G#5YmYWy1{`ig# zK&FM`V8K`+m$d{x$H};-U*9(7V^Pz;s2wr*nXqxkA46UlSpB*bDs#;_7jxKCq&riBuMu?NzcfYQ#he;=+Zx4;K7O4#dC0=WZoT=IjI=%WBb0tU{pc#2wvi!4mcBi0 zlUtbB7e3i}0vzMjAsmgWvJ-|3O6|&ZSSkq?`T%{byE9ucdBy zf&l=yqW}Ov`|rud(ALVz*wD$`*2eK)!l~A<{FiW0zi)K;*C2|_O@p{l$@TjBO}0(2 zo=}J>A_gp@*bzrfs^gL4GeprocVD#<62!!DIk&Un!np|PZa;H8*)Kb`>W&?@&q`1y zNfI+Fs#p%Glux2jB|l%oYv4}FU~*ZiWhc4N%2SN<5ql&yrFriw5{9p{zL(5;CW1dd zg{~Ck&0l7!K5A+vJu+4dodigqv}xQzZa1y*e5e;c%Lmap4R0N5R*k#W%Or{%Xciq` z9M8?jM_RQ`oRSD~PqZi`XL3YyrK)WP_#229G_1qI|cl_hRATM+}c zA_Frr$p&F_c7K1MN@-KMX7^#xt|&k76(F+le3S`0siCKh2`t}Wv72{FCD0u05{pFXpnWGQ}(NbX>UQB4$kVf zv!!m=zB3MusiwPVY8}~g)evw&Oqk@Wy+wlXAW4JV@dTRE?KuDe3X|p) z!(-$~nu{l*vE5a2Ao^-vj5(u46~K&C36pd_^kXbu!sRkMrk z79vywKee>Dleg(;IZmqzYcfPYKyzR#CBbs{EM3Rhg=(-ToAS#V zr>vT$oH9Z&oTfEVJy1afopHk;{8X$yx1#>`y^d9fVd7>q1)M)RZlsC$T>j>o; z<=@8uradLS&M=mf2vK;V0Lh06t7jM)HU`rXUg)~kCoMxEPrfIdv@N|pET||~AN1HS zty%!eRaPW^l$|l4cu5z33{#xPQCE=!5+=nh*sezt(`v ze#c^6^wf|-IE$+C6fvnm0pxQ)75RX+vWAlrSH9`Oru8Psw;^9 z&%E+zOnVPw4)31Q&B7d3mSw|E>$gHID-)}hQqaNKZ_X3xyc2VmvQmm8{Za*+l!uio zm#cq58PSeNx;3v|(HaCrnNi=izeIF>;i0_HmOLpWM?E5`08m<;z$FjKgI0}{yYOjW zd7$y?WMpn2KI_<6o!wmCU2xYC(fL$bT!3!eT8}rf2|H7-%0@vABVeJvnrK>kT6jCf z&2WLp0E5SVM4MPC$Ltx*M z#}Yl1KP(V1MCTBPoqE{eDrFYjB#T=Pyid?s4bjBXHAGk(fR4LP`6_?XstfiD=JC)j zR&iHx@4YM_j6!&of@hPS)`P(8{#1lJ=UPU(k)Y&F+kwXF zwWo!b5_2ZVAFyOz9}w6yYHEx)hFkqiAOCGetP1=R0r=6^YTP|qCdKBP`z4BCzhRN3 zR>DYACKr1Khu_h%v_U~e|6}O;JRh9GA^=N#OBk}5@Y3AZ-rk1A-oPHgbf5LhSps@; z;vg0APg1pw{N?cBmuzmAa1of!OFgiaN#=FNFInq;jL%{|0;jjZB-TFsrzE~Za7D&Y z{F#1Tmi?XZz&+qucJwzP&zc-h0%7mu)Q~$AQNUg^CLBQUP5wE#fUM*?!m#Pr1=SnM%Q|#iEMHvgA zV8ED`!I3D6a9gOb$ThCY&+86}Eova>HMth~(0H6jy}kpy!K(Ua=5mkuZUJt7%)Q;LC87b|NZ2t>L~3Q(yEl>R)MH`{+{v zsn|^;IscyGhyo&Bt~rGV<%lu>!>XX{Gd8&2!vCpK&wY!4-z0ttUiqQuOSz(*?0^w~ zOh*G(Oe>deEva+GZV7wp{~|p^nf}@rn1JzG8H_N}%+4Eid^A@mTb*<*gklp}ok+g? z+rU}IZtlh!!z|FSdNmACpQgS{HfBhsR4OCRRPxUKyq94;r&f<6U6f z<~WBqjyFD&)NqhKoq2e$iM(q5I8A(e5#W!&VIYM}(x*8dDB`qWCrmAj>l2xB$W#m) z;>tCp$Fmiscb!mCHzIy_>+oPw&=A~k`3FxtT&ZW>ui(TH^FF3uBh#CgoQ zTTPvGXY}RDy(nv>zRAV{Kpd(}kss5GwRn#P1ZQd>oXs?-x#F=75n_(bAJ_x}?;QH+ zHWOVW$Xi04^AbQmW#i^%DUpCq1PxEKMejrO{_RfZ$vmD{Ogy6>F= zvBwc+W(;OR#YSY?fVvlI5%8~Pc-!!Hpkg@W7DxY*OLyMsP+M2*4X4EphMAqBgb<0q00$Ii|jOI>5 zZViL(lyc_OWynvV*DxH3>fwPOrHT{I%du~gmcv;hBlhOhAVepY|Bej=vVH zDOAl`sqQ9L)R7`alU1NFsu%afjkHG;adH^Qg?Y2ViO^gR~(LgyqQWM+W*yL ztvMRx&o@f<^sni3N!0XkrU3$x)f042;*T~FUcR`3`ESHPt+0=pYHF-yhe+xhADkea zXf(dNj6=HeMDc(YKnNdSR9=W%qE0{d;7w?j!e|Df)2s9dIdbtT@qotp*2O{h4>z^@ z0!u$Mx*9Sx&)add?rvQsHqsyG9HmLhoapsD*-M4}S{b0f)CfY|F@=t8pOJA2t5cgQ zONND<>%c?W#|qz|L%x9jIVfel8d>~B006jR0RTYxZ-bJdt&Pq9os<5JNzq{U)@QE%tzHeJQ0mS@@5}pK4 zE6$gQA+BgqBTaSvs3q(5_1mf{JC5|n7NiL#B7~tS8afX0J@C#?h%4NZZQ9&thb)p$ zs2(Yc+!F|UPM6KXmzEpzrzRDWs1vSIGECntn20GaDy(xW!31rwlG*7k&P(Ak+&QF-Mm?Ice5h6PVJK;u){-b7ReUUxQDv%5wHA?544$$PiJFuqC}M2 zGYvM&*O1LekXocGSvtGBzh1-oXCbJVJibX2uzTi{)*1eSpEwVNgFe!lg{@48D<_`= zrTFiV4PB5%Ruq%7hBoZkcSs#lbRv#1;^Xomi|K}E#h!7`5K`dG;Px;xWk{7{{Xm_u zTbw#IR<6(=npO+~&IKL&uj54wm}>ISvPUL>pav^nDm6&->CQZu4H_d1W2a;nqeK>F z(X_3A$R@>I1EFg>X+&|<_+hfFA#!JHFkQkt@z679T>54HS)h&;#i@O35u9u_UVbt2 zZmUM??GH_?5}?>62VTx~X*j^bUSO7G_LQ6UZURya42EKrN2wibjzg)K9y@ILxJpVz zp>-;{?wcyAS%?~IL!w}}+J5DV(pOV^a9wcCun+?GyuPh5Yh)d8XT!je#ipejnlX*Ucq3qd!N+J^|0v*2|Jt1`zY!g zB?5jmopD-43otror#mfUs`_|$WyJG{K?tBhjm~&;z-+p#Qil^OF+P+K#aT0nm=CBw z2W}ys(-#7Oexw(^j4AaE8aH0qY&0(cGH3V#ZygaOtKMPc7%#*Lrg?lmpO_jdD!a#v zH-6HBEmb3&P10ss;3b-czQ$F>QKzZWH8fARWOkw~^bp6b>>#r?zKj6_>b19aJ2_ZL zm+d3cH9ltIzP0D!2ZtN;v<{ui%{dUPjCEbLW94%F=N?48cgHvum)nB|@Q2S8vNjJV z&Hw{}utiXYsqqBx2~V9<(cUh9{gSVFwgVeWN?J~^ZAGt)AN&!JTU|cl)qFr--T{nM zOT;X_f%38qsGBeu^h&~xA)G4;aJ-)l)jUOoGewwl?kzx7^UowPBfUcNnHRJyRIE{6 z+zUt_yt)WR=V@m(IZ~PqBq?+xSe3r8MK$4GkCZA4P#NIc$`Ix}ic-!Hgz8p)@`=3) znHR?bgzMPNjUGpx=gm#YRf=OlQdrxLU$aON_?xYSMb6GS4o*`Q6hTAGflc1|ObOiu z;|T#i4?wt*7v(`=5B+zr|24a3F(-lGAA2HXsBl>J!-X^((eike?7)LY92<2OdObAB z4R;R^*(DhZeBS-ZvKh+aS1EuF;wb#Ho0)9WJkJpA@HLn05z9i$@dPE2NSHvJ!9z+7 zV=ox$hGcR;hQCvZ*lIJfwgZ)yjqAtbvuzu)r1-re5T4!$kf_*pr2f-D|Go%=7J?C}qm%NF^SXQac=}x5GL=?*`?hj%ba1~%^1Dh5zlHf}PTuQKIslZj zF3hr1JI~@w)Q`l0j2-d&bXVNtktS*5#jOIuQ+d0tb#+b5^AC?Vh9_vxGCc8!Yn^a3 z)BjU)CB<|@$6&Ww1hj~Op7E}`wbj*;qZ?ZHHyViAvF|<5Duxf|8n=;GxGEkU8_TR* zsXoovXz#+_m;7)r4afwk6)-qMh*EHy4iIprQ0hU%G7h`QT_czP-L>Uu{Zzg^;qLVD zvl_*~KimM>`|**9%*AQt!v_nw;BEw}VuVMyJaGj;Pi-8ITQ7lO9^sd`#7+a61cul>0y|D0QAqz6!Vd%q3bH!Lam#ssu&5AV5gB zS!8+mElFVpIARHRftIDTG$@nt?VMjX7vug7;TaXKQ{$xfw1%}52nebNdt-pqu=Obz ztc_RLe&cN8&Ouk_B#KMvAyOb>C4VN53kz+@2Ut$&Uv8)3GKq2$;HG*U@I63sTzq#> zC*lzXRBskgb5|C^6g=6 z55XcJHP~_BDZFJ6Pc=ROet$?C^^9O)q@#cp^aHW-A(f=-c6al>{>Hfp^6z|==czfO zNhm{LaYr)6ZWT$Sd7c4 zK*=&#&zCh-vyspq_@p`M^kvIwy+zf`zmB)<bGK()nxb3#?(R2T{l_gPsMc8U~Hn=HK0NK|wk(jag(23`ZoLMI1* zCQ<0Tj86_3IQfxMNJdIn#-yKGWMWL7J)Au{Lin_rJ*sj)|4H;lN=yH^$b0*yT-7bMLJ6y3oI_8Bu5ge6pgive?U_N-h{ks&U59>#VX5F=#APCOsmgdbhxj z-=G`X=2n;Ake*w|;<1hQ!5+c8=Fg&Wgl=2u-DD^WYPB;z=`Y*|j>!(AX^@ZU8OE1^ z$e_#-3W?32Vo*=zA#2FZMQhSNO@Y%VoXA&0&V<{G83WMJ!0wa^qsz;aSPik67%n@R zWsIcBS_a&xT{Dd&Ny5GmK9y5dNQT zX^`lsD9}y^GsXz*p`tn%KLA}I%35omBq7- zUfA+Qj&<8>)9A*Kbpv9|3d#XE={|zP?I4GaA6+k=*9OXv@LAnGv1NV{%-u4Xg;J07 zCiNZxGd5`>-^%9eFJsA+<;BE-T|_iO1jyj=(@wO^%QQF#iPL$(tF;Z2V8YIG3k-y` zDNpt^N37fY10jAPSt!gS6jth^9eY^i^5y%16c)*SXI=LZv)X;4m+fQSZ#4rb=gxLW zdFDaO?lvbcZDnW&8`s~*FDKpEdf)V2zCCz^K#5mEMKY2kLNXI+wkxQ_t#dy6KSVg$ zcgM=F^N_$7GBCCE^F??&a4@g;c^GDKI?YULV*a)7t6td7al5V>R*K%B zJH#~i*nFmXL3q1R^+4h>5e8svAU`+acgl7}+zccln@I_pQl-=uMmf?6;iSEYQlZ^% zum_4wF7tNCwzCCH;sq> zM2fM5#XZ$5q1B_^hpYJn+Lep?wx?>#$$vIuJ&C6W1c&-<&s)t4V$vh`ZsE{ zznwi?TJGZ*H2p*UhjN{Q-61e-J=fm)AGs?zaqjYGig=<5lrRgWF>g>YGM6^wY*EMc zC|N|B+yt%l6H;6r0VoX}f5o~(*AXA|i^}w`X9b)rZ9V)_+;x3vnze#7E$Hy#byYFv*WoCrpM1@SRTp* zEsLt2{fAmC`v~i>vOrTJQ$El&;u|kj%uQ#!s|ImL^cV`P&?@i_*H3tOvb!@vYfX52 zdfZqzu{u$*t>BjafG=w=Y{vuQ&|VL~4te_ecQ&iD&f28LybF%XOzOG1{=Q&w8Z_0- za~b$h8OaGPbL_!^b`?-~oO~L^1%P3EUJp9eO&%5gyaL#guaVJySjp`lkae1qY0Vdx z_eAdKR<3KF$TQ{uNr_1V{}ayYHJ$3y$Tm^;V{#ICdI1_U)_?mdxoIS<<{dIhZ#34w zAnP$X);^ZQ3bdEVC)61#%_#UjNk;nv7w3WqD$$P+vh5c5LI{(Mr?8lZEGbTiurjxRAc=ZyNOmkv>jpdRufnHm^oH zP>xVVKzD7$J^F1!LDkp?xPip*-{Cr>MqmT$g5gKHn%x$2NZST69E|6gzPy;{8-jET zSk>6e?S9(R8U$W+kMnsy8q$LJ8eUegEUWg}*0Bf!T+J9eo;H#MQL_CT%p_Jh#0A-? zG4H5^er0g7;Q=qw1^o)X77+VTYl9Z5`G_lNx96^lq@S>!w37^|&S@#s=5WCv=_Fzf z7TZ)$ORvr+$>^NfL!np}M`Km@GeVX>o(26MpyA5gU z>H^_ly0`&gJ6R3m#_o;+8&n{M7UMoHnNT=AY<&%4HN7WP3R;Z;KlRS{BY{YKE@ImP zsiI<3(BNZqG$Ubs^`C@LYF9Taey@mw5Ddtc*^eWn1o=G+nUXO*&KmlJ-JI9)Ay+VK zmWS!|Z(V+U+dWI-nQ720_3m2AK3ff8na<-awm0y8;Qi;KSq zu||P=a&Fze*_H$C|7RZQv3mBJ?7Oe41U#td?ls8cZ8N5y@x`z>k-vbSuV0i72=!;T z!bS0Pqh+2GpF9!;i zG~OKcl4%#-ea2NPcORI~*2dy)u-DQhWsCK5!g8LaxV?xCZ)BEPs&o zPMPKK9b4RiCl?!MTDMYpC7GtFvi29Jjw2*elnl~Ft-T;Ng#@3}e#wt@)XUL9B+1^( zOUgH%7}2IjU_~({yfui^O-2@Jn}*fT!ecKAGnZx|j%u+8(7v{Km{VbRw_R z@n?sEQ*hi<#gg6hAjZ!4GE|zqJj%5f&q{@sG?EUi&>alm*wUS1RYHYLxqoL^E-97X zfHxQm&reUuN%&4V$#vP2n}bpA@E^qvUdfZ;n-f4$WM#cw0x?J=g3(--YVJCVnpgv++3n6{lc@DO^W`s{&bL-BKf$QWJ z34a3C`%Us-KlBy-!sf&?y%m%Nq6`*WIvW=kr#ZH-{Wn$2x2t4RzrK;(_s&(-U9!EO zztTH&c(}b4wQ?J(LSM*^A9s0pGjvn!0MmxEmf*Jj{_^iGJf`mUbiMgxjMd`pczZp5 z#MV3ej*f&Ky5mCa5 zfV+co%n(G`sAFA843ldXkI+dolHcy`jU?29O(QC*X~+lN;46*oaTv;k*`SInSR*92 zd|sn~*kNk$^ojr`Ks^K*zrGbYF-N`hlyv`MuAL4qV9i#-fED_)pQ>7~xO_;t$ zPN~P0!w9L!9}i2%yQb4E6}k4MfP%73CMc_$(h!2d=kcA%ByLIr^6}x#2U#v6C59P5 zAsi3it0EWVeJc5FSd=Gt7~4ZsfaKkQT7nl?P!}aS`$HY|+$7NC^#f`44{)guCa6yN zZh!@U!RAeoOEZ#ZlhUb%NnoQhg9Kcp&_o$0n%iddxuvm{NFCkLQQ0NSGP3ay|=oeX8^W-Ae z0E$y;7CzXw#gB9)W-us3r!sE9?`2!xXWCqlE%xP&c`%DNZ4Fq3Em8*(N8{HOQVe2s z{SIaUZHF|P34Ex5sJRE#EF88!$4BQx@tf3C--EKPJ!PKz4w?=5z2E)3YX zdb7Q$%lu&wtOHD}QlwlC2Jq;Llu80wNKwZtNeu>G)I{GIA5YTnjKLxgHb=QoBKf}< zJExe@f+$P>wr$(CZQHhO+qP}n_PxJt+xFa^nVw8CJxQOZ^Rmywu9Heu)!N^hZ^9r< zos0rFa89jQhQbpZdL6;a5S^}@$qJ?hEvYr|nP7Xws=!wC$!6RHIop>)^aJ4@L~$2T zFX0`h7xRMtSftRqy(z|_B0d?vWg1v3H*e3JW2T!z5s zp-#vvDZ0*{TRuAcWG^VOy{Mak1w@8C76m?|epNmYW*}8LR*A37hP|DW{Z5wrVXGcs zutOUMF3x;q_(tj?0nltdt-J>)-QNy=a_hyus>e9W|NVMnY|HcSdKSw#HIWITXmAQo z&jbU89`ONu&DhzR_oe|VhZnH6fugPPnG1(0LX_G<{ItDtwm}aCMyQ9(9<2*x{(JxP z-L|OWl7QJf-}ld|WJVT5=?73*aTkcrfV-qmZe*UoJZT79Z z@o-!SEwNV`1;|!YOw=I4b;hI>{00-K!S)JN!QYhRt6FLA3LiCrnzb;uDPno6>Wr75}-whBY2bgy}UP- z<@T{0Ks^~M>!jlfX$(V3xrZ#+Ps+OeTHij!ZYE=2+KXbExtA;2gc)8?URf@T_>S<- zCx$FC{-2{y9x7L9kN#t(eF>qhnY5tOIN8QMn16Q2EwF3#YV(~ zbC*N$_ahq5l3Bd-L&EY|1^Gq6e0aOE!(IO8T!Xim^}Rq9Bk>gQ(4#2OXN242M0!4A zCL$NRjAP)v2#m+IdlZtO{<}ETNOOpK@90=Rz3#P_C(;*&kLg!h1aq{E41SanV<^!l z90`fr1G$EaZgXkB8h%)+Ti9D7(Y18 zjkivuO)R!|TeSkT_9{(rF)5I~C}W{rkdNJOaO2tu&a;021WUsVfJj7_mOa}L>>=z7 z_AISvU~OrO6|RiPm8^)-_Ym1H>|-EnMmZf$rL$@MJk^IL&?w;HB;P6XiI5x_!6u`#+(Gh(?nM+H|&FaZ{LjkjPR9$WY9CL5W~jnJCZB& zGFjs%JbnbN_yuW~q{WzTx3dDFl)g=XPx@)fFaDuND77u-gK)gWL$bTk+tDdb-np73 z0=&5_mv|ZE4EPBD0lb7atPp8Ei_YuM*R?-_%D6n+Scjz&>~|O(XD3ypaCFzbgao&I zFBlIc;^n-%9Wam*Y`_o2edUuBmm63|nNyAzM0me8Xk8Q!@(h5}w+(bpSyX2U_{s5Y>8)#S|zyStu9ru%)o#m+Hc>z|FC97Mz zTf#cHrWpCd8jv^9u5$}Ma`?4bv!Zm}3B%;8mNWOUtS zf<`3j;6-wA?6moD^L}7tS72`ix$8jW*7aC~Z4jeTv--_Qx@-lZZXM|(j%Sh(X51$g z#+j_0?cjCGNWM!I;e_-`oR5GefJcSV?Jc1JLlA3fs2V>c^)avFKA-|D0@SeFWpHvq z;FL)8S;5b5urekZ8c!g?74wfP4>g+!M4@*IhJA{E@G@X+95IaHcyG%M995`##f?O; zY~(#kc*8hokop2yV*}^a*yAuSDaJ@79W~nAOTC2ib}U zPaJqD@WvlK+Q75IV`MPXj0}EdJ#z!wOBl;aG48`kqjK*k09y=BmfmzN4<<& z3un6i4aR6QNR~^Q^*)d-h-1S)>7ItVscOU4v6U?OGnNC&Bn#- z5$7Ygk}bIpTaxcqI*B6#MiPjF$=pzI-SF+-nTJ#5aW>3HMw*_zQ_ToAF@s1E{5YQ7 zd2}#~5{wPZ*n)C%?$F@RBc&oY$~`8^c}v}(pOT8p5EBlq04#fG+PfQE>Y zBMgVauY4QOpwLCYT~=Pv1HlqNC`6|R4vZn{G5KJNftc&pR7XBRP26*E9JYg68uSIw&=iS<1XvbgFF)z@T>aes$Eu^; zx91NZ|E7d71Mnc`E)hqw?9q@uHM$JfU=tf}JWbkM$K~1J)1P zGY}fXx*KY>qHeE58rM@?SUv?zxF^dnrTIWkfJ@Lq-Z^PUa~Xi7l9^dhz`1>YfFlJ0 zfXZZ-j_3s(VG&vWmb$@v3O}Ag`ewv2Lwa_Xjpb;Jjzxc@iIsDMHvt4Tglayz5QBJ+ zwtHarPtscX%$y`SeY7F4AcmV{f#QZD>wnvHG5(^)Y#s;Mca1xWV7$oBz(6Nl4;WhX z(BRT(TVet_pMUT3dVKapLl?efP>JoR)(c01v!Tf~NT;cMVaFD~xnEJ{x1x$1LISj` zUIrQHx*r$8DWJMr2?T(AHl-0(a~~1I<2~2;BPV|5($ZZi|F9dFr@d8hCdcr zB6&7pS1N_*k+4iAdE;L3XYxm_X<~S}@#8Tt5jcAbKxL?Hc8-Q%^3Iu_IuiIQ8z?*piGPf}} zaxroo6b^Yx7%q;?mzUD8MtDGy$f^Gz3pXOulSB&UZv&Q^C_ug$$&TLkpBln|fzww6rEvC^`8=Ef0ybwUs-ZjFDVrxKU|$R^YMV%wTX*z`Y>JQLHsft8P(f!cI~V z(1y5GS=sRb*OF7*1(ovzU2q&j!PYU&<%2*l*=%Fi8&fTC<4+Tb&6GBVvJ2)H2G`b;u>7<(D!3d&TA#h8R7{cRc~2Y<=TDUAz&{L zQ-&Pt9nj{rO&%AB!YO_&f|!lV+%(N(J-_8;)B|lky!j$me|eT&L!nt(nxKc>#UbVd zp-YDRmG2G8=fKK+YrFG&HGghW%py9`jpxd%~u;`U+q&a2o{+)+~r!HWkH?}rqd;U5#cm|vwh*?-gx*3z8m(igS>nZ5x-cKC2y2!BHhuP zq7NRkm@l9}+O=3p&P1RIrFrs$jPeJbMlR-?K@T^r#QW$WPQA!1e|u=7m4NEmpe`vM zR7!G?Ik>B6?j21S*B!%d2?fJ|Nbrlra1FtrhOYJ$SZf=_^UM~wd*x&(Y<>hfTge*k z%G7EYQk8Emw7&tmZPu~Jz_@9u+%Z_W2kL5RZxWYBD_AO0PJp2$6AtZ1vTyRQ!0wDN zo+u19ozOS>nbH#LTE;rw&jKdT%o;R_SWkeFG_}{>SR(CB6_xUp0v$&!m`3R*{gE5ct0if=L76bW zEK&!w?V_TkM@;)nFj`;PkBKu<{kZ|%4^S>XuI-h!(#!;6E}ku)2dCJbG=Qnm3rM>k za{GD5A&uc;JTr)v((f+}xuc-Zus2}?T2bz7@EJxJg(}Fk+FwljZN5DKtoDzv=xa|#{jB}X)95#$PzlUZ=+xZ_#47{mLCBy1!XdB2(OilY{_0YK5J{CjJhVcwBk)Cz4I%&O9Z0$Jlks!OW zpcq7FG>m)&Jm+QAh&hWb!Ck}R4Qj@4D^hV8fDV+uL3jgqP;FNXYNep;ndSm(>GSxq zh5qJ+KlUe{Z}nC^-m2fb)UN`m4W2b0iS>zIixIhis#NPAO` zdb1py-E{@nh?A18F zGdRPx`KdW)?C!+%&U%{seg0Nuq;{LL^Hb<9_%GT}#&1Z&=> z@x}|}%?3V1rpF5xe4&fUD|t7Ca;AN1;~tMJK)yLw0oe3pH%k5^32mLv)})leMIubPqC7 zR5t`ENK8FV>2@WJaBC?G8ZLRaa>Nm60W2v0caG@M4Q1bkg;bAE6XvRXa9DBr%TzgQ z4s>0sWYUe~>gc}2wn?hKD1k*mfb$QRr}@`4JOHIBWfcy~rw8`FO;s18zc zXYG8U-2`MbNX3elEFYJUI@829dAHYUstNbTviU3&sLX45ROK`tYe+M1&Jc}bl@ zNQ=wqU6I$v`5=xth28cjVR(k(0eEj79cJ=3`PXCJlDZ;PSx)rEYb|JI6^j4?;A_fr z7RR=r$) zTK?_98i<$#K{3!LajEwpTnLHCjg+)RCIlk}&v+)}kZoTotq05C=NA^n@c8Z=Nt`*a zWLD5gF&)=XJ^OzeLl9|I5~w$T5yg{9;nQmJx54tlE>;d04)cskyNz@h2#4~R(VW&xh8eGxzUYd^_CGZ8??FsWk#}(45jYb4nH&y%P#6+w^0F_X*l(F$A ztw$rw33lU7Z9U1UTLJ5!={z-}w~A80h=y0fmpGWQxvx zCQ_GQKo%zi5jv7Kgl&-(tJe0t7T!9aWTM2 zI}Vu^1@9jMfewGjqY9gM51KZI1)u9V2U$*}k$h{v?{uA<$3FOk6M-q`KDx&|7^t2* zpQQpFV0^s(al|+8?Zqb@7fo>fwz3aP>JuH5vB<|9-pw}c3J1LV?LR`A=i^d68GE^~ zu8$Y1=M35-X;eVqZ^;VI_@8?KQE{?t2Iv%cw^tC5VX@S8oC5O!JGY5u9%g)@i#;p? zF2zv&17D$M4UeSdD>SMx_pVk(ree$c`TQu;BjBzYEU*s@&(Te*T6M5!rSs-OnjP%0yR!7DPZ$PZ&)O<6jpKE?p8<5}{SX?Gp#8lvR&w!G4j@)~g#CVT2-K_bO{#4sT4MfI zST}aUG5S3er(mZ5-o@V9uVNWrm5rs0B@h*l&q`b}YK#+4HssZK4kR-X8u1!5R91(2 z9E|#hpcum&`OJ^KinGKZI{EdO;OJ3c`VDVRH$R#Fo`bWL!Z1uXW*Np|TjAlzXM`Ui zMG9xal9QQ-jDq-gDUI+>pw*(I7rQS-2t1b~ufnG7(Q%R+8(MConJ=mZ&a;CHf8z8t zd#?J1xl$X(LiyD(guwH7JERcE?~y0k$3%Zj3q|5iiWMN=W?Izo?OofOiF_Mv_X?tk zavq=8i!QJKG)_;pN`vX^{bT6j!e7awVa-6?@Df(f4^wB1Ah>Y5u6mi$lH8RAAMV(3 z>=ElNJjZPjv+3-|E=ASm0)VIeX0sCIoDWAmoE%`Q=2{p(`@7Yy4~~Culo~iHK!-(! z)-ivwa|Qm_I5^gFsCNcZ6yRcq5P#+H1i($MYCRAWjP#$o2C+Kc<>AO0jZ{buadMYl z9uDCXphja0r|4rHcighq+$(VM6}m*9IKVG=fRn^PP6uzWmX>KWt4;lnzDKODRkEet zBj+U|Glr0EoG;pV1zx(^g2?hDrI=JMdH3UTTkY0si|v)E6>qxo!)I)+q;X2=^4&efD4 zC&(U`I$NQ6m6>jk6n4-QWi6E%g}3^tlhUicB&wd!yPq7P zKNWh|r^oGN*y3iriYuVs&qjILSEuv{dE84UeKHlgdkLZU)D*%``F#obeNHFENMhzR z3Oo7Qm2hdEuYP>RKe?U#eLo!id|U;N9E~iTSU*!~omMW0QU37ln#p_nK5|HO4#TqhHcZ2K=5?$Bm324jkV4Cok6@wCF#a9*rfBo)Eh&A zy?P+j3@t=A)r>T}cz4Tojd5Q|yxyDv1sL|vYC~Wt;ZsW1EwF3}`zNoJ5g32-BZf^t z^yS80eM6?Wna9w%U+5nqrQovp)WH)x*e>#(Xy8zuboeSdugTg-Upln7Kp=SiPNsf$ zCnM-+D7YX!KV7t}W3E*TF{H*q+%F?)e+oWQ&v7oBaNLBR#NHuP%{g!w4@_+}1g7Lti{du(rH}RUx zE`q^uw4!Iow=F~*L*D4sVV1WE3Honz3Dtk2 z>7n2M*z4iE!aIK0LpQ3f5C7|9k-7nVsLPjxcwMTs-jTH;!frYd2pT;fQ<(925fIC_-CGau*_A^0(n7B=2EQMUet?~y zY4mFTSv%fVf9q=72o6;Yddw{1Z(5YsCEVMp$3V*|EemEH=Xobxe`R(lYe`06*VjoL z&>L(BM-tsmy!$c;jJ2dKB~fb{XVj`ta$rj zAeJ~j^<#mJojoOmQVtr4tk}0Wqc#|Fjt?|bQ-9#!3#-`Y`p4{`xY_y?E^Ht(p*vkV z*)-s+N3Y7oB0kk+O0)N~7ZifRv=shxmo~NYvh6hBJvo6ZKE`Bx*^ke|qJ^_JWhBcl zVD?e;Ugc5Z?hcjunI(rISYv5djEm2-sbdp1)sQ3kV;zdbWC{;Q+Aar?m!Q=sSnjiw~KTFCUb8kcKCO{~+s_{yZQ6zv5NKofP zCay6{?Djye!_x21vuDSNO}vB-GE)!EjSK_I^VCyd3ymY;-A{Uh)XdLPks1o&Wtm2i zV9Mq~R@rwf2}TtwxuNsT!nux-pg0~>r}@k^{d?%h?;n@--yUfh1!78(-ny&S385LT z2dV+X;n>QQb0RW}gVYTui*s{(z*Ja<%=JbHs@eQ1ujWzo+h+OuRFMn3E$O#}OMFKP z&quh`J}u5?lMM_t;D?3;9^o(0Oz)`CFnV;^Sr*!Z& z2v$?}BXhVe2Rl^KtE;fRzVS%JJ_AW1{z*EXq}Sz6SS#Kbx}zwD*E<8j(?-4hc0AK$ zpPdCXgfY!4Z&VB$TK?yAeysqcLiu{Hf1fg;3ZNfX)axahr4P%a*&pb@)J=$;gP9!q zs_h&1Sv;tPH8jBvnOJ%=*LrBTdw>KDc+9vj81JK53Ug|^sTTNuzwPzEfcdEr8frjD zzg2^$r|8*b{K}@ZIK|=u9IVUOLN7p)C(<#9YZ}Q0)KCx&Owm(fqi>!_)4~PAj{8B6 zkC&^Xp_?fqEI(0a{8C=w=3rHio!-g&8#2#wmPCa5#)`#f{iC@*<}HM@*5L%cS)$nS z6*gXPclv$bPY!nVe(wLge_brQpW4sXhY1?TmWvq)$fyb~+5Texr)doUpg}KM?w?QX z|2)|L-dvq*Y%GnK>Hkd!x;R-H{om}S|15;~pM^K{d8bH#004i0002n;t3pEu2U9z9 zOFL72Q#&_HCwsep&bQLUL91Z~1d-d1s8RHFg)MJFaN*Ph;jO)n^Foxv5p8h;>rj$x zKflxjq)kgH=~pth3}0rbpnzj=%fiwsYlN0UJ+-r44Jzok0- zQo`jTCr0QV$mCkG!vGrNnj!auHj379L~_X3TqkT_)Da|Ffz8?`qKeS50*`HFk9}b#XGZb9S(I za{2!+PrGKcuR1&cK!ykaz<=vYMwWIamUia!#hFT*eq*Oij7Q)k?i{v-?u|AOY_W3Y&RiD=3OBsCO?M+#=I zEKl5amxbnXz;ijF8AK7gpDp0d0d6Kv+V@u=Pv^uDp?=1ftiG)Ok|hLw#by`~%fvJQ z!2O?k5!S1?476auQFSV!g%*gnOcq~knxJiFKgBcL+2G|c2r#YF8Rm6~FhaIscAo`` zw>g^<-@igN33|!x1ZSkv)EvVv`vz&6XRR~T>fyNKGMUf;uzwpV4I95|E7%9oivW#SgL<+wMJgBnRZPIYI5h)C#cMKtN3?dR*Zi z_ARm%v0MW`2+*Fdrru?+bqN?WtpyBrV2yZKTk#)t6CVjXZEUp+kZCf!G=L8@Fvw1> zwG?b&YjphklyF$Hd~zVL9wu}psBGw~@+UhN^h|TsT^5hqmOx8;5Uf#TIjxgD6pav8 z!~y*NEwFFl#A9>KdxrL>d`pB}L$j>i8aaXhp&!bJ;;A8lJs<##?Hd;2XePYvcr*eJ#$zdAM`Bs= zz}F3(-r)MFYYQGNALMH`99l98Z;o8#(3zBXqkj_&shpX-Gv>;=z!<;?yqL0K&T}Q( z*2$vaEW()ceM9I)yOf8FRfi8L;0-2m8j)PNzS;48TeSZ+9-g^^J2l{tscQ}7iva=G znwXnSlY%X3eU`thpprv!B&ZUThq+;+73zWdu8di7b0n@@nlt;>*fe?cMla)ub*+(1 z_~!tc8Jzh+ST2kXvYiBbxfVi5UHscp0ztd@F0`?h1(e1KmBj#=g^L`)jo{%hO*(eK z_)0%ck~6$wU?Tr z5!FjO>727q*Mfx!Ns<745x}8QnxMw%5H>ApFyC_gk16XgBA`TuGsps!M|7Z7wG1%Z zESA1;+C9zf1-cd6*FS1My;b1^g#IkEoYNqE8}`ked@}^&I7mokkaKNyaxjRGvWv*`!;|1b(Wiq zFF6#?-=qbwD~JB%7ayq&d*6=8zHN>t^hf2e-SJFQX|;9zG!%PIjredep|T?Kp(j>5 zLeGjo9b@vs!NmRyn|^>H90)gz@l&$d@F5U*{Io+}V0+*WR*#5FRVJ5CS!b1_B>Dz; zS3|RFZw1SVaD(>~i}9;i#Z&x8d5gY&DwMy_1}<7Kpr!kUl?18y~JR!0y)+DgV1 z7tBAS+c)k(gqVe$8fsdraerM)aU&`xq4p%SHio}R#7UR>xDY3;gKVW@NWjOsCcl@7 z{#Ph|(TBAr08PoTr3wY?sTR_2=8dz+iZJ!%M0u5sCS(1^P>(t^QHAs2oX>8##H(en zvfsY~AwI`&$8)&<-?8gMlMxe(!N-h4EHCIWWpx1Bg@FpgwNmPb#|cw@ZD#61QM~G6 zpl1VK2H&3*h77d+cT_cj_NS@KPLS*ewMZbgM!KVCplNys!unjUi7a@H7yko-Y}{=w^eh@eL)#t=6QW3GU7TE7b*& zds4;JQMtmLDF`X(R3Hj^DoJp{#aq?9q0}e`-;^{gPNzy_zrwzWU`q5;R+J`^t|FVP zRaDpUuBeBnf5{xcmsApoD~Yt3bwf~_k697P+EMz18%X*lZ1O9^T2qe7b0p!^pNmL2F7 z9P7W_z>8WliM<1BApbe#hKU>*|3HFi|?$cpqGqxRR zatdf`shB;3H6qov92LR`1m%^qB!X5KsvSDS%ytkmfG?{UtG-b7z*0erF0NJ%WxNzh zCtJzA^N`~sR+){d5En>&VLAkSTp`5DDu^qqN;;90K`rj2wKLg75!i36V7jn~)k4r7 zW?7D=q-m===lGO|s3g6Hr&P-f{f6I>4VN!L%U{m0)z_FX_?)f1-cBfh^-u z9)FJf_%2yt@P&6ry_K`<#x!N2e{S7D{VUgzn4zW7%wDy^_Pw8HNjW z*BQe5#B$R;)Au%s6|l`oGhFUG&7k~5Pn6ikYWHjDSt{y1koXPHjmc^%CxQLZF9$S!jhU9Q|L z%)HYpo#AN^k@1#v>}e@FDiNfOqaK|xPICLy%A-@&!rk3sxs!O6dw+hD`q;OVyq{S0 zQfjUX2f2Hx{lsm*O6gR{i9Ev5-iiP~C%bj5o-!#y!g)?ZHd;k>A0oG`p+j*~PPF;7 z1x+zkCTeWEM{SbzX;RgSX#$m!9wbbTbA)^|ze%8~yP0>F7E4*kg$ZOq*vO2VXE5j9F`-VquTpzg6HzXx}5xWG6{`J)t>+UX8Ec)r?* z!H)}KL8nI%c9*F4gXWr77Ud5jRj25E4P8MRG<^}OG6{X*Di`UM9u?wmuiRzpie03%3v4Kv8;PhKk6gvc5L>2Z$Q5_t|V?3dtgOV%#iUKn{ zpEM#Xfp##NWzilf!?f()GSfXAHhR%K>Qh&vcIw_7%yVj`WOJVS1;?i(bK1=*Qrz~Y zG1LWj1Bq!VS~RD9#Ig<*KHB)=2&QFxDKk+-Tc&dwlD|7Ee`5KcY-MrtSy1_X=towc zYZsuO4~SYUv){7Dj^HOohJhU$cY{E&DHQJsb&~H_`3q@$TmpYli6S)KSRnE%@H=&lxG=NQu?K(v&Te7XRo;^VQ1GlPlk;=h&idL?A&&{*thN4SFg#|ikJ8G z4FpNLP~6>|uhGUrPb+JcUqib*$N^){*o-zTJ`aGRygL{8QuHDgMm6H4ycN7M=|>OZ z-;Gjyk||VZkz=6g&&jX`tCu3^sgoF$(Z&_*Zx0xdQieuAt3 zTFP9It-k~B%#-EAg6U^*{<)8%2M)IW1t)kuk>49!p<JcYU&XZf9QVQp}8q zClP?Ud$Q*e0RUSawh8rD+zh_pbg{LQfqQ6*FqMDVlEC%#xL9PU?G^FYMNNb=)V48& ztcr#x`-^X%Sq_QsYhHAn$JW8;6HJs=iTk`dK@*QTYpkbJy=Q)%L_;%n!xG(8;|zw# zX4u=o2Nk&I5-X^^K}a^}PY?Kw;<}=`_aw227sWS0{BW_w>`t-aw*?S>8Ugi>X zrbymh(e~8_!BSh$(J`~YZ2beS&G)6NO4BAAGw#+IM}DFStX1|@!~1b91oEgE6-to4lTjy zn9CeBvBG7F5ElgF>bZKa;)I ztH3OKS4{J3*OI?IATt8`k(jkj%`-|foC$&f)~yHm$ME__8D^C3+LlMff+7eEi*|wy zg~@L@v@P1H%4F;0St0XG%ii!3imOvnmXz4-u5q)I$j$Kc)!z2;1S?GoOW>Np9v=~3 z68{R0P5+nOaE%|m&NDr};Z@}JrlKsl1cxf92LQSC(a1I743oaCg+(;`VjUS@kqoC& z>~{~f7sWAFaI5#0Ylwe_~&Y(x9q%@2}h z6rsZ*?4<}J5@0Z~>;kpUCX%#woJRwrRcu7lT%w??dp*DPOdz7%JU`q4(6-Iw;kkX} z4(H6UF@YNhz#x|GswZ%}r7lCI@WOcyiNZABDQZBp($V@cFYbC>qMSnr;8YdX8eORa26 zH4BEmRSAz)fAg&U<4d)-7E5tibK%UPTa(_UWCSQqA4(^3Op=*nU95NB_m}j6L`?u0 z1Kp|cK8GuuoEkQ~#)S5ENopB)9xbzu*;F8+DJ*$ft;S_X-72VN(yDY*Za^ymlEla; zcb&j=Pl4~ui9my_BK`D6d&L%Oxy#t#)f%t~RR(1du#*o;r~W8v2vl zQ()cJjA(_z$KMrh?1n6P5_t~CVydFMFG;L|K332*cw?V(LV~TI*@O0!ugGfzrUleH&b6fLYW}L%xf9IeNtp#_h1j=*RT8S`=NHgHNBp0cGiym z?7W;yGXIC`TV=65x}CmV4QD3dV7hvE?G{bxphcm1A?QyhB*;eTH7N)|` zO9;I9=6-i~8eA24(Qi=3L@be05T9PMX;gpjHmF52NjVVdU{{T|A{IpHZn_mnU67QP z&E!)?EtSdAr9n~G{vr`lsmx0brXlRkzUA!aYgtqET*hsqMlW>dw5SUKaM>&r~IrzN#tt4p4$27f}i)XE*JS;sNqt1)n#U zM1BBV26JhYLmT9Kpl8bgfp4;0o%R(+q#dbNmoi7@-c?pwPIS(P=YIksL49r6F|<&? zI{Q)s7|JQ6z0wsb& z;blUQBGvp#zLhha;7!)-^}7A`gB|Z*2+arM=WEa6V;>!3IoZhFM6f319`gZjJyK6R zFjnzbSidt(`2la(jRMjfc?#o(2DSlQ=rZNz5kCe9=}NvoW0F6?whI?TTLc%)DQS86!5hgPGLPj!6D@5f{1Ep@@=&<50ypL!tkD9uY47-y z_yYne1+{E^UOV@E4BS4iwwzVqz>5`mH1B8_)KcC4mhwD4o);jv+sANqcD9_GFSVZ? z{OBwjJM2^>YzuD4A!s=S?qYWKDtaE==cR?|5Y5|H^bcWdBAN(`RqBAhbC}*nXvtXkFwjNq7T76M;rk-I+*BK z#Ze3jO_zakE}6Xs+XBGZr$Z_aed6h*BS!0~7f*i9`$AZrNSfd&Qk~e9^+L;X=8JGS zcQzv6NXr)LJzVz@5`T#xM)^aQGuTR@d{n8xX(NO6ky@-lI%9sO_5yLixJ@c=D z^a;^^fJp>lESgkH8Oc=urPZdJ1f4og&Y+htqbg({1#(y;4Oe@b6C7q zNRbgs+7*Y9VsDfimU|F0@4Gb**P^1DRE*g*kgp^tcEn(a8ckHS4ksJZ*N9IAD8zLk zWtD>kfZ6oPxqPXdpOFu3+^?LjbXgwmtkrMOSf zikrFDf_fScw(aROhnzi@q(uoS z-k`_`Tdb@8O6wHXeMkM)UX@DOoS3TQ2x*&~^ggqoRV~c0n%hRaY}j?u?uod5B~dn} z8OIxi6|$6MeCtBJVyap=s3#y>;cQXR!57Rwpw2)zC;{C+r#Jx4N~$kiyDUJm0d<*+ zj>jtIexyDdC`(&2Mvf+!1GQbo%P*CO@2mlDlna+| zzfNC8Hi2>T5l{X_Q_#+PaDrBQcLt>L>LJ{8wQQRyp$s9qSO{Z;_ z;YN=Q|A#1&hiz1_bn#}1-!1+tS$)rV&;n+&o)=;@7o}*e_HVW)zRFX$PXUaG%xR*X z8AgMgJFKfeM-#1%9_093TfkdwVx>-PMa#^ohNRY5gT=tetsv;N<uliW=Bx;x(H$$(8@87W|jo2@Z>KD#P@`J zCY1qT=O{sN10WZOzzjE7!z!p7sTX6cycX^q18QK0y@Jp$A~~?ZxZG_%3JRuI$CRqR zF^EXb%4Vex3xk9^_9%K1LO2`Q(p7^l>pXif&!x-@D|YENHhwS=nqR8%Sd2qZHjJy4 z+tkYurD1T8K0x+Ta$!0{C1ANzP{1C*3MuBA{ISKv!4YemOJu2gGT7)NT=8Itqz2ja z7WNe9?o^PIa))-9$*;!bitXMjy8raa3jdM8SUKOq{$}$KHM9>)pZSZrUU6N|);3L; zKlg^B$Z(I3wQEMdvgG!^K+GztS9f=QzYcojO>uNn*kuNZs{z4^%eSjuUXLpR{o8fl z12{$jq_lAb(?tj{6IIA*kE?0h;#n&B#*SF~IQ`+ej*tauET?7#A7<;@-3!0g05sSl zsP|yBd-yo)oG~Ge>8OhHp$F+(ADHvuHenZEb!GQsEwj7&O!!;>lz9$4eaq~BQ>Wx{D{(-gzx82@zbb=G;HzhWN$Vz2*ngm=ChOv8q7*|x7 z>Bdh+wFx-ugKXa@oF%NSaShxdwLsYB>*Q!GZ2gf&c(KY5`(OlY3QoJz;EQQ9>7@}o zo>1C+;lT}1De?|}tIL411#aKphB#3`Ago(E7IkX_D#vXb%%(}(N<-sksL#-_LE6qt z^l2B?$tj@cP>=D9cvwng6F;K!c1D41q9LUKiVf4yN^&I#2Bn=MCA&7fzebj&;0 z7<9NgTv@=FsX#5pRLSx7P0)`PAS65izY0}m1JNesP(M$K@131erkx3?ez z=j>V-xEw$$kcE)>J;`YoM3~=Q$y~3U19yqCQyT@6LRzNs9u3F8FU7&qD~Ndl94*u@ zpiz$RKIMa89_86UM8DChJvDS3y}faAaJTObCGv^Ih4Y39^qc{_LuVA98G31*1BefL z9x(!0ZA|JcDMYAJhB|e;*zL8t&ZZ^z_+=nL=fC(tZ4wiJr4nGNDtLupltm(l2;NP6 zWJh{2nt*OqKh5SHe(Lxh>Cb&6Y~R|A2OWHiD8&mc#E<8{)j)95Dg;;*x9N3PXc;G@ zfryvHoiPMS-QEM$1WYj#oi_vUz~uX zb*{rd)aHu>!+$_Cb-bG2aJ+funH%oR#`asSeSv%F=aS=$>-YPGZQtd;0OSTE9lji- zEPm*<_%Sibz0V~tlK`$gU z>xO`Fw4JTHzV84>8@)O3-7JW^s^EXHbq>6tK-;>lZQHhO+qP}nwr$(kb-QcZ-L-Aw z_9ibcIXCA|tgJcb_l?n0riDYZ{?E4Xy&&lueq-}uNWhKjjs8EU_ZbZ0LxW%YOga?+ z0M37z-v592;rE>0s%4wJ*@pN%qaQetoJd!E!1)U-p~{W+b+fk`RnOm&DWAS2KuSVL z4iO6IROY_2zoFZP_!ShoDNV1D2SpDXy{xkfB#)D5+I5hmQfwq8>JmS98zd<-As3OL z)}Dp2ir7{X)rO$khpYkYE!&CLUBK3_tB}3m^LP7BtMrn(*Q`I}B=Xy(Zj4VxM|Y#x zCfYrgu%Iu4{=3S^b61Se(Yu7RqCSsqqg)-^?fRgRO}Y@*x-v*q`@5f>E-AFzY$qZb zP&}y5izAXU1A=pMI0Tmb19?Tpw#5BZt!9zDpfMZ z&*-Yx#7mvurq&OVHgAuOG16{1=x3R!(tMVEapWRbHd7JESHngbVyK{`i9P*Vw>h#JZRVtdZfJg_>1il0f$}Nvz9g0oh zzE&Wr)nZJr1r`ucD$klzc_FgC4c1uXGUij_pOl_GQaG35=qxTuZ~4Ka2;(@bfw(pr>vu>8^9V?ubsfd?(t12DyBS|Sm``h~M zNH;`-0?$E|HKu#0%LKBW=cD3+yt1NF^vAv#V<4KXS9!^InP07-T-AjbVxT&0g!#3T|c<3S>fvla2>@-K|xmdU1;l;eR>Go7;V>b zN0W9GEl9UW&fVZKG+X+Jt;U>scr0COMIh!aZVFZF_iwxqS@;&Jn;Tu31wGB1W?oy4 zim34!-n)n6bFL2$_uPLy{%`3QN4n1^NB7TH(=UffGOCMBmPy?bL&p#o2IkS7VzNu90W$WYRJXdjmP4xbg|*! z03OETi%chx00#dJX0`4#Jg4;ug-JGLtp&g=s1YG3wocVFAk4OL7x4GV zOEW*7_Hl}n_V8U?ql_^5{P->4EgFub3uYh{!3fyMBAB5%Km?=fYKL-qvACjk2c}9j z7}BB^gCbi0s=Ii|Ype|OYvv*`a}4Yjazl1o-!YGkKJRV3?=+AqPMj!0447UanS?Qc z-U#hlPG?4zZy0f{ns(HN2*dFS!0H{ecNe>9B!xN23bIX$CmAU^Z z>ltlH0u!N&ry4EGT?~ToW&n3#MOHd5O?QGe$}m9)wcEIp35^$9EADUU-20!w=s@ZU z^6iMu5y6n8m9lEmGy~6tL0JS``A5eTSqqq>T(-CDR9At%@Q;* z6;`9m;v{8f04E|8Ye0A1181Ku56YO7=& z#CtMsP_Dpda$RG5fNe7hSL?BR58ivk!h+FFW53)wiUnSW1O+H4yv+0vvk7f$D9u#XYU}oN|N1^)I(~jyrGqrd z$D0Y#D{2m5lK~4&ZeE}IzEXn+IJV||VZ4$)mPj7LjE=s%=@8g z4I0wVdnzuP^v1~6*dW8&nirn!g{N*Iw4AB|NGupPi=H{`)o&WhTJJNzyPRk7W(jyaaerjdgwmh&t1%%~!$AJSB0ZdgutfgzZ^VvzHF=+?5-EUXJA3FL|py?RP%R<`mY z#j^tWq$H&kbn%rqyn6z%ed5x!rpJXPB$QI5_bcA2iv(TYE>e>>K6$uc!xxX+n8vgy zsd7xto!0ZgUcWpYDOmJh?^rmq?NAO(&T5J?m5MPD9d+cVWXi=?d#Nuk+i!K=Tv(hG|4P7Xm-v2gRI^F)3xpZLL%4 z%vna~Vuf^OFkJz}$|3XmxB9|-?=*QY-?{t(&G{`1o`Vbj$!A~m#iZ!n$hSjJPUZ9< zxg-9;4jdTZdnI9Ur(FSxb~yZi&dBR$L)<~|KE)qtQ6yE&yi^b&>! zeHtX-N)2#D6D4S7-&`5C_=dV5Hw&gX#`Vh$@imz;J{b%R2Ztl~xsfRS44qjECKv&V z?=oz}C-_9E%Lge{I6N)A-t$V(!U`?;;JW_kMD-KGdm=0+#-VffeCM(9KzV|J zZZBdjU$d{P1C+?HxRddSEyoR6?x0|Znp2B}`s5AAgHY+PN~I$N+iEBPFo^8wkh^b= z9a+R<#mfQ!VwP_?wWn=06AI6irG4rs&dYl`AiHEUgRq>iGr z>gj-(X}A4~LD0NP=fMl3?%>c~I)0?#Plo9`qWNm4d}E%k#{?j(9iD z{R%-H^~pMCIqU#OK!64JS!Ak_AEa(x2dH58FxOn8&JNOK6&U^@$dY$nvR)RtX$N-m zNQ^XSLj#ObEXAA=2nKfLPv7v$?kK=rcTB(j`eVzDD1(;*GR#Aby7kBUf6&tK=0TO#|a0~TB9)aPQpJdcALK{Gx|T4K+4rcz8i_pU+z z9wLq~|IF;JnOk2R1^Jx!uGz?MXJEM&q8FN^=edUc)ENX`Q@|EGG`KpJE&U{JD*2u-<0zne)lnIyP3_Os!7m z4^$LTAHG~@x7-^F6qt;n@do>lFRUxu-)$tGVs%n*n5!s73!f%L--@97Eky=Iui|c3 zRfiqlhN*SIgga82%EpIUXUe;LMRK+IqT}<$VgABzaSi$QnsT<5FTy`Xn_7IdxW&l$bnZ0+hc%mh^`nIx=SJKq&%xvSq)E z08EYRO*r|vr8S@g;Tm_r1ce-#A88IZ$JpuRDYgpaloA+ceF-f(u;u0u1ksvvMi$wU zQo|{VSm-g)Np>UB4DKd&@lWk9@Bj;#Yn2wV|MF-7_Km@bg%-0CI`3n2_!^Cxg4 zZDq?te51gg|1i-rk1;k8I0}MQ8iINXd@u8FQbmVprB;np&iorF??o8L^Ci*|x0U5M zwuI6q$wgBUOQa^)d@n)j_f=Zyg^TL-z2`aR4)mYBv36bVZzZhOH6 zvt895<<(@$6K{G_RiiCVT2^evqe}K3sD&J3C!#`1=A6N$y1%{x4Hts@u;3}sRd7UX zlX=#6>{!c=Wku36Ep9r+_;xHyFcBlQ+R@|c!^9mGh%-7SYC)?le-l)t!p+gtTEv>x z+|>)(gi2(pW{IL8URC2_tKsP{whgFmg6-rQd(C)cgufF!-WUMFz21F8#Y{l03Qf}i zZs|EmO*jrV#+#DVfCQy;GKlkzpF&!0g?1U`_>zVWFvg5rXsWt+4=qLAb(u%iVBt){ zS0{v{y_7ni>gjBn<0ocUC@BfRO6IBNm;=goZkHypN!m}bfV-Sr41#+9Q__Q-RQEa86lSH!S zU83D7iLr3`-@Vxu3&q+oe2w7#ioiL>D2-RoC|`q)HR&lLu8lN_mT8rKhF41jZ*@}( zWI|Hb1g~6?3BEZd3O7bd^@NXd`MhwBD%X5iU+c2Edo9q%&|PoupW$V!3Qpps0<5si z7p@??NR3&2!|D)OcaDd^^O#WN3-t%Nf%)k68pyFJ zIemIMy0rE5T$Gp%&M8wm6^mN}$!Pd$_35kClg`>{ar3+rGsS&_7TTiUaVlQ%rtcw8}u;R&BCxo|FHO#+PXo?O^a z^8!3rzi69q#RM`?XC>z_bJ~;aqeC3In~IDp#(zp1^A-55&hsN|J}qaj=vJ(0G}6WI z#bzX+{~)7w&F->8qIlOTICsNs3MZ?$<&80`5?6dIk1{OM-bK()!b4^$E1@9W=c-rA^G7jD#xVg|PZ;z7&?pMgw*LoLIUfpN* zz5=Z*Fc2P1&ny)1HoWVK(r3xIIOGG_pa181UuVOl&;OOH*YW=M#gl`l{cr8Y+4+At z(?{IDQm;SrJ8#qsGg}c8<1x89+%JDr%lX9ZSX^!R)11y&lM5-3k~EY-pp(>G*jIP9 z|A7hw(KqF0pG+=#Z9q%Xpnb&s19fq6Ih-<6w?Rk8X6wp(AN9;M6+*KiCF%Nyj-A-F zir0lAN#s_ucAL}8F%7L5CQ7rAGfdrvPP!S%6q!TPds2gN893?DY97IP*c74eh=GC= zpbUM|O7RMz*c4G8#6+oqL~lx93=k9Yz=S$1?a{#4;4nD&!J+#Th$hP!@4yKFRYV~c z6a*rX_#z^bFoY=MghkTNllfqB#5v=Gd=f%TPNg~QFyX5f(F)Tvo!7C+5!-&0mg{BTeIsT=I*g_OA&__i z88oVhwPaA=gA8j@jL9{_-FQGSr^t&50tPR@2C)E!*Z7YNj{TXTj?t*2KQW{k*IjCk z;1+~N8m=gw6h7KymQ81$Avm&TYK_c8KvE(PMD(*C&|uiT)qv#39FmzhVPC!=f@KAQP*OjdmuK%$ER(kYtERbb1GF(k1Dk7Q1>YG#;uw0|lS zAhp*)C=snm_aoJoUd}f#$J0RzLT{KBg=euOMi-3eP%bI>#fgcLbT3%(Kd?V2-oKhO zq>F;DEn^e@v3I0H3MCg9w1#1#cxb#dPr|mlS)WFSHXeZlm8tDY?2IE$TnF$ul_y{>1%HVIMiKr$qC#Ao^R4a z&4IF(5fLfEi_m6*S=q9HwP5UmYN27fih*&rRxx&-aH4ZYA<#4!>hM?f{;6$2my z5n}W9J<80)M)oq3%w~c64ekM`+0@vA1_c%@I2c?Re`E^qSr7}bn9L(bkg#4Yz;v0K ze(-yP%w3h+EA@x!OyIUG$-I*a2x>D%cJOpfoh{iNd4W_=kHNqAf6tY1L4sTQ$AF1+ zhcA@w)m$bmIj0F2kVh~#1oeUj4vC4`$xlFKYg)F8i`$bYAK=xU@hP6^%i3?q+`pGy z*z{=#F2^y}_5{*S82RN7nA<3$X!yOKqRO}FdgGb#h6BkD-%)#evK%4rhWp^!w(`po z+XS+3rCJn+&y_7CX!s&1XiRl3eZNViMRZ_tiPucV=6(EC(Fo9X*v+tLoD)+(UzWQL zPH(v8yl(x=k&&kl>HE0f@~GPLu~Fyj^d z`n&S0LYH;s^auP%(=a06K^{0(*h7|u21XL>O1kx?9;WofCParizzy>ba5hzL2iSpA zeaVbq_dIR&80)e|U!|Y^us4CIGdXrdAdlYpMriMX8b4dkA=`ozv+e3bL1O2}KUCl3 zw{GE}+BM?;aqK2<#zk_3qwd zERe3P@{F?U0WuPnqu5XR5e^jY{XSq*_H=f247WVpe$HmzRpq^JH{=iQ?DpdSI1#k) z<+7Dem01te5pJOlSVeHo{^}rzIJfz8VJx^A2GE!Q)EKh-4Q#uFlg{rnc`MHkoTsw{ zTU|`)@dGoh_lGvE|Dg2NRa67bh2yH9VgPmXKRc}xcNKH)gNq%_MgMap;L}!=2!-gU zCt{$%hf&)~M)uX#sv~oK{QWfjRMN2)pWJnJB+tTN^>=$~rks8CM7`&>J$YOg`rGcl z55LSkx!o0nn<3tJlikUaujjrzT>ujBEdsf=VIOjBF-C1`;9KKQOU?&_(Ti|Z%C-0< zAn=`FqesKAy|YAd*lFGfBIO<;C7DozsS^e1w-hB&s5Z^iXT1C3+tAP6`SE^z^Vtr0 z!}r2= znK0Dy`AQPXaqcAVBB+dhsu77xzz?73%Xon?BY5c@gh}*;v_wNbLJW{%lBdk56ki7Q zejk6)ssVYyT7a+$72aVP7_VFb1zT#v-(XQ{G!+GA0I~SnDR!kxr?y}EGw3r7LEpAA zVq#QL7+duq*aTr>L_;mW3RGNAgL2K?>k_x_XW%gyykL$&Z>$1QBtbs=z)K>}+yNQv zq^y|&shJht9E6?(wj?i;k@)R=J=q6>w~y3aoLI^(3?ubWI2XYLK^WK6{thqJ+9Qli zZAIlQv5U@+Hg=cbG$`VgYh1mXU;9#@(iO>4_;li-h^1UY@5+L%x2+ql z2wb8n;66)qm6--&y`}`@ohJ~7u~ZMi7i>qS;-xH$$0>Runjv8Tyj2{%U`;@*v$|b< zV%G+iqAE%2VpzG%(eQ#VnIJ!5vjyZ;sf>}$5};3InQtf@H^!jrlw+R*ZCQ&iUstAF z01br%?_;bwjZjc{O+Y5(Zvk?JiH+E`>fxXM;L#ocqRGXfe{#^$-GOnEJFv z*>SMJK70_3Z#eH#?8I9hfN1jJ-5{+D*w!7Xz~|#e$}uDfuz0#?sO$wcM{bHW{s|lu z^qL0VNL_(8fg&E!rG1#z2ww^-5fPIzRHCu&B7|CGN%o%ZUBRKmZKwWEf(rW{y)u^u z1>A`!wk}w4FbF${L<>~^fu22OPLDG|Q+2rRfs^JqWnmXVB_0QC2Z5<99ai_X&|!Y1 zm5lGVl-m}d?=9%s<@$h@fGxp zDaX-{EoKQ9QdZ21I zu(UhIXxkhd#43Pg^k?z2b2gFi(z*eBEv#9Sgm7HFREfEhtCHiFVlgh)$rk1cWf7zjlYighB;m5~ z*ySqxLha+$oYjo*!T{!Bk7)a7JZRp*u@Q9K{TPxj9mR@D)@&r zPrscQV}NW3uF3$4!;xWv)iE`}xc5MUWT22S1sc_O&o$fAYLfhls${Vn0jyKDtyre% zZ`kf2Y_Fx)#?23wS}Cr2QAbKCov|FQ z6gRe&a=fo4BP**7IIf<}{oj9;>4HH#vu~K=C@h>yDOiS<3Jr@+$oi8H6s8-5=q{40 z{nJtc3`e(L^Vo2f-1M}Vd;n7cFheGy`tMzVv>xD7Tic;cpf>EzPb#@NKv$!+Si*?NvW%xrbK6^P%9t;)vQgRi&Hr- zp1Ne6t0p3$Xa&^Pl9;e0#Wkw9h}a5GcL|qP<1}TeVEX`_5;`}|b}n~d<$bLX1)s)W zSISRAlG=r}(os~hLJb_o3!0L#PFhu4mSu(6*Kf=<8h=(Q{ow{k6xPHQNS(ElD zkU-J^5F-FJ`?kHnl**}sye3!;hsKxtja!9?CX`v0#5;?*Y(?(hnKtM>jGY*z#y4u4 z9bvi<7U#u$=sqogEQE^~$M&+WHKPPQ``F3ZL_wG3w2Taj7gnjXMiV6*EfI!{2_iIrK*VPfJ1cfC4w!A^<(%e61WdOc3+>^U4$P9c0 z#Eo9IL`&RlF=vCpP)p<-?gh66qzCE*_w@L9_6?Fp_se;LbV&qkSe|bao7l2kNfkS~ zG|ti!nC4^zOK$6o+%8(*z&fEWodCudIz%72wUb%Dq?@Ut)O zLS=LctXNh?&yT>d^74G;N;`^I^9-kva#pFbnIcB&LS6IP;bHxgr6XI!C%6Av?}C45 zXUDJqp?~#?36F1x+`1z;uLNc^fp*1!(nJJ7fT=_>(490Fg9QgVe#C6yzEp;kTo-^j zb}=W3xQ)=Sf@bAFGh{Yo@PTtrgXT9(%zYz^1^lpkhxk=`Z7bSnX~h*WeD~d^CI3k1 zd$Otju;w}SlTeF~S>LCSpSF*_$Xllcwl^VEv=ZS@lyThM5#@=+z*!iovJ)^qSTOzi zWY{3n)^~;I_H3of^vm(@6xzir!BM5l`};JTb+6#K89b6{miV;K;UR~sj$#tY;S9b9+pV_sO@8soG*QGW=5WbaTkEVoPX)ic6f3{LmVfo5Z zY3gLQEJ_XN*Nz_TZ^$jUJcULcd<_zV@nKLrSVP1t!e8q^j5+WTj4(|R`+(j1|N89SHUWH7r( z$$T4D+X+>^_!kLrxY}Ii^&Q=Au787(Y%QX~HzCJw#ptPjXGdinNYjRaN&}-3f&!fabUBh+x4cQ zP9y~_X1uV@qm-Br)TwK#g<4IIeV=b_2k}%IKd^g>756gY^^H?Kn_foM&&RUQd(D;bKc9K$tyW@;zSlMesf_?Z+B?`bx$M%ab5 z)L*fD5FS4oPXy6ISII?WS#_d5LG~LJHqxNU?A)HAW|1E^akzOv z(WwKbY;~?~a(3#`SaDUO{<1^~lR^BcjPx5X@zUG4NHbAFAw(C{s^8+wQFFTj&2F71 zQU2~rUxXDTS^}Rmu*#m|RxVx_?5HipE{Lrj%${eIuBqo(vc$6rPAOr9`W2VNP3nmd zi%qx1Ew8eyj-tT|5-0&5QQ?F`sIx!#xI_UD;dg_-R_euL1*4S}UfcYvzpov)^xPBL z!SX}(Viv>ev3`pD;bRAGBt(ow{nv(NV|Lv8-53NI{%N{6ZgUHtr<{#3$tl7dN>NtE|`NAI0!B}#k-^3G>SdOO<3I4fAK_U+u%$Yn%XA3 zN?_|?#=sZO&O#If9+hr~WRtE4(6xzEI{9^Crp7W6{&oe}%gQN8_(=&J_-UzC!CmPA?=(vj=SPF| zFM|ha4rneCS!HDNuR$TZatjy1Nc%)Wy_FFGoA$gsx@Eje5z9+>r{cuxZlC^6DMkS7 zF5^RCFLLAkRPXR2EcE9UfIwB;umR>SJX?#;%o@8>f3IQfg}n6cZLhKvEBu4NQYzp@ z^~^M^x?n|gv5pi!>iG@?$6Ce(GM`p%TBe@ZfKl-M&>Q=I-fc=@mQH{00RT+h004;o zOQP)mkYE0Hy{BvIe886UU8f)DVKsR#avV1*$#xXYelhRCRF}KPH`%Q0U5O&Bm@u3{ z)Z)`9=I#3P^$tn^n2=&>-hTZompY+AGH1bp^)Ge=*uvi4o*~gOb#jwuLXC=ERI&DS zr(;4iwcL`47Y$yLWZ$VdNt6L&i!Mosrr29ELKQ1j!Ok;7)byTU_$oXy0`jaH*F>6SoO~RCOuHdH=?s;_bV_QF!#B9icNI z4eyu_NbOX_n#@cw747h{lv(n4xL`+w09Le#D#EX(qad$RX=py`9U^BIrLFXg_~DjC zn%xN3HX&FCjmkGcAdVX}{#rpzCJq!BH+DhkSSv=MkP7(}Bjwjk-4WE57Pef0vqYLf zFj0&-0wf9s{3N*mjmH6~+ZGCrYE3j*MNz5V@u{79xPTo~u|*G7c1)#-i78@Pwc<3A z`$!E1$rSvqrSFnTLQM*@5EBj-CH#V{ib_zYV(K1F5L~+ITT%Ie52Mfq-I}yyi<5Wp zV14(bKFT0qNp%=JH39W!0|KdIj)hr}IMVlEw z?;klsofY40c3uSmgvC}tD@8hm44zHZ$go&ZfLY-zkE(=t(xp14aP`snxB4B{IVmLP@!huA2t~Mt8hgHS7$~=@)u1Zv*v%4y`E040TSMp~eGy z>0K(JKR(Q(vyHqTU7+4q2+FEYvS%LUgDC0%6&3oibt6EiQdlOGAOO^qD#pPJ#cZ)`M9W`Pt+0j^4cZCzy`HV1Xo_($ z83NULnwUk9V=(p7^!~AeDRy$9ZiLm5D0FH}@&^(=#)TWwy@77X>F5Ch7{lk_ zs@$mjXYNNAf0Adx;d_X@MBw6%0M40jRNPZ&st_^r+(8l$ARe_ed{AhrNu(*GpbGC7y`zI0LRFYNLmVLg5;$W zY)*Ggf@-rr#@TVigmeK5x}?w%e0u%)`Bsb2a=;?UM;v`E^3)GhWgLK!WSDY!LE3=W zT*~WykU!xw``!hiLUew8VUW;tO3aofdJW9sM4=N3y(UpNC@C>e74g^g9E54R&LBqA zvH9ASMG`Fy2{>GQM@ZnFK+u=$IHU$nx0;ozpve+5{X>JN=8cb>Cgse=;C!|E?1w;P zWrIm&wrE35RDs>)6q#dsANRh#Wv1>cD3UXJxFB#e^vwlg_lYu#Ln9TKmMA)IFkiRM?)fc5)nmfHAUL4LkTrKsQ9u9;rx>xCq6a@p{RUjg9fW_u9ulSnJ#)i4ddPqRPR zr*#(R5Bva|%_EhJmxDV%c_(j{3}YC{5EKx6fLK?2F}jiVp=zx$m`z+m?wGtREkwnp z2egcg4eZfSM2&3#YQysF=!vNPqPo~`>-_j)lrAc5NdfvDF1+@ zXdCBm=k;-ayza5#=?{Ifs}I;t7UfGg&)6MvFh%Xw z)_FSaK<#16|9d^XNNv>myYp1m^fiOmuDzN$WPV@a4m)5!IEme>L;cwF(F>Nx0@FRI z4DQu#J#koDT}nO~IG}l+3f855Zhz|r%P*Om#c2Om%^N=0TlRj=Gf2Q=ti~_AlTUbF ze(u@lV+ngtM&(jtyhTcTeFQlSxyr8Iu6|Gr|EJr-4^?0Te_CQA&VAuUfN!fTlD_ z5`45`?lAEqi5pTuc>9M7QMi5cW$wDQ%<-@`{$F}MyjbuL77PK4j)83*wzDGP44ZHjl1HS`9C)^ zSg1P_8#BP2*w%Z>nb7X$_T2tmOs^ohi>Pj94Yh7Fo4Oc2NX}zxam*(eG7AP|Cq>Lh zqqasx@IPOQrY}y;f1;!`Ig?@gM+Zr#^rJ@SQnYVQ?->J~7M76Eu(vM6a>uG@ z`JW4fXZmhP^6KZ6(j2uoYV{dyDVHciT@YJibVvt5G))NUtA(2P@U@~IOxTf{Dq?#r zS+kDWVZHrHPjxyWDc$KEG@)zHW`kU;9UOf77)o11px2>OQ#rd`FdYlDwN5kLm`6EY%a=u*lf5ZTWz%5 zcBrnxs+dZiripDwQcb!BT5D9_y3xk%L1~qHiqOa^y?&447LB^%tAj1*ly6*82A$P8 zOCA=HE+!DTF35$~qLPZ$D3Asc-Z%qq>+t62>BNokEEHEw{tOn0<3~(V6ttcjc=^K8 zShZO^#dCsZy#Fv>K%DNH3Ox}L5TnhSbHTw!PpJAnOkt)DHCzYekRuz=Xn&=u`O|YA^N9z2`VwF|L*5P*{54)wfDP;;H zKg3=s%U(c90EpR{wNf2OaZub%uP@>R((S8nD#QyIiu8Z%7iTO(Uu$fw_MwlH6OhjbU; zHu$^7mZ9>w+>f>E{0{!o`mgbd<=PB}SNJ4rL1BeNaLn&O`(J=tU&`>e`I|n`w+%Q< zBFfECFgYEC^7IFACXJ)==}$g#o}HAY!O)D;mFvK>OMueG2)Zep7)#7VA#)Yoe6WAT zPnqK8u(R^O4UgXUI9~R~>q)0gU)wW34eI8_Krtq)bQfHzU3YeiY{uJZ53U9QkhS!7 zpyYsUv_>tP*-p}n6WwzXj_e9BZ42I zODAG&CO<1pK8w^_-{yLv&)32alikcRoI!R9cuAwJ(btZ%4V=KP-UKQYmz_WzqEO() z1rSBxQ?h1^_M7EBfhB*|bI(9`B>u<;Gn;J7dL^PdleOoci~vN%$ldIw?TdI2x?{|N zvH^VolRRK)0ei}HsvU+pxf<3cB8VU>z@O}2J;kT0STv&QKY9$cLMM+;ux;2a&}K~k zWPHFv1Fc=KiEd!DFuSwhz>^#AD*wMiIyLmW27$Lx!_66_27yDy z=XVd9aC?9wZs;b;A>c)o8iUq|>Goo?fRR_R+2aZdAkYYQN&XrVF1|@Hn{a~q;4H~$ zdt08E>Xe)E_(R-m=_Po(?2MW~=7dN+Eaai%w!l7Ge{4FWxx8B0Z3ahX8o6?2>4-iC z1Vnd$l}~_&Ip7hYkaPrNGFA69fvuX&0Tkj%nI^t>O{pTI&CEq%xAbQ?PzG`NGG zwO^_@W0E5HErA_N9*-=72hvqNMETLF53fS|@l`&49ungk`BRQ+U2R z#fIouQHM=f01I=EVE-HYuL*)r3t2aFJig3)m>eR@!vT=tJVaa-_NZWbXeu8H&tS0J z+p~4HA^IN$&5f<#=63?hr#`s-u)%&v zj44%H<&TKat%9P6;^2-etHWIOI}G4Kv!lw?T=APV%@o=gY79sQtp=Pi$1FBUw?-K- za9xKDnSg4Fm86?fnMvSpp=O|yaN=6QoOl`~D?Cx7s;H#273@izGwg+x^B@JbGkPTs zt6Lqvrk?{GS@V@Zm|!D`;9S>ek?3zqF|I|-*&Rru@jmGz7dF>ieQ@xe^h+QrBpQVo zyItS_=PW`I7xqQstMh?G{FZZG$lmU^ z4H?3je~2_Ku9VRK9jj8FK#+&2Zmp7v=9g#~%tf@_dxm$4ZZSMBW6|k%Kzv87Mqe}y znIVx1*5)ao-G6_sRph~zAcH{5E(nC9j4Xq;ca348LLJ`5$ACZrI-)n2x7QDEt3{Oo zAV;XNakA*ERXMX6&D}*pal}*b1wfs>VDS9aAAMv=-4tVgw;r3biK11RjJ^*J!!z{y z4|Cp>ALbl35n>a^21T)jgxbCK`gYN^s6TbC-}>#`uLN+jqWld8RswTrFi1RyqYO#S zK4Wm4mW+zWi*c;FhS-fSq*&R3I3(ZrkLHn)j~c@qXk$Yu2);a|NW6wqI$_-g@Sg&? zE#TSVib%=geLPp<`8(;r-RzN~IT{B6_N)M9d^+kopy`swl#5u$xl?r`rSLsvO17j5B9xC$^2A71uf= znTM9}VF>kjz5aDoKIHY=Q_kM!DVs+LY=4E1VJIIN9!9=2??cMB+PBOWx}$@)7|Pf)swpaLo;aGkR0g{kTA#>M?$ z4U8@M3lj8la_3pp4#stET-fsp#MNNQOp(eAG6aGIeCBI3VmXN1OB5<@^JpCsEAwH^ z+#vOrUDQ^0+Lo90)0LUQNtYqIzmpy^R>}t%I;G;$3!&jSiwv?!nkSo*kSOUES=`5F zJ68MqP|XF}>4^W{))M=gt@L<2e=RBg^|Ju0!bNG-QsvB9$Q}jYGYbH-i1+tX(nY;t{DHU-w6Mi5w-&HV;@{IHhYHvL7m#RY{`pLS9lWRO^m$4(C)U$sSoiJ2FC}(c1qUzu@sv=QN2K1i2;0=FNb6a`JKy9j@XS~u~maB&xosb!BuknporYdYh9gW3$T2>GE&B?y2A(2`?L{r*#ml6xY{J=FC3^?o zcTbR!Of#RVW(&cVvE`S~(uc)&G>zmDH@Z<{I-OR4#0YH%i-V`*4tlZtcD(ofJvnp z_{kj3DVyM(P6uq(67ZYb+tkG$ioiZETL-wAd|TekR$@@`9;uFMvf+98^pZN5d$u(3 zMN>>vv2miu8?VXSCw_S{##$FgL}r@INA{%_0O38xmC)yf-h>S5ZV(qW3%l3TrGx{k z3{a|g(pu+Bu%XPD#w}xqNXr|&l`pwlu`m4Z7L9d6;pO`kvJo#gTvpk%Dy&&kA;yKlu^+`WuoYTk5WZq4a*7@rJ0FAy&PDVSK@ME~p6J$OU06%T9Q~Fg*#9c^ahEd0bu^jz@ptB4 zSXy`!8&ug@)iVSFTk%8760@R$#D!1ya{0NjndFMWfIeqvx`kes0`r=EA*^6!Yj<{n zG%|)DEM4x3EO0+wkh#WFn{N1S9Z2`yis3|~Jk_s34~gtt1n*5t+(a5f_v+$yq-rC) zB?ewE+tV$V0`;{zqFDT?#^t|#k(^3HF_mkXg0LzumGTB`IUUxuhuS7;y0BOQj$iX` zO>?o$nGxI<3!eoneMExzguqp}Iqd;K)AKsCpjyn>J;XlS>}p}LRG!u9`I^x5sAv>_ zu$d(eOZ8;y&F0N(lSO`NGm$VQoiSq$KvTrBZCPg<gRJ$v=ig_8$a~A!F|ZDTOXBb?JMa*Cv{5l8r#9Ba zXz$BC1{vNqmdh)i&42A5s8G+ecQnVWC;HnJg#q1n%q6eBVgr`7UCUfbRm@TYFS#@! z7)^F@8vaXq$d&#$6 z8kdUQhO$bZdwTzTezhFQ$b@cDbD$FR!y1$L_NCXYdYg1#Q2PGe$lC9|UttZaK=NugX>o z?@Y>Hv=^RbEFEF;y_B(ean&4}|BJ%}iys$yV>H+9MrzSb0pm}><@7%FKrA{>M+*zcmt zFwG%GW0kk&{A85@Q#j|MWH1fDHZX<&`=q9li+^_RjaON{SM>q@_~?chR!J z_QkcZWf>ia7WKT`Qx@JG4hXtu=%C#TO{$fA&y4G$i288=!TjE_LmTmmRO*I-%y>rr z;xA>~EH#{dRV_25Q%l}@6U&07znwVu3wE~9HK=-V)ii7}o6TRG#qK_NK_ZiPa!((N1LfkT zP>=c_#@;D9l&D+VjBVR?vV$Glwr$(CZQHhO+fH_DJL#O!qfejj{1@Fd>Y}b{j8(N} z&ADd1>v=_NY^lcx5>>xwib(Zg)Vf7NU4q0XZm z4zPOzr_~BCyOAEi1Rp*xJcX-nU9B5W7#iMGcUa>#%H z!bo{9rP0B`_4bzXXB>$EkJdLYTYCecU0kt#>oID#=sXGZcU)_25BX7IM!&f*?B7mp za?XYCL6}F{3SdW>0-1`}){R5pKk{N@AIZICUfzQy5_ZTCJw~&mL?~t+bcF24c|A%! z)@ai8VVp$u*2{!PMJS%RwV2%3bBx!~9H;HFsD5F=D!GBZl7ZMaVSWjic0^mnd?AUg&{%P+KHtvsN!kzI5mLtuk%qnUI9o6>45 zPw4n0w^x+B7P6m!n$RIPWUMS`nk*xwdN|oEHU*mEOmE#Q0DKNg;Z$Uh;?pF1f}G~h?Rq&kf)`brnrQLV zKy-i^=91Or?d@8pReMwcAV+UB9f@wr(5FiX1czr(9Tvv+53o_T(=#1&&F3*QqW--O=cW?#QCx zOO@h|UVF`Ikh!IYcDnbhv;#iAyGZ!!`9$s{;r$?GMm0UhRN*h1*%;^5f(S2ml~Nr? zn@1w)ju)qwt_9jiO)z6Md=0|IBX8{yZ2o&qtDKDFXRc{ZR;Gy%7afOu{0VF`EOW}4{FJzCQK z>a=EQK{+YsX8mgj*=tU!k7XF{At=BWA^4V1?N-J^%W20l&r_^}Z|Kr=i~Ex`Qx;N? zp=;Xcdo;toaYaP-q<=*(^ATJAbG((nUTouIEtgB@0-yD9MylG-!+{+xbUNjP5zD)% zN_S4*24@AFTJtScz|`xO$f{1S9UR58=u9fS)S73XOOEa>n0gE#_~#pwbdGJE7WvaD z#A}L~1MfPVTmU+`A{ZRLZbXbv$aEYL72B5ZK6n*X7z=BYNL;!*HwIfe;~4wdem#%T zcZHjqWvN$8PhZre>p}=UPEJ4DVt`h%TbN&R0&yJgh8yNW0l{p4UND@+rmQ}aP8K~s;f=15e%=RXSaL3fd45UC72G2;o71t( z%6<+Yl51P2N(~dLAUT>YIQ{YY<8|8Zkj?thpE8z?e=?29ZHRt?PNNze_kz8$wmtki zjo3LkC9j_c>LgI5A;k!3(HH78D#7)G61t2^$}Nj&Hz}uWe7nA{Q(SnV8LUc`hv5dU zgQc*vQw%<4lb-H?D(}4L*A|xIBD2Tb)$!7|1=rk$@!HU|Hc$^6#I_D3gA`y$c8TKn zqO^$}FNBbu+f4jU0!%2Xg_&I(yOiI^2bEfb9MVa|1Qa@ed3~6LUhas0n`{rv{Jnt-1{uYB63+?NUkZ?P?BIR3&7v#vvJ1_j zg54C>R|;pg%@mVl1&e7iAX`M#NIVg;^0WCLnDj5NrU!d5=%G-y;~HxJA@bjI6N=gC z=x=G1SwyCY2wt^OC_d}3R9QqBM+1)BeL@97?~64)niF*-b}G(QSy%y(!xenj^U>{S z&zY>(5Xu^1vS-5`XckV42psPw4xJx@$*Yst=_mG`;2=CyYkF2UF8~(+uOdyGZ)I>& zN^?gd^T>Gvvy1^5`FyS~lE?5cl|I&Kb+EkCb~VhC2(;{%?yrjEDQ1ZatbMEvV<wwZwC!8fa;v zV*p<5<0lxpw?YIkE@wY}Q_kQ4!m-cmL#e=m<_NfrCT>v!Yt&{(bSlk`ecv`(vj#6w zAezuMgmu)|kZ8@`)Hm@UkF@ZkT18inr=>mSFHiBkM}7?E@W2&mP}_RF6qxFH^X95z&HX6a z!U;~j>?9k-dqx*cuwoc|h@(F{i?38DawSvrM)7I>;{w+MJMB)?gpf?N!GVTHt%FmM z7QE@vkxcewLhYt5si0ler6q~mBWsW9EP($e}RC%EGqnB&#@bh zFWl;*o!pMGt@*Y8_M)#H5KZGrbQ!jkHPt!ks@CXk1XN;47!*41iE7-VpCP~l|7yB? z6OocaocR19;TU=2&Hl*G?e?nzS3n{b?CJ4WM@;EMev4rLwPF$e7AS?yV(a`+&cgC- zoZ%j4)DB+gGxU(X`Q)vB#6A2gDXOWe?=QbY*dw2uglWJq5TwtG)Y2}Rb^UApjRj%?*z+ID?TK@#<22yxH^L{*qDii5MVE`v|T%q+59+iqO^03TqSMJEEFv5 zYbB4f&4uI6Q3ZRw)`9%f-@t}1_5Lt-G{+!L7OiNSyUQtUSUgDC#9JDw!}8oCP*7-! z?Utd*L{6AyCZtiSzzCS#NY<$+yj09BwVzI2HahJ%2KNPu&rM^*Oy>d%v8nevhZd`U_bzT2b$x z5v_Rx<9Iq=E2Kd%31)oa|7XfZcs2iYhX4Q=zytt5{U0gY*v-(`&dJ=?=D+fFx7z>1 zXy7k`umY}OtD+CAhcVN3g^la*&$fz%qMc_&4_^|Sh+(wy{kV=vq8WGa>7wCF+#tD$ z+1>Vb9c`Y+j4W{8haxTr8>d+vVeDz(pv?;VJlVl&Rexiid6ZeZTWRNtP^3(vmWAe~9punAKs zau71SH;=gBGX+(J#L8LEhMIQLNukKVi=WdGVF}?CoK2!)n&8tKV(a5Zhx%IOVrf%V z-D9MunN@19!z^5|A1(yqI#H^m`RsA0F^;*ge2uSjB{Xe+5F5RuQ zR6d$1cM^SAzo6aa)#MS@80pJz@KXukO#-@9Hq!vxe$wDI6^gB41N|(mNsK%LOFG3# zhI^FZiG*PdN<`wNY(|^M#eGzdEtMq_#!|+nyQV*L?Fdsl2nMrL<4Pb1mSiIik*A2!SUz^hI3PJ9Ejv=hGq}T@CZGlUE(<6D zmP?Ua=RoE!>E652U^}w5svNT;V|tm-lsoctR7^$T7Nn3f7LlTOpo1X=q6i@pL;Ul^ zEbJV4G^sW1#WPeyX&jHioAfyC#86+tApalUs95l@_c_eb4}%TvB~*0=5O4i}4nLk_ zud$W7dLkIk8ae;%EsG;rG%7?g?mXswc^JE2D^YBnIaFi4NX}2B*Rh{c)oQR9zhvlJ ziC}X`iev!addW#JMIDuF$v-41H6Z)4(-Hgf!rQ&uLd$yHhJ;Hi(ydz7LJmA~Sd?Xb zHs-j97%AD&c4!J*ZGi*nhqi=l5!U>lugPsl6sq_ZWh-`_fx;3b*@cL(ps=3^bsXNk zsA(yp-K8}W4^&&%Mr2O=DR5Qls|zR%6?gu8fS>Pb@xzIwh2kBz1i%ShrbxZZddvER~h5PT#4| ztGzsZ-3fMNB=(0GAH|28y7(i?=h<2v)dq4u3w*}u0*YgyQ;Jr-$>F`0F~YqCO#}^elq`6-nw@ULx-XHhR0Cn?#mv6s=wBMgicUQWt%`D-K z4Vndsr9T`iMtIWsNDDs~Wipm-D`$L$!1&kLUVktP&{Y>QcXD>?iuDMt`vJ`hP%uoD z7tW$NC3E1FCa$OC4z~!Kp{*|;N{qJbwCn!!J=1lNIQWVokNpK8SE>fC-buFp4FvUZ5bWecQyu6#e&+Y;i57iY(^z7CPujV~0F7Jn5 za}XXk^2@pWSvQtf6Pl#Nsb}XxBAoXj)JCYrZmcnGIq*kj#gHb_73$#H?bpMLzvqu* z7p~0O!dX`qC)Y3_P7Ys#-!WoLd@qX! z1L1XzW!fL~prib{t5zAg2aKxi}5G1xS9b{i}Z3uOF(yaiNs*gv5aUe{z@^IMVPQp~tY*xMA zt|X-K30Y2qkEDphp4V6V+w<B&jx@`Y}M zo5cyKQdh20GaIPmH>Qp1BMuGLX-VQ#RKrxsdo>Ivpp|ChDIlzKC35zBuAKp;O7`;H zh~)<7Y84stOlnmoAUSVdH9y}`WvAjV4vcj_D0{Z5qY_+b;q$L+Bm?&Po zK-OK7DfBNn{no^Etj8-*)-AT*+G4aoR|4^Vh{%&M42qkGuuYums~)hQYOj9KTAY(k zkXu$^n3SIOW2Ef5^XTY&yT}S`l&5goUB*es(4EDV9R|%t&V@XYGpe@c3-kl~eg-0N zE5&z|D9Ipc*#Lr6Fy9s+h6w;MY6B1h#hJ+zt6JFIMJ7t??#G!mF@5Sd_F!_DjL6!;-bV=QR-bvZn*}XeR zlq>+&ty-n1QsSp~ytuu;v%K_1%1!70O&oSt~#Fq+S>ktK^I8^BGUL&)t~5P;OEp`7p8OURa+v z)Amt!K1VoPLgRai7GK6gjfYgQ6h?#AyvVr~xc25+s5s;mDm6){muah?*G6n-ax|$S z-s8Hrs-@49 z(GVc+bG!jtDp#{m)hSqW{S5*i+(now%ska@iv%_-iA7k6HaSNxHre4s%ZJD0TXo<0 z^6A5!*bwSGuQKwLE6avQksc$kv8l428~UvKUI|K%ves@LPsdjNjEChBH??Sct&ya zdIe3HS2(`lt0fuV9%`?lXGiPPA`}!`E%A4QaWr^p1k72mJSbrN69Az`vNFS^0oOgH6~x|i4BLE! zD7sb#XdZ>rM%r%54H)Lb3#lqd1oslvxl}`a#zsT@%nXhs1oB8?NANWZgRSL&=v*Q6 zGw&+WeE##0*CjnIrnAZa zW;lrp;qAxn$FAV3yw}Q2^Y$PVK`vhrkWIBMOJ50Qwr+)5Wgz>2YeU348ET_*o0^V4 zsE`}5-r6)tf0d0F(R41uKSRz=&eRRMzCl{>05ry>8dmdpV|(%ax}SeyrB(LuZF}(z z+QAd(C##QF9;LeUPbqDHqr3aIDnEh$vCCz;cb-ItW{O7*#>#|wo0uqzlML1Ius-yT zvc|gnQ!{5#&T~CVG<4~_fa{!B!`zg{wZ5x6I~{sIG?Gv*Xsv+YXihuYAd@ICKEZ`& z_u^;89MZH@<|6QuT#p~*PDu&=r{1Hu9?kqkB8t}Y)Q~Rj){AcNn>A_Mv%!vmK_BO* z{LnTa(*{#n%J1&&u97)1v_lv(@C}$gXH(%z=TdZMdHT(xi(x<16gD#B=ix(#cz%L#9Vq3_|i(nEl{$A#u~)xa%2jM5F2KK!`;ZKzknk%QuHtN35jJoeILy zlk4c&Zb_cGkZpqK&SKxH5Y?sc5>CLik$b?oYbzOG*^pgMuEgOzEbVq7J@|S>9Qv<(?mF;|n``2dV12*P!p&;(9?~7H%hy%!v*Z3?@P%G&dOSuQ@<~`= zvKPek9vKb?YdF&%fd5?nhY9R7IsyX#SV95-`~toHM@qFawzG9~`d$1dD@)rhF(7oG zs76IpNYB+ERs_uz=pYbW`NIREgHYHfh_5cy2VOO8L-%Ia9~$v$N)%OKpS(>^WuDj@ zIzhYdJl3$Koe*ruV1suxX*|O{>~n`t7Rzm^2t?f^*VH#0X10hgxbftR=B#3ex;!yr z5~^&$BD^yiOy~!*02y14F3-MpieBuz4U@F94CMPyV#JGA*M87tKh>yrWf||%`;dt% z7y>VASVp>+dn!9NiZ>bqJ!WNR2mj!E0)p~w+oT$0q*2_NOngK5kc zENW=D@Qpu1j4Df5ql8x9$wZhWT1h)F9Tlc`(=j|aN6)A{NjS#eOf%e_a~Z4sVgBRTNZk$Al=xav4SE2y0t0G~bK z*f7~~LmK*1`Dq~BaD6@!NS4((tBWH!sDGYCClz#sNgMq}o^NPK){**Hw zk&&h}Ncev6{qnpnCn_oe1?{yVw@pA0eNVVPU=UD!AP*exuH&W*+V?t0j9=!;%b~4& zC-YP%2R^e@ZphcV{N(i+s-c{rX(wkThfy6-aa^KMx3HSWT*KcMEymEz=CYOf!sokVzp>j~9it!HayPGq zvD2@8Uw6+eCymE>;7zjL;F^MaQC3^eGojJwNyv?rtvky6yMH=9b5QUa->jElcnu}2 zukL(D=)-mG6lH+Sb!Dm$ieaWaLj$9JFO@I0-VU^`@)M+lZrF)i6SpR@yl~o77Sw-j zj$<#hTky?kY_Tnu{T7&?IIBPq<02`%g@xe^?K$6Uf|Gu`4Ea!CwV@W|1!i5=Oh}y8 z+xu2@aG{P@p%z_13+6zw`s2?%sN|w|^U@9$RiB2>G2(T0zQx8Inlv+4@DGC1dpHa6 zoY>vRx%(B8UoAA(&{Cx)LS5-xGvVL^vM6XkJoPHB&Di*4D>$G7Mq)=D z=+R!FbiDmAawH<0Sd1ihxbT;_DF=+^#(4P zVI#(9F3|w`@xp4(PkC+adVCcHw*y#!=LQi3QGMa97w7!wqBr1<4kWL^d4|4*#;DxSL@HcX>`}bBBX@8zr>xFzE6hDe{K2H^Z8(YV1MBnO-y#5jI-N+F z-y#0@LH2v)>|kYOZt#cxzsG6tJ77Co2dDoS@qa$622a>P8KB?${laJeKki|zZ)t2| zZe{%Y)SQ(zV>TENykAtKw5ma9g{mtgP&c?xP)Uj^IyWTa-+@A;A|wrnH_am|o;NQv z1^le=2=21j|2TSGsxtU+hg46sy)ybw{5y=b36_%>53zm$FOQOuXc^5y7yH)c4wAyg zNW&fYn!haad#Tg0Y~L<4Ph7R6m_Ev^Y574M*866u$UTJ3n_tGoi(oQ^RySuH7E|o(JVxrIu@dDk5DI_Ft$5xGe{sfCSzmC(eGaRK_p9Y|_pIdf?dIZAuAS?kJ zQ~*^JM$zkW1F)|eh5DIzI~K#yo7GFpV02vZv1_oC213nMdiey z(f7-uOP23q-;gw1D|56e~<&h$n{&U)9{G|;SxdBzdp%_T4&ag#+ z)2x#IdS1G5^tXw*O}fw%+NteyXS8f*y#JZsMiYkzR8T%XIs_Y94>np;3rp6X)|OD}QFRtRSj0)s>H(y$p0ib1Rf$6@Eofrv;xF_rQr$+FfG10M7GQ zGI@c+TFjEmKwT>WoiyU-eptf$e{oBH1=LyPzdt+vpaB4|{{MX!=GJyr#@5C*PWu1# zJLLCkQLScei!6@x+hve<2;zd935wH9X{4hTMzA5S7mw+~<49@T_`_{K*yg#kJ#zQ; z?pfifli1hbYDvQIrSPP*tVn-#=l1DBYEJ9bqEQv~piyPaRBTZAr#7l&AcIBw>Jw@= zR`D}E-bu!yR!Dp^d8x@>Vt4N8>B5N%FIL3UNxv&=aWmOLsZ0Usd;3&N<9^P``71&q zS^SCw5_FI@8wX1S7dZC`VJT6!npgG>%^QIX!kPt1G|stZ}r6SxFV@eFj<~r=I$%i$W47 z0NO8_|0*l>0#hp03nEoj;Dq7n^SnvLf%XdBTy}C#PBh%q)hZv8f;Z3)L$f(a{{)zt1ZUf-_xJ`75VSf%Dx5gcJWMdr2Z?0tO){PH{@<=f`7vdS)A-5 z{$hM<=Np7i@rG=5pvXOIVshz2osUU%{Zs!+FgZj+O5wZ#ATh36gPNW-kmLgS*}M@m zmT_@kJNkl$a+#DH=0B3&2nXa|nZhZkQ9G_wP+Es83}0sQ@uw)PM3dX0D}%}jE@W0$ za?vMihU?S~VUmWawXEL$W42nIxyHg$-l?&1v45s#x(kQ$ZOVVfu@yU%#C1W47`@@F z}b`CqlPM!FFfh795Jysvk z8|W_Rf~!nKX3eEy^J^Oj-kmlOhLw@lSW#C6)%eo=7OwKoK%UKC_)sjK{c*}r77CJb zvzpA8s#rF95=dWfOv>far;dW#|_TS>U!l>6feO~vJc-~ALX z_p&;L@)7u6^*R;SEtZ7Z(f6!KtH!uw`u|M~j8ix&MHJH*%10ILaZb$!_TAKFv(}uN z#bPz_o+;kvZspgF1Zy=389-6p7^zRCfdhKVRmR_2A)@Q)I?!GUHPcwFwxJXiR20qp zvO9cB@$pw7i6`+YP?&`$tdn&~6E(f<82Fo8wWY3YUtnLi5pYYp7k^aKJRIiMsy{Wd z_9WVMCgw&lSPLQnvhkJ}FDBhrY0$ic`16+uVTH@T125Y52T+g>^jkI3B~rsB$f7w* zqa(8~Kh7G?avKq@S&KSgNkt$d69V5zg?WFi>pylY8HF=ah!V@1daq>j{0yTH){YT3 z4D3{@8nsrj8vY_&iWH8`=TQZD28S0%FBVqMJ?sJwqhk&K^{C*H`4~RRY(y_zHC>diHQ3X`!nPfpGG9#XR<~+8V5DW7lx5-W zw>uiJDr&6bF$9;@H=TKq-+%#=Ko9vA8NaI*|{9|cn$_V=&uGhw61+79Ts68h~x^cK9=IGH<{C)$wM&TIZT8l)l1 z&dD2}6flP)8L7iI?EiEQBaC&~cUUMoMLe!7b>cgmj5ZZsO)vlFmH`I_X@^#S1lNq# z$w$bKr(I&?q+uhe5|V_Pb)HLrIrtA$DzgpmR%1aD)OEKnm}v$h6G|r0fcs|JDqWBG zoZq=!kbWTDqehTnBe1*z?P;|L|NT^r1bDPiq9o9*E-Z26gvIuni>eLU1z8(CRkv7q zIHt0z)SIVC7Lti5wTi_QUJ#)dwSbC-)^(pw%hkGJcA=DQq0m;N2S&^K-cjP34eDhP zW4m-VHU~U`H9yA0N}>jBY;oW=iuM7M7O{&*c!2eH`edZV61VgOh~;+@1FcRna0P)2 z`2*O-1v~xj%!P2EK!j;>w}0w7SJTA!0Us*QVdTJ%<`s?}NV(gl@B~x zmm&P9^#0=r0Ib+`&7}Eq+wSP#{Vz~weQ|Q!V3X0p(|m|QQl2xXfWXxkx{N*HvEr-x zU7I1E6rFURy@6J{>vuxAf?N+P`+92oC&)>@D3x5_d`E)}*a(U~_S1laP5v5-$OHCR zK~39-eg>89qp$<`hdfPJfIwC$FVnk)FE_ipKhpu7ikIN~{DCKWBhHyRL-$O4E8!Zp zb}irO96|NOs&sI9G)wZ6^oO48xCxM|k(wA~bG`O(ca*vpGcQcfeIbn%2O<6FtJiDWfL zEOoVyhb=>7X(%ZXqYZ7UrhD$Zai2;ovO2L@<--a8uQd@~??c+5wc?F%j%{a)rBV)b zH}8@(^}mg!UlZM|UfIjT0y;_MrjD8@&!(%2g6fL}UW$uKYHe+4vS0s-qj?WzlzMe?NE4L-B&i=!Awx@PAU8yNnqcj3qzZT>6ji%?9R3RkhW@+^&9 zwg2#%jCj(ubiUJmZjXPypBF!RwFcJKA2k3GwW&zdDfXQ1L1ipYBd6{-y>h~KW|z{K zdgY@5cSHprqD!m~G~+BQuQw>GeuTQ{B>B70>mIGQt%9s-I=CrP5U*qk8eEP!dgPuZgG z0l@~9^r_cLOm)f}4C7dw6b|4m@v=m?5ECaG}4WjE5+B)qbO*)Su)~%8|f|%JT8OFJ4@u+x2&*?r^a@Oy-#~1mJJ`X zms9#VYqe1NCY^n3tIWz>?_N(jM z!@c{M%@=L2Vh?e>2ato(O`jB8!4)&j--~S*4J{rOGmcp+S&-l@jUox(%;9$hhgPun zbutS25fW^t9Uyzf{DF@-%o|6%l2O39&2Icsz#Qec4$vUUw;D99N)6wEkN1#|$ zh^J!ggj9vstx=|1TB@mE!OZ*$Nd@|JR6TaD8X*O);cuNVJ*Q}_99Wx)_ec;m`rOH| zn^D<66SUVCDl2TB8$h%zOo}Gmx`OMj2Pv;Vv(lVhTtt3!nI&4NfJg!3{1#Ge3hI!> zo$5H(0qo|tR)qoeBIdv^J%6r(-JW=Lf9wJ8EnRg8Wu|(p6-*t= zY*fS&1Zg6GqsswrLis=qTlnJ)>nzbw4F$ura>%4yfDtk(mrvW2Om|-@I2STo7LCOA zHzcQs^sOqK?uCG*XfwbFwCXJt<#F7guVU?BM<(}(6ylU=A16Dm z`RDaLfS_{h_MM8$w>YP$Yp!a>8iiH?9Bv-18%*xa4xR)ewJKv4uL2TT=U7*D+;~Z0 zE^FjAv2%+Vc5$omcwE#^EPA`|s&kqr;*=teDS{q?2e%GkuJgJ<^ZufKf6g<)$^|~ZW4ja-}l=yS=^&70sdjU;(zBl4c_5Eis5gA zbOm#Jf*j1Ruo>>`P|(-$a=~hb>C7CaXWFjlPMsPY|l1Co$>%X$vcu1w;`0K%C{Fui7N(stE59}>8fPYub#Xz$qFl3>n6al91EpafL z!d)O+VhR}k77<(aig#@8VrAZelg=0Cp@rTbc5|*`19}9YPBWw%$)*QZ)Vd% zeMSa^5gL5+L6|`AyBFn~C7l3TJz-+2u|FP4pyOMN-Tzc}tzWb%w|Lxx{yBi5q31|U zk<}7*4rHKCW|+?}Pcl-~PO2in?{nE-AXo%#l|X_BIjZ{vBApq8+uTXP`6EjQT+nUx zYBi4{4;vT>gUVlk65YePiLxmAeb2nS=qb{QQL9ED_t=eHXTu|*?$-4aK-FIVPe1%= z%E=H=f|VZ)ao==587(YRAaxi4wXD=Ou7tLk8n5=#jW79N^GQMD$!e>-SmU}`L$Jae z$TG(}58EDvJM^zESC;bxz~X43t0^U^7^>l(%;55PXKS3B@9ynwNb&PH(^jh)u!(7f zn7;97(wzwhe1oz^jydy}>JRR;QdWC1o2$G0gxc0pu)~}CO`iCokeVyIN8#$s-QreW zk)A0j3SFx!)0I63E@N$IR4Zg1F@Ib}$*dm_RC{9>(}4T0`BuP$jyS z0JS+dx*kXH(Xlh=gp|4D&{c&Q#6{!2{QwN+UKTxph?-iwRm--gIWtU1E#Y=~Nc!n6 zKq?tz4N)WDKPf;oEb&jjkFc&UZ%2HwcT>!1-5B7dR@;n}+w8yIPi16utuM!@$F7UzJ-&4R!R;latPGd^<}Z2yQO~*t{8D#|46mH z2d0!V(AG1ryseVrG}?U<7-XV_n%|`w)y27OL7c=z?G*&BTDR0v3l#j#$bO;97!vR6w+d zW7)NE3s=wFvat`S$+4F7Zniv>ObJ$Vr8TAV`P2|5_ZlHBpe>O%t0?BMw(IBiOoKPQ z-Uqm!7zWF+W?j%Dq*D)o)}MxWy5-6Ht{f294upu_z=eiVx8OE_ce&%%r!{#)Aw^z6 z%H?Y$%<(tPjMEWS9-3*Z;QX$V32r^ZJ+nw|5B~Bu|MD~Ap4zQEhH}}vNTcJ*!OCL- zDOjFR?1+yhYaBj&A#$n+^J}~S=k_Ff;puwI&hD;k zpRk6jnA3zUnnm)&7T(HQixbt#6wW;PtZuX6qp%qv$!DME-@n)1d78Hrs*m5oY1VjkZGAM)LrIBez9 zk|;VIvp{+-+M^xe=pZ`q#0>M*5pCrQ>nV~_dY68(-M5Wh=-cf?rmKsgMg?^LCtQz9 zAe>EpN*LmgLxHqEU!wA_`niGDC60-oAS~a=JB*4;iYy%PwtL!6A;pw?3|NHz5cU^O zBr}^>pCOo1zcv9bow$>;bFYo49Oi+&pHS(*qT%0e!t|lJA&R-ANO%*-1m^-ltmm5L??nT#+VZn_u$>=0Po48}%yaxo6nC@9wk#tZyiF zhk|vF>Zkm(J5`N6Jlwl`e)Di#f$W^AabC^;5G{a2M^%&#b%S8UmU4p<{oWct(RPql zm&Pd5FjQ*j7}UOT9K&=jd*surEoi@)o57A`P$YMjGbFLy{`%bg6wxmYms`cep4ZwD z$G87o9!^FOeW&nGTM~tj+?Kva#wFmK{;fjt@erD*D}Yq-;uCEp?_UazH9`)f%55#w zMnBk^*oL2@(2~LgFNFYE2JDZiB75UDWC*sdlF7?+z;!WD>r$2Zr4cUTle3n9=*kWP z<5IneGAKgMyyeE4d3lUYIRW!+cH@ysWdr?Zk%?~TRdGVU)~f|SHtl*txnzVs8~`ME zgr-*i^<4Mfe>S%JK`k?7o3kM@T82YOJn$Ta0N?M=hfB{_m{t(a;rQr1hx#%U^A~F- z-ntQ;)3LU1b2?a@TY9qJJrtZij+!5Ukb$4jPP1v%_~TO_)#)<2=KfZ3%j)HJ%w24 zLG+!#!|Bmfq%Du(x;sB(GUM|@JGY*$HrP9+kaDkp;%}HAFh7s?%aOrtO`tivCc4JD z#iVwgPGcdPGkGYw-fvXgvEB4)P#rZ=0`lj18UZ}^ld%^Ocy?0QskXD1X`ro=@DhD7 zzs`qaX->-_>c0&7(0@az4Ci~b-7gL8$C(K=Ob(K(GJTeP`n%27Wqk~z12hG$^@_vI z&RsRF)ZoM~=Ygr@Y|T4zi4mQH6-u6(Y^zH%0&NwC7VPGAto>uAj#hdAL4z(dm#+Vw z$&4s_bnqE7gZWu~_Ijzt4bV8BjY?fPZjF|%lv{~6F{zflPQTnCw-yI2;kV6z_>^2v zYy&qw2yh^<4px>?hi2WrST5e=RxXP_>Ja{grn>DxSp5|f`$i+xj;|WRL!{1l$&Cu( zf`h{tUpL?h2F@1opqJzY$zsa#)tsH#0slnM#kjk~e)V2~CMQZdwT=PkiLD4U$5YpS zk$DuQZ#@0(TgnfXCK_(`uddNT{t2+W zeLOfQb-mfq^0IRa)|l{~hG;O)gl4lG@L#Mk#5ff|dv?jnwKrkO;x(HW&)BkRhjcvw z2p7O`tp^ab{t~8L2pnoGD7leK*;s&lJqX!QMNKG7N2#T})O|Q3YUO8?a>E)5IEi5s z!|0*!Ly6Q|d5jKL4arLKV;1~m$=X!Ai|s!X_s z)#-M7d&)aJ{)K1_rOn=~xWCP5ecD!6R@u~ybXdFD)UF;2cZ^het}?vPFL*ueU7`uW z+})Ok zqZ7^9KZP=62wsb>5)W{}Ocr4EDDNV?f5Zo_jg0T#v59gGUUB!3NUW5|?^(bV3mxmD z^>;?OA}l)We@6k|fr9@#uEIB(@7}tdrA_n}t`wU8X#j`VPgaCs8}bE5csuC@s?YE7 zYU+L6ED%T0{`k74}q6l5EaTPcVi8jBbH%MvnFz%~6(1aigqZqKWX25uFzXkzpt zInMT4AKwU8#&zxTmrNvh{kj#qhh8f(9+!=2kUN+{yAbw4fE$cKDHJu70DS47*H847 zj2MzZlcTG%^fa5+|HaljaETUd>6U5Rwocl%ZQDL++qP}nwr$(CeLAaNkM6oP-e1@; zcEpMmbIq^JTSkTvMa@@DEV_rb7LCt-o1_GLb!b)Whe`uDj<16hUBd|dB}pwaC-Qvp zRIW7MU*G}I$63B*?9ClW_lZP>y!H3jcdhx-Cm&$~_m|^lxrD=BuUOARU$TtEe)Uuy z(0+&B9=~$n)jiaF!&2&PNZQsq3zz$nPd^NQTM?DQ5>Ef(zzu+q_M;CAp7lnrIiEC8 zk(}D`?kJ;)M(S<$rvdS@gsLY29qLdyt`{5DVbBMsnnbQ$jz?EYp0SzA^ZpJDMkv9w4v=+*{^c+a zO0bNU@>Dd*1qEeH>)6lrE3AY}Mt;bnXHU99iAuj}Wfem-S|w_tNO6;a zmr`XHgW>T{jx=L|6k~d%{EwC zzY?@-ldSg7#Bt;119!N4=of|$k*`|B=5|!m(gn_spwZ2&RTgaCw2En4Lo3rq$idUA zt0^D7iU)}#q$p6Tqef~>Wy6=AvUQ(QaSvK3g#mF^x<0F(5V8uS;|$ak=cx64cSukX;t{oHZYWKs|*6;;XO@n;8jU(A>r`zF&a>FeitoeqV&1U`stg!AgpZdtOF zAKgmwbiw)PwR>{NX^GDOzKI9_zbXo43F$(hK*s(I7 z#WO`?O6WWX)+kn%`_6Cj`<7&_5MzWcVmmV7y*&>Gp$b-HR+UCHl9LmO>T1MGst8RB z1B?#nN+ES=+4{Xd4@{W}wd1q@+BHY6J}wS)rgn6`y_&l+NcEC>6wdcQhjNi49Uq{- zmp@9%!xh9Wz-~Uje_%~sGUFO%#sypz_kV7HVcPyB|8%PB>h>1+$ghhfr-FyzThMVc zB!*m@)XZ?AFS=S=Pfo7QC?rp!HWZ5qg}$=)sDG5%|J0Uy##+3b=4bz-xFezF}zY%G}ql~flf zvvHT#UJDfN1~WZqpEy>{_=*c^XyNnVXtj*isGE(KN~SPHda&=lsH9%Z4`UaH z7{SXwH7v*0zL;|=%wRnJxSRNXd>s9@o>}8t8!lnZu$3X0*Cs;Up>kX-$QG|{QuXj~ zIj@)J#@1sN(hl|lzr!P)6?GWRWeQTUEO{Z-0%!ia&&-kO?DL3eKVe&=F6R!H;!#4? zz)rCg!0T-jzrz1yfQoCwZQnym_nr} z`!cYvwQuV4Q5Zi=&)rm^LrO<)_&h-fAOUI-%m+rAmzE@ zpW0zHEy4W{g%Yn+8nF?aL$Te*T@X^eh5gV%X?T&2dEz@Fs4WQ~r@Wy?vev==d-YVQ zFebLtAtug?a8K zS;QfnektEg`t!X+FG{Vj(zq749(;P6JzNm4@9vc&m+6K~pP|JQuCF(}9JgcGdbw_+ zh1Ij2efPaftSgs^y#8=XL4k*MXo**{@v^?1*v*qB4;QNKFB2t8{a-h0trZ8M+V@XR znPOV3%(HW}Np)OU!mk(!vQ~*fPFKb)+Jn&$R}9q~qF*oX)8RCPSd!P=F4!xP^xkXr zm4BaF5EGfM{NP9P<`@0wWR!_TyHrVck3wzCkJIn0aA@GoEo~N98}j^x%7b(Yw|OD| zrbY(fuYp1Q&EU=9kZE~*HV(^T8?9=v73@GZ94$fFlD0&dAQ=1*v2Zk8 zf#=?2X7*aVM5gA3<7P!WH1=O->#_taj8^@`g3U|4Sj!K}+?^j@vDzh!J8bG&fhF`4 zr>UzyTX5f-Mv4#fVychy+6(y@k*s;u#F9UlrFkXIgbITAbA}%M1Q3~@ExKG8(7ZjA zD!+HCd;27hsH*yOQV9B9*oqzWevoFN_Lbt^Y46m@u33BTnrfeVx%#EY8RzBW{=Uco zJc{^EM5KMCdF_=nXJb`z)~@qz?4H$3^B{m}YCqjQyAEIv2(Id5+`j=CUCpN=Vbk=v z;;%a&RNPj2WWS3|B@T1gQd&hlK%?smc}ZT*4&uQ8w`EOW)J4@r>C9aFJGu=Y%G%2C zea0=Kh4t+gTmt(+o(UAFnF-(IiD@Qt>%vw35x5@q5?Oe~HeK)!{6C-A=7B!S=zsI> zpN;;LrgkuKwELZ;{x8(YV9BanzlrZFT-{poCkO9RDyzNu>{7krBzYxaRTxsh_bQL)w6(e-sdI_k8+ zEqMxMNc@K}5xaDKkH7EKgm<@lwvtVy84!#1;hC%^!GcokKqy{~!>{yS^dLFw*sf%awM(ltx6L3md73p*DHk4iFBx<)`em?W7pq{c4NS(FD z1zUq?da*6(3x@t<({Yhk^Avtzt^w$2w2?U;v)*ZViDJQEg3&a7I$vr!F5V5&Xltj( zWW*u2Lvo=^{^`s{fX~B~xwi07U`qTRsGzxfDLAS7ds2mVW(v2NsgBbY0UIo?iE}s901_cVziX6FO zxsP8J7F&E80Se*31W*!S4+^tis!H%S{}CyELff<{>C&%h%)f`SNl2wj9}ses{;rJcLfS)7{1WF6%|}a-aB_ zA`bubA`xX>@WZyk2p|~USZS<{a&JT5v|1hL3E&<&UAO6M35rvQ(-&(Rc1p^#jhyyCOclW=?@}mXwKyFoa!d74$i8{%K@iECNLRT5VObJNGpK9*HvXww$=0!U z8NKcH5FKD&+&5ED^h+e;L~G9?tEjF!+(cWt9}4Lnh65#VnIJ*>h+mp8h2C!uw;e`s zlP|SIB+D&BoaWi|;Gzo5gw4gNwSa?KAU5_3q7s+aJ3Ir1_HVWH&ay>vQxl}%^|MD+ z!yI+HyZ8O~`D0>8QDrbdb11ZFG!kk5TE^g%A1Df+I72cc@;#U|;aXFL_7Fek0k9)d z<1w(3NqMTZYypOvOldOg)3#izYaRuo27#lYy?=|HDy~ii8rV`q6<3^j`V6LiMv{ue zp6Ql^c^(178#`Sc_?KTYw-yWbz2wc1D$rl3;xRkYDl4(R@OEk~O4pew8UqL3e90wv zuuF*P$!UFd6zC)31Ac-6B(N&5Zw24Cc1-K|mE(!kiXqvEhAJ`KNMerfoP>;7t{ecWXO_q0>102L+8}JV7AHm{pfGRJpY>RaDfCdwN>*%Pbna5%-p~uN?CqZV!Q(r?#|tj;V$kB%u+CP{|DHQ z8v;Y98H|bi`giigKW(CkkiWJ$x@m!uQ=*xZfONLd;@_ZIE3XC}3ADp;5DwUGR*{}~ zk>J&DKmLhq)R~4vj)Oq0z9CLtD=9)vpa0qR#(GtGs6xkW<-(LP1n~If)^r*9EEB4rU@fdCrmm=%ChLn_X>c zSzTYC%sp#EZ*2plL4usgd4~FO`_-Bjs6iEP*y~#=A@i91eIsL2^$Q>|tb@2-N75j3 zk;s5v5=upq&tM%VEFHn(KvjDgI9+3yVW;IrI02BRvD$-R@D2UA=5AQX*>YK?VsbC2 zUBuNGpOU-nfu|x3!h_4~;nQ#U8k$IQAg!Qh?8*Vf3Js0|H|98|m4IW8P_!1HTR=~E z#-cU!aY@FFO{&ZmN$Qhh7TqYB9czAETA~L~AFKfO@Vf&qRBoZp5`oKFBn{RO9fj`& zp&qym4d8^eLzv?q>qos8M4(7HR;O6jjb~v0WU%m=Q@sFO(*wX4OxZp*B(x6gy9`DrL;*u zmAt0--!H``B?m_mAgyM261Nzvl|8!DL|(qSrrzF;{N^*%=+%$jhohc}Kb=-#eCBf0 zIJ{q6oID)Zc>V4{H>I0WmY-j5#w0oTxd*wYZ>OGLkDarguOdljkG%Y5Nt2FGX`*F% z6&>7sc#vCm`mppcV2hjiQ3Nx&<(5~;918KO zCXacGlD^7A4CdL%Pg&Q}hpb?rY?5bDVZITDQgY1y!ST^=OF$~ZO}LYRM-&p%J+Z>P zZB+c3%KKPxyRi7f#nsmLoR{M}wiqtT=xwi8ff>?zk@=ZnhP(5Cj!!Sk2{=M`Bjq|W zPh^kxHdt4}zUp|=11E>u1lMam?6{V8cS!P;(ByG9ZHVl%lb~q6;;|CILUw8xm01%` zm-b39bcgWcu}$qxypyIEvxW%SwyO0IIxA|ZKPn07Zy*lDf_#Uc>)!UVhx&8aT^~?( zy3*k!uQg0MjDV5NtGEkq$Uo&W3Vw@4Jo8x? zS#&W6WynG&V2YN^H?P6~=C@I+JPBpg8rXwZzkcao^Ft5BmUgua_NnH+BKB#f+Q`-$ zPw@L-3b?`4G#FQwwndQ91tsI>t~k@zFsLTcD2nBKsSUFi`XXn(Dk?nhM4Xfyx`6#0 zB3oBniZMS}0;a7`gcYIyu}%g~)6J5$=&=aGIj}HuE8w!srpseih4x_pXKfwe+|$KUaCoUD2;BcF{|exAFGF z!VHA3wXzE=)HU)1$`yHngJSOat)B2RDmvx?22-!vMFyNFMly(C9l#b+c|?X-uJte! zMhz!=feK6-1P>C5>w^Ir-_I})c=SfRGR)JI5X5|rVhjrRK?xT57^jsw{kz}O4A-*i zBjv1Yq-$xq$Um&_L}YP2gNodjzd}|7%NrGafU<~k-&Ti3Xr17zuDXzqLp7T2U)lE% znIOPVVeDJJTQn`YN0a;Ed_yJ0A(0F}Ipv`yj@a%(SH-DXLkc=>tWCd2=eXIn;;0dR(aCu81-`+%3a7S9^*<@A`j>xSaJa9##oi4DusX>0 z^eT7)y~(y(vM69dq0oqY!V*!0kPNh=*H>4-HULk_T4Vw0D)8Co+ZybP+Z`%FHLty| z@9qdeEwGaQh}QvVyLbE3-JCRyqnFV?0fF@~quhcg|49Uo87ea%#tY(rnp~C91qVJu46Ea`(bWsPmCMBku1a^q=C4vlrf*A-nawm*NDy9Rlr3{9f90n=|_5eFX_wOlFB&vN*e|vEP`3Jw;RANprQB~z1 zNRrfau=$=Nq^M1BG{Gs+P@!yUCk={i5tA@UPe#CsY=xQI^!+RZTRB1$A5f@e(v>26 z1&UuG4H7|so&%B+WJqY4VR;8>hs`g=+PV+T7@N5U>HnhLc!5b_E_4rWzmQ{y1O)}j z;Y=Tx!$!rK#$#*Rr3G~@S35)D60BI`#{5=+^D?9s5y$!z$2-;vY{wWe zu8aya%Hbgtob^KYz1;1;ho6tb&yd6FW6J_+3YwJs&AKZ@7fgUrI0cM!5~3za%HK-* zNP_}C@t~dIa~6#XTglVTkO!fksEv;VHMW-9q z4}L3*E!Woq1{`Po(lOciMcK~W1M@sq6gJ6XM}l#Yl=7r~J+u~BC;?0|_af)q+sVX^ zzHa`_;5e_OU!(@4%Q)}|ngK<%F^yZR=ypy;B$)0#?jAL%C-O1+YtG=D7hd4b#pigE6>aPi+ipO3o-oQ!~wL% zoH%W3J!69pjOUQM9;|h&ey`<%SW?>dkTPvZC*75ECJrH~`oz#&8=(-4l!w%9SpXx| zQbZhX$7Yp%1=*9EC-R7-J#0;lO0}8N8{-ho2J(iUWBOjGt61fl(_DdB?)F8j16dD{ zN^JP{%g(w`U`{2G@&a8s(H5b%hv+Y@5=;!C%Gs7}%G|})EGoMzz?Cwe#Fe1lG0nw% zVP#z=P0!QMiIr?dU|R$;?k$7nLNz0+#sXFB&zj60oAm-6ePYFwdSKCghSc&$+KVE_ zZ@cHEgJT)lWz$Db1g*=`dXNKY^&X}=&t^tPADN!7bx)diOxc?Kd`DR-7DRM?ewyki z{-s{IYM9?0z>^p((V(KiUmpG%xkBiz{+S#FH z?Szlb3EmZ^Eh#>s=yG^epL?k(d%{p1gFVWyds)>!Z89b6L)-wcW8f4}kJBX4(xgtL z^cMWSj8S}-IpI&yfX4vuhmZOId{s3a5f^{~!w4M}JozkIBS{g6H0Oqa2!0X3(IoTT zvbp8j7WKvA{uI6z{sUQA3v!rtdy;ki4f1m-iWcs;K_<8-x;btS2>nrvgu>OeT&gOC zG4aZuC=G|LI|VWWNx*OCU%}*%*LqAaz4#SM&|9og*r2#eJTb z`0&trOa)cFEHq&r?|2;?t6Dw0>U)l=te^oxasMeU=VpPE99YNX+h3L#h~xgcZo|Iq zAT=5P=ux`AXz~ciJKZD{RD2JMoW{)8P8Z29Nur@i6iJx{L9Mb@^)s_Baa!BM zP9H(qQP@bqWvcfvRh2o*WXOh+$A<)L80%rkRPext+Oyn&BVBZ6RZ|F5B})+NAxs2D zHBY5^-uLSMZIjnswH>NpT_mnLz0h*mO zi-@KA-q$8G9-P)Yh(aTV9_qLywVi2HmI(xX)f`O1}z_QBdZhb;x z@Yeb_*V5BIl@2p!NiQM7LC5y9oDBvb+513j!IAz#9uh==r(ny4r+;}zzYqe4K0 zBxyQp_*+)%*Ra9N%m#J#)akh#{`M{4E!H0?Y7$wkML7NR44ChL$p&at#I+}9yad-_f$7BRZeQ$S7^F<;Wd6iyoC%{ZzTFkG(E)Oa+L zdIkOyy=b~gYn{Kx)3=YH-sndWE9#ve!Qe2ajP0(kqQLC{-=d;-`cvuqa7%3O;pIRH z7B;ocwkv&Ug2_-tL6@@YN31lNcq{ww&{YV-3!a_UTWlK8Wr2D~A?n*-u&4>Rg3Lwr zH2`>6vFiOT)DRB{3_|%V1~}++5h97zK`X?tyz$b4!c{CH=J=7Gl;&SKmSfoSjccCx6NEqzXYw zJ|E|*`JwfMVbw#df}7y>nAs<@PTAJ8l_XIJyijPdscm@(X2J6D7+w*so%3OAV5#sE zyq7jtRCb7yiq;vP5s5Q-L z0C*vD4p_;oHRkJ5a79*j2m_m_m=-vgeWl{KJSwO?Tu(Z(SDH;!J=&NvI$7e2Mm`YF z4+2-lBO_=|lleB@!|PXV3 z{4(Hy)$-(dc>Muzz4v_CG{AzJ>pMDE zJskeGZUOMXW|`w1DxZA#bK9Q!%D8{!ac(L5R>+q&wyP?I<;`dhIRCEGenz}!%MPMR z)b!hkhnu?l;K2*JWSBR4X9;@bLb~3H@Yi+pK={@90&jCrY|SQY zIBirw71vdK@@X;M{|<9xfQ}HOB>p%nC3&vkZz>)d}4t%dweLx-FvZI{=t2jd@?0 z5r7xY=)Fcq?0nFW*JA4>)Fmv&KZmN=oD5=?n|a!$YKDm*H6d1TIwR2y z9GqrON4lZ6rB2ir zi2Tm9j7Ba2XvFF<0u!~5Fck16_KIZx>R%mHK_n<}iT)C{kGp$7&z;dkt4>8>N3>tU za>!|UMrP&JO>B}EXiW;*CLCMs=CWc00~WX$V@y*G{_WN38Cxu}2#gI5DHbP`8h z=~ckYMtMN~6Z**U4!|)!CS$)>>uhSZWhPiC~|MP)O(RshO2oL}O1>`>i2ArKNtpBGq;jd!9%_coe_bC;~RU90| z2RIjsNC+y%0)Z?%7h;4Ao1nE6>ACUur$qhP#<&;bE^)aS@5+%Du>9)+G7!cpn4IC2 zzxN{a00Lc4dT!2Ce@ba&afHnIrv5Ol_TiDE3DA3ECB0f>d?D&0ld5PJM;-^!{$YWv zEl*0%WgW^Xm-iHdm%n^GJYZ#(%-cM1WJ$|Qke#p=;eA?vziU*Yjk90FJvXa?&B!<& z8kvvC{pY%CfUk*jv@Z{;ytQt~Ua{YG?&`G%a-(RGI$!Vg%IEfC$y(3N3$RUkJc#9L zH!-M#jtx4?`$?2M8EZ_RBl|hWDC9vKaJ(P%I>6N=@(9^(qk}!ohwjP2WDW$EzcAeM zCn3#pv=-vWQiBc@#}Zq1Gd@orc#q5v`3c-YDEXj^n7opl}tPIhkrba zkR7@>hMj7$Vl!3rJtiZzac5{4IB<)}@S^9wa!_*G9l>?KHADk{{#SIw>axB$!!H4a z|BF9i{SN}_zgO1C*2c!f=>OF(WUEQpVzVLiT&lrb1(FQvoT{`U#06$@M$Zqi8W!`Q z3`cAflaQgbleR0i^!6}$T?r{dHF27g(!NiBX6{d%(Hy;3xHRv(!x?H>9Qx5zr!*hB zzwt#(s-o+)VOO8Yx0nqSf4_dXu1wuawY6?=zyEC=F?WP)qS3QR#GaXOW2S0y5T#zc z&r(5Ev&wgyS(e497A;g5S0k{F(L$xmnxmwP9`Qa7N-1ITb976ZB7Aw_(z+L{5@rDU z`n6KMpNhq({(*K>azvoA!-m7f2@nznDUqzh)|o^~X%n-YoU}d?FhymuzMP%@3eck_ zX>@5>V^@=?pW2x|jkVQ00zEr6`@%%LX+C7)@8w5bZYCH;hhtN5zO3#MUY5`7jzdb@ zY8(l;?-(?^Pm!2Jhql`Yl(^}_g@j@)>%>_zahpd`EMs9GOcMEScW40If@_`zqb&#< zuu^v%&0^YVOrX@p*1~HOrQ$t}Gz@St4BORs}47#NCh!Ul=0j z8(J9#OA9sup5I)&LdXKTTFtWPAjrli1t4rJ7WTbm12SOSvRiX-LV{ou#muTqLJnmF zbLS?6rnfYlbiUT*o6G@ayRQYU{VB%zDcuw;bWBqUsj^%?vB{_MhkHOpg<`72LYOEW zH9BN%yB2u?Ru9D-kPgQ<;~ta-j?tn%(PYo*m(d`KSUdxSR;@xMrX&E=G+3Ypa;l+9 zutLWi;HH49q6V#|ht$$ZK&Ae3!aCKD*Lu~|=Ydr5)LyoKWA6%^l8MWPW*}(*9o?(I zZTbE9tyH0~sXp2&Z)vlhgVFUivy7_xWyr8@ei`s1T(~%F_;LFHfEVB5#eAnz z7a##|huG~5m~-29NOl(=9fZ7Vr26C^T<}CGxI@cP!ZNaL@Pxnx!XpZ1vRlo6onr-$eohgJD&knx=%IsVcQ9DMG`oPY=rkcCIfvlR*>Ld2rL_j%YqYv`!f5*^WMF z4z^y@6Zki}*{^7ppiQNg;Em;N$q3Q$B}%lCqB1;LeF`~jZ2b4`PukutHQlGh1_hA| z50@fvRK`r{WGDG6Grb;< zWtDlRg4N8=G}wez58XveJGSh2493^GnRNUcip9MT)_&g7nMlydPT!4pP+2V5Z=d0j93)+@Z+7JujNJu(Z9?$WXlQ2$e!PQ{#OsYC=;=HuDvfmBkEI$kQ`39zk0W%G$M%Xy+U10!El zF>dekURvUzAseyWOXg3VNfVVgQB*wFC| zx!iJj@IVz~Gp=7FQfVSkR&a5~Cg&T)5zn89@*|bipgi_y54dM4PVL5vj6c z5$zzPcRJN;cA=i3LX=tFBz?i|ww!%8SgxG>?&22)&9xxw<0n8-NPwr2;bea=-OCNt z6`GDGEm6)oRGHFTFFJV|YVU1cTVG!OO}Ok9URl#!7CoT&Y4C=!va+eo>Gg2VCUW&6 zow;M&qS0h_EAN#p2@PIw%@ubs9q<0$RJeRl9;5|p2x|@HDbyNiK|-=3d_K86`d0<+ zeCp-Iojr#m#N(5Oh?4MQu@_-u$eugx3}05%?)xnn_-moMe4;A_$&<8JGzl&~|Kq8=i7)~s2s&;X>e#J2p^uLXd%1yGfPrnE3 z%5NFZ_q1>WxQosH&+n`g}!Ws^^a#Jk+E0 z{&ocZRUu}5_X#mD!0PEAAe_BpAX^j|-|!IV6wmProlV}0i^dXa({BD$K_upEvqT&h z=$u8M*l)xfyc>AQ^8RO{JLwdv-KCh0o6q7L0cc#%3~T|j+dQp%M$mZ`pweqS^FYkM zFBd2DP~Ur&`}A24n;0_erGHQg+TCrA8FU^kME}`>ZjXlbGe7GSfA@)eu-Ozw<2Y{X z{b!|V_N>wS@mpouzySdKLfQYHE#bdE)BlfU7pwgr<8+Ol{ha*Rh;_42q#^wrkVOU@ zU_c4~qW3yjaEdGgcKDMxWsKHS?`@2S+Evr$17ZDmXXtFVo6hE20Q z!HOz+@?g;q-Vt>R8k$~@xyTBgUY?|Lh=8}%vA1h8KsnA%p2U_dbeP0_?qM;{yKW-ex-3_?~`PL6k*O*~St=>x zVOUBvd=UC?!b_8ku!+A|$<_0(pGW=nWHefdMMT?6wlivYG%!N{UJpa4<*3XESHaFC zmEB#~R|JH3;JV&^(*r2-TaA|Oxn}o2J|>jiyk%TW(t|0MCFAMFMyYBWo+uRp zIYP4B3PyQQp;jP(Ry5HmmVlrvwt>QGoI`{UWt+V5vk)g7?5Np!Al2x61la2mMFd>9 z-l~cRU{*ZEoi!qKuL^yO(MX6;vS5NtVt2=38tXB=&s3EF0<{8DY~CU_-AEdr8tPV2 zuY!mgt&?padX(T=JzM83HPQ>>E>Gohhv^3ABfY1Vb+=e~c57 z&0Y(((AqRXaaS%^YhzWJ_!ufS@1pIB<>h?CbAun@4leUZ3Q&au3)K0SPJwry0p?o| zaY|r=!eMqRZ&R;%fMYB6H_Nb@%a(?FR?r#wbkm&3tCd$ElMj-{0tUJCqB+sUdbs)y zxIVOxk^RD9Tn|K09QS3HPXk@4ec(+N_PNeSaDBP&4)ltc{UJ4daW4RH=Lm+P<|kb) zLN%>QdB^Zn@lWKy?aDAbg+fqOjk@kt(E4ZZPRC@n#j~r;cuu_V%+BNrCypoe3f*7t z?seyQeDkJ!vxZRqAySHU2;7buz?Wehn9GMH0pH7obgEl6nWQ@ZRW3dl#P`AdIz+y`M zb@ZF8Zq!X-Pdq>bh6`)?YFdDEdwBIJTg?g@ho^?vieB`dX+}gZ}j;@<~g6lecZmDWy+2GIKM1)4x_~HFBT^@7TYq z`iztg6lX#P_-V)GGPTukXal!$19!qwmRz0I*>vrbH;{Yv#r21dUt)G zXOay8e1>l%@I{R)uotYL?PE!X7fl%$Gt{fa!+CPyU`msagx=Tz0Yv;mY~N79;BmX* zdK7CyXj`wLbP3Y5oPw?|1sT(7-2>Vu%6$#%V%;oR z?`B8=IYg*9_s&cG5;U8~V#LWp1q53EO10w}E5(AL zEh9}dH7iOv=^w6#tbXqzon) zZGH0i5M!~@QJSCg*~RLXZH}6B6J^c4@~`g0O|lF6Z(m5}nt4aQ z#XCTE~E&0QCyIeqrfLQKG%LX0s?Wq zfoBj+0+h5~in;VQv^|L0-285F?M}5R>2V>o3SBwh21dsStXnvzFmr~kdI8vwZU}Ng zkWZ@ea~|_}EGy0%Ed1$51g85^tNrI%;fXVeicKtTP66vY1!L$Exn=gX9h34C7wepr z03tjx{CLguVbJ_z`8PYkB8g*0M@QTfE+#;~!(P*5hP^-y*;uc+c)=MU&xY)b4I6lM z*&cSP$`-s8?!>yhxWHss8LG|a_Dt?Hj4Qhe>V3MKh*HXyY;`akVF5Bj8*|Dy68KrF zoe|Z!#Xw)Tnx=8yPC!K>H^e+4-3hgU7`WH>O|Er(e4VCgVtrWZZ`{IrN{Ip0khGJu zyVHjuNsy9Oc1z<5MooH&-L{{W*(O^$DO zv@EZPB{7+x)b3o*;|8`Oq_jp$Vu2`!3#Hr2nD?H@7uNlc`1N}_KCErbw8o_C-Q?q` zTqO=~Ld`fSrN}7~X0&C!0(b-R!*GuIVfC7ZKY8n@k>Tq3QiS zz)leSzW-;W!Qz(l15ujuKo6TSK-SJ#dnVTRQmSp|ex8_Hn$Gr&hvcHf1s>g20D7bE z|LPGvC9Bw;{sw>CbN*jSR|gX(2lxLYuyWiSLHre19f;b5_zCqVnaE+ut|_OSt1EH6 zh))&au7bu6DG0*?QR8_G9s0c7+;rc^9Y$5&kCE85w#M#W-(2Ugn$#QFcUfGNpx93> zZ1+%Dji{-_vowbtzXCtE$+`;q&O}sJGWT+>5d=HOn;7bpis)J(aqNZ{*}SC32`y+Q zIV%{O@=x=HW&X{;j4&Ksl=l5I?4N}$a^OPqf_J^=*FUQfe_D42lt!81p_?MYQG#Ck zejQvk$#puv*-!?(x8UwX=(dpUNm#*CMUo|U`pz=Da6}q~en+uHt$Kdl-w$}^Ki$My zK&8+d5L*CqfWd+=N*Lwdm-Cp>SV5b~LYeV50*PcRwE)Q-_EEhX)tcNgXRpl=nC{JUA4%4}HSjXe4;oILa%l*?1; zNcJ=e?4FzCP z(DkJed$D^ziElmNrg3SacZwCtJG_+`dn(|SV^aIUf?3kk^lw-YQ4XY2;roa|3h52e z>G@WnG9_AazZkk_i9Z!dsTyZePywd}akCi4B<3i;W&tlzsJGgQa|3n8xc`t}Dr6rM*=Oj>v6 z8Gv{H(jHBR-M;-1_>j_7(0lo)G7t^v{XsBp@yqb}J8>E{kXrgxWxWkzw zU8kabShN1il5Zt=3}1z)hsI_-`pESSW(V-eL|jWs!Z?m_wC)hvK8!X1>@N+QSO)mz zS3@%J#0&0hL?R&ga9>lV@Oa!zQ5~6j*9DlNvg~KlvUl?U^gEs!LQU|ifS@L6ri*0J z-_bdrY>sYAc5B;=tm&9DdpUz*f|a9Vmj6>wNL-AsoV@?_&`{x)y^uF@Y z`RER}7x=qxr3_$A%&-w~@*A+qTh#-y6c6@HtqAn)T>nvLNVm9i>85t3CQb>a{soMK zMF@c*t6Q6TN0U$L9;Fcl=FV?LxGr)09>a%cM34OKl1o*c&5rT?adm#|p9Phqgb#X$ zDgdq69qkZ=*2MP>0b){IQbu6YA=p;oopS5pGnOe9<7BZHb|B#@QQ*>4-B!YZQVsqC0j&-IsP}Q`BpL{KnI|}>pDe9^0%y zjkip4%Mu4*+OX#@&-}{+|2oKj(kWso3z(s`Ei$TpLum#mnKE7bR_s-6SW32OUP2@5 zh4AX(AEIH}_{fx_>uNxAU=K;Izf>|6KfX;6f?Z3uX!7;mP|$`@hU?k;l(iu?Tu2l) zCuGnS7eML+iV3BfiQv_|vduvRAHMeqUwtUG+Z5iwZ7gecp|zanuX#5N_cAM;KxRun zg;eH}3M!d9JVxO#FXFspe09-8_=_5M2Zlwuc1NZF@~uMRDb0t^e^&ven+-}OOJA2< z;s}Tda7?X{sMq0v&(HGaw$7~7%-8erK;-M==~ifN4$FQXQQ2WtMi3v1iant&rZl%f zuN4S+zCNTg6YJ70T{D-;rZp~LH7)y)R@6h^w3oY&q>2BfBy*uhAA*2}>Y z+E{??wZ3)$p)+VL`yT0qZ1#Lg?m zpA^Fw_8EQXc`RY0pdW_!$ARLq|6h}4g9tz+-}wEB4pR04{RX*y0t?A1d`vBSPENoJ zemW&5bvx?BJ;_HF<0b_16huU^m}D!#1CeyMHKzdadR;bBYP9i(fGh}IU^8H=2IYKs zf1hRJbu+~|S~TvleBPZY1sqEr(Y{W`ohte6pqbUtS0>PD>6whncF>AyB zR4RuZTKccuABJZELm1jeK?>jmYE82mVd|NVCf4(M%+SMBawh+jC78df7%KXltAcH6 z3|Wtn9Lkb03opQ1GU+#G?$S+&Ms40G^Ijt<$Bc%tH5r7Sz~82=pGITLZr^49CBob{ zTR{4uGC^`H=Y6j|Z{s3XdZ$a;O#6e1-xjm8?UFP!u@}O9My@1h%w#Y^_7mBHst+>F zXWnR`>nfWI*NFxZVtzzPd5;IkH49dP@&7dT4$yUO zTmOG-G-+&GZS2NLW81cE8;xz-b{aRf(bzWr``q*1)A#hA_x^t?BO`lc3WfqtTQ>L5TND@Z*%AE}YSvKd?+WTKR| zPO9Q{#6~fib@hO^N)hH&4M*+}u<{p_iy-ax5lCthZs06z`bP6P01t6)ut~+#g4+yJ zbCeWG!y1=?V<>xQNuq{bhl@zju2U?>ERlP0ouEew*dn%Y=$kr%fXdGF4UGu<+iilr%M@laK{g5{}Yn-}Fn zTg}1!V3I*F1oC&1!%=S_U5L1x>}8HIo9%UHyI*H()>)E&h!#JPc>)`meU>5<%ws8J z{c7rARSK@eHv`b9N$3YlN`8Ftd4&mPr=#v_#UL$H62;6G6LM#>>a$xYOx8H8XJhLc z37;k_RWuR*G~TW<9?mElZ4BoHCt<%~C|^ed$GnCCx-rrTDLKx&Bv{&j?h+qP z2audFXzHsJCQPBV{5hZb{r!tjFhgSrT{(rJVN2 z+)73(uZtkBy;{@@rBn}>> zw4)>W^84D#0lRK$xdm;YebYh|8I|SkY1{gMQ(DEnuXF)ENBA5BPiLh(P>w!9(}q~T zvO*IGT51P{BL>36ebZiw_Xe5tQ&X|9hIHYvAOlXhM80*UEOu?U{fdbar+go^ahCX2>jHE#M{YE6pk}?<9 z-801`r;#iY0dnVZmw@^sVqdnBp03>Fw>kEtNkWydymV2{9|zad-kQ2EA8%kCM!3WaFOeOjU&NG)UV;)R*aK6+Ltm@_1+bW6<(qfJ7ntZps}PpXIm zB}1wWl0+Anjl|Jx5GZl@1YvHX5VA-1EW402K-1uxgkk0oiah`QS(0leH9~C+WQy)e zUlF^-Zp0PWbofB(lEUtMNeTQf;G+TuBM2 zQ&Zc5%P6p7GNefy(<3t;XnedmM-HORnR|@82_;n_ZS`1h1YeGOd<=OUD4K|3iW=p0W46D}R7S!aD>SfytNpY8O6b%T6l$W65UfZRRZ z?(JdiV1^pW;e~T6tWx7EGR@2^ND~u{1a1`~d*9~anW$a#X4#CN~j07k9B2 zrosUE^Bv$+9v&)pZ}KZA%nUdGL})R~7kMKof$kk`eb;&XBgtwE>w(g5Dt_wT#o}xd zce_^Tt-veZ;!8HK|JG6$Q&3v9~x}?(@6^%RIQOwE4 z`7_L`jbI>1JW0Kl_8hFv8e;K$b#F_GCXRz{YTQHNyo;lZtf~**IIA4!;<6zJfI3ZU ze{^)QC-CQ%%3M;N1_me}9lyEkvkIGZeP!ob$E)5SN7X*EEsZ!7#moF=nu`8-RFtF` z){pmuBjXz{90cQvSDrqTWreNEqPYjZ(F(T2AvJZJhsoIpW?479_Bf7~XB2k{>bWa2 z!MNz4{LI?k%W3}_sF}v<5b8d=gMYP6hTlNeM_m=QR1rC*W~?#k8<1i<*J0YA;JA`X zWu35cG3b<7g*vxE_w4WFSR|lxrF7VoW6rn{%hV;}M!s~GgnhjToHP7lHF|*y`zN*5Lb_1K*F*qH~L^vf+mKGIz zINy&K&PZ}P%kiXq&{L-FR&cnHWQHlK%@N*#kJBYTWv*IP=XogdKT3?&PA;hXaX{=u ze7k|~1(Q$6vuv;(*YV+IY7BDovDm*6Np(MO7@mh+`00QYJS(Dthr_kI$OdIS+*8NN z$bInY2j8pdV^SRb7jx>hBSWt;Rv@OL1ul8-dEou|yyKq-?vtU;=PNH2>tZe!ynhcr zE5ApOoB$$2B8-5uVZZOz{ZU{C5EvR$x3phrO?a!+_H8g$lB*KrREl+)yL3~rV(#Sjm=>WyT4#(3Bwz2Qi> z=+{vX+RTqF9B_+t%+aYEgx7EB3=e(ch1?NW`h@|saXT6o#Ns-l5sj**j>d7L?LY%+{Z%W);0#I6~X9B4@H z5przZ5=+BOwPXf6Yg?Ziu@c5>bDpz zh1sHwipa*7|F~!$BbfS(WOioJAWoc$wz8+%9!@~aG1_}W;9JS#)shmFMedBTn}pCe zaiCYO^tGd%8~+$p-uiqaYHS3aqf0NWMx}06wxo&sSW{h3q>Hxb!C>n9GmRG4m zT1skmqlC(F9j?gRky^NlM=dm>VzJb4y`;%IK6m$+^1){d zQKGxV*UnrY{%V76JLHEdyA@(!m&|KW(NFgG5N;h%cq?6+wE?f8yG9hq3z06v<29WX z=CHPSLc^n<&%gP?sWh#x<2L(hJ-K>LJYlr_K-3?QS^|X^jUz$Tgq9N4q%L_f`k=+|WR~uqo^O%=r58_H-; zezB03RX_Oph#2O-qAq=k6CPzwXuJb<5C|HCO37U&-@ykGEa^px%uO^Ytj2V35Uloz z`RU_#q7l8R`p(*={rU5-$Y7WlC|teh$#3t2if9Bjp)ekDOW(!5XoFdfJ5ld};R zZ&EQ%DoEKx9}ANb7HwTpfHwA)=%TCN4Yt#0$X|&~n_;jXJRg{hzpeIiqWv7FRV0H(tbMt(kXki#?G|_=xw4_tNAlzASn$H{=KAO|3-q=R=X*FY zIk;^BEzP*PhjR%7k}=GLHqq0%O44w4EI`!>j%_<&KS@fUam|H>;u#G2!>}2BR5xdU zJ_y6uB!E}GSN_2TrDO=ngoK~bFFfB>*QZURJUf7CgSBVqM+zz@^sWq;x}=Qx&f-OOJAk>Q6%|l;F zqw6hiY2LC)W=;DSt#os;M#rbYL)ah1A0IwdKr9wxIghG-vM)~}+BT@IA4yKcxS~LY zMyp2o_5)-_g&<{Wt2KY5($_rmd?@*^A5F3v=1-9=2@? zKCZimn_AKo=XX+V<363SxxgF=L(HHKev&d^-G$HLwIn2YK}5_r_(1e5%%L8gnC$C)o`>O)}H336WX zakobHm2ty4<{v;loqSe^0QI@2nT8cWq#=(rG12X30p_-atMi{mA zW&9gnbA7e*=Zx;9p1veiy1+A)lSTvhiwGZiRgmLPPnzjB$MV!4GR8($pi7!$`V;2G znmw;5k2Sb|ST?KO6cXpkYt~uqnftPNmMFA*sva8zbvwYV5OoGIY5dr^Fgb699?NT+ zBE!ZIg7R$-`Z8N*Od@6gXemv~?-th;duS}6`AfDeyzZ?gofZo-B zb4?vJ!We&xNU;H``baD>pbEB=oDq5hr-iI?5HTo?((rSuaxXXo+oNd#k zJXM6``vO(o9ENDbR+K1L}K7lbzIPm9gG7RK&Q2gr%`&EdETdY*2fx__T<4bDv4b zY(A|fdgST>F*tprt?|WstXLSc>{I+#NQ*nTNzs~HFmdP4I?*N^kGo@4cs5}@ypXXlWp*ZaU3z5>`C9Kbr2T4X!9Br zy-QVeu?!2tu@BB%5tVDWSD*q?RR#qN$9xVi?AyN2Qt+CF7dFkDwr8CP@g@LM@;Alz*mbA*;?(=9ZEF2-poZ*t+<_O40jB?!~EF(B) zRshH$--MvG&%7yToEajM1!&9#Yu`qI8*u~|c21)OKeoRaus^ekM%KCE`Or(AB5t28#2EN>6O zwA(H3q+JKQS9@_RK5=m*tP7DddBfp#n3ePax*RX>ihOHi!Ii0Q1bXaV2#MJ5t|k1+ zsR{CgX+`{>Qc!yD{7yJ;By?*SLbjqI)0hz*3Knr`WgoGeQVa@i@xrM4$rbVC*HC|U z|5#_Jt<$DqLcI9=;D*xvN~p8ogI;V36(bH+k9~Ul8Z)x+6bxoLnpQ2c1B=86qTK^ z_YJ#??$2jQx1_W8ebQ&%xfxEI$m4xbt&kL&_E!W`GGE==ViVKs`RRPD%Bq^-z&}&lv zCg*1odxzEQIG`+fG1wqe17*+GC$*=BfvCoq5Rt4`lwzR)ZaQcx+i!|~kJhji38UaY zA=&W*+LFQqWoxdEAbsyFLxmR2e_%3`Kd0udrjX#4v?ds6&ac=-jXoIkjl}2Y8-z?H zO)ORLWYm;CQvp=Qd3+9D67ro75QKmXl|Gr3%2dmFvubVKR^jI_RXB%~^gZaQt^$`d zXe@gN%4Qbu5V+XPX2Hu_?q5Aev`%4w?}1&FbWW58mrPO$kz7Gp}Ui{cUDLaSUmRZo%U zknQ;wmMYow-kQYU59&XSi{d_@Zi{6MbSH1MvjBvP1Cd`dB1G`?Ka!hCeSk56k+yL2 zesvxAFvm_hx$|7k*8x55eerNZQeB`^lz07p)Wy~6?W7@(6+KO5QPH7AP?<;i^%(w& zVaK6YyNt^jKDh*yMw`Am8pQkcn>vw8jPj2=(=luKP4YYg^f-j77mJ9yKyuMl`AKf* z=#&JQb(72%P=b=%H;VQSIf15_;l)}A33#sDQtHa96WxM=JweP^gEeUKiC2*xg5h?@H} z<08v`7f7pslr26?Te0jZV1Xu#`1R`GUwQ9y&GSPGTq9SRgD+ z5o7{remQnEz96psSMv5^5Vc^mU*4aGGxpOvy~WF}&<6UFyA+|vGc0tk)#i$w90xw$ z1;RTNIA^J&0-X|GR8TE^`}nA}*aGFHK2d%Q&P(rIh%KAGMpF3F! zGG>Be26FgRgV_a8eR$qYX4;Ye@%zW=EzQ(PL*iCn!6}h8l2(_mG6YGZnv|*bOsnsi z>`{K-rV|U;3`{lB=o&@A-10}oxeXZFS~AwSJnlVYZ=%tqJdwnx`DL(=kj))4r-P6^ z6obqu868K$4ms*epO&w#w7QoW2JsECjGz5(Eza`xrCgtEA>3)gl$jfA+*a4eI4ya2 zj2j8C>AdJqgc^mpm!H#_z%a={lbA zN{O7WcS2S!^he2F6qZgLk2^Rq@R+3KX)Ti;{o0P85-!|sJeGz3R`nHIy%q> z7Mhz=>%^)aSy*)Phdz@}au3-In-n_=B40Hu+X5Owp zLa$bJG#0z(MFf5}n6&db&w5tNpy=(7^-=rF7L@%yM8=lfA#w@&o+Ih_Q@~<+?;$eaBYHL-A6vY;zs@Px%{b#! z#AZ#|-%HfRvRVj9fvcBeQjGWqQ_uA@DV4NRoG`y!3%9_h`|^R7TX&5C90A?g`AXN7 z5)6y+!RCp3@-dXvgSgzt=6e2>GyOEcs>jg;ygku*`@Cb)$m#a!?2Sra`9a^-la}XN z6E=~0?(E6T%FunGM#*8L8QY?9W5jNB*8hN`1ufMB%{*vBw#l`8wQ4KNHEz|-|7FjJ zhga9QWNH^hPz?jB8~&%GW#AU>1~f58WKXlkTRB#Z#=tbQneFnE%W4Wf@0&Uct^$^d z-gm+lza20n_^R;k9WQD=u?BTM3{`c`77Xiok_2*S*Cih>f^GamjTf4j6>$cbMRDR@ z3J#HB+3=BUaZE$^-T{mnbII{_rU&!E}*jKa`9 zAW^yR-^3{r)ww=O8Vfg*q_F@sea_3jt`kI0Gr0ulq#*psJJj) z2G3C4h3Ig;sh&OI{^XqVM^!MafGWS!cmi`~1;%Mdx&(q;an?EHv+sA%P6Wv}K6jcP zutIK963^1Fv2VwWz#7U)K)`x<#Ktt|Z1B5bt0v`Ho4ugT-8UH;Pz-M81~c1eBUrcE zRIUS0mtWg!tTmbHpvyn4QStexI@X25D!aSq2Y5 zkY5P~Wtoq}2g9_sXv1-t={y|w5-fYCIIa#|hn~wvrxxGw4Uy=p>kuWl&5$K&xds6z z0o1U*Cf5VwW5`Joe%i+*Gn^JlTDYhC6{s z7S+DZY(m2$Bx6Cj@tgtdw|RFDb92R%#_a)pc_%os_)w)ECa4xl>+QqH@fnd?Stc_5~tj3me3yZ#kB>V5$a?D9VujmG!Lr zed3Zu6&KT5KW{Vf9sJNp7i1=DsvO&sS#*X08JjA-o6`uj0!k3JuwTTP%|B#Dm-1p9 ztYCY07t&zX#$kUIENCD#OQ#FGYBc1?~F-r-`(mf)Smr^bt2R6 z(WXQGL&x7a?j<`C9&B4PTk<=Z%2UKO3=!7M$eG0}?-t?SZQ z)gozHpgD@LOfXH0M~z7~8aWJ2ej^7@-ONNt z*_5B~Du}C%NijGHN}+MyfZrQ}2o(?``E)%EmfT7keSk{0M1YVYEi*qF6C?SECMCn< zRvL9}PShJyd{7}F{A?`Q^$}O%Z61Uf%9qTtx|T0WKS3_^<^4lOu9yGKVAOYgYx`2_ zVg07S383Lb^3{8GRg!Xz5PpoExJPe^KrG5lOt0i-_Te5P83}o_r7vpC1<5Ty8dIW~ z>%x7)P8k`&a}d^(By1{ELOmVoi`acm+&*`%{AM@KQO?7;ssV^}*TV~3UaypwGHrbC%-L zpd2_{((Yz~NmiyNxYd74ZBoYP?3qCb;aq?Tc12Ri*L2#Oj zLCtf2jr&WNO^Bu4>DO8fVeXG_4c*-kEqv>W8}U<8sP8X!Kai_Y4VSI9f;4X)U3vGG+<*;MEFIyVAzmlk8NPhEnnk+Nv1cT@^s3CltLH6DUcugw!8XLB6D^mNr;lQA zExFIULgS{*fm_du?|L_MfJfhn8*iR;NPgwk8>*$4xCQ7Pt7|Bm6`v08TK?0|yq#k0 z0-3PXd3hC+m2Fv(aM{HAE%~WCU_=tHoXZ~_xoY;DP^%LkbZz>fPAk!9!2at8OtFozzP*2QC>3f^NAWKyJviZAYuJU;W8pBHVjc zARvjcTv2VC$kU{YpBrzH#L#(uGleK#*6#5xwlAoJ6PdyQ+Y{0?% zc3cj$BAPu4a7(yD4hP>U)0@emd-E;?D)S(3`s9Op`3hyF+v3o0qV92rqx4Z&p-iO_ zQ+1&^+o#zOK2WSPbofh+Fjt^F;w7whI^Y;Db_h$JRyI%%{k$h{7eeKL4pqaSt}r;F z4>`2(z{M*UqE2P5v|Fp>upp01AgK_>et)OO=|~&>wh@3wIIMgbh4Vz)Sz55Z4J&=n z0ZbIW%bNv~ES_cMUuUY$oq*N#-IV*Z_}!q^1NY3og{({(`RBR|7HRyrEqU7#X9I@hztU1f`TA>orDZ$@cq$kA2J94E2+x7vOfR`r zIUB2R+LXyGR>S5v=BU(?qEUEcu^`~ApY>W$C+jlD6B+bdTJSBenr`Dw^=A*w&}GAg zys6|@0S3)7+P2*WeW^ONv@q(&A{`lnr3we^0rR`j-QA+$eM;CTJBICs*wKB7d1_$& zP7M#J*;XMGBHT2O*@ooU)dC&t{Zx;e%cgK`ZEu(Ni3Mw(bb6ky*WH(e>j@jf*eUaK zpiWvqF=UFX3=TjQ9Pj#s+laV5k(7Z<7 z)?5XZ_D{l5Nq?d#VFO>KuG!4Fke%Qky%` zbOqUQ&y>7##9%UZH^L`=(`O8tl)5IiMIc0&g7=00#0|HPi;usn>GQL)(<~y$s_FDT z8AWDKx?HA=q;M$GdFYswzH`k^et9skQpZQ*E9n}G0^Ri7zGW201O=-hVRGyS*i~#> zyLi>CJ;kutuI3&Fa9@Q0=@2nmN7Mtlllpw1nSfEAN_!uiVrZbRSxBxX*;ppL7NNMX z|4VifpHDr{76pFr^H)7Q!k%%89w)dwPjo)#B>M)NujnE#PZX;aEE~yTG3m|o`vkjR zj+Bg9DiCQSgA5Q)UvyJyf-RA2xm(+tq)nT~V;ZpKEzqHmRqaRF~rUv*f+LTUX?_-8_g7Fw)P8`061 zvDB%wysw{wPzx4=K%@28(~rIa0&!bq;vggk3~G2*^^4G4x7*W{Bbzz1RY7L$$44 z%2uFdUWB*Ck`0FYp!kzRu-3wl#Je{rVWFuIzbA@lG1MShC5XbX1nBBg%Sjq+PZ?Ax zn)bfNO;9x1gJ)wfevJDo2P3-;+n0OpmuL7FEej=13xw))hWix{`uF4q&MV@f%IPJj z^&I1KV7;({OfSLjjeIj2<@q&MerVb-q||M!@^A2cYLayo6X=MK$;1U8gXmES>`)g? zd<(&1Lzb3*#-K-pB5z`zh6k{>LEU9{2qp#@QP5|wQJ=-A81^D@d30TUyCO0cOrat| zLJ{u*q)3)%9>arh2#Q}s=#at-Hcmeo4390vzKdPhIN7E8BzsGaLJPsz-HW+Doji8d z-`t*oeW~I_?{*BIDnMH;W?P%JY(ObQY#-|Z?h@}wz<)$#HMbRIUYz|p53A}0nHtmR zH5^wMPEwWs_!&wJLU+RAI-z`2jGcnS?N<5DAbB{jkXV!&;-{oB_+12(TpRq4%YK>f z<3=ysE;A`w5b%Qq&f=igt<#G_ydekkReRq~u?{`wLS4RRj@L|EX>*XP@em;5-q#TB`XP$yL|`nX_~4-hZrc&ge1KH9y!nQw6LHW_u| zTH4y84YxCz9WQb=-3a~S&r`|BPKGxXvP8&E^Cq(ZZH94cex_*u!gTalxA-Crtt_`e z;rarq_9{%p(Mym6s|j=CFv?Ja+5c0;OtWO?bKNVjiEtdzP+8-mAfb}p#?DtF?BZre zbB4EYK*S&4$yM{XLgYvHWh)J-{uK3NK3CKKp;obYj3yRzt|vc8bWB}jzx zLq*CML{U=T$pbciIpuTHzRmXViqIZUW~kF=X;xlGtk6U`>vmBU4jeB#H!`B?Tk|0A%#E?EbPQj-2pB-QiBTCQfV@1r*YWWG5 zx*SWVvz>=AlQCi;FP=i=#ap`gzLZa~DZm1Ka*vI1QL&0p89wiI>%~$<1+S5-B;8Rb zfXUE$zlAGuX=SMemm0K6Ma&o47|PdBo8VY#!_SM}LdHG0SYNoG1a4ql5xB$9S7~OQ zn;~DNuj`uGEku9nDn%a&doAudl%Af~_CuqP{*ph>o`yp?`tms0h>|4CClU*ufmB@3Ow8?zz6%_j(wu|>y3^5`NH-E~inkL=`BRE=OS zFJ>H?|31phn^_Tfed}Pr@tk5c@(m>S#`$M3`eyYqN6+XM$r_v$-%~_rA&cvYl0yr+ zaXQ)g8O!0)yZ7+#B?PUC8f`iO0$SJrQIG#P0_Uu2`mYG5in=v+%O4R=on6S$lJaJF zG}wGubjlbZ|FvblZ6Q1~-!Eh7-&Dq8>PQClfnP75akYerRmTghD`Hg8uROT!uWc1( zu#Ul1%f|9+3y~CyV67!i1H#NJ>a~X5VmmoXOD_7FI?`O)yt$EFz+J1bMsg#k2Cyr_ zpt;dz-7a}v-p1ARvyh;(3a~?^l&Dn~$`VwQ*;?Mqlw_JrARBhS|)tB;P$a zDq^qdqfNa3ID|%b?aw zaO9P&p)>lLNE1Kky@9=TPs^@Lb$Qq4PJUPTF>p55o+MiqNXCt^*M;^4&0G%MU5B}l zB%GO^TTv62&#Zx%ucG8QscnPf$b>GR&Og1RhS#bJ8V%vu7ggXcb{DOD2bzj{72_qR zR4$O{RH%y-S7ChwQia6q=Mu_5*a(dE_o!mj^%1?`0)T`g;Zmzb3GqZKbFR6rA)o5p z0jL(R1_*+#Gwfybc%5@(<-H$X$QqcXjnZ8c3W8P{c;^z<)b^U60 z$xiZVNJ=G^uvdaJCTdkGDNfaJ?Rqy7R(z1)HFX6ri9xy!V6ym~Rmuo2AEy{Up$kD` z=OH$>k-2g(l(PKNCB_C;Y`-}tyjbfpmKF0gX7e3$N-A*g#2uJ2HS6+l_Gv6|{jJ90 z0vW=+1UE3eEHs?ZxVT0ObMum1ee3S}iLXh8g9!K|plr(qlbG?o+stD7{lOg@Ak|De zY#|lQh^0Fx#}yXpwLbd030?fPjyxu|hu_zvgI5{zenRXUcE^l*mEpMGsVcuo);B2R ziQW#J;lM4RNIn^8MUU&Y4IX}=jOZ1X<}eOMCY>gr}VXlyOwT=`w|K5H!f;Cx<{)k}|m z?9ktRmE$?uM0;PuEFIyk<+X||>{A1aCFK{x_^4=^pC!2!ayVDLpFN2gs=M61;yu1E z5w!N2D894qL=M%rgWWaGrr!?d>;aQUMsiJkX+*iq-PFpuJ-6MK-Uy4;m_JwWaJ>CY zoX;e041KP06BbOtJ$J^hG0ndm`Fy)KN{S4hffX5}E;?eL-pt~~X)^4K4a&ea_3n&BG>2B_geqIbeKY2lIUOq2}23`#4PG^loG`JE8}i*R=@S=+7Td zXcAI0bt{wB3~!tu4Vy3_2wLzSq*6_oT>yoSl-+0(3=A#bp&k0ebkeNYS>M(R@ek17 zegf){D3qUgUDnLd;E7GtA5MB}iU*e71qZ>Y-~nxUNWFP*c}pc2hSTP_`lfn9Z#>7H zQ-wuKA!4JgPC8=3wU1y+-<)JExf1d)hEl-aTSCL$-nI^ynf=6yN+;&lASlYjx?yeD zYB_4n-E{3*Cr=k%CO|#-vh%UrUt^&jBbs)`vhg}#TbKdZXCxq~B|J7wjx44&Ge~OV z>km5J=8(s1IYo@v?*ULyJp<(eHedKhxy*}2lF=|h_O5AS*=Bn=3J?ZZCl!F$~F8{{gh>Bm5+bs_4fFB%INBCbiPJ^fBCt$^V6|+ zxGwYOfV}>|f=K@Dl^y1Rw$yyVZcB0-==q6HNTMixkVkBAD)4T=dOIO?=t@lCIwKfAczv`EW8hM@YPY07A*VE&%sruq>Hnb>IXnDw!&R4_(=b|I&*GAtAAzw8EzGl* zYL(^Uh~#dq^(|GOEek)_KN4|abr(nnsvjQM3U^izP&7j_HM{qhsU1BUg-C@q_Mv2& zhuH_Oj0d&3Ry~w}_Ie}Fwc=3xeW$nk&&D24tFmm~dOaB@Nd z(sF{o!z2ph-LwG^E5JA2-(Vk={|ii6R7gnTcNX@$TsJ`a2GBD=K!9E5zgoU;<$q&2 zSleh@7&;kR{FCp#MSx0j0eT`A0RH$F@ekj<{9^uZ)!W~VN~xl$y@3M)x}f}X-}~Q; zd|y+IziyCTTi@Ek;!kx|dq9NkcS!oZff)-Rwc>>NPtlEEkXX}SkiRLk{*Ks&6HoR6 zc*Qal2nZ0``>W;qKD+%B!p7SAk67O?4A8&E`(M`qUI2#UUoGFaI_GZ~2Rl=}|K^u7 z`pkV~U?89|z)&as3-gC#5B~|IYhz<*Wo&9?sBLKFWNK$^_5WiV&EJqbdH-OWy`jG2 zAA%*iR)E5wb`Jl|*e2C*Ph~_PpkzTHpudwt{$I#?rd9@~R>uF-vwrsCk@f(xA3YEd z?cZ#stowhk*}~fSf5z_r?y5hRrg0479UZ{POQHe-!ucC|zxO}Ue>wPXj{TDawqLbd z2o40K0~msT?{wdZ|0G#CSXlnY==l@0#DYnm1(-&a+`pToGxwh$8&_*UrvoyF{=uXI zxY>hu!0Kb@1O!C%x0_=>{7=$vUHuQd60q!QPr#yfkMXB=*1wVYzAn(f|6X^QNKXe`c-ST~@k$zDOUGxoY{t#0BCq(ry)HVsg5DLH{ z8GyV0YWcnkn7|9YK0C=if2^zZ8x72*HB+``bt`d>Bee@*Z|yU1|^ zU#k-EuC#!;`S(#XPVx(2qpNSOYiwx$&y(gqmx{kH$Bm@_K+*#s|CopW2lG$sYTe=e zr2s2NHDEOUo%!_NnU=cdhDN3qf9Pude#g(2BfGqSyR8Or0kiP0mhT%u@eg+Xk;!JM z>!5Fh)Y8Vn(9+P#LHB>e zw|~C@cao7O6Tqw*?`Nz`u5(w6#sGOdYiU z$S3@r^1FihFG`*HZD%8myM9p?JpY68r-Ik-ck_F4=P$%%^lym&N%j1l@cRM4Uj)S5-w3~s1O5*A zeRuK~q^aUJ$e(+azXN`c(ES43H2wzopLm^&I5@-~e?+{&fB>l1i3{si!K{TuyD`isXtp`uuY_)T!q zW6uKvF~;NQJ8ECC^zyu2p>#tm97<%+ze?k+?|TLDitnP-cqOb)Qr%(;V{5pg2GT){ zeWAp4bSrEwIqph;+_Of8m56#pgx>;IhSehXxnj;Jw;@?7ozH8B9Srukl=`n|koe~A zwru=m*SQL8tgDaK-be?+(`lrm{*S%#dS#x$EL0}T-`c5V1p1kX;Q-fKAexC>J7e>) z%51rk&>albFsl`l%}_ws&5_j;K#H&P(sMBLwS@xZ?3znoL;N@>j%RaWkKp*Z=T??j*tmY5k1Otdejkq? z>_AVN`}`kL@LCE>%ukMR3)*F@B$UaCMuOr@j$GOm&D+9x>b`NHTqKDXM^f-|{G1?1 z(dTL_&`}hT?Zk;NmGx|Fu!OVX=Dbz8@=ROw%gwM^we>RyJL|Q~sMz-fDbFpE(TcO# zvsq%|={;{ABSIfQ&;#uK)*+WdX-IdH){J$IsQ9LaVN2QU7){ z@S3&YaWXe6n?q%tCcv7C?z!~+zO;uJ_gDrEHt|;O1e^j;)7RECdow=mE#%l5{5)@;tc!v&f6R8hNimX96coMFLSt0)qn3kf)?HG#rje^EkY zUASQSj_)McRiL0Z;7&Pb+`*9j5Lbhox-KJM35;Zd0o}O_@=-+$39&=|Gz!Ga0yvn3 z%UMCAnB7>{M!f03llMIso!}8D;r6J15Wp6%`=~4o>FR{p*c{`DcIfhD;J{eAo(I&*-$2zHh(;G`bcu1HxYL6(gw)F`}N;WuyG5i~`sEe*!B;**YZdHS3GNWCX zVn9lHZXpWg9I(UERxAIY^mand@@Bm@Wa6{`$_l4d!B{cFp#L4rPH?HkemaG}Zofwf zu>faCq!sj(EajVr0_9+>2V^x;u@+L zl#}r?zI8|I`#{7s+()kWrJ-sK@hl6Aht@`)if!|jlE|%A8%6ihUlES3K$<~el|evT z-NM(&FdwgE>sy$zH7MW+Ua+Z_AnidZO9!BBSnApcNyEX?TgR2+mOEe=We3gr0`9Z~ z+3{OC7WJ5N$j^pwvtHep4-eR+U}P*JZh=dkle94wwTuJP#vByFTJkKxqzCfIc$+(l zXOq7vwr^F8PfWjr44s^ePTVZFIoaxk|2Uy0&8ue5MuNvmeEA@goyA3v%OS};tY$Nf?Xnb;$@6Sf`ht?MJcYVw%`IQtFC!@mU1$cY4kbp*OXo!; zL;!aE62+GvDmpaY)dSSB%+sro{m`!1vlos6KSI+S4G6_oDYv}Br6o}*=_0hdLk6}L z>gyNY&k&a}GgS%cn%d?a?Ua*4YYZ*==zQFu&>D6xmqiDY|Ap*jZAcjb0|FzsWC1ly z*U;Y6wC#xz_;Dh$`}|$cZe79?%yIH~fwQz!SY=q1oS2S$6orW-y7 zv(x<^un>965D_RbXE51jwxGw>^je+BRX^}I|CF6`nlbEU|SXYd! z0&Tli!(|C05dkOyuuJLU@}P5Ye9hweI_|#Az={(R2@~A+_LfY{fr>3P)nN6$ePf6) zQC(BDdxZO{aRb+tR_+FB1h~D-v~1vd_^vyK`!(=4Mnw^|xpHy^WMwj|nh`tyeaV62 zlpTJy)<`JBsclVBJ#nDcl%0=4O%XAMc6;aIycRihbYk1=Edp6|+~cka%u@iscRnOQ zX{a8_#?uIkn3_V(l(7d@ky3oipUd59)HPsKxB<|~Pg*^Nx3Ui?{?#Ih`IyY zr6Kr!w=vI{-cZdIJ1lu}mF;pZ`2cwb`5_UE9>WhsY`541>r3jj*gSgXl%rEgQ(qwO zs2X3b3Yo%snR5>KXBbOskCL<3_+NRmJQSBzuGcWvl$Z0;tMsY3R1#!*lLX7HV{8pz z#?lSm#PaH}^TU<}@fQwqXt#q%7*j5uJQhU ze3rb+GRVGr$8ll&%#vnCSZ+}RVz3aJ`oPs4E1@!6?|!{PI^vvBZI^9*UdfClL>cOH zdB1-*qU~MOppPO2Z+VNw9cqx(MG{GaWuf_b-K;~L8a zhxH;b!Sbk#Kb2Uc8hb03j7sGWPL)jz(ryXpnH>w>aB{)m%l5yv)00CfU)0zI51{U2 zcGiaX(>E66&aRE$1r8{K4jx-UA8 z5J0(Zpx-SylfArp{1D`6V1x33_ozf{!o7!)7avzuN=MA7YuNq2>Uvpx5USfz)PQIG z;O(iY6T^nF84e&wnze--lzC66p|)-gN+!z^;!ShjAl~;g=Crp7>1>xQ>oUrXqPH-P z#%eFm1h=M5>;EW4PX7rmIKTid~V_iT$$7hm~E42$=6+Ic4 z4}}fsudoUZhcjDBZ=5EIcSGrVzXBuE6BAWB1Df!cZ{S>)&SM(zzl*n%_mO024@M3e z6~a%1Nb2+iqhE4&!!bm5QYn-HGuxxr1~Xu%Xt+BA*Q`ons4PxH5xacYzP4?wv)_iC ziAE2rd#7!%aC?1Tcb?SudObd3=j9<*FT%Ir*V`kEGCPNf>-2oyWc9vArp)DeL7b^a zdAxuJO5o?Uz^^P7W)b1%^s4de)e9(?9CaCYhixx#MoRzQ)Xm-_Jl)0ZaZiDM9yh^9Z@+kuXbv8hwJE51mLjHavvKCef z4nTAf9($u3TdvN379|&*_cW@+tlxL&R;F-1VvaL4u7_f!|Gw(y`~Up%Gx%9@rMg8D z=F6S1kOa^Z<{<>`Foy$0Ub*z`xL01I=NQnBkrALw*DJ&u;v)j40WS&X?@xCk*>~hx z9n|E9u7L4Je!;K4Rh~J{OBhp$~||dgDaFV0YfW>=IsATS-#)aKEe<|>8!LN z%Eh6X*c_9I@>qc~!d7_*u~5)AD)awPCo1Nc1_4GGRYBi0(ONViDe#sYE!8x-Rlgs~ zu13n`PAl`w_v(uy9BS3`;JZlk6V6ZTV)UWlryLCMqNRu*STIzVwUy(Gb};E>gf-6!R$M15O_1RZL1 zSnU#_3gMTlqsAnK zrPAO43-7}<0m4G85lO$w1;?>Mqa_YXBs^z-kc3#;sg~4@Ita_ELD%tDboOA|5I&dj z$%NhKOo_vh(ed;gEY~QCP;)1Zs~yB#0*#ngT-SQ29U7|~21k69elTJ@&)TdE(SeDH z+OS5ZiGZ=Cf0I#s+Nv}xs5FFSwl1JSLuW^*IfZ&;nZ^yqnhw17#3MQ znit!UFlldh_#^yXV#5L4&PhOHsB%wiH^%bQI%=PG9vAYfdJDiodqo zm9zueUwnZfbtzJfwXNCp^!*a=cLF!<-t*e3>cYqd-L?Qmzr2wb-!8pRo=*%^#nz>r zaM7%(d3f59=bR)8)~8?6gh^MfDGjNJobU{y)rmV{RC)2O1Jw;j|-1*Sh4@e#TisKz*B7GSAWG zb9poBjQu2aB<6g^&KkY_A6S3A%~U9UbLot(FY65L#tyDw>lx^tx{DTsR@k~Y{JerH zgcOOEfc=6ox^sNCb~a9SJx~3eVkGk{g@eiLWV!fvyHwoow`U82W;{9|Ty)}|iHk=& zpM!B`x)ky?X8#65zI9?zSSmZN#spT6TZ&NN@St|d?HA4Q(#CA^mWYk6Y55_GpG~%C zEiM!D(TUHl;c?WF=+n+qLGqJ&I|8^C| zn;6Za%y1@`2EF8hWY7SsKaEvUH4U z7Yruz10oLROo2joq#oeWC_Sl^G%aBA4EcX*PpN`sq7W#T5*Q9xlbxlxJpUP=VGL#$ z_=Q9L?%V8yxrBg=x^(8y2YkZIimm_>h3GcTrMW#^eH$?9MSs(TOFfhnWvBkr>}ELT z9eu~D#^eRw*Ha)YW7QHl#gtt_wreaqFRK?}9k`aTNIWcy&QiE-PmwHZSl%)Psfbp3 z7)aW59Fj0v1cnE) z<~X+K$6E)e#3$z^B7J|pB?F}&+~1w%)Vm2Lc4%v*lFHq60i{P6I?&XS$<(%FjBZ6N zRaS$CdDKuan}+4sx7)(Qm^WXe-fibqi^#yix2n$AT%7P!0PGr>A7eWH{(415hu&-C%nsrfn_aPVGA*g&^)0quF#X^2RnaIRu~o z;i#0zLwF^BZ~&wL8xNpr3>;OxlLj@WKi%I&CcYJ`GPeV1SG9L>Tl9|#sh+kp)h-09 zHDHv4wO(>$T!Gmqt6No)LZj^6arHyg=0VMp!}L}VeVD&AyQNn}Pmosw696E{Wq?ux z_+J%^1*Ksg|A!kN1SdXc%POg1gk3smdC35t1)|;x^!eUOL$Bf%Zll%CgPr|VCdCCJ zx%5MverhjpeuY0e!m95(s!rlkIfH3&65P#~0xD_Svmy6yHzfCRroe-v$}`x7;kE?d z*FyLVxbdg;5WwGnA0yJc_P5k!7lsdPK{?-TfpVLlRSoKP(d&&dd>u8WZo2Lfx07fK z7Qq?6?hzW!iZA9#WR&;6Pcq~>V~QLweb>1-2%XhwN0h!6Y9*6?W-+<4!UhB zmT)1-k2pcBd>2g*TCqjGSvMorTyzSZcMQlGm~T4cD@~_cnO7ipIA-6K^X@Jnns(5> zZvX?;tG7~-+6)tOPD;(pfg^-4W=-z;v2r?!NE~;+xovhdq3#*u%)_p{`$|JaKE;9d2eg| zEYUCZ0dRQiUoZW_I3l4cr*`A)8#X=L^Yg@s(l!738NO37L$AW8{fr7FL+w!fg)a6= zts{0M(g?XEX6dJGA`s({E+%Q(&ge%wQRSBg2WRC|MH~-(T*%t)g z;T$#K_|knLiuCc{2a2OGPa(O-(aDJ@@Z5WR{sxFxl+@5mk12QtxE=%r{)2Ra#AIv{ ze~s~YG9AD-Yf7F5K|7K$7n#69xETZxp7(u1f?9@=9v$U`uKgIr&^$s_;8J zqz3q7n6(O4u9(?|k$RF)s!WEb!0Z(7?F6C#%`|64g{-vBQTML!8m6Z7|BwzRj$8H%AptMKRikDAQn`iuhltw zQ4sI?5ZrC|vKdE+BFQ!`VGL91T5aAv>MZ z$0bE;WK9m+KiB8)r$e9Y{&YQ3vfT+;A|-if>B>*%75ZR&bB_=LeQ zcjXs|_o@-Ym4konz`5%F8q&r>=B5P3S<{vg5nIKC@%nf2ST2SROszN?M{%@S@5|uk zUKgG!W^pUyj}s?_5Ff*o>hrxRVAg3(Bl7~yL*e1#9S?y*a54*WKFYJezMTH`+jyE# z$ZD~+_L}q^Er+GWb!$B}H$x^ie3Vg#c+L6*=YyirR8}0_(aQLWD+_Q{aHVhI3BbMZ z^k*pNM~kwQ!AR7ma`g*Oz1Ig1mE(4@CR9lCWWsO_WMzt5m!ABve5XBSEgy*oBb0MdhSPmJ!G{FE^iHxu z$MR)?<=Mk-DOBzwd+?Sw@{?!zNI&d zkTP9gimL#eD`F<^lgG%HXLRe-dqRq62glZPkz^{n+h34?yFeDA(!7WLVpk#9g@}Ha z9BiWDx_UC|F6f1YUG`j2@CT7)hOXT$=$x_sdUs(wi?yYQ8ZmKFVSN z3P<=H^EHN>Pt<&-OLzUICe2K4d&7s{tzdOol(>C+P^DO+c{^WK1Lj9LC}WJ7xV_$F zaDnfWpFV{bPZv*eEEqgdcL@jfDM@e%grfhPi2fURrcloR!~+IW>G^Z`5v~4t^fe$9 zQADlMNPvX%?)xlv+fFgpf@QWx_*4E-VBpf8svi!+dR z_xGafK#=A4NX!1i65Z%mDQ*C+?M5Rc6)XPm=binF$PioC0CeTucaW_@Vubd3T>kf| z?DuJ@@9XQ0|J(X`>G%EOkKfPLpWn|p|F@^Tuje^~`ME&q5$B4)kBEofJ%0d&|CpDV z1GFj!0s#OBf&4$r%VZ>lMdg%5|7TvNt1NH7$$-*#rp)8`&p2`ARqe_gMzJQ0!%-e( zBnk6?azx2)@cZmRKi`xS5^CMMy9*wMtt;Yf1-!lV_VDrW`1|;Ne*@`aZBP%)a@uyW zZ6F5kzKdai-IG+A6V49^*UJ2+sFLwu($iK8epSF)w9z-{SpC-^3j>b0a2xQl6)T=B zY(M`}KM(_P|Fxj8=O$helvS%>VxB10J=~!}EO-c3Ww&cnZ5%wdYL0v}bfs`Y^(={B{=B)5H7rdSVv^g74)h^7)z( z@FV8n7|T1~o_Pdo_H*_xTO5}3@~3mZw0wHY1!O2^Zzp2+1(#9%x%cGXTe~d5REvC} zp_)R;x5dt-GZKx31D;n3%Ph*;p-Hk4{ZhDLp(F4$*V~{4g+_ZC(#O4`h&1h+9eZZe zj@mwVz#2W;d7!Yjn%z7f?Si+S$lA~Xx>ar82*YdeI44UK=^f+gP^#})XI^oY6rf+A@CvmWX|hUf{E#2gCJoAmo+XB)O({nwLE@PP z(J}fZ3@S;C4RM5~*00m#DI#c~EN;$ix(^pnFBpDEv?h3lad0(QW@Xi+QPFJPrJ#|FGoR6_;WTV{sCebD?(%5X z-0xDyYDa2Y!W764X35?rU3v`HG;C@yt7oPrK8wH3XIpeJG4;I`iVZKOu94oT(p13i zCE?cIzpp2IFRCGJx2h!Sw(p+UdTUuCwUI#h%95k_EoC0HnJ+-DkbpFu#Y#F9hm+{f z4dMsD=QIJ)Z6joC*64k<%ndPAUbLP|nDBR= zKXc$~O&cl^ZE@#iYxsm_sgEIb+hOYA4L3HA zIi6p<3&{`=2){?6p(T3h6x@ZLX$Bi>3%l<$S|(U+cEs^2VN4T7{nP9vK>GLqmNnf8 zb^y#DDu`H*m`*EwOPMHw>sOHFh@$wsHm?w8!z5_9Y*Jp=FhxH_3<9enK+G|`8sLrit! z5bQQnG3dy{(0^PEuGZcCL$}>zX$ZqI)j7a6NbO@*MMySbH*@uaHGJtIvJOQ*O#RTR zl*6hHCXP@5+@&KF%;S2f*MdD%zv5$*=JM)cDtk=0)tZqy%w2_&eoySyeg&8t9=O(S zCTe^qc~ZGO_w>3^YT3<3;pQYTPwZ6zdHbeW;+9XC%5CX3{Mt@ zGGl7`@||b*k+fS|c?PEx#X9zU_=3Kq4eG+9N<${oXXBVF?_N-t%p$O8Ulq8ZvaXy%E~ zGa8hz$owA@=$=Naai*%p~skD(^#=oemSR$(b0XC{qFeVEosy^!oaic9t&s`g9JSH(K9zTVhDR z`tl9vMfo98G08gKbcopXxFw929D>Kq?b1M2qO~-u%S!unv{zAJp0U8UdUWzm%%6gE z{Kw@JxC$t!NfL*%)3dW*r^ezN#ENL-UsMF4Iq`5_Z?`*FFA&|UHlyu&$d?1&XC;z! z=#d2X;YsP(9pfC5X;mq-nCU8H_pI5-9R?}18C z6#fa1m$VTklSEq1R8SRSeaRAuflfm}o=h%GB=GpLaq(`nh*CqtIM+l9Ipj$gofAr! z$1p`o=>fFa$RJBHWl815+Y}&AZ210_GOIyFv-I&W@$R#D_2P%qmzC4gP7pr4_15=* z?{RMvFVjd$oI{7na6hTR5?+=`!pexr1#LwY88WRs;c)9^{x%`nsbq&=fKyLqh|Iljzjd zDd&+>GjhIf??3Wl5sL43^CA~7|0h-v^L;ydBS!&|R5HWNI_)iV`XC}$AaZbJAjm& zo^^VrcyH+>=6fnM0YOfUHVbPCIuM&+giMQ4`49yliDTmUaoA1RDX;5~V)BOt7S#`F z>H^RXT!XPG0xa>K1@I-H1eFv_zlw=eA7Md&+di1cF#t4--VH&?`-O>6?S@(INdtvy z>_%*#UvWxwh(?vactC4V(ga*qaMkE5Pm>VzXZ_w$GCW4 z1_A2mx}qXtZ;O7zgWUP^n-O~cm^pu*E`sEyJ9@vK$)=z&z1U!=0Rl7FB0gz<0XW6M z7_l|?`*sNSFW|@Yq0;JH&6_;!W;G`U&4bUp*LWe;38+X#Mq?AXP?doE?Nd5^qv{eB zrlP1g&}d&!zSXyUDjW~sswVi28BZG_u9?OwqZM@q)&ZLr&T!ID-u3ojW|I>UC|K)0 zFsf%FvFS1RUnCQ+k>aT~;{Z|2_;sl`nh}U$03SeObR`JF3`vowu>^p{A_n+r?^qrDVi@I2feH6wt#~BgEID2 zZs*?iC)z)5KWyZ?0>MC6hz#e8C&8q#=_^J|YghXmJc_2Ez@$Fqd8v8)B$ap+g5z3~ zl$2VH*JKEw3grY7C&c|agPPZ>B2+^aN#58*k`@vX+G#@}b4^L0I>ozxGTKfevTY)m! zY(N9l0c_8WNp^uJqjYa5p{nnKx_f=NxaM7TM8!bD!XzlVs8lskjHt|vz4yp1?oHGr z&_Jj_sviBM3JfKPvMyN+Z*fxp;sWK^C`1kPLb1>b$i2~yO5vo@pzLFmO;m&Ic_X)$ zy}N-OUQrCA>zM?34giLRahR)XxI9_{TTnp=PKbmV>esu}I?K~`Q{NE>+B2m$%G(y? zYUeCn#X7Z4&WPFWd&N&(jjJC*3@G1*tEUTS%5%0m;bx|6)IKx5t}En`y2WZ_*DsYJ zacS@KmhazHR8h2|6VmX!zxr%zc;DMj8fez#HLIIfU(3o2CEcq6qI$?Jp>(w|HNip- zX&{Ee}CQD)-gX-f1?cA(E-y#cv3@ zqf6ydMlxHZ9Gs3581C#t%IWdES#PN4;^eexRaGfYgh;bH_1aAh9n0FsOwcgl5q+W5>9Dl`1dyDf74l7h2STGP#-SZfleO zGq~p{KGOVP-|GFu;Njku&j__eb#7uVXgq&@4D#a!Ib>rB%F7g#leR{KIg}Nh@)FRn zSCD3y3=hPSG_zfl-(`He!L1B|q?hW8OotELS_KxEjyYoUyfyj#R ztqJKq;^tfGpiWzDQvhEBIYo79P|oO&&4ytOsxb3(399mTQ_p5x&g|wYH=e1d1c*(w zh8gd)BU08GI=R)-5W_m+J;G5=#e58xn*luqitTHbuGVsVt@bK?x#?Q!vq|T}ZM#Af zwydb0DLS@GW@x!>$>aSLNWdtvDequPRokJ!Ufk)e^#<7Dp+N@!U0ao5NpVkMM;_<^ z{K3;X`UeFIa`f6B^p(|+l_`K?k>rIkGE+s1b{m@VM@Dhh=UO_qRdiRdkiCj_+DWXg zCEa={i#GuMa@G#LSpk`wW}D--S#lO8e9N-d^D^^HkV~FJ7M}iTFthF}&DrlTMw@2C z(-a2O>Hc zXwI5OwML^xCDSk$)3tSB@%AB%&i;tJ+C-1ZK#`^ngK>kw{1P(eoB7n*>5FuDK6@(C zPCuZ?P1dnPR}8i%EEfm3$n3lwdR;(RC&_8hBc)#ySBEgB3pX5s`%XR1N@3D zqFZ?V53mN2{<`!0TS9vhp!997tPUEaK#R>OLZI(gvDVBQR`RgUZVHRiWaAfiFR005BxwXJCXt+QFEytAhV!>!`^C>)`+;}u^jGGnf>%JLjgWu%9I;9I{m?A`DA=yAeg2u&gbKIi z->Bj`!Ss%uqv~3ykTOx5g#CQ{dlQ+e)R?~4`)_#i!tFf;-I}agz1XPsy^it2{P}PM z{+ZT9QkVTbKOWgM9g>g~ZW5e^BjwNes5^Ofm%An|y46uel#QDHoB?FeVQMm00 zR}2>xz*4wGMx+qJ=0M?oU8a3HsCH@Yqr!l?GQnyG5EolOcSRiY_4Pp6eqoe*Jei$` zfG)9qM415Lesz<6b&7rJ%}i97b`7~;jRT1GMo^#7Lyn^OP{z~xXl_u`FwUhLLCpVCKS7HdRn6s_=33`{8#CORL*?ZQG(F-FzjU`lvpy) z94qVe^E4KsTE0-&^1T?)wF!8Q{VzWDM)6{k4P@{z)tCe_$wZ3RR-xqiE6m=-t!}=V zwuY9m2$Z%q-92?+zP4r{m%O262m+-IZzaLsPSzf-+qDpOStExSl-4-eeK2dM7Z+Yd z!VvMaodRC>_zo!O_7f~Z`dfwX*eno&2rNp2h@lkl~DQP^gds@?nf=1mR$F2~j$~j6J60rX-NU79q_cZ3~ zWzi!yGV=oug%g2R^gyL2Fr*$QDf-CPd<%Kj1 zuFZJELncKJ_#}%i9=w}*3yS+pp`vd~sntJmY{=ZzX=0z1WY(yKH|rLh;3HDv3yC%d zgxfUQ+{+f3lq{m47UG7_H|HhCA|naqgv8QYfF-ct*{ejuM|7~Rkia^d0O%M1;JzrE zK^|X41tLZJno`(*2CcPW^DDNfa)OOYiq1Fj0C|+MO|8S(UOLGxT`{UWm0zsn_7UU? z!(yrfQOf~2G6|8l0*b&qLICk>1HfSdh}ocQ1-Hws%jGflm%!fp0XRwu=FwnAVIUxY zfi?sF83X1p|8t{BVF96`fCM%I5b!=WQ!HC92F{L91E7AKXf@MHn;jYlXSqxo(tGQ= zef-cs;~rOSz*&jlvi2Oby@rQ>;{`|wAQECA0toz!c$wfnV1}g27-mF=oDOHnh>mE8 zG`ee|`-5-VlY32saJq{lxZO$~M~s~j>_ND3W=a?xt|XHj1yf>@)}%n~msB~R)-fq3 zzPo+dB`@EY?hTC;f?X*Md zV0q%Me)8lwhWTCnw}1}yzCdnlw3!1!gTq_!AnIM`SVWhT6!GciGTwr;OLBrSqkt=} z*N>6~En!fny~+=GxjpSPc^4$^lMt5u9}*QY$>sH7*P_w<7E~)=Y%-~Y5c75o|TMgCcyn4td`gT~hS|EG=~W!d;m285n7b(xBU+$ggxULwcyTPKak zR|PKtBSn)Wz;0KYH8voXmOkI_M34p*?`mSwxbM^0Gu}A^hH<9*qX6ra)XI+S&B71L zb*#`>ZvS6arFr-5LX$8~khUS|xM6_U$~U0s5PWs1KQMc@+ZeZ9l-quPeW0(9r#*{E zrZZ2O3P9@=v~Y%Yz6?Ro5Y6J>mh7J>ZBhcUaE}JPE(Ixq*tIah=hP;qGnY7&Y+|eo z>_hggEdYPyEmJV@sF&gJjxLumOlyUpg8N=AcCO}WsvLo*wODFVE(5}}%zaio3njP{ zRt=ae%|(Mw5sl|>Vr|^D#OTSu7%SwLl`PG2LLq4&3FRy1soQp6sX%>9u{t3vY8-{VvAhwAUR1_xo(_REBWsG7!r2;<$=$YfTE|HQ7F$ z*mGxkX!@Azrl|5tXeXsn{fF|wS_;tlL{;+8i6H7IHJxP%{6}YX^#lHet$pjse29S4y5hMcvN2qa5O|XVywO2M4N{93Y zpNoQT;vO`L`CV`4PwBtXT%Sbg^jC)B^)gPJd+hPKxtKj-g5AXnGY};{E4+3+UN4m^ zLiZiye38rCt4AS@Wa<93J}K{%kBmitNJ$YTDag%H$Seyeyris9hcCiH_I4i-zASC$ z<@_8%KfqZ_T^vHr-KB|1aFzl@Vqz9N{8t2G5LvnYIXctiN#2qirG&s%md{j?cL`@T zN_k|%PY6BQW02yOA_E|Yp$1Ap!lj_zr#;xC4{I(vf=x>gCTw>AH3@eF7rZ*4v&_+t zf_;f>T7RA>B*t+gIpF4sJr*0*Oelso)2A*RyH>1dC!h>RB?fyyl*KZn*#I@2vBYtk zrHTZ0dPXK-gQvFY-VSSdle|11875&E2JJM}q$t!<63^O01gcf4B`FSL^om@A>~HTO zL>Wy+*^`b32gO{dV8PNPlZGR&au!GTH&b#8K z`O0>p?{Njm$tCEQBmFjnpPf3ZD7ruBk}TL2nA{qA1$kzhK=GFE)S48@aRyGr zr?+oL$`Mz{l6p6cXTP!~^E5gh+pfB!Wly*?V8$OnukDAAfWZ%FiZgTF*s7E&bN_zz zqSwxE)YZO)VfB0pUX6wX&u<7A7SzBlVCvYkX=>54jrk(dC|j!fe%z(=KO!afSo4o4 zAo7J!?zyb!poVYH8m;X}5rkI_9l)6ZmSh6<@onP#)kT){MMHw6 z`KnmSH{c4SPk8%`hTV|c#qEBJEHSw6<<2{n!g7&G#bZM8a$7)5bD3_vn)hQl*C;kw zzgzok9Jve|XJL?<$_~m^rtBL{wso{4nCwvzX)22tXb`v4GGy{{6y4c90!eOTQ_ip76ZmoHj%H#3Aa{-4{_50Jq zoi3-;(=0O&l`QMro*nL)r7L|3*7vgjed>*oo1AN`a`*0VCLyFME$V;{~R`=`vG z-cDL5Hivpo8)OHSa7`*X@~q_t z`yE(+;>%OVS70nL%hQytZNB0Ev(|5ceXW-K`>AIM0RRB+ziYjRzN@pTlfH?mnWden z$-kmsl5Xq0#ex#nccvbZk`z)xD7VH22R;7+3T2$)%3we*m==c>d<3#lKuiC5L-DHk zT&&A~O{9P8Oe4+p*05c*i)2;1^yNg7R#QARn%9YBkyJvenTZ+;247uEmCn}M+N#4yhZuflej7AtqPVQS`6Amx zbrE9)d8X#A*p)x+BAP{?W~!dh;;bE`Eo!N(+PZxc!qb%j1kxa)gR zx}EhmrnuMKinp25)pdA{zB^;)g{f%8(mlGiRBmy5dPHO2lHWOfa|Np-XQ932!>Fxu zMd7=A^rdU@V#P8&yNgk!>_q_!Pl9(S?hdbrQTYtpXX-xp zb?$54SG%u#U*W#&eX0B6_eJhc6#N|gO!?W2pOT-8pNXGwewO@9@biqyLpG^(C;xO+ z9{V%vC+}y@&(Y6>{h5-*$G+rWpR+UJ-@z~I!-4qeq@U`ayDHD_ zN&I*8&+MQ4pW~n1{%T#Yp)P&;vxFPRRSu;zoYYg}H@tZ`MSe1~Puq+mGdz5Rd_>fw zgb%UQCVlC=sO~mj0v|)=m&cchFO)C3FY0%Z@3a%D#Sjqs;(0;caXw2e9)`#-jW2;O z7GH2**zY9YYR6TJAz<<=#wF55jL>J(w#SeLYNqjMUk$mC!f__K& zW;?c8G=XD3OJ3El_y57{67v7Mnc4oQhpxB(-{dtdbJ^|f`+fg22Y53wi7?|n>jPNI zfx(hS5Jl|CALyo{uZV=0$-uCr(LkDjsYvT1(M?5PpoTE@yDR}yVawIfjYMBMgD`S~ zA^{^I3u({|L|-p~Fpx)ufPvuE6X@olFK|GZx0;Z7D9att%|&0~fH0Q{xb_b@-jUZk zpqqj|ev2?A%K*(3c$XaA4D_x%!i>dcXl5XF?9oj@@0KA{b&AJr?} zwYsZUm4Y-V7%C7D5EM|IUZmWHv-95z?0;W;KtM$Q{<>M1np)E`&@nU7G1HjSYmr3wRk;i|nWJS)=UwM5$Ch&uw-H_@ff)579vJjh!vo z*o)3H75HcuZ>`x=A#vv za>c>hn5rR`%O)Gaz%CoZE62bTUuPv}5az4%`O2Bq7e0pgF)$pZg~pp4$=6!W*g%da zXA?;E%Ow(?wb`-vDIL`z95RzoRx0L|gdNL(c|%%;8C$BE3}bdOu4O9KEDpj$oiXt? zc(S%yu_dx`!KhlP5&z?IN7V<>cY|Np)HYWiK<^Kb_}OQc0BoG!zMl`vZoR(m5AWQ>_ z3kxl)2>@(di#7R6M$B%}*WRxR2wXjb!B_JTUcVRg3`=JSv%_bS`)dwvD2tz_+W?HZ z5VB{`oAfZvCmhXCDRI}4wzOvyN-)iD?|w`PO->}Pjt z=n55~BizmZ_#xX9>ruTi^M(*;;$2DY+EF%ofP0D!ccr38fFUH{pw@RT@*on&$%B8??It0kA^8g=J*q{(Q^xp=7SXm%@vrsup zSX8rXtD3M^9Ypfpd!u7K0;S*G>hA>bMQh$F^MkrNp*!jklOKw#c6Fs76!#@9n4+bw zHX4hf>SElb;J{3_!C9}zQc*`RDbmM7@lo1@_gptEJ3s5 zL{lA}#?Rmy7VTZwl{o`|&Kc6#W*Ii|wU&!SXH}8KjKsyZ&JZXzve;*eiZ#q_c$;3T z#DOTf#X+Blu%S(=B>4JRu`=4i3axCs{Sy)mPT>qc!WMKfbPI(XqSY;{(M_hc3z7^- zDbFlKVVwN8Sz2r4@0DJU$yr{lRtHVI_g+{Lw8|OFry2CWgV+f!wAfE3@z?BjDWT@! z_PJBvJC5o~4ytm5xtiDJ8;&{31l6zG;ypv_9rc6=0r_3e--QbAa~JN%(#tNvih)^a z&tsdnv_AJlTtmI&dS4o`|j!2(V5|$-V7p}VIiTkD{L|_O_W7ncaX?f~AtNamw zU%No{;fIL~j&*Sd2b6kv7O)@K7J2j_P~eAYnxliD`Y2_Wl{+`bD8=SznjgXgT?<$_Pjc%jD!h=8B{!v7NTot z=V99V$O!r{p5Ar#rf0h*;Q`?=aWv0aQX;G}q)JXqM?QkfUGoKRR2qV(%vIfmn1$8h zb_ZO5vT2A65}!4YXg!nPZR#Uua5cAa>v>2+oIRV)@PflB_+ik zO{@N*n30G890}C9WMOH*DJZsjVQuaAo=pF;<1Z2>gzv3QnW%jg8)~Y7sy(}gKf*+{ zja6=8ZY#$1T$fte>u6z+b~0140c)WC~h1BNCiRI80iL7cy?EH7d`wo+~ z_?cS6!3-xh)rED$0a}x`-U`))#F*M`9Sd_>%8%0RUu~w&GX_}Y$7jbTZ0K&=Owd-j9ZhXIzcF}YSh-qTrNiSsy-F7|LWo&wX%uITF*~En5gNn6I`V-Purd==pk8e=NEieEySF7U6!K^Lf@WtG zzBG36^jJPo@@{Q=)7~GvI$5$MZwg?{ACM!6<=eWeocMCGb{G|-&zc5TneMLh_Cq9a zu4~vg0B547XSXksJPmwc9_TKWh;^vf5X!>Cib~0_8Fe+g-&bu9i#JkL8>$-Uj4z@c zHFbQ*5DvpW6iJh|ki9bRF*VHQ^?vb0X*W$`Sk9{;;&D{=3aEbadAeuF~j zu@FhEo?zs2_D(3K$aXS?GH`lZWppcB!^ zK~>L`HTLfw@0aaI_1zx#_vkr!sFm~3O~kdfFr)O2A>vv+?^jv9ui;5^d0sFl>Jc7K z(Eeh?IW5RbfWizi;;dd3ew}(g1(Sm=r&)-&f~%v-N7RTlah z_?96iF4$enN=q4+Mcy}Iu$ix<6R0pv*}as_5GbX$(e1(0O>6H*&gSC3V@}{ospPxf z%8q=(4=Z_41Y6WPR9VZ4J5vfx+h;MGM=lz%Avux>x6tm>(WabwbyY3RC z?x`$6U`WntjH-+mptYOXUC+!xbzQT)iiY%WpFi1x|EQTXSnG5vKdpv7Fgd93ciXMv3M0#aew2&=b*fGw)({^VI0bZ3IB##NWMnF#k~7$Y2&`#%;6`bMRG@9IQF98+MRNFyp38zx!{CM5Y@k|QOWMmOqrgPB#o zvbj@AJ@PzzV+aRZ^xXNbRVLye%q{VEDus&(mhW(+nl-@uekE(MLcXShcF}KPZQ|-^ za{+}`#=&Yr)JRJ$_Ma~-HcpZb+Y7FmHpdMFB{BwNQGk{X%|WILG5wW8D!mL?SQw+B z`y^u@pF3?IX1NviRgs>LsH{fK(c)GXXGz#cbu_&o!7t~K)r{UF<*Gn?U4sT6Y_VVI z6ruXVFIP*O5tO;)s_VR@N>wDQZZMKFr4c=q-Ua-KopY=NHwKgZhH}yKw z1E)N+TF0>V-Ct4$6u=N^8P%%!E$Qvxk2~ttrq!=MYUcg-I>;4?s;d<)iwhw2PNslp zs7nZ4ZlH~jx`Gb+Gi?}^Mo;?^V-(dW1g9Olge%U!*FC>3qZ0A(rEpx^ zV2M{;*y2BEmdS8^7gO|>7Z9k|(v}~#2P^R^_HLxbw=}TAvJn;*I5Yt6xFV&0zxDxU z2q|2V95+sd!X==V`9(S!m%N3JXWV8E$7|o>EA~q263! zu#b)R?h*%OA=dCqztS1kpB=V0`-ndja#7n$gcD0qR3yLe}!nhbcCL~LH?w(sWNonAy)_?_N z+lg^8^eM_xr-BW%D};BEm=ogxgjkuiEa+){6YW>YxD(fHK4HP+Qv#!!@FxT|Ssl73 z+n_LMPgm#!5Q54UgeAU9{$48UZ(|fP5NffU0ZDY?Q#^C$rvOHy=@@E5lAXTp6()}H zTwRMvlk8L*<$yaSIy1aYaGp@*Mua$4-Rd5_G)7a;fYuh(L5U*>K?;&)7~G229t2oV zLoEo3u=c!ZW@gwky1XP)&iz#kg&#d#C#*R7DNO@j~y>#L+{MjT!b)MZj{4&Pzy>KB8sWJOObzRv#Hy7fj9 zioR)gBcae;YnltoI5T#xpij~%*`w5UwzL^>yYBe&gWx#VDcD~@InLrbV^C{6>x|H` z9h+<)>TFzYd-P7YNJ>U^xj3^%2~RcZiutmyA;A?&JA8PhOJ3z`oFN3#yMZn96lp%2 zGp)|pM^Z~-&S&hT(bM;i{o!S%Lh+MLXLNN@YiK*Ve+6I1K=;^HI4`u!*2&@P8CWi) zNVEv*8-&@F<-NJRe!Syx;^!D8nFA0GBD0m{;@|01al6}^$q$@%Z-;W$iFqO}8tHfn z!kz9^$kUkl2!ej?z@`8wJFG+nRE+^dC~$euI_35XXL)I(Hh7E0Mpm_aQN&Ltnza^| zi23NmXIAkzYDx5I=cu6hNj;p_(njDXjis`!*L%*1AqRxtD8cY_M_goq0#4t?N9yo|_l5K*Wu(`=fXgO%5QqaKV`O@!nFNl|v{+$LAUQLo5b zRy8J1$lmUJVHwNj@JXi3VzM1$**RIgFsp#oxCP=NSqzqfEjx-tS;MmCNoYm%l7j%! z#-l%RBbBhccCaOdHJQja7zUK}xKjTZDhgahd^$%*)A zTr{op6b72sy^KQkP2nMZYDp!Ug+{0eQ8Fv0X6#$%=)p6Lg6`hX*;;q#I=$e~=F1(r zR6wJzyS3JOeAn{*F%4An#pmp=CCRZj^n=+y{dFN&7a#9T)|G#2w-TGl>M_|tiMt06 z(;`~iaAz*<#w0(5%p6^%#VF>Z@R*@LYg~E|JGl{`&n1YNutI-TW!gOPb+9_J7`Hl% zF8K1+0xR*!d5TEioo&j%=m+(6r8xF%K!_dKSgIs*cb>!O5eD}+wx=_-E*fK45=)g< z<6#}v=g*{IJM``}^DySjRjYT|de$H_aPY0DGd2~)J?4YDgy%)sj83NAr~87r*LEpu zytTv+6n-H34mNU}k4U{E|9J=2%WE^(+Ky^n4ZBtQPD>()xxs8Q-3`CC2~PZj&wqbd zLgX&IoHx)9mXCu6R5=QXrrtq=7S)&P=PVQ3f?bi_{%c3IXJJb;SA|qhTbgPIiq#4@ zLc&TfF+3*U?32~CGC`q1_V%diK4N3PdeMGrGmt*SPnsRzS>7G!SDb@iTVYb1Cz4A& z!0n^qO z&+t3;qz(%78~A-#ddKdDy7b)eo-HuzyEQ;=FX6Uw+WzE@mWWuCgw3yPfK*zf9Gr|XQV#hld*OhV=TJq@tDT_3jA$_zIMzJD-Eeu;7ER492)(NCiHAscW%#dA2IJT ziJjDi++9&(lYjMAbo{DTP0Cts&O!n(d6#=`Xln*)`>Uq76u?sky z&vpI?c=jyt zaF;GN*g&k?O8kr{?2N+NIiV&~EWv;Lpcf{j7=m;j% zBObx6ma}q2&D0OqkpxqvGdu=lCV6ee5&0|k!c_*8n`bP+g2t>X{pJ|oh{X`{w{G9x zZ5y6xc<)=ZCB(Oie~RKjvb-~b5Sbr{adL)}EHPW*`e;-RK0o`*lOPXfK^6Q`m9-lI z^`;NS-FhdRc8DyJXzd)rFsZK9>ebCYf9$XO+x8yZM0SLty(s}U$3ec>PJhPyZ4&>e zxNw!M(SGai)!Ez0;3vBuUAL5MS6qfjaSnQ_^5a>#J_KKF6UE`Zy|d>@9*G~S-3}GD zXPY~_`L4e2&!K(}z7JOcYUYOZr;?4?gM)Tja;$CkJZk}E&T9dDi4k=(QtN$-zwOh! z_O>W4z=tg)SM7%(Z8UUtQb3FqZ7C74WmE{SUk49hA-I2X*}*u1qt$9p=6Cj0 z!HHr9w=(`1al#+sBe)WMzE=gTTCFJ*UXVE$yx(|7gWyn{%z~T`@+|PrCm+7+kK+m% z%~n>P6Fwtl@U*{OTTaZ)P>2m5WYnQvGCm>sU}!Xz6-TzU(!OF!{aqAX=$m=`f1i8! zF_iJ6M*w6n!dR}NBTA~A(=rLN#OQ|5g7E99bj`obQ8sqExhTbep z%5-fprW|;-keR$!9y3p#(X~VG@mE+IB#xf5Bva|_-n<0DIf@XK<{kVOy9&V$ROFlF zKqC#;<)cwoeh+jNpfY;B@9cr7V=jj>a!}S_IC;)tbs7Z2H!to{Z>~6@>DsL5FoOjo z6zOx+#~5KQUh|1A)#aO-G(EBP6(4b@oYi?j;^y^Um12?R^=w5Alpl4!lrd`j=4yk% z8L?M>>I6|dRXo8Vf8bc%ITX~pILLr@+06>p^X2L2Li0Z2Ib}A2e54-Q#^#fA)uS%IY zP>XT^2oR7E*#B>(Oh!^zR8Cp+Kb10FWqG>|2GrhDWgdrrl8FniYG?Wosuf`juJQ;Y zNr*d)18Qcy?`Jp0*@m2uP|NP^ZO{;WZ6R+9@XdvnySKah$HUv*HMFypK^-W|N$dHR zff%CO4yFN4cS1#0C_gYl3-ha@O4_|icWVvgWj<@+dhdWk)rUa_CIWH67Vt$2b}U)Q zUfzX%04DO@OMXN5b*v&dt5*K_98t7esC~Iu&>+0ZPUnW&7-V$iEcs$6RU96tfN?(S zd{q~r*=wSNaRq{PtTn_=&YqF*oB*Tlz-ZH8d7MV`=L zb%EsTLdW7MiN^ds&kF@0gR*9Df^1m71Yt<%5OUS!CU9P%!H$OXVYe_WMf-Z&j@h)m zrq>O)T90-PB;>VvC&ybm|Ft{3CODsNMcXHgIiU-&%{_7((KhSpZ!D+yH(IC?-E#^h zLct%Qag6u}RI{p~N1Bl8zT9;&P&tZ}%im+9b>5KtA~_?-KbjPJDFkR?F7ePgBLoj5 zn?*!^A>ap&<%B3!`SB{!1pPS4dtusQRy7G|cAG_vbLrn7+SgP4EoK!>5`DjH4)%|3Yp@B#ibY zQIy9OCrHS<5DCeVgiXFD2Ump1d+OKrL8O;ta6@&^}@L`3UEJm zKoyQHxqcsc4gO-p9hz|12F14KZxeBP%e_m;zip_X1lv>EbJA=du zCBl`IS(|jaMp07TWJAecdS7c9Li){OQsF6+xGITKc@EspcPtsPi||oui&7c#gGf|P z+B|zU&j?*izjx~wc4jl0 zQjP!^T&{LlT(NMmaKMI{9(E?KxE@-Co-ttc2PN3$AV@1YZK>_K0ZP>)%i_c*@@_B8 z*m>~BjFIu`YM6Y>rh2g_cdrg7u6)%0oH4+S2`so^GeScW3H3^0s|H!cYMIuuVUSH2`aFJihx^XAHezC}f92g5p{|^Y zW+r_1X81Si*;Iv}$n~u&t-lG7wXM+4f?#9E2SYe!Raz18xU;~Z#aEz1fH#ez+R(@)R{=^%gK45agDko9~MLS#eg;G#Ce8p_YxWTZA1g< z{lG4!d^W9YPZjLXhx?$5gRf-a+QmI_1>p;B!k;Fy7sWoS_ZpnLGrDlf-}{S@>pT5U zJS=p;onm?-z7Lr8yd-cCSC?nG#8S$81+>ni>2-UQ$G*+dx!S5a3oq~?kCB{m!N5{u z#_r_q<-qZsA~+44Vhpzhy=mMy8)zowOqtL(iKHG+coWP@`e$tIJk1HPqJgeIT^N>( zMICOp$UHU%21JueEvv#KmV5jl%0+Np24$pP;+MB$1=ce9tB7dV2wW+%r+*8n4QdOc zg_gAn$r7imRioF5=mY|E<2PK{p&m}4>FUa20+*UsN;uwt0C&$cjM#PDpcQO39YQ`p zom6tfnU8p&=+9_Q-ypSV=k`R2*P%wM9E)uN1kNmfq0@tm(OUkqFbSYEoKd#4eY~F% zSx84Sn&*UCyYVZ0{$4yR6TTyxbfQgm;jGVkKJH!T39>-id&JvHhcea|O0ksCxj=3f zOOZUQIXTuDsJD(oS+ej^29l38smPeI)fCWLKjhexDZkI1bZ;PJS(^B;z{${@*FCBq}VgB;v9(9#g4?1hMCn1I{%y zNCX?zzh=fWwL>5l6adPWc7DG2TB1#)=;`FFmRsSgx~y~J@o0{!T8CYDR;VAJ9|fK9 zF5L!8h67{c=w+`0CK|kJgkWHsS0x*VroOFr`}A9X2`Bh&3jZ;6aRluvb#ct13|l2# z)8@2Sn(EaK3!|cKa8EI(kDGmw7yf=@eGKBHtdskDVobl*7Y(J0~AmGkO zyh3K9iA23hp0|?cSJA<9NVq}BF^sgUl^N@R9(x}XA$fUYPh^U-siSm z>U^n8YPZ3RQ8t4d0yTX1mb!GxD>`TFjqkcb>P2!F-uUdq*8fao2~D`KmvP}nkpQEt zNp+chP|S9Skna)o*>d3p9%&1i4K%rQyR$*ib2s>m327J3$?#xb7}WuE7=CTI0(N4e z2qibSd)+;1nXB|`g?SqQ&>G4lcg<(jzvQyxwp#{k2PIi0?{U*!?&Rd#V;qO$WggcS#ZYijPJ9Ww44d^trkUWy9PY)Y7i$~3a-`n#re~7Ck zW9(6J_cybtkilmQV6N;(JjX9T>oRYA6<7=pV$BM$zf-I!co9&A3~=ugFR2rXd<*Bj zVpw9{bCjQ!rj?=@r*BY_kQ%3<3#W%HSDa&*V`f`m zUO9r9n5Cb8rdfffpp}{)muXO+f4q)r-^q&+tQf_9JdS+HKnqH1>f`)=J=9ua~s1@r} zffhZ-In&kJ!_z%aGd$KTuA!#yYkh9wF5-BoBMjMOBo>FE9k8Z6@- z(|=hG(7$aEh~$4q<7{WIZ*A&oYW*K5)c+ZHALM^{f}&leRsZL~;GZG?znx^_GH6t;DkpI2x*fNNC*Z)S( z2mWsqHiiJ(|ARtTVbV5;0jcYgT5JZ`J8ZI9;!Cs`uVBp4fKu)ISDVzsE32FU;FYbB zxwCPS(>xa?UKBrT(bu0fCr+rYZ2U5kbjT|saCClOD`|3@+y^DfoSvC3gwxd4FbbY! z0B~qE4+8045C9QnIJ5Zu>!GSRS5^kDeG00$;HLK(gEF{AShcyhaRnG37(+-h4&($s z_9DG#h=c7xSC9NtZ7%XLoq~qxg5~-NX3nMwcj~IS@Pl8?l7;OQ*~sl=GvZ{aX__;Z zqk3;j&ovpUp*6(Dvm;&Qw#l1E^avxla#c1qv0ceZo^t2!vu(`(NNb1BAkgZNfPjcO zfq?$g*Z6-r80n4v)4Qnuf8PHsQZej%xM|5srHQ(2 zF&%mka<-}8a1+%XCMPeoY(fHR+rTg#U0~ZpZ_TQ{bWL@=ABVHgM(r%I_)@w(KzWNJld5+(onk)LUiX{R;IZC`cfY!#OIoYXW92w&|)J@xj!_FD!Mf zS++vlB%RJ$T#~mQ)cR7oD6#9R*lEz-c0($Y*-g6_2EqBpRvq;{^R``R)p0tcH!I56 zAjtV}Mp)Q0i;fF+TCp(59fh{;PM#-sT>$)$&~oaPYyqc^a&Gn&OXV8psE+hkeMRjUZ3#E4&_BJFtPhSnwPgm3>5Tz5n!J6-l-95QP0} z6IXz3&xUROseo2IW#<7hrKmY9hzs)?yr#6Yk?gwVz))4Qw0KW^to&90IDGq4($!A{ zv%J&5l@r@^Ia7L~qlxri{^Pz(Hu{)>45;S84Ni|clqDL_8hhDYm3c2A$ zHNcjR7XP36-z|7*+EL^Qmfzk6_tRznP&_*{15LUF_dZ`4vYSzv&QUsLTdvf^&-g913jSq z^wdVXb$<$;l*w$KipHG^B&z4IQqzRrFjr8qZ0R(Ug}aV=p~)(byl}6VOwKt859`OE zWOA$#cOPvdItklCaV1!6mNrDQA4Hfzu+7VNfB;3%YAQeEGEIdRE8lPc7)I|x+IH2f@%DTC={FQy}pXVgiJw#OMW-#`#~kufk1Y<(xR|RZP*gO9Zwz5brEU zUSfL8xl=)S1yed`?&hb8EDY{}V=J%TjF%zkfaSDB$874o|Jn=XI(65a?23MY&#T!1 zDGtudBJ)<5HE9v$49hMOP1IbF0j%L?w%EFF{*KCh`AWMjF>hQaUnjGd>U-{?FZfC;IM8z|88C0l>*Ou z8(%&nSqEkEbyh0o112IRAi^h}JC+v0MgtLV08a)F>f}0_zP92O=ctH@IU-X9JdgPMfPkdkyN;RNEfDyySj_D66Tl*<^&7;hg#+ZW9?bQM zO~RYIr7cuV2YvakufxxB=Fzkji;1V)l9LDo1pq-V*Mjvso}xG}f?lq64I@uV6-^_z9U%{>K>TA$=BZ#YmWye7`5Jx= zfm<1Tv+`{i_b*SZI45@k$sglNQASSn06n@P*K3V9dn_wrJpT$h&U7f$m{??Oe()|m zi{_2~?Q?%NT9L&R{CFbYKQes&Iu|eW)g_$mYRq^D#)S`LBWkHJ#+g!~4ymZP#PUh} z-%lvQV!|&=%S^)(lQFGmFG<}oP+VdPv%_WAY5tcm#($bYvdqb`TAnn3lb5olb6{RF zNxi5Tl3~MRK`GpD(539<=@|Api81Jp-54`Co4G!qXaz}&4(t;XH#i$ko zmY3c<2IOdI%U_d3t}<(C2>)8$8`Z+e6EwD<8|B+Dw!|5zMVAXf6&q$>&qui9)%U8q z3}p5)Ym($mKd*sWbrdX~B_0sSN!VQy-FCM6xAE3NFcrxqVtj7;WNCT!^$RG7u>w$n zhIDMXOtFqe-Ptm1`aR0{iqEHK*I{4~Wts^-H%eNaM-m^a#@d4^uG73qlnl_jX!~R- zn;2l@p16liZQle>$hFJ#2tt(iYuJK9N!B>~2JpTxk{UZkMr-5k*!Ld#?y0dymUr%8 zxrOSUIFc4Y95Qg7vP>`**RTU#CA&e~T%~2B`dHls$Od_%RCM>$quoTGFG%wMt4ZZT zd}EeU8j3V|)q;0k3M7spcSw+acPF7Q?_89kRWEOBn3pllrsz)Oq*?wx13jaQqSPO68RdY}SAW4L9s-e?k!6k9 zojjjU`|rR7DWpRRea{v+Yeeo%H|+~J5c=M>Itkv>cB4ldp|F;>$$2EqDy z*^BMxo$H(e{q9@%)zxI7y!lbyg0g!)F$NRoseqV6;nL8RBzJL^R!e*{B zn}w9^ho^y3n0=?ONuKwBE3K|TLgnI>Zsw1f1STsSRIDQOUQ@`bkBbTG zZ()6ZV}mI|n|9n5#0jBOOH5F`)qNNpijV8CTnMeQ<;#Q zO3xn8X?=Yh?DQ=0gN}}c^atM~h)=CtxT|I1lJ;j{;TeTl9lY$~O#W>?EU$U{vcHVm;$j!gdH^!get8SP5Jnv-% zv0}^V9a`=fws3vtIIsl0Ag*5EZwTh zUsfC{1{fihZFzv09Id#USGOYAb6^is2<6Q>+zl}Rl_-Grqx%|$(9~M`9MRdB<nr8cGyRRqgL8tH=5;8>;-fG77Uj}9_V=fD=(qgd-}CC@KPI6sjyagQ0;pAIO+Zu@ z492!r^vmmY@C;T^L?AZl3kI#q#MvY!rI3z^;zASm#MqK!4Ki+(Jf^QsuI`h*=dbdu zT0iZOz7cJmrE1HkvHad#+&?to9 z{IrQdi;EJp4j#XqFzG}>hba3_2xnhvbiCuW*VEL}TRD39APZZ#5oyfpfj{xxdmUANp#QD@NPf=(*#D{e+0Z~hX#bzWVQdZf zzjdf;HEF9Y2Be-(b*NN>P7_%WUho%%3@}ev%3|@twZ=}OmLrR!qWq^`x2LUVz69Kh zpm-MM-KZX{=%iDR7c0=YMm2cQ)a?R{Uuz~J^ix*Z$0W0ATJTi>wZwE57I>7wvL?eq z^o6+!>u3e0$pNO-%Xq6l9O{_jZxNa)E_FuOIb?zwhlg6A6_Ty~#Ydnj>R5%dXX^ZQ z`p&Oywh2texoIl$UlH5B?QPB#cb&oWb+>Y#VpheiNExtTuKbe35cUmB^nZ1}Xw$&X z>=8SQ-Y9R-gc%ksk}m2i9zBbn`l1mV3!J8V`JTaDU|gDzdUBZC?f_>{3FLz81k2`WkHx&%MK9EH$HCKzt*MQh z&z)d8B8lEHxWE`*>8|-ZAo9sbo(mF+n6ro;T&Fd1bpSHTmfxz^9;ltf;kgI1vac(w z*YlN@OsAlTaS=tth z6PPBp}{N<(n6w5ODFs%hH4>lNu$xaZhN1?L+Qbs2>n=oi-uc}!H`41wbhHUZ6i^txjcuo|r?0PjXrBu!XR0l=SeSI? zTD$^O+#5e@mQBC7*6%hdgd3Ml!M;jebG4Q6hr~8h?yBw@S@ud?O}k+VGx*4CyC~Ga zns{!KsXzsoQ1jk`)LCFv^;TzW}9UCjs zg+uTL5iUL!0u=0;DY9TWU*nbh>JNE;m3TavwC7eKP2UD(9~GPm`cIw~Pf8C;qciW7 z7ph+2_`C)N8_B`Zzlq0C8_DT%e4k>$z>&Lq1e^JbRxDnKnJ)K-(vsu~J7 zo4vXwEs2k$P>?Unm$da}oK=e}b%Cs9;IB78A}y|Z(Ny6F&z-5&*P3i>cv?;o(qf}6 zk3Q6H(jpWq3+m;=F=ry~w01AsR8g71blo9(OmOC>`y| z+?))pp!)1&DYd(%M66gyT&V>J4Ju5#wb#2%KaR}06_tl9Ojtw9DgIuDUO5g~Ro8i$ zg}=Ps1^acfM#7J=Pi$f~HZgg{w{LIz47Npa*XnTHFV2dJL`-R zZ+JCad~ei0*K?1$*9Lx7o@kzE1hM6u{Ng(51WtH$X8~cc;7(ko%*-aFTZ|9JPX{Z# zu7cw}$K4#aDP_6(HOyYS=Ft(nZ)zvfV#{pLOTnCrU}lU*sdz0 z+bV67Dr>G%t`3^cduuOulonVq!{Aw59n&YLBQIAwtbd<7Ul|i9%-3l$62%^2gb`1U z&?DiI$G~GkDbT)mpvyx|I@6a*KOS5ZzaM?R1htnSG+gtzkESU+s;HuNw${QHg{9juq&?Tmx}lV5r22Yb4KpKwbw;I z80ExhlV2_GUomvVEX3(609`kpeoW=#!OoE(o5giYk5rn7zbM(AVh&?N5_ln>6ko_d z#)!j1Y$9(7ZZxvWET7WPl)^3LR%y*Eol=4dK*5(L+WJ70^Wo(j7VoR+a(FlR_Z1lJQz4v7I=7yX)qYzu4OONra*1J0r+dn+>C*&!= zOarl{KigL6#H#KO=#kF=0Zm~4B_dJmrLD=1DXZ9Ey}G~rB^&NSB@v{8qJ|;A5uqJ6 zJvJbwz8N!$SaYmYOI7oD`fSD4sN(VkE1p4%uvLjw4{6v zgdS(B6lUr6@rM$za{h=`{&QCm3YuF6N2F@4qSfLJEP@}($N79ZccT)w$9Y_uABfeK z@C}@97X0}f8^K7g!w$cKx4-w#i*N9W-c$rovNHw&ZwRaO0&dC|5Z#1lHOd2R=0^f8^)Gh z6`@04oF#2m;TAO~REFl=w}lb}Z!gUUz^~^Wjqm};3FMmN1RD23IR#b(-rZhxaHkI+ zF_HWA3+`$6!YbcCRBiBqiBJ=QbkL6Ft~gAzhKxhC%Gme?t;~cf5Y?4g7O(o1-~&Qf zgjHrN#|KHHv9aIpyXa8wU0ncL$oGj|e>rv(mTDRAwCk+xdgSq+RbcCN+}hjwu7L(Q zB@HSmNm3oG5YSWwPKRGX<=^UJ<+|Df({c%91iDQ^#@7q8nbm~LdL~sq z1d-9B!9+^JH}uqwoI!pVlfsEc^v2E*Nl+61ylJz3+Pu3v9)OH?oQ}rjE!s9Pe?uwC zVQDp-#H21nGg~iMt44cc_Z&3&%Z`1dmavRvSWzE4-+F^ z-bpu!k~k5*yavKS%D*7+Lxy*{%dAdoDW#nR(?=3vICf8&%~YGj8Ok%~P_0;xRg<;U z>^`ElI34+;=O})<^b#+ti@Eh7^@!Ic&Vvl~xG72(gt4Ym@ysc6HmNSd;j~W*b4THi zd(#=cZP6701{Hzy+5qR1IVS85#||XTm!C7Hc8DFwF4fR3)edNBl;6gfcu^`BNt{&C z^U`BH+iZwto5hel!%6%Id(MRT>ZhY2+m%Ae`K=5EmNmXBumm7|-OlV^Oa-UP;G@ag zvB~Or7;?%Pz;W4CXEK`;l{44gN2ZoX!%s!hBr7?1CM@AKM$N~$Yg1eQe6!cOuV;qM z#b-qMV0)|%I~;JU`r|rw1FPQe*YE+^?gz`NGjhBn3X9uvJ*8i zEdhUpB*%7qpmRunpiUoc`fsJMS|SkAHTzdx$As?L`L1SNjpV8b^-7MD{0NRvUCm;vl)Up z)lxV5A`KIwR#_yb7@g|HCsR<=X5- z3CXU82mkC8%0Rs5`W3gI4{=8cs&x~p;9l2#PXDP(c`@=3LCtqFdE*EbE7{!HMoH;s zCSM+2wH7`5GAlc~U~4=T8%JbzZlis#UEFZpbQiSJxyg!8Tmm)3R0L>?;+=VIPeR7a17EDF~@hAC(&MzPW!BL{8~H zmoy-BC8u1h7EAt>pi}!5>QmCk)9lcW+q0h@+(>Jll}XB3eEUwjROP)cjo*IBu9$U& zght;NSjJILs25~n7A!sRpuh_A%EeFRM<-w(8DS@W$_OV`^sW&)ottHkAqv}Ht_^tU zNOeC=g{|S4HGUqcQ&bc8M-{M=8`XokHgVQBw})oz*yW(%maqGMPra#_=L%>}vRps7 zK^&~p<9*Dhe9=3DqhCkQUwnNX5CPr&aN$Wjrt*^EC@ZDsFa^69|T zM~~rJ4TLxRRrwncA1Is~_GANtTGMSuX?X;Hqq_tZi}rZS$n5r|$@YmYuCHPb5`^A4 zYsU!Q>oNHR)W?A6JEUaq6dE3D2D~wH`U1z!)EqQ}^zYESj+g$t5Gb`{!D9(h(ee}6UO0vMik@ma4tvAw+llp zSJ$kGkZ-8`y#D!M&*ePrPxyu>oqu~rK>lPa0ZaA2AHSUme^e6|woc9l*4Dsk;@_3N z`Sk01WniUm05q@scANYWVQ*k$1^o96m36sgMiie3J%>X|ip65~UkixtIp*g0(g@+u zKS|>`${YKltwZ5RUT#-8CAPtK4Lry}g%-oEU5B`n>#Z9rXp(RumAdR7OT2&1V zA(2;#cJvZPZ3wt^X+~o#Jl{M#@_t#(5?a-SZdQ$!g4BeagtD}O;OMB+XKliCyAuMd z#TakJe+ExP;8e4xsRE&rrb`5VUDbx*>&9@7dy}?OFEAfef9+e1F^9mTVGMKo2g*wJ};i-DBuhYdrx^m@e z(Ac2V_Of6gc8DvROY!oq4dN%RKHPd5IZS26}11ez=_| zxgF)gemqIiX-u;0WG+gm+E{0H3gpPe+1g&(pZW?Tu zZV4|m4Oy;>ThomvAo7)DLoVMR5*a8&3=snO2IcEuGwH$Vo~)`t&Du&?wn(6sO^to~ zbAN;m9`us&1WYr<{1(?pT(aXbeL=$K{> zdiSiK^9d8$fk(IUu8^!8ew9mAwOof{d#c6QiY#L&44$nmEsx3D`vtN6Z41DH2Exe- zXtT-zj(VU2x9?weqCd8vi|v0lp-LRDT@WKe$n6u{7sy!i7P3`UmxIXy6|n>~r~F_D ziozc=;je2PU8}6%M3vivl^M=!QIj86rE3QZL0M$S(WTeaBT8+CIcWMQTZySeo?r0C z1;e6Y6*E2ia#+Am!;rBu^N52c7rL#f=6tZz_523}Lbdly=!h$5N7s~aFvw#uB;*jx zGbrjHs8|rr!|`ERV*}yilLo)2kkKP26J1O7!^Bish8uy&$8=d7hIN6;s|qb4hk*6P zpm47q&c|O`Lj2O~)f&mq9Az?Lac_*_oju3M8lWb`G2gDH*q@N^TbtuSF>9>7T^VB4 z9BF^P=1WoEmj4V(>tx5p@T z8@pvT6ku;g@I5>^YfVF)l|s{Ki@rpofjPGEBEF)W3GI?8*%v$scBTm6EfSC*tU1mF zE@*hT=6<{4RMhA2P6t+jrUoVMyU3Nl#8?^ystYTLW^Bl+Ov2iHWLZif=3HHvp?t($ z3#KA^PDIk7%B@PxDZ|+5O-8;A!y<5Gb~s^Sh*L?SF4j;6j$>!+Q><==Dh1q@0R}-V zziQ-MkX8R7u*2r_^->>QonzeNBQhBD8XRlwrij+!Q}22}}(okI{TEp*E7r ziAvcC*-F{Yw!8b#VL3b9XT?}O_VNpOq_8En)U|l-3blb2Cc&=a`)TC?9n_3h4;K$j z-OPCOu!gT+Tt=;uL?QUl(5~DbF1ON>#_bN`K5OxKrW7!&m5RB;43{_UX&xh$tvmLvq}k^^({XV41wS^(V@%HnLhdv$2BuEm6$iFMj=+lK{7Z zI#k{BnmMFN(qdUk9}2LGFO~8`BA)s+bO2Ij zrj8-qC> z-0@p+5_CEsN*N{u|d0x>?%9CKNmWCa)I zkP_Ro)j3EiGl;XqnjepFH50n|es*S4-;0I|mM09nTpyjtH7+%YV8Ub?5x=(}m1G9nvntNC$zqf?7CwB$fWMpylOC=oIzC4C=c!XB znIvY!cDA*)#X##YXm#;# z^Q|q^!qMCk+OWIrkn7w*snKiWls8-}Ae|F6U|R}6y+FKn>#qa}u?OA9Sm*q^ZND%j z9NMs2pa>IdiqFqGkB?x!XH22Yh#5X}O(3K5;}&}dy<y25Bbqo8Fne4w+Q z`Jmfb%d6SVHFw{-CbD52Bd+eJ!O?etWG~nVp}Dm_?6Cz6xCU=gGPu=OE$|mXhNZj# zJFh15cb?Cp)dz>~p5eXR$CboXkC;8$zd#TqV1IB+eTSQ){5|#rrJ8JN!pC;;SAOA9 zT14FAhvv=~OVeRmc+dU|R2=s7W~#RH++y$~1Bcw3kerd1i+LHyk53=)SzwjP3670T zeLuYtFpF8A_@#VEQGyFn$^CXNA343tp$Qt;7HGd+WQOPLBj|vJIf)Js|+!< zzg=TY%hKbc;el~FA29g#!ix!zr-e+2^m~qSY7kQ)_Fa&b-HSszfu13DYFLo6;SDkd zr_>d;L1oIrtwBylN)Pp`RuZGiMNo+m$ZS}}W#Ml3ob-i&${nBOVz~*xb_a|mru2@b z7noBHmQT?D;x!daun5?Qdv=vp6Om%xfQMa+x*32uY;Y2H zv_i{ zsJY>Gi7|P?7B|?I4J{tTiY}`C{zGK(`z``K8-`I!C4!LYuXiDc)Ah;-Q5QUGHdz%m zhBNjKvRfG;Uuv_>22OK*LI0iGA2TH<96$rl6|n!ASlFA`e`IELHZXGneti|F+c>Q> zpuYHYf(gll?0n75=N3_|oP!pdB0uE#C1cHQt1<>Dwk2C7?gt4pDi^)Bw-R^%h|eo5 z0yslde_1ti%hH*?Y9sopAAu)YEIyp4e7gfkNj*iv5tPMwcE z)~pAvK2ZxPR>)Ym7aBbsseXw}Emv-ColiXdER(-*nW5#LFKJ&rQ=6hN=P0^StHMlm za}sH{l}_pQF0w3@wZ_O)rq;TA^dyO&iPuODmIk4@p|LU{&a$|e;b#!coRUbb#z=!} zGn?bHfC@;bL3w383V%e3V)%HDd(79><1#Nhx?ZQnxL9z-^8jrt9cD*+$ESxnm1C6f z3#pCg$2)%ANOMK>Dn?TNwP!C!6h0XI+CX;GSij~bJAAXAUcYvGLx;Gqje zF!BSAln8yAaHQtr*69jhXMitk#SRK7+#lwJ0NHFoc4;TreR?Y2MzS_`v4iz`<8Ihr z=crd}pQY;U9_!-_Z_;7by?S?VVlQQnm5GkGcp-$8?cGh8ML;!nio;;=(b zf{ID+;Zb+knA{?Fw8c$aWHwTb?`9XlX&b@P+gS=HNAvOsVzrvX(Nl;pRRm+QVPZJ2 za`;lSvL*(bQ6tAXI6I=s7>IQcwV^T}NL6Mn?X%3-^0W~7jZ;tZ5})^xu;gsL1Q$%5 zL(9+sbg@ezl((q%a@}a}&%eZ!8UqTj9_!&JsJb#5(8$eV_e-M0M-Y_ssYJJc)PZ#! zbRI#nQyiRbb-3?SRn3SfDnV9?aAOFCh97={@8Yf+6QuA=TBokjsRUTAfJnv;cyhMZ z7cxL^M7v*39}1CiWQuze%XZdNIbufo;Ixo&mWQ#!s@`6(eT@lMh6AyN#i1imvKQV% z$8vRt3LL2(*Q*o6o&2a5s4`O{n4d9>UkYk}o)aw!Qd|cT3d1ovilEipZifkpcm&`C zt19hbL(%L>nUTL!okxEB&R<%?cQvbN?_A}T;|HEUGn8atZnvT!6Q!UoQI$SZq5xD-?YfVS5dsJn@`q#rDJ@KlrAuvzW`+Z@gt7DCD z5^=Va5v2SUxF@^1$BSY1K25x+77yX+upQJ71UBFuIxow1)ojYRQRpA%{ps3!eRA20 za$YOb#X<92HhS6euX6UP_33hOz8k{AKjFaJoP@597}VAjRnOubyN4x@Ao{n73E2*$ zUB=R?aDy&g#NNed)9$(J4v5^>`Ec=TWo0}>>md#8Ph@Q-X!BK_GJ&Q_b_5#av0wT(@TxSaKMZ14JM=lbU0e(U(!#n-T_x$S)|g7P!` z9+(gkR*|pgs?puRjwnArH~-Z`>^#0_@nKEZAaW9vjL#uF0{FF46Tl&M_geu}xIDS;;I4MP%;N}MqB#e)5culn`Upd&1DxeqQZ+!*SRhmSmlS$n<@UmVMe|zKY1R(* zI|bVOD6n4({2Ul=?cwgYJX(MpHOh#T?T@UT)Iw;n%CjXMuJs|(vK?}%B-d~-pc~cx zlQ5Fpxm%x2IlZQSB4qr12irX+Y}w2EzTp?E44-+F&{N0)eEg-Heo#JB+RsjHJRKq$ zO+Wjvi;+xgL{Xm0v%01>FIYTKkOsOuaSJy==LWLpi2MzZBP>#(cvDiX03v(hjl9T4 zzl>2>bkwM^MD$haa29otG(hin*x9vjeocql74@&C{D9+diErPuKIZLfjWhIDFfGQZA^jobHST|*}^k}4odug#AclSFxD;?7hJbj$DpoXP%b|;t5Z?YnNh1GD$DBXUEj6QmU4VMkb2&CQ<=9UrIn73Bg; zlhvzATWEw&LZLcgdDi|fW01h(!r{!R8W%dVp9her3Da+U`Ga|GfsiCyYLe*Gz*+O~`RW;y*xNz>& z#CI>$k$q1>h!9=!TymTtwP9PJM)Wn?9w)dPs?yZUw2 znBp|NVyYP zOr>Rt;8yYZN;C^XSAv&1-g@R@YrT8N%`7B^ey-iZ4*vLiv`{Q(Rw)mspTM)M@ z8^nkbeD;WeE)6kDaTqsdO4isB#FS4P$krW@VUXC^xH}jNxdOjmDkInF#HDnjpcX?1}8OQO7qH3f@UB3UGfJvaJH!_)nXxC?8Wy=Y|~2KJ*S!MAsy6#{Bmmmm|5 zgV0mMjs^9rtQMl?W-3b4JI5-o-sbi(B4$fAWeq%B?{U`LPc<4K#?(F z?8Es}Z1T`l-`mxcndH}NbLx&z1l8I~OVo6IT<-5xavXNd_RM7G4rS;+Q|Xl-T>+Gf zN;f?t=k8&|@@+S^KgrGRgg!)m1*xMN>yRtby zH4qdxy@?HB)X9Lf?Txa{)8B(Y+u7P7`})i&g(MW1OyKjT^~3o%x&sRIzscf*fB?Hc z|JfsdHs?$&tWEy7vbYvbv!cHqpCSg<=<2aFV9U0x6%a7Gg#;A7K5Ky$Cfd07zS zH0S6R5$IoUKUX5_(KKmFcyq6o|}!@lK3R7AfXa38D108Xrc+PF>ZQ# z6LKI!pY)<|*kpJ!z)yX8W~p$#2q#g*Jkd;&%X`9-=+IxQ1enL7L~pUR1T>;FYoixl zOr+AlUuh`Q0GyC7_P<^2IA3ffn|0F3l3f-R>n74z*y@7Je&5ozu@=q*)O<+N2Axcz27Dt{-xe;*K1qsQhZk3JqO$PgN5a(PutG1}f^o<#pv)eMjMO^U$y1SWWEY7ont~ zEbwI)QYQNE|#F& zl*kr2iVBj`Z^wAr4Fe~(xX(qt2!7AvKv4s=@{=@XXcs!nF{;DwOp`tR9UsSwoAr=0 z#Gap)k~qGuE-b|;4n{%u?&2Bt1orR;2&Wnjey2llNJ&8CQ_aFBn7i=uWvwrxJmCmx)B%d~bnN!Fg-q$@eh%0{KYJvgP+W0FGP(xp zrOnr9RIWFu*yura_A*;|!$?#G3uSZd=M^2Jqi$2FN!1}Re&9Kp@|6|QPVBPEb8u$9 z7UHduS`h6y2%QXvvema1p zbQ92YmwwxdfLKIae`gJ1XZsi}JQK@VoF9;*g*5!l1y&^Gy64??nh@j!GY|;gkCzH@ zt;pN81~@-aU%e%UgAy|K=|sgXNAqo(?|zjlcyI_E8A4*Hx(%C7`1Dc|&;q^0-O6Co zW7Hcs5nO^kZU|0Yzl1bqMYN2@>ur>7f#zbw6)B0@3e4583(2LG-}Z zR)!uSuzuqGyV9upV~7=#KmvAb3fGW!Mt9t=&G+cb7XeT*?OYFXD6&0y!~iCn+%!^B zoEkzsi=XbSHUTg#{k<06VP-KrbSSzu-6tH)(_b2^%~;mS$aLe^j`ccXlb=!>o_@_Z z`8)^iBCc;QzSJM>u1l>db4)f59Vd80WZGq{g)?8ezJif8*fY(FRG5cFcfdv*LsxwU zSv?T6e~cpaLB#{^U^61I9&}G9e8V4Iu1XFnVR)=T`P_Qx@!O&NP;PP0lyh!UA(hH{ zNuAh=+~BM>WTUdJO_aXbNTiB7X3w0HMwBwa;6`z! z37_h^dB4CUe`BK6-O#vWUJbtJiE#olC+!=r>Wv__!t3|hO68mPVyetD?FqmaE_}O=a_<0=?-C-|50HK(GJN$+f$(_!IQ+*i9-M1F}{E%X=>$PJa z$#E6cqcd+5WJV?L0D+6VbL5ijSThk8FCE7dRuT?L0?@r?#g16ZiqnrWdDvp+!-#bl z>}sdcls6c8NymJ@8gIepiF!kET6TcN*l`#!&uYIj5U|wGhO{R^smwrloFW>TBZ92> zHPJF%G{DyqUx9XX$&B$!an3aE#2wBV>d6n@3jKM=#dX)UPu$cWj>15yI9bCyp>HYm(o=aX)ZmV+lg)2c@g?Ix*mfcS_>lt1yxf7>cH$d zlAheDU&_TIv#Oao#X!H;JyZ|GasDYjJ7&tW6K8Q%r$V=aDAXu>M}RVL2WD67dm$JR zr>WJ<1R9UJQNJa1d7IHJ@tZ1FHOTqwaK;Ls zJbbZetT<5sV<1vz`j)M4HamRQm&O=xQba}V-xjdo)P9e!bJBF=V@&S^=Yy+wz_p(sFUN zXj7VSV0hQL=UHR#Lg|5MbOxCN_s>Qav!>)G&aeaXK$rH9HpcnQvuqk(nSA7SlY`qA zAl8Q5rgK0Zf*b4EGRY~|Puw!SCCwM2g#Oh!i$_C}|xW%_s;H9^rMXXkxM zHjk6)34(2!YL)5mPlGi<@wH|MqO{jdI3De1`2B)&Fmvl}n#=+O$u!s`+~RKYW%dE5 zKUA`iytS7*lBuW$^J?btytONz_+5%?2WDZd7}(5SA?2k&!7#x8_fImfl1l_(EA4t@2%cj9@%fbBOtrzf9U;}PWD#pE&1rT z*f`1m6#I*V^j7LEW97G0CD0cBKi2gpapkSjTPVtJC2`9Csq_|+@>cXM+vKTYksy@SgYoef59SJl-n2 zosapgkPl>n{I&i+4)Fg$ZFwv4*7*Nh0*UvZ62Hd)ek=UH%|5>sw1Hfl-;4OC_2=LF z^{x5mw?g#46#nBv_`QI?4#(db7k-DM%KUQyf7=+|3cNjC|1D51`(J^7oVC9Ve|x_1 zJKR#`zv2Hn?RYEjwhi)IAV}wLfxnv~Z=>H<-M^!ifWV}`uK#~(@VB9FYs=rE#rppZ e{ZrsSm8QHDB+!KL$Akz5hy^4F$fCs`&;AcHHw-oa -- 2.30.2 From 172c83efb940210420500b9c76ee2e8a199cc276 Mon Sep 17 00:00:00 2001 From: Castro0o Date: Sat, 23 May 2020 13:34:47 +0200 Subject: [PATCH 3/5] essetial requirements.txt --- .gitignore | 5 ++- README.md | 14 ++++++ requirements.txt | 115 +---------------------------------------------- 3 files changed, 19 insertions(+), 115 deletions(-) diff --git a/.gitignore b/.gitignore index 7d7ed5c..866ad94 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,7 @@ env/ env/* venv/ venv/* -.idea/ \ No newline at end of file +.idea/ +*.pyc +__pycache__/ +__pycache__/* \ No newline at end of file diff --git a/README.md b/README.md index e69de29..42d971f 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,14 @@ +# Run + +## in Development +`export FLASK_APP=run.py` +`export FLASK_ENV=development` +`flask run` + +# in production +`gunicorn -w 4 -b 127.0.0.1:5000 app:app` +* `-w` workers +* `-b` bind to address / unix socker + +or using unix sock: +`gunicorn --workers 4 --bind unix:app.sock -m 007 wsgi:app ` \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index e5adb79..f923120 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,117 +1,4 @@ -alembic==1.0.0.dev0 -ansible==2.7.7 -apache-libcloud==2.4.0 -argcomplete==1.11.1 -arrow==0.15.5 -asn1crypto==0.24.0 -Babel==2.6.0 -bcrypt==3.1.6 -binaryornot==0.4.4 -blinker==1.4 -certifi==2018.8.24 -chardet==3.0.4 -Click==7.0 -colorama==0.3.7 -configobj==5.0.6 -console-log==0.2.10 -cookiecutter==1.7.0 -cryptography==2.6.1 -dataset==1.3.1 -decorator==4.3.0 -distro-info==0.21 Flask==1.0.2 -Flask-BabelEx==0.9.3 -Flask-Compress==1.4.0 -Flask-Gravatar==0.4.2 -Flask-Login==0.4.1 -Flask-Mail==0.9.1 -Flask-Migrate==2.1.1 -Flask-Paranoid==0.2.0 -Flask-Principal==0.4.0 -Flask-Security==1.7.5 -Flask-SQLAlchemy==2.1 -Flask-WTF==0.14.2 -future==0.18.2 -gevent==20.5.0 -gevent-websocket==0.10.1 -greenlet==0.4.15 gunicorn==20.0.4 -httpie==0.9.8 -httplib2==0.11.3 -hupper==1.9.1 -idna==2.6 -importlib-metadata==1.6.0 -ipython==5.8.0 -ipython-genutils==0.2.0 -itsdangerous==0.24 Jinja2==2.11.1 -jinja2-time==0.2.0 -jmespath==0.9.4 -lockfile==0.12.2 -Mako==1.0.7 -MarkupSafe==1.1.1 -netaddr==0.7.19 -ntlm-auth==1.1.0 -olefile==0.46 -paramiko==2.4.2 -passlib==1.7.1 -PasteDeploy==2.1.0 -pexpect==4.6.0 -pickleshare==0.7.5 -Pillow==7.0.0 -plaster==1.0 -plaster-pastedeploy==0.7 -poyo==0.5.0 -prompt-toolkit==1.0.15 -psutil==5.5.1 -psycopg2==2.8.5 -pyasn1==0.4.2 -pycairo==1.16.2 -pycrypto==2.6.1 -pycurl==7.43.0.2 -Pygments==2.3.1 -PyGObject==3.30.4 -pyinotify==0.9.6 -pykerberos==1.1.14 -PyNaCl==1.3.0 -pyOpenSSL==19.0.0 -pyramid==1.10.4 -PySimpleSOAP==1.16.2 -pyStrich==0.8 -python-apt==1.8.4.1 -python-dateutil==2.8.1 -python-debian==0.1.35 -python-debianbts==2.8.2 -python-editor==1.0.3 -pytz==2019.1 -pywinrm==0.3.0 -PyYAML==3.13 -reportbug===7.5.3-deb10u1 -reportlab==3.5.13 -requests==2.22.0 -requests-kerberos==0.11.0 -requests-ntlm==1.1.0 -scour==0.37 -simplegeneric==0.8.1 -simplejson==3.16.0 -six==1.12.0 -SQLAlchemy>=1.3.1 -sqlparse==0.2.4 -sshtunnel==0.1.4 -traitlets==4.3.2 -translationstring==1.3 -unattended-upgrades==0.1 -urllib3==1.24.1 -venusian==3.0.0 -virtualenv==16.7.9 -wcwidth==0.1.7 -WebOb==1.8.6 -Werkzeug==0.16.0 -whichcraft==0.6.1 -wsgigzip==0.1.4 -WTForms==2.2.1 -xmltodict==0.11.0 -yq==2.10.0 -zipp==3.1.0 -zope.deprecation==4.4.0 -zope.interface==4.7.1 +dataset==1.3.1 -- 2.30.2 From e375844ee9d8b62c9d82791c88139d2d8f58d917 Mon Sep 17 00:00:00 2001 From: Castro0o Date: Sat, 23 May 2020 13:35:25 +0200 Subject: [PATCH 4/5] stopped tracking .pyc files --- __pycache__/config.cpython-37.pyc | Bin 790 -> 0 bytes __pycache__/wsgi.cpython-37.pyc | Bin 199 -> 0 bytes app/__pycache__/__init__.cpython-37.pyc | Bin 346 -> 0 bytes app/__pycache__/views.cpython-37.pyc | Bin 3748 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 __pycache__/config.cpython-37.pyc delete mode 100644 __pycache__/wsgi.cpython-37.pyc delete mode 100644 app/__pycache__/__init__.cpython-37.pyc delete mode 100644 app/__pycache__/views.cpython-37.pyc diff --git a/__pycache__/config.cpython-37.pyc b/__pycache__/config.cpython-37.pyc deleted file mode 100644 index 392a627c55dfbdd21d035e17c83624b6d7efe392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 790 zcmb7C%}&BV5Z-qC2SS30CZ4==u`ghZ0)-HhVr;oI(M|2H1OqK@`H5$J8K1y|Z_=x8 z;mMh;f-z{~l9|jmJIs9ZZCmwvmB4wudbxHrLf#O39Rq?>u)G7VM>yfy6PO^6G|~X; zoC2mo1FQo!xCz))m;$!A4cJ!L;7&lAl>|Di56mn3A3z{Tq;V4IT#G1}!S%@G6#ior zRy#{?$D?lOH?6{9ERCmvv7*Y@G~_H+|wA=#cXa@XL zZu>$tDB3IpOXx-8LIPQ6ou%bEev?Wa>Lf*nT5sr-Q3Z4OJUBDQT1QiO`_Mfo*bD^~ zbx^TXaJM6tVv^0KBAu7h!>->nf6h0dgS64Dh55#02QH9Oj$Ba!iJ5g`k0>!Jx<3fS-V-N=hn1BoiATCw_5-AKRj5!Rs3{i}X45>^hOxa9DGO3IU zm=`iIGNdpEGib8B1gc`tWW2?kSWs|_BR)PiF*7ed-cOUI2xQPLZlG{ZW^!UlW_}(> zIxjIdH9r0pb5UvDN`@kKpb{|gOGdveu}HtXyj(vdF}Vb&A;+PO2RvP(v{bkl?~Ot9snW!CsZMU7(8Hw*g- zufW8)Eu7@L`|j@heD=w3I6z<@?{9aX5WhV5GYZKOoca=+Kmu1tVTLi1Sdt}XRMKfr zkX5JQ4)QFB1&)cQmt> zg=+z}RXC%#xu43sasH*R$b}GA?q@HZXD)5qHoeJUqdcpQtxbWSa$f4P;e2eLy68Z` U#+5w8K&<^o#v~#mJR&ju1yW;NLjV8( diff --git a/app/__pycache__/views.cpython-37.pyc b/app/__pycache__/views.cpython-37.pyc deleted file mode 100644 index fc740f18c0c2bef2879469d7ad57bfd02c2d2080..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3748 zcmb7H-ESMm5#QbW;OR(Flq^}I{1Mtooid5VAPw3yb%OeXO5NC!V#%;`C@P$|E9uBP z9=*4;B!YZW9*P2P`%vVm57J}*kUsVw*w+97{4WH3=*%8PD=Lbj6mE8Rc6N7mXMQuI zd(+cCf!|!?AHV->mXPmoaQ3sI^K1CBKT<+C;WQ=*2?)hLi)lciwPKpEfF)L7C3avZ zPT(YN;3kEjFqZQI&&W>&Q_$M6pA>_lnRDV&G965h<;p=B=H0lQ%mg!IUL~lQwX?yj zY3G7DUJzvalJMHz$^0n^<^?%f;NB_aQ{4ZC9Mj;k;S_;W;?st+$jgGXm-x&b!YigX z3%xmhX^)xFJd74h?=tij`O-HesPZabhISeF3;YVd%CGG)e*G2WZ}FPh^@^Ffac<@& zf7{Gl6_t}~{GC%8To>2*PpTw%%gEm1SNEvd<6Zt!BUv;2`h@=;f8X$L82$%vW-fo5 zuNeMK&NfNC@fs~ur`ig8y|uclr|!jl(UVbE=@}`yT*z%Dl3pAtp$k&H=!;BgPYNDM z(Nen5m+|&)Dz&p4huJ=CG?R%|UyAMBC>Gr?5x}ZGOp?9|cVe+FVMDuYwL)kbuIB0BzEfuxG_-?P)fNM8iM&ck_=^bgu>@bIC;9-Qx z8K48V5$>dY_5UejmYi4SjVgJs3|ni*h+T&6*@+cA@!kKbYoqA z%k8HdkJj%#*!>68{;c_6+w9wXzSUgY ze7L^084>Z%YkKza-RJqt>cdCP&4)p=1#mV$d@p=*W1vr=!|9N83bKT5HY6u7=GH0W zR+WtCke<*}qFCGFc9nEo`4M+EArQbvz@+Y)rYozjachaj*s9ywm02&2ly>^Po{$oc z({3y6?nZlcroA(7)0Q|?=U&=8aw&}C^g!_Koiy#-fR$MZ2%#ReS%u93l~-UqxeFd_ z!DsGr9Xbkba7-0#GfqKYDlZ#dt+BrLn!E&3TdQ?TTYwy+om>JI__t9liw5GNRtx8~ zGH^ku4`5a10wL5WhQ|+zV|%0i+WMlorR|ON%`MoykO;M(@@(Rp1&~L47~P-4O%!QU zPCM)`RBk{&Z!PHACk|()0HW;Y%H`HEr9>5g?;)(9oq~D$lxABn>-@(o<1Sbd-lgsH zLWju#NWsb*bUnN6!%0~84 zSxui@8iF>IJR{wCo2dDYFTbadKq&c|blG!~uN&I16B{|aIC2j^F}#JLb4ua%A5A0} zFD(*vdFUR~MKZJ&39cBreEJt;Zb}x)%Hn{e6+OK8%X+P$*a8C+R!^xW3 z7qzWh_qA>8Oa|3^VDDPe&s1$cd?{*S?aa*wH@EgfRYN&AREe&N(rzuvYTZ=T#(pIs z2b0$ZD0Evcpq9SbFoV7LU~wEY^GIT#kw>elbU;?Sxo1IOhnr;*{ZJQLa9|`dZS4tw zqDd1HomE?q2eb`|AdyuV8$8J=oMCCE?Ov$%wPz3v>T0{4M%_0k(OwdEFr#F82H&xH z7-cGJN(p(z6=tBVOi68{>L#++3-TtOgNJEvC(KN)k;^!AcheZsOyJ@3n3L(@MezCg zwNc_{uqOK)2(e1kvnmi4eC$!5`Ic`+hT1-@(0R&e8U9@OY#3jsC6MzhpUGds4gcQhG30 z9(&Z}1+Xwka;K^or;@i|fy59e-vgrUv?sdqHjY=2e24@+)&x)aG4!<6O%JqlAR{;r zT}{4^1XE4j(-tH&iP=W}3dtQLpCLhe2L5g&VvhI7G~K=E0#g$`_dqy9*CAkU7c4&h zV`b{GcjyuW>o#F_Fq^%A93(z%G#ZGC6}}TpjZ-Qh%4>}K6U*b4cpYQ;i&e|g__@Z5 z&OKIMyqwe56ft=!J1>01)Oy55#z?gRO%^Xk8EE+oH-I9FeZ_;?#M6UX!!`qVw-nUt znZ$qIbg`AjF%I>TXjAiu=DO$n<&D#OcaoI%WAQmUL-q*}49_(K(-H(= i&wKz{<^ojb>^awm=PP4iE_#LKkCzvH%VSH Date: Sat, 23 May 2020 14:16:14 +0200 Subject: [PATCH 5/5] instructions for deploying in README.md --- README.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 42d971f..ddc9b30 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,71 @@ `export FLASK_ENV=development` `flask run` -# in production +**Using gunicorn:** + `gunicorn -w 4 -b 127.0.0.1:5000 app:app` * `-w` workers * `-b` bind to address / unix socker -or using unix sock: -`gunicorn --workers 4 --bind unix:app.sock -m 007 wsgi:app ` \ No newline at end of file +**And gunicorn with using unix sock:** (this how it should run in production) +`gunicorn --workers 4 --bind unix:app.sock -m 007 app:app ` + +## in Production with gunicorn and unix sockets +Based on https://medium.com/faun/deploy-flask-app-with-nginx-using-gunicorn-7fda4f50066a + +### systemd service file + +Add to /etc/systemd/system/watermarks.service + +``` +[Unit] +After=network.target + +[Service] +User=psc +Group=www-data +WorkingDirectory=/var/www/TacticalApp +Environment="PATH=/var/www/TacticalApp/venv/bin" +ExecStart=/var/www/TacticalApp/venv/bin/gunicorn --workers 4 --bind unix:app.sock -m 007 app:app + +[Install] +WantedBy=multi-user.target +``` + +## enable & start service file +`systemctl enable watermarks.service` + +`systemctl start watermarks.service` + +It is also a good idea to check the status of the service +`systemctl status watermarks.service` + +## Nginx config + +``` +location / { + include proxy_params; + # it will pass the requests to the socket + proxy_pass http://unix:/var/www/TacticalApp/app.sock; + # @andre: unsure whether we need a proxy_redirect as well + # if so, it might be somthing like + # http://unix:/var/www/TacticalApp/app.sock $scheme://$host:80/; + } +``` + +## debug. + +It might be helpful to enable gunicorn logging, while in development, to check what is going on, + by replacing in watermarks.service, the `ExecStart=` value with: + +`ExecStart=/var/www/TacticalApp/venv/bin/gunicorn --log-level debug --error-logfile /var/www/TacticalApp/app.log --workers 4 --bind unix:app.sock -m 007 app:app` + +And reloading the services +`systemctl daemon-reload` + +`systemctl restart watermarks.service` + +and the start following app.log: +`tail -f /var/www/TacticalApp/app.log` + +But in the long run logging should be disabled \ No newline at end of file -- 2.30.2

    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 diff --git a/venv/share/python-wheels/six-1.12.0-py2.py3-none-any.whl b/venv/share/python-wheels/six-1.12.0-py2.py3-none-any.whl deleted file mode 100644 index a7e75dc6f3af057fdee4ca66da93d3602f407163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17683 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 diff --git a/venv/share/python-wheels/urllib3-1.24.1-py2.py3-none-any.whl b/venv/share/python-wheels/urllib3-1.24.1-py2.py3-none-any.whl deleted file mode 100644 index fa5e5290242d10b3b0d7dd92132c20414b93271a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117484 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