From 56ce1e9a32924cbb12a1d78ddcfa434f474b75c6 Mon Sep 17 00:00:00 2001 From: d3m1g0d Date: Mon, 21 Jan 2019 20:04:48 +0100 Subject: [PATCH] deleted a bunch of shit... --- flask/__pycache__/helloworld.cpython-36.pyc | Bin 334 -> 0 bytes flask/helloworld.py | 5 - flask/install-dependensies.sh | 0 flask/venv/bin/activate | 76 - flask/venv/bin/activate.csh | 37 - flask/venv/bin/activate.fish | 75 - flask/venv/bin/dotenv | 10 - flask/venv/bin/easy_install | 10 - flask/venv/bin/easy_install-3.6 | 10 - flask/venv/bin/flask | 10 - flask/venv/bin/pip | 10 - flask/venv/bin/pip3 | 10 - flask/venv/bin/pip3.6 | 10 - flask/venv/bin/python | 1 - flask/venv/bin/python3 | 1 - flask/venv/bin/watchmedo | 12 - .../Click-7.0.dist-info/INSTALLER | 1 - .../Click-7.0.dist-info/LICENSE.txt | 39 - .../Click-7.0.dist-info/METADATA | 121 - .../site-packages/Click-7.0.dist-info/RECORD | 40 - .../site-packages/Click-7.0.dist-info/WHEEL | 6 - .../Click-7.0.dist-info/top_level.txt | 1 - .../Flask-1.0.2.dist-info/INSTALLER | 1 - .../Flask-1.0.2.dist-info/LICENSE.txt | 31 - .../Flask-1.0.2.dist-info/METADATA | 130 - .../Flask-1.0.2.dist-info/RECORD | 48 - .../site-packages/Flask-1.0.2.dist-info/WHEEL | 6 - .../Flask-1.0.2.dist-info/entry_points.txt | 3 - .../Flask-1.0.2.dist-info/top_level.txt | 1 - .../Jinja2-2.10.dist-info/DESCRIPTION.rst | 37 - .../Jinja2-2.10.dist-info/INSTALLER | 1 - .../Jinja2-2.10.dist-info/LICENSE.txt | 31 - .../Jinja2-2.10.dist-info/METADATA | 68 - .../Jinja2-2.10.dist-info/RECORD | 63 - .../site-packages/Jinja2-2.10.dist-info/WHEEL | 6 - .../Jinja2-2.10.dist-info/entry_points.txt | 4 - .../Jinja2-2.10.dist-info/metadata.json | 1 - .../Jinja2-2.10.dist-info/top_level.txt | 1 - .../MarkupSafe-1.1.0.dist-info/INSTALLER | 1 - .../MarkupSafe-1.1.0.dist-info/LICENSE.txt | 33 - .../MarkupSafe-1.1.0.dist-info/METADATA | 103 - .../MarkupSafe-1.1.0.dist-info/RECORD | 16 - .../MarkupSafe-1.1.0.dist-info/WHEEL | 5 - .../MarkupSafe-1.1.0.dist-info/top_level.txt | 1 - .../PyYAML-3.13.egg-info/PKG-INFO | 33 - .../PyYAML-3.13.egg-info/SOURCES.txt | 28 - .../PyYAML-3.13.egg-info/dependency_links.txt | 1 - .../PyYAML-3.13.egg-info/installed-files.txt | 38 - .../PyYAML-3.13.egg-info/top_level.txt | 2 - .../Werkzeug-0.14.1.dist-info/DESCRIPTION.rst | 80 - .../Werkzeug-0.14.1.dist-info/INSTALLER | 1 - .../Werkzeug-0.14.1.dist-info/LICENSE.txt | 31 - .../Werkzeug-0.14.1.dist-info/METADATA | 116 - .../Werkzeug-0.14.1.dist-info/RECORD | 97 - .../Werkzeug-0.14.1.dist-info/WHEEL | 6 - .../Werkzeug-0.14.1.dist-info/metadata.json | 1 - .../Werkzeug-0.14.1.dist-info/top_level.txt | 1 - .../__pycache__/easy_install.cpython-36.pyc | Bin 277 -> 0 bytes .../argh-0.26.2.dist-info/DESCRIPTION.rst | 272 - .../argh-0.26.2.dist-info/INSTALLER | 1 - .../argh-0.26.2.dist-info/METADATA | 300 - .../argh-0.26.2.dist-info/RECORD | 31 - .../site-packages/argh-0.26.2.dist-info/WHEEL | 6 - .../argh-0.26.2.dist-info/metadata.json | 1 - .../argh-0.26.2.dist-info/top_level.txt | 1 - .../python3.6/site-packages/argh/__init__.py | 19 - .../argh/__pycache__/__init__.cpython-36.pyc | Bin 293 -> 0 bytes .../__pycache__/assembling.cpython-36.pyc | Bin 12072 -> 0 bytes .../argh/__pycache__/compat.cpython-36.pyc | Bin 3202 -> 0 bytes .../__pycache__/completion.cpython-36.pyc | Bin 2687 -> 0 bytes .../argh/__pycache__/constants.cpython-36.pyc | Bin 2156 -> 0 bytes .../__pycache__/decorators.cpython-36.pyc | Bin 6033 -> 0 bytes .../__pycache__/dispatching.cpython-36.pyc | Bin 10041 -> 0 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 1713 -> 0 bytes .../argh/__pycache__/helpers.cpython-36.pyc | Bin 2395 -> 0 bytes .../__pycache__/interaction.cpython-36.pyc | Bin 1947 -> 0 bytes .../argh/__pycache__/io.cpython-36.pyc | Bin 2301 -> 0 bytes .../argh/__pycache__/utils.cpython-36.pyc | Bin 1579 -> 0 bytes .../site-packages/argh/assembling.py | 501 -- .../python3.6/site-packages/argh/compat.py | 92 - .../site-packages/argh/completion.py | 94 - .../python3.6/site-packages/argh/constants.py | 103 - .../site-packages/argh/decorators.py | 195 - .../site-packages/argh/dispatching.py | 382 -- .../site-packages/argh/exceptions.py | 56 - .../python3.6/site-packages/argh/helpers.py | 64 - .../site-packages/argh/interaction.py | 84 - .../lib/python3.6/site-packages/argh/io.py | 105 - .../lib/python3.6/site-packages/argh/utils.py | 55 - .../blinker-1.4.egg-info/PKG-INFO | 101 - .../blinker-1.4.egg-info/SOURCES.txt | 49 - .../blinker-1.4.egg-info/dependency_links.txt | 1 - .../blinker-1.4.egg-info/installed-files.txt | 12 - .../blinker-1.4.egg-info/top_level.txt | 1 - .../site-packages/blinker/__init__.py | 22 - .../__pycache__/__init__.cpython-36.pyc | Bin 432 -> 0 bytes .../__pycache__/_saferef.cpython-36.pyc | Bin 7208 -> 0 bytes .../__pycache__/_utilities.cpython-36.pyc | Bin 5448 -> 0 bytes .../blinker/__pycache__/base.cpython-36.pyc | Bin 14460 -> 0 bytes .../site-packages/blinker/_saferef.py | 234 - .../site-packages/blinker/_utilities.py | 163 - .../python3.6/site-packages/blinker/base.py | 455 -- .../python3.6/site-packages/click/__init__.py | 97 - .../click/__pycache__/__init__.cpython-36.pyc | Bin 2620 -> 0 bytes .../__pycache__/_bashcomplete.cpython-36.pyc | Bin 9078 -> 0 bytes .../click/__pycache__/_compat.cpython-36.pyc | Bin 16751 -> 0 bytes .../__pycache__/_termui_impl.cpython-36.pyc | Bin 13986 -> 0 bytes .../__pycache__/_textwrap.cpython-36.pyc | Bin 1299 -> 0 bytes .../__pycache__/_unicodefun.cpython-36.pyc | Bin 3331 -> 0 bytes .../__pycache__/_winconsole.cpython-36.pyc | Bin 8743 -> 0 bytes .../click/__pycache__/core.cpython-36.pyc | Bin 59867 -> 0 bytes .../__pycache__/decorators.cpython-36.pyc | Bin 11572 -> 0 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 8574 -> 0 bytes .../__pycache__/formatting.cpython-36.pyc | Bin 8517 -> 0 bytes .../click/__pycache__/globals.cpython-36.pyc | Bin 1846 -> 0 bytes .../click/__pycache__/parser.cpython-36.pyc | Bin 11435 -> 0 bytes .../click/__pycache__/termui.cpython-36.pyc | Bin 20784 -> 0 bytes .../click/__pycache__/testing.cpython-36.pyc | Bin 11588 -> 0 bytes .../click/__pycache__/types.cpython-36.pyc | Bin 21831 -> 0 bytes .../click/__pycache__/utils.cpython-36.pyc | Bin 15212 -> 0 bytes .../site-packages/click/_bashcomplete.py | 293 - .../python3.6/site-packages/click/_compat.py | 703 -- .../site-packages/click/_termui_impl.py | 621 -- .../site-packages/click/_textwrap.py | 38 - .../site-packages/click/_unicodefun.py | 125 - .../site-packages/click/_winconsole.py | 307 - .../lib/python3.6/site-packages/click/core.py | 1856 ------ .../site-packages/click/decorators.py | 311 - .../site-packages/click/exceptions.py | 235 - .../site-packages/click/formatting.py | 256 - .../python3.6/site-packages/click/globals.py | 48 - .../python3.6/site-packages/click/parser.py | 427 -- .../python3.6/site-packages/click/termui.py | 606 -- .../python3.6/site-packages/click/testing.py | 374 -- .../python3.6/site-packages/click/types.py | 668 -- .../python3.6/site-packages/click/utils.py | 440 -- .../site-packages/dotenv/__init__.py | 40 - .../__pycache__/__init__.cpython-36.pyc | Bin 1042 -> 0 bytes .../dotenv/__pycache__/cli.cpython-36.pyc | Bin 2948 -> 0 bytes .../dotenv/__pycache__/compat.cpython-36.pyc | Bin 371 -> 0 bytes .../dotenv/__pycache__/environ.cpython-36.pyc | Bin 1485 -> 0 bytes .../dotenv/__pycache__/ipython.cpython-36.pyc | Bin 1473 -> 0 bytes .../dotenv/__pycache__/main.cpython-36.pyc | Bin 9317 -> 0 bytes .../dotenv/__pycache__/version.cpython-36.pyc | Bin 162 -> 0 bytes .../lib/python3.6/site-packages/dotenv/cli.py | 98 - .../python3.6/site-packages/dotenv/compat.py | 9 - .../python3.6/site-packages/dotenv/environ.py | 54 - .../python3.6/site-packages/dotenv/ipython.py | 41 - .../python3.6/site-packages/dotenv/main.py | 348 - .../python3.6/site-packages/dotenv/version.py | 1 - .../python3.6/site-packages/easy_install.py | 5 - .../python3.6/site-packages/flask/__init__.py | 49 - .../python3.6/site-packages/flask/__main__.py | 14 - .../flask/__pycache__/__init__.cpython-36.pyc | Bin 1794 -> 0 bytes .../flask/__pycache__/__main__.cpython-36.pyc | Bin 421 -> 0 bytes .../flask/__pycache__/_compat.cpython-36.pyc | Bin 3193 -> 0 bytes .../flask/__pycache__/app.cpython-36.pyc | Bin 70868 -> 0 bytes .../__pycache__/blueprints.cpython-36.pyc | Bin 20457 -> 0 bytes .../flask/__pycache__/cli.cpython-36.pyc | Bin 24834 -> 0 bytes .../flask/__pycache__/config.cpython-36.pyc | Bin 9960 -> 0 bytes .../flask/__pycache__/ctx.cpython-36.pyc | Bin 13930 -> 0 bytes .../__pycache__/debughelpers.cpython-36.pyc | Bin 6569 -> 0 bytes .../flask/__pycache__/globals.cpython-36.pyc | Bin 1721 -> 0 bytes .../flask/__pycache__/helpers.cpython-36.pyc | Bin 33029 -> 0 bytes .../flask/__pycache__/logging.cpython-36.pyc | Bin 2350 -> 0 bytes .../flask/__pycache__/sessions.cpython-36.pyc | Bin 12197 -> 0 bytes .../flask/__pycache__/signals.cpython-36.pyc | Bin 2382 -> 0 bytes .../__pycache__/templating.cpython-36.pyc | Bin 4931 -> 0 bytes .../flask/__pycache__/testing.cpython-36.pyc | Bin 7834 -> 0 bytes .../flask/__pycache__/views.cpython-36.pyc | Bin 4739 -> 0 bytes .../flask/__pycache__/wrappers.cpython-36.pyc | Bin 6740 -> 0 bytes .../python3.6/site-packages/flask/_compat.py | 99 - .../lib/python3.6/site-packages/flask/app.py | 2315 ------- .../site-packages/flask/blueprints.py | 448 -- .../lib/python3.6/site-packages/flask/cli.py | 898 --- .../python3.6/site-packages/flask/config.py | 265 - .../lib/python3.6/site-packages/flask/ctx.py | 457 -- .../site-packages/flask/debughelpers.py | 168 - .../python3.6/site-packages/flask/globals.py | 61 - .../python3.6/site-packages/flask/helpers.py | 1044 --- .../site-packages/flask/json/__init__.py | 327 - .../json/__pycache__/__init__.cpython-36.pyc | Bin 10240 -> 0 bytes .../flask/json/__pycache__/tag.cpython-36.pyc | Bin 11042 -> 0 bytes .../python3.6/site-packages/flask/json/tag.py | 300 - .../python3.6/site-packages/flask/logging.py | 78 - .../python3.6/site-packages/flask/sessions.py | 385 -- .../python3.6/site-packages/flask/signals.py | 57 - .../site-packages/flask/templating.py | 150 - .../python3.6/site-packages/flask/testing.py | 250 - .../python3.6/site-packages/flask/views.py | 158 - .../python3.6/site-packages/flask/wrappers.py | 216 - .../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-36.pyc | Bin 974 -> 0 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 1136 -> 0 bytes .../__pycache__/_json.cpython-36.pyc | Bin 829 -> 0 bytes .../__pycache__/encoding.cpython-36.pyc | Bin 1601 -> 0 bytes .../__pycache__/exc.cpython-36.pyc | Bin 3190 -> 0 bytes .../__pycache__/jws.cpython-36.pyc | Bin 6649 -> 0 bytes .../__pycache__/serializer.cpython-36.pyc | Bin 8004 -> 0 bytes .../__pycache__/signer.cpython-36.pyc | Bin 5765 -> 0 bytes .../__pycache__/timed.cpython-36.pyc | Bin 4531 -> 0 bytes .../__pycache__/url_safe.cpython-36.pyc | Bin 2520 -> 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 | 83 - .../__pycache__/__init__.cpython-36.pyc | Bin 2498 -> 0 bytes .../jinja2/__pycache__/_compat.cpython-36.pyc | Bin 3308 -> 0 bytes .../__pycache__/_identifier.cpython-36.pyc | Bin 1811 -> 0 bytes .../__pycache__/asyncfilters.cpython-36.pyc | Bin 4763 -> 0 bytes .../__pycache__/asyncsupport.cpython-36.pyc | Bin 8112 -> 0 bytes .../jinja2/__pycache__/bccache.cpython-36.pyc | Bin 12684 -> 0 bytes .../__pycache__/compiler.cpython-36.pyc | Bin 46865 -> 0 bytes .../__pycache__/constants.cpython-36.pyc | Bin 1674 -> 0 bytes .../jinja2/__pycache__/debug.cpython-36.pyc | Bin 9307 -> 0 bytes .../__pycache__/defaults.cpython-36.pyc | Bin 1424 -> 0 bytes .../__pycache__/environment.cpython-36.pyc | Bin 43235 -> 0 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 4984 -> 0 bytes .../jinja2/__pycache__/ext.cpython-36.pyc | Bin 20075 -> 0 bytes .../jinja2/__pycache__/filters.cpython-36.pyc | Bin 34382 -> 0 bytes .../__pycache__/idtracking.cpython-36.pyc | Bin 9913 -> 0 bytes .../jinja2/__pycache__/lexer.cpython-36.pyc | Bin 18537 -> 0 bytes .../jinja2/__pycache__/loaders.cpython-36.pyc | Bin 16544 -> 0 bytes .../jinja2/__pycache__/meta.cpython-36.pyc | Bin 3635 -> 0 bytes .../__pycache__/nativetypes.cpython-36.pyc | Bin 5098 -> 0 bytes .../jinja2/__pycache__/nodes.cpython-36.pyc | Bin 36632 -> 0 bytes .../__pycache__/optimizer.cpython-36.pyc | Bin 2004 -> 0 bytes .../jinja2/__pycache__/parser.cpython-36.pyc | Bin 25309 -> 0 bytes .../jinja2/__pycache__/runtime.cpython-36.pyc | Bin 24574 -> 0 bytes .../jinja2/__pycache__/sandbox.cpython-36.pyc | Bin 13961 -> 0 bytes .../jinja2/__pycache__/tests.cpython-36.pyc | Bin 4380 -> 0 bytes .../jinja2/__pycache__/utils.cpython-36.pyc | Bin 20837 -> 0 bytes .../jinja2/__pycache__/visitor.cpython-36.pyc | Bin 3320 -> 0 bytes .../python3.6/site-packages/jinja2/_compat.py | 99 - .../site-packages/jinja2/_identifier.py | 2 - .../site-packages/jinja2/asyncfilters.py | 146 - .../site-packages/jinja2/asyncsupport.py | 256 - .../python3.6/site-packages/jinja2/bccache.py | 362 -- .../site-packages/jinja2/compiler.py | 1721 ----- .../site-packages/jinja2/constants.py | 32 - .../python3.6/site-packages/jinja2/debug.py | 372 -- .../site-packages/jinja2/defaults.py | 56 - .../site-packages/jinja2/environment.py | 1276 ---- .../site-packages/jinja2/exceptions.py | 146 - .../lib/python3.6/site-packages/jinja2/ext.py | 627 -- .../python3.6/site-packages/jinja2/filters.py | 1190 ---- .../site-packages/jinja2/idtracking.py | 286 - .../python3.6/site-packages/jinja2/lexer.py | 739 --- .../python3.6/site-packages/jinja2/loaders.py | 481 -- .../python3.6/site-packages/jinja2/meta.py | 106 - .../site-packages/jinja2/nativetypes.py | 220 - .../python3.6/site-packages/jinja2/nodes.py | 999 --- .../site-packages/jinja2/optimizer.py | 49 - .../python3.6/site-packages/jinja2/parser.py | 903 --- .../python3.6/site-packages/jinja2/runtime.py | 813 --- .../python3.6/site-packages/jinja2/sandbox.py | 475 -- .../python3.6/site-packages/jinja2/tests.py | 175 - .../python3.6/site-packages/jinja2/utils.py | 647 -- .../python3.6/site-packages/jinja2/visitor.py | 87 - .../site-packages/markupsafe/__init__.py | 327 - .../__pycache__/__init__.cpython-36.pyc | Bin 10976 -> 0 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 768 -> 0 bytes .../__pycache__/_constants.cpython-36.pyc | Bin 4268 -> 0 bytes .../__pycache__/_native.cpython-36.pyc | Bin 2120 -> 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 | 420 -- .../_speedups.cpython-36m-x86_64-linux-gnu.so | Bin 38555 -> 0 bytes .../pathtools-0.1.2.egg-info/PKG-INFO | 25 - .../pathtools-0.1.2.egg-info/SOURCES.txt | 20 - .../dependency_links.txt | 1 - .../installed-files.txt | 12 - .../pathtools-0.1.2.egg-info/top_level.txt | 1 - .../site-packages/pathtools/__init__.py | 21 - .../__pycache__/__init__.cpython-36.pyc | Bin 165 -> 0 bytes .../pathtools/__pycache__/path.cpython-36.pyc | Bin 5264 -> 0 bytes .../__pycache__/patterns.cpython-36.pyc | Bin 8190 -> 0 bytes .../__pycache__/version.cpython-36.pyc | Bin 318 -> 0 bytes .../python3.6/site-packages/pathtools/path.py | 207 - .../site-packages/pathtools/patterns.py | 265 - .../site-packages/pathtools/version.py | 31 - .../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.6/site-packages/pip/__init__.py | 1 - .../python3.6/site-packages/pip/__main__.py | 19 - .../pip/__pycache__/__init__.cpython-36.pyc | Bin 148 -> 0 bytes .../pip/__pycache__/__main__.cpython-36.pyc | Bin 402 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 78 - .../__pycache__/__init__.cpython-36.pyc | Bin 1794 -> 0 bytes .../__pycache__/build_env.cpython-36.pyc | Bin 5013 -> 0 bytes .../__pycache__/cache.cpython-36.pyc | Bin 6788 -> 0 bytes .../__pycache__/configuration.cpython-36.pyc | Bin 9797 -> 0 bytes .../__pycache__/download.cpython-36.pyc | Bin 20890 -> 0 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 11508 -> 0 bytes .../__pycache__/index.cpython-36.pyc | Bin 23160 -> 0 bytes .../__pycache__/locations.cpython-36.pyc | Bin 4186 -> 0 bytes .../__pycache__/pep425tags.cpython-36.pyc | Bin 7401 -> 0 bytes .../__pycache__/pyproject.cpython-36.pyc | Bin 2669 -> 0 bytes .../__pycache__/resolve.cpython-36.pyc | Bin 8440 -> 0 bytes .../__pycache__/wheel.cpython-36.pyc | Bin 20834 -> 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-36.pyc | Bin 225 -> 0 bytes .../__pycache__/autocompletion.cpython-36.pyc | Bin 5067 -> 0 bytes .../__pycache__/base_command.cpython-36.pyc | Bin 6255 -> 0 bytes .../cli/__pycache__/cmdoptions.cpython-36.pyc | Bin 14986 -> 0 bytes .../__pycache__/main_parser.cpython-36.pyc | Bin 2187 -> 0 bytes .../cli/__pycache__/parser.cpython-36.pyc | Bin 8909 -> 0 bytes .../__pycache__/status_codes.cpython-36.pyc | Bin 354 -> 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-36.pyc | Bin 2453 -> 0 bytes .../commands/__pycache__/check.cpython-36.pyc | Bin 1255 -> 0 bytes .../__pycache__/completion.cpython-36.pyc | Bin 3027 -> 0 bytes .../__pycache__/configuration.cpython-36.pyc | Bin 6397 -> 0 bytes .../__pycache__/download.cpython-36.pyc | Bin 4609 -> 0 bytes .../__pycache__/freeze.cpython-36.pyc | Bin 2815 -> 0 bytes .../commands/__pycache__/hash.cpython-36.pyc | Bin 2017 -> 0 bytes .../commands/__pycache__/help.cpython-36.pyc | Bin 1193 -> 0 bytes .../__pycache__/install.cpython-36.pyc | Bin 12193 -> 0 bytes .../commands/__pycache__/list.cpython-36.pyc | Bin 8876 -> 0 bytes .../__pycache__/search.cpython-36.pyc | Bin 4263 -> 0 bytes .../commands/__pycache__/show.cpython-36.pyc | Bin 5872 -> 0 bytes .../__pycache__/uninstall.cpython-36.pyc | Bin 2649 -> 0 bytes .../commands/__pycache__/wheel.cpython-36.pyc | Bin 4870 -> 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-36.pyc | Bin 213 -> 0 bytes .../__pycache__/candidate.cpython-36.pyc | Bin 1048 -> 0 bytes .../__pycache__/format_control.cpython-36.pyc | Bin 2383 -> 0 bytes .../models/__pycache__/index.cpython-36.pyc | Bin 1117 -> 0 bytes .../models/__pycache__/link.cpython-36.pyc | Bin 4715 -> 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-36.pyc | Bin 149 -> 0 bytes .../__pycache__/check.cpython-36.pyc | Bin 3321 -> 0 bytes .../__pycache__/freeze.cpython-36.pyc | Bin 6350 -> 0 bytes .../__pycache__/prepare.cpython-36.pyc | Bin 9153 -> 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-36.pyc | Bin 1507 -> 0 bytes .../__pycache__/constructors.cpython-36.pyc | Bin 6907 -> 0 bytes .../req/__pycache__/req_file.cpython-36.pyc | Bin 8633 -> 0 bytes .../__pycache__/req_install.cpython-36.pyc | Bin 22795 -> 0 bytes .../req/__pycache__/req_set.cpython-36.pyc | Bin 5740 -> 0 bytes .../__pycache__/req_tracker.cpython-36.pyc | Bin 2841 -> 0 bytes .../__pycache__/req_uninstall.cpython-36.pyc | Bin 12840 -> 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-36.pyc | Bin 144 -> 0 bytes .../utils/__pycache__/appdirs.cpython-36.pyc | Bin 7875 -> 0 bytes .../utils/__pycache__/compat.cpython-36.pyc | Bin 5964 -> 0 bytes .../__pycache__/deprecation.cpython-36.pyc | Bin 2518 -> 0 bytes .../utils/__pycache__/encoding.cpython-36.pyc | Bin 1080 -> 0 bytes .../__pycache__/filesystem.cpython-36.pyc | Bin 611 -> 0 bytes .../utils/__pycache__/glibc.cpython-36.pyc | Bin 1507 -> 0 bytes .../utils/__pycache__/hashes.cpython-36.pyc | Bin 3279 -> 0 bytes .../utils/__pycache__/logging.cpython-36.pyc | Bin 5326 -> 0 bytes .../utils/__pycache__/misc.cpython-36.pyc | Bin 24487 -> 0 bytes .../utils/__pycache__/models.cpython-36.pyc | Bin 1893 -> 0 bytes .../utils/__pycache__/outdated.cpython-36.pyc | Bin 3900 -> 0 bytes .../__pycache__/packaging.cpython-36.pyc | Bin 2342 -> 0 bytes .../setuptools_build.cpython-36.pyc | Bin 339 -> 0 bytes .../utils/__pycache__/temp_dir.cpython-36.pyc | Bin 2756 -> 0 bytes .../utils/__pycache__/typing.cpython-36.pyc | Bin 1288 -> 0 bytes .../utils/__pycache__/ui.cpython-36.pyc | Bin 11834 -> 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-36.pyc | Bin 15533 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-36.pyc | Bin 3822 -> 0 bytes .../vcs/__pycache__/git.cpython-36.pyc | Bin 9113 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-36.pyc | Bin 3766 -> 0 bytes .../vcs/__pycache__/subversion.cpython-36.pyc | Bin 6372 -> 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-36.pyc | Bin 2870 -> 0 bytes .../pip/_vendor/pep517/__init__.py | 4 - .../__pycache__/__init__.cpython-36.pyc | Bin 233 -> 0 bytes .../__pycache__/_in_process.cpython-36.pyc | Bin 5298 -> 0 bytes .../pep517/__pycache__/check.cpython-36.pyc | Bin 4697 -> 0 bytes .../__pycache__/colorlog.cpython-36.pyc | Bin 2877 -> 0 bytes .../pep517/__pycache__/compat.cpython-36.pyc | Bin 971 -> 0 bytes .../__pycache__/envbuild.cpython-36.pyc | Bin 4128 -> 0 bytes .../__pycache__/wrappers.cpython-36.pyc | Bin 4695 -> 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 | 3171 --------- .../__pycache__/__init__.cpython-36.pyc | Bin 96851 -> 0 bytes .../__pycache__/py31compat.cpython-36.pyc | Bin 605 -> 0 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 156 -> 0 bytes .../__pycache__/appdirs.cpython-36.pyc | Bin 20694 -> 0 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 203165 -> 0 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 24453 -> 0 bytes .../pkg_resources/_vendor/appdirs.py | 608 -- .../_vendor/packaging/__about__.py | 21 - .../_vendor/packaging/__init__.py | 14 - .../__pycache__/__about__.cpython-36.pyc | Bin 692 -> 0 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 530 -> 0 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 977 -> 0 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 2834 -> 0 bytes .../__pycache__/markers.cpython-36.pyc | Bin 8857 -> 0 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 3853 -> 0 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 19796 -> 0 bytes .../__pycache__/utils.cpython-36.pyc | Bin 461 -> 0 bytes .../__pycache__/version.cpython-36.pyc | Bin 10571 -> 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-36.pyc | Bin 2391 -> 0 bytes .../site-packages/pkg_resources/py31compat.py | 23 - .../DESCRIPTION.rst | 480 -- .../python_dotenv-0.10.1.dist-info/INSTALLER | 1 - .../python_dotenv-0.10.1.dist-info/METADATA | 514 -- .../python_dotenv-0.10.1.dist-info/RECORD | 23 - .../python_dotenv-0.10.1.dist-info/WHEEL | 6 - .../entry_points.txt | 4 - .../metadata.json | 1 - .../top_level.txt | 1 - .../setuptools-40.6.2.dist-info/AUTHORS.txt | 421 -- .../setuptools-40.6.2.dist-info/INSTALLER | 1 - .../setuptools-40.6.2.dist-info/LICENSE.txt | 20 - .../setuptools-40.6.2.dist-info/METADATA | 69 - .../setuptools-40.6.2.dist-info/RECORD | 157 - .../setuptools-40.6.2.dist-info/WHEEL | 6 - .../dependency_links.txt | 2 - .../entry_points.txt | 64 - .../setuptools-40.6.2.dist-info/top_level.txt | 3 - .../setuptools-40.6.2.dist-info/zip-safe | 1 - .../site-packages/setuptools/__init__.py | 195 - .../__pycache__/__init__.cpython-36.pyc | Bin 6480 -> 0 bytes .../_deprecation_warning.cpython-36.pyc | Bin 508 -> 0 bytes .../__pycache__/archive_util.cpython-36.pyc | Bin 5096 -> 0 bytes .../__pycache__/build_meta.cpython-36.pyc | Bin 6227 -> 0 bytes .../__pycache__/config.cpython-36.pyc | Bin 17075 -> 0 bytes .../__pycache__/dep_util.cpython-36.pyc | Bin 815 -> 0 bytes .../__pycache__/depends.cpython-36.pyc | Bin 5241 -> 0 bytes .../__pycache__/dist.cpython-36.pyc | Bin 38497 -> 0 bytes .../__pycache__/extension.cpython-36.pyc | Bin 1935 -> 0 bytes .../__pycache__/glibc.cpython-36.pyc | Bin 1505 -> 0 bytes .../__pycache__/glob.cpython-36.pyc | Bin 3712 -> 0 bytes .../__pycache__/launch.cpython-36.pyc | Bin 814 -> 0 bytes .../__pycache__/lib2to3_ex.cpython-36.pyc | Bin 2393 -> 0 bytes .../__pycache__/monkey.cpython-36.pyc | Bin 4661 -> 0 bytes .../__pycache__/msvc.cpython-36.pyc | Bin 34488 -> 0 bytes .../__pycache__/namespaces.cpython-36.pyc | Bin 3638 -> 0 bytes .../__pycache__/package_index.cpython-36.pyc | Bin 32559 -> 0 bytes .../__pycache__/pep425tags.cpython-36.pyc | Bin 7304 -> 0 bytes .../__pycache__/py27compat.cpython-36.pyc | Bin 771 -> 0 bytes .../__pycache__/py31compat.cpython-36.pyc | Bin 1157 -> 0 bytes .../__pycache__/py33compat.cpython-36.pyc | Bin 1380 -> 0 bytes .../__pycache__/py36compat.cpython-36.pyc | Bin 2167 -> 0 bytes .../__pycache__/sandbox.cpython-36.pyc | Bin 15683 -> 0 bytes .../__pycache__/site-patch.cpython-36.pyc | Bin 1466 -> 0 bytes .../__pycache__/ssl_support.cpython-36.pyc | Bin 6746 -> 0 bytes .../__pycache__/unicode_utils.cpython-36.pyc | Bin 1129 -> 0 bytes .../__pycache__/version.cpython-36.pyc | Bin 288 -> 0 bytes .../__pycache__/wheel.cpython-36.pyc | Bin 7000 -> 0 bytes .../windows_support.cpython-36.pyc | Bin 971 -> 0 bytes .../setuptools/_deprecation_warning.py | 7 - .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 150 -> 0 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 203159 -> 0 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 24447 -> 0 bytes .../setuptools/_vendor/packaging/__about__.py | 21 - .../setuptools/_vendor/packaging/__init__.py | 14 - .../__pycache__/__about__.cpython-36.pyc | Bin 686 -> 0 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 524 -> 0 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 971 -> 0 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 2828 -> 0 bytes .../__pycache__/markers.cpython-36.pyc | Bin 8848 -> 0 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 3841 -> 0 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 19790 -> 0 bytes .../__pycache__/utils.cpython-36.pyc | Bin 455 -> 0 bytes .../__pycache__/version.cpython-36.pyc | Bin 10565 -> 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 | 182 - .../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-36.pyc | Bin 701 -> 0 bytes .../command/__pycache__/alias.cpython-36.pyc | Bin 2394 -> 0 bytes .../__pycache__/bdist_egg.cpython-36.pyc | Bin 14369 -> 0 bytes .../__pycache__/bdist_rpm.cpython-36.pyc | Bin 1737 -> 0 bytes .../__pycache__/bdist_wininst.cpython-36.pyc | Bin 938 -> 0 bytes .../__pycache__/build_clib.cpython-36.pyc | Bin 2409 -> 0 bytes .../__pycache__/build_ext.cpython-36.pyc | Bin 9682 -> 0 bytes .../__pycache__/build_py.cpython-36.pyc | Bin 8533 -> 0 bytes .../__pycache__/develop.cpython-36.pyc | Bin 6404 -> 0 bytes .../__pycache__/dist_info.cpython-36.pyc | Bin 1354 -> 0 bytes .../__pycache__/easy_install.cpython-36.pyc | Bin 66509 -> 0 bytes .../__pycache__/egg_info.cpython-36.pyc | Bin 21538 -> 0 bytes .../__pycache__/install.cpython-36.pyc | Bin 3934 -> 0 bytes .../install_egg_info.cpython-36.pyc | Bin 2918 -> 0 bytes .../__pycache__/install_lib.cpython-36.pyc | Bin 5052 -> 0 bytes .../install_scripts.cpython-36.pyc | Bin 2239 -> 0 bytes .../__pycache__/py36compat.cpython-36.pyc | Bin 4584 -> 0 bytes .../__pycache__/register.cpython-36.pyc | Bin 735 -> 0 bytes .../command/__pycache__/rotate.cpython-36.pyc | Bin 2540 -> 0 bytes .../__pycache__/saveopts.cpython-36.pyc | Bin 885 -> 0 bytes .../command/__pycache__/sdist.cpython-36.pyc | Bin 6349 -> 0 bytes .../command/__pycache__/setopt.cpython-36.pyc | Bin 4563 -> 0 bytes .../command/__pycache__/test.cpython-36.pyc | Bin 8142 -> 0 bytes .../command/__pycache__/upload.cpython-36.pyc | Bin 5113 -> 0 bytes .../__pycache__/upload_docs.cpython-36.pyc | Bin 6061 -> 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 | 218 - .../setuptools/command/dist_info.py | 36 - .../setuptools/command/easy_install.py | 2397 ------- .../setuptools/command/egg_info.py | 716 -- .../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 | 200 - .../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 | 635 -- .../site-packages/setuptools/dep_util.py | 23 - .../site-packages/setuptools/depends.py | 186 - .../site-packages/setuptools/dist.py | 1147 ---- .../site-packages/setuptools/extension.py | 57 - .../setuptools/extern/__init__.py | 73 - .../__pycache__/__init__.cpython-36.pyc | Bin 2384 -> 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 | 1128 ---- .../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/py36compat.py | 82 - .../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 | 44 - .../site-packages/setuptools/version.py | 6 - .../site-packages/setuptools/wheel.py | 210 - .../setuptools/windows_support.py | 29 - .../simplejson-3.16.0.egg-info/PKG-INFO | 63 - .../simplejson-3.16.0.egg-info/SOURCES.txt | 56 - .../dependency_links.txt | 1 - .../installed-files.txt | 85 - .../simplejson-3.16.0.egg-info/top_level.txt | 1 - .../site-packages/simplejson/__init__.py | 577 -- .../__pycache__/__init__.cpython-36.pyc | Bin 20429 -> 0 bytes .../__pycache__/compat.cpython-36.pyc | Bin 958 -> 0 bytes .../__pycache__/decoder.cpython-36.pyc | Bin 10532 -> 0 bytes .../__pycache__/encoder.cpython-36.pyc | Bin 18700 -> 0 bytes .../__pycache__/errors.cpython-36.pyc | Bin 2001 -> 0 bytes .../__pycache__/ordered_dict.cpython-36.pyc | Bin 3842 -> 0 bytes .../__pycache__/raw_json.cpython-36.pyc | Bin 582 -> 0 bytes .../__pycache__/scanner.cpython-36.pyc | Bin 2320 -> 0 bytes .../__pycache__/tool.cpython-36.pyc | Bin 1199 -> 0 bytes .../_speedups.cpython-36m-x86_64-linux-gnu.so | Bin 192776 -> 0 bytes .../site-packages/simplejson/compat.py | 34 - .../site-packages/simplejson/decoder.py | 400 -- .../site-packages/simplejson/encoder.py | 722 --- .../site-packages/simplejson/errors.py | 53 - .../site-packages/simplejson/ordered_dict.py | 103 - .../site-packages/simplejson/raw_json.py | 9 - .../site-packages/simplejson/scanner.py | 85 - .../simplejson/tests/__init__.py | 74 - .../tests/__pycache__/__init__.cpython-36.pyc | Bin 2732 -> 0 bytes .../test_bigint_as_string.cpython-36.pyc | Bin 2099 -> 0 bytes .../test_bitsize_int_as_string.cpython-36.pyc | Bin 2496 -> 0 bytes .../test_check_circular.cpython-36.pyc | Bin 1687 -> 0 bytes .../__pycache__/test_decimal.cpython-36.pyc | Bin 2709 -> 0 bytes .../__pycache__/test_decode.cpython-36.pyc | Bin 5576 -> 0 bytes .../__pycache__/test_default.cpython-36.pyc | Bin 607 -> 0 bytes .../__pycache__/test_dump.cpython-36.pyc | Bin 8762 -> 0 bytes ...est_encode_basestring_ascii.cpython-36.pyc | Bin 2504 -> 0 bytes .../test_encode_for_html.cpython-36.pyc | Bin 1895 -> 0 bytes .../__pycache__/test_errors.cpython-36.pyc | Bin 2510 -> 0 bytes .../__pycache__/test_fail.cpython-36.pyc | Bin 4071 -> 0 bytes .../__pycache__/test_float.cpython-36.pyc | Bin 2001 -> 0 bytes .../__pycache__/test_for_json.cpython-36.pyc | Bin 4696 -> 0 bytes .../__pycache__/test_indent.cpython-36.pyc | Bin 2337 -> 0 bytes .../test_item_sort_key.cpython-36.pyc | Bin 2112 -> 0 bytes .../__pycache__/test_iterable.cpython-36.pyc | Bin 1384 -> 0 bytes .../test_namedtuple.cpython-36.pyc | Bin 5125 -> 0 bytes .../__pycache__/test_pass1.cpython-36.pyc | Bin 2032 -> 0 bytes .../__pycache__/test_pass2.cpython-36.pyc | Bin 670 -> 0 bytes .../__pycache__/test_pass3.cpython-36.pyc | Bin 765 -> 0 bytes .../__pycache__/test_raw_json.cpython-36.pyc | Bin 1418 -> 0 bytes .../__pycache__/test_recursion.cpython-36.pyc | Bin 2042 -> 0 bytes .../test_scanstring.cpython-36.pyc | Bin 5173 -> 0 bytes .../test_separators.cpython-36.pyc | Bin 1272 -> 0 bytes .../__pycache__/test_speedups.cpython-36.pyc | Bin 4848 -> 0 bytes .../test_str_subclass.cpython-36.pyc | Bin 1091 -> 0 bytes .../__pycache__/test_subclass.cpython-36.pyc | Bin 1529 -> 0 bytes .../__pycache__/test_tool.cpython-36.pyc | Bin 3115 -> 0 bytes .../__pycache__/test_tuple.cpython-36.pyc | Bin 1459 -> 0 bytes .../__pycache__/test_unicode.cpython-36.pyc | Bin 6713 -> 0 bytes .../simplejson/tests/test_bigint_as_string.py | 67 - .../tests/test_bitsize_int_as_string.py | 73 - .../simplejson/tests/test_check_circular.py | 30 - .../simplejson/tests/test_decimal.py | 71 - .../simplejson/tests/test_decode.py | 119 - .../simplejson/tests/test_default.py | 9 - .../simplejson/tests/test_dump.py | 249 - .../tests/test_encode_basestring_ascii.py | 47 - .../simplejson/tests/test_encode_for_html.py | 38 - .../simplejson/tests/test_errors.py | 68 - .../simplejson/tests/test_fail.py | 176 - .../simplejson/tests/test_float.py | 35 - .../simplejson/tests/test_for_json.py | 97 - .../simplejson/tests/test_indent.py | 86 - .../simplejson/tests/test_item_sort_key.py | 27 - .../simplejson/tests/test_iterable.py | 31 - .../simplejson/tests/test_namedtuple.py | 122 - .../simplejson/tests/test_pass1.py | 71 - .../simplejson/tests/test_pass2.py | 14 - .../simplejson/tests/test_pass3.py | 20 - .../simplejson/tests/test_raw_json.py | 47 - .../simplejson/tests/test_recursion.py | 67 - .../simplejson/tests/test_scanstring.py | 196 - .../simplejson/tests/test_separators.py | 42 - .../simplejson/tests/test_speedups.py | 114 - .../simplejson/tests/test_str_subclass.py | 21 - .../simplejson/tests/test_subclass.py | 37 - .../simplejson/tests/test_tool.py | 114 - .../simplejson/tests/test_tuple.py | 47 - .../simplejson/tests/test_unicode.py | 154 - .../site-packages/simplejson/tool.py | 42 - .../watchdog-0.9.0.egg-info/PKG-INFO | 334 - .../watchdog-0.9.0.egg-info/SOURCES.txt | 75 - .../dependency_links.txt | 1 - .../watchdog-0.9.0.egg-info/entry_points.txt | 3 - .../installed-files.txt | 64 - .../watchdog-0.9.0.egg-info/not-zip-safe | 1 - .../watchdog-0.9.0.egg-info/requires.txt | 3 - .../watchdog-0.9.0.egg-info/top_level.txt | 1 - .../site-packages/watchdog/__init__.py | 17 - .../__pycache__/__init__.cpython-36.pyc | Bin 164 -> 0 bytes .../__pycache__/events.cpython-36.pyc | Bin 20433 -> 0 bytes .../__pycache__/version.cpython-36.pyc | Bin 312 -> 0 bytes .../__pycache__/watchmedo.cpython-36.pyc | Bin 12749 -> 0 bytes .../site-packages/watchdog/events.py | 615 -- .../watchdog/observers/__init__.py | 94 - .../__pycache__/__init__.cpython-36.pyc | Bin 2621 -> 0 bytes .../observers/__pycache__/api.cpython-36.pyc | Bin 12517 -> 0 bytes .../__pycache__/fsevents.cpython-36.pyc | Bin 3835 -> 0 bytes .../__pycache__/fsevents2.cpython-36.pyc | Bin 6968 -> 0 bytes .../__pycache__/inotify.cpython-36.pyc | Bin 6867 -> 0 bytes .../__pycache__/inotify_buffer.cpython-36.pyc | Bin 2550 -> 0 bytes .../__pycache__/inotify_c.cpython-36.pyc | Bin 15238 -> 0 bytes .../__pycache__/kqueue.cpython-36.pyc | Bin 20303 -> 0 bytes .../__pycache__/polling.cpython-36.pyc | Bin 4160 -> 0 bytes .../read_directory_changes.cpython-36.pyc | Bin 3111 -> 0 bytes .../__pycache__/winapi.cpython-36.pyc | Bin 6828 -> 0 bytes .../site-packages/watchdog/observers/api.py | 369 -- .../watchdog/observers/fsevents.py | 172 - .../watchdog/observers/fsevents2.py | 239 - .../watchdog/observers/inotify.py | 218 - .../watchdog/observers/inotify_buffer.py | 81 - .../watchdog/observers/inotify_c.py | 575 -- .../watchdog/observers/kqueue.py | 726 --- .../watchdog/observers/polling.py | 145 - .../observers/read_directory_changes.py | 133 - .../watchdog/observers/winapi.py | 348 - .../site-packages/watchdog/tricks/__init__.py | 174 - .../__pycache__/__init__.cpython-36.pyc | Bin 4729 -> 0 bytes .../site-packages/watchdog/utils/__init__.py | 157 - .../utils/__pycache__/__init__.cpython-36.pyc | Bin 4426 -> 0 bytes .../utils/__pycache__/bricks.cpython-36.pyc | Bin 7531 -> 0 bytes .../utils/__pycache__/compat.cpython-36.pyc | Bin 423 -> 0 bytes .../__pycache__/decorators.cpython-36.pyc | Bin 5494 -> 0 bytes .../__pycache__/delayed_queue.cpython-36.pyc | Bin 2082 -> 0 bytes .../__pycache__/dirsnapshot.cpython-36.pyc | Bin 9136 -> 0 bytes .../utils/__pycache__/echo.cpython-36.pyc | Bin 4846 -> 0 bytes .../__pycache__/event_backport.cpython-36.pyc | Bin 1237 -> 0 bytes .../__pycache__/importlib2.cpython-36.pyc | Bin 687 -> 0 bytes .../utils/__pycache__/platform.cpython-36.pyc | Bin 1114 -> 0 bytes .../__pycache__/unicode_paths.cpython-36.pyc | Bin 924 -> 0 bytes .../__pycache__/win32stat.cpython-36.pyc | Bin 2641 -> 0 bytes .../site-packages/watchdog/utils/bricks.py | 249 - .../site-packages/watchdog/utils/compat.py | 29 - .../watchdog/utils/decorators.py | 198 - .../watchdog/utils/delayed_queue.py | 88 - .../watchdog/utils/dirsnapshot.py | 293 - .../site-packages/watchdog/utils/echo.py | 157 - .../watchdog/utils/event_backport.py | 41 - .../watchdog/utils/importlib2.py | 40 - .../site-packages/watchdog/utils/platform.py | 57 - .../watchdog/utils/unicode_paths.py | 64 - .../site-packages/watchdog/utils/win32stat.py | 123 - .../site-packages/watchdog/version.py | 28 - .../site-packages/watchdog/watchmedo.py | 577 -- .../site-packages/werkzeug/__init__.py | 151 - .../__pycache__/__init__.cpython-36.pyc | Bin 4698 -> 0 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 7101 -> 0 bytes .../__pycache__/_internal.cpython-36.pyc | Bin 12587 -> 0 bytes .../__pycache__/_reloader.cpython-36.pyc | Bin 8851 -> 0 bytes .../__pycache__/datastructures.cpython-36.pyc | Bin 100038 -> 0 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 22932 -> 0 bytes .../__pycache__/filesystem.cpython-36.pyc | Bin 2209 -> 0 bytes .../__pycache__/formparser.cpython-36.pyc | Bin 16155 -> 0 bytes .../werkzeug/__pycache__/http.cpython-36.pyc | Bin 33461 -> 0 bytes .../werkzeug/__pycache__/local.cpython-36.pyc | Bin 18678 -> 0 bytes .../__pycache__/posixemulation.cpython-36.pyc | Bin 2770 -> 0 bytes .../__pycache__/routing.cpython-36.pyc | Bin 60152 -> 0 bytes .../__pycache__/script.cpython-36.pyc | Bin 10068 -> 0 bytes .../__pycache__/security.cpython-36.pyc | Bin 8520 -> 0 bytes .../__pycache__/serving.cpython-36.pyc | Bin 26504 -> 0 bytes .../werkzeug/__pycache__/test.cpython-36.pyc | Bin 31038 -> 0 bytes .../__pycache__/testapp.cpython-36.pyc | Bin 9427 -> 0 bytes .../werkzeug/__pycache__/urls.cpython-36.pyc | Bin 33312 -> 0 bytes .../__pycache__/useragents.cpython-36.pyc | Bin 6044 -> 0 bytes .../werkzeug/__pycache__/utils.cpython-36.pyc | Bin 21165 -> 0 bytes .../__pycache__/websocket.cpython-36.pyc | Bin 8207 -> 0 bytes .../__pycache__/wrappers.cpython-36.pyc | Bin 76412 -> 0 bytes .../werkzeug/__pycache__/wsgi.cpython-36.pyc | Bin 44667 -> 0 bytes .../site-packages/werkzeug/_compat.py | 206 - .../site-packages/werkzeug/_internal.py | 419 -- .../site-packages/werkzeug/_reloader.py | 277 - .../werkzeug/contrib/__init__.py | 16 - .../__pycache__/__init__.cpython-36.pyc | Bin 753 -> 0 bytes .../contrib/__pycache__/atom.cpython-36.pyc | Bin 14065 -> 0 bytes .../contrib/__pycache__/cache.cpython-36.pyc | Bin 32378 -> 0 bytes .../contrib/__pycache__/fixers.cpython-36.pyc | Bin 10070 -> 0 bytes .../contrib/__pycache__/iterio.cpython-36.pyc | Bin 10952 -> 0 bytes .../__pycache__/jsrouting.cpython-36.pyc | Bin 8261 -> 0 bytes .../__pycache__/limiter.cpython-36.pyc | Bin 1724 -> 0 bytes .../contrib/__pycache__/lint.cpython-36.pyc | Bin 11888 -> 0 bytes .../__pycache__/profiler.cpython-36.pyc | Bin 5250 -> 0 bytes .../__pycache__/securecookie.cpython-36.pyc | Bin 10302 -> 0 bytes .../__pycache__/sessions.cpython-36.pyc | Bin 12890 -> 0 bytes .../__pycache__/testtools.cpython-36.pyc | Bin 2636 -> 0 bytes .../__pycache__/wrappers.cpython-36.pyc | Bin 10381 -> 0 bytes .../site-packages/werkzeug/contrib/atom.py | 355 - .../site-packages/werkzeug/contrib/cache.py | 913 --- .../site-packages/werkzeug/contrib/fixers.py | 254 - .../site-packages/werkzeug/contrib/iterio.py | 352 - .../werkzeug/contrib/jsrouting.py | 264 - .../site-packages/werkzeug/contrib/limiter.py | 41 - .../site-packages/werkzeug/contrib/lint.py | 343 - .../werkzeug/contrib/profiler.py | 147 - .../werkzeug/contrib/securecookie.py | 323 - .../werkzeug/contrib/sessions.py | 352 - .../werkzeug/contrib/testtools.py | 73 - .../werkzeug/contrib/wrappers.py | 284 - .../site-packages/werkzeug/datastructures.py | 2762 -------- .../site-packages/werkzeug/debug/__init__.py | 470 -- .../debug/__pycache__/__init__.cpython-36.pyc | Bin 12713 -> 0 bytes .../debug/__pycache__/console.cpython-36.pyc | Bin 7327 -> 0 bytes .../debug/__pycache__/repr.cpython-36.pyc | Bin 8631 -> 0 bytes .../debug/__pycache__/tbtools.cpython-36.pyc | Bin 15649 -> 0 bytes .../site-packages/werkzeug/debug/console.py | 215 - .../site-packages/werkzeug/debug/repr.py | 280 - .../werkzeug/debug/shared/FONT_LICENSE | 96 - .../werkzeug/debug/shared/console.png | Bin 507 -> 0 bytes .../werkzeug/debug/shared/debugger.js | 205 - .../werkzeug/debug/shared/jquery.js | 5 - .../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 | 143 - .../werkzeug/debug/shared/ubuntu.ttf | Bin 70220 -> 0 bytes .../site-packages/werkzeug/debug/tbtools.py | 556 -- .../site-packages/werkzeug/exceptions.py | 719 --- .../site-packages/werkzeug/filesystem.py | 66 - .../site-packages/werkzeug/formparser.py | 534 -- .../python3.6/site-packages/werkzeug/http.py | 1158 ---- .../python3.6/site-packages/werkzeug/local.py | 420 -- .../site-packages/werkzeug/posixemulation.py | 106 - .../site-packages/werkzeug/routing.py | 1792 ----- .../site-packages/werkzeug/script.py | 318 - .../site-packages/werkzeug/security.py | 270 - .../site-packages/werkzeug/serving.py | 862 --- .../python3.6/site-packages/werkzeug/test.py | 948 --- .../site-packages/werkzeug/testapp.py | 230 - .../python3.6/site-packages/werkzeug/urls.py | 1007 --- .../site-packages/werkzeug/useragents.py | 212 - .../python3.6/site-packages/werkzeug/utils.py | 628 -- .../site-packages/werkzeug/websocket.py | 337 - .../site-packages/werkzeug/wrappers.py | 2028 ------ .../python3.6/site-packages/werkzeug/wsgi.py | 1364 ---- .../python3.6/site-packages/yaml/__init__.py | 312 - .../yaml/__pycache__/__init__.cpython-36.pyc | Bin 9184 -> 0 bytes .../yaml/__pycache__/composer.cpython-36.pyc | Bin 3519 -> 0 bytes .../__pycache__/constructor.cpython-36.pyc | Bin 18821 -> 0 bytes .../yaml/__pycache__/cyaml.cpython-36.pyc | Bin 2975 -> 0 bytes .../yaml/__pycache__/dumper.cpython-36.pyc | Bin 2010 -> 0 bytes .../yaml/__pycache__/emitter.cpython-36.pyc | Bin 25365 -> 0 bytes .../yaml/__pycache__/error.cpython-36.pyc | Bin 2272 -> 0 bytes .../yaml/__pycache__/events.cpython-36.pyc | Bin 4058 -> 0 bytes .../yaml/__pycache__/loader.cpython-36.pyc | Bin 1519 -> 0 bytes .../yaml/__pycache__/nodes.cpython-36.pyc | Bin 1716 -> 0 bytes .../yaml/__pycache__/parser.cpython-36.pyc | Bin 11892 -> 0 bytes .../yaml/__pycache__/reader.cpython-36.pyc | Bin 4472 -> 0 bytes .../__pycache__/representer.cpython-36.pyc | Bin 10099 -> 0 bytes .../yaml/__pycache__/resolver.cpython-36.pyc | Bin 5463 -> 0 bytes .../yaml/__pycache__/scanner.cpython-36.pyc | Bin 26068 -> 0 bytes .../__pycache__/serializer.cpython-36.pyc | Bin 3352 -> 0 bytes .../yaml/__pycache__/tokens.cpython-36.pyc | Bin 5215 -> 0 bytes .../python3.6/site-packages/yaml/composer.py | 139 - .../site-packages/yaml/constructor.py | 686 -- .../lib/python3.6/site-packages/yaml/cyaml.py | 85 - .../python3.6/site-packages/yaml/dumper.py | 62 - .../python3.6/site-packages/yaml/emitter.py | 1137 ---- .../lib/python3.6/site-packages/yaml/error.py | 75 - .../python3.6/site-packages/yaml/events.py | 86 - .../python3.6/site-packages/yaml/loader.py | 40 - .../lib/python3.6/site-packages/yaml/nodes.py | 49 - .../python3.6/site-packages/yaml/parser.py | 589 -- .../python3.6/site-packages/yaml/reader.py | 192 - .../site-packages/yaml/representer.py | 387 -- .../python3.6/site-packages/yaml/resolver.py | 227 - .../python3.6/site-packages/yaml/scanner.py | 1444 ----- .../site-packages/yaml/serializer.py | 111 - .../python3.6/site-packages/yaml/tokens.py | 104 - flask/venv/lib64 | 1 - flask/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 139246 -> 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-18.0-py2.py3-none-any.whl | Bin 28976 -> 0 bytes .../pip-18.1-py2.py3-none-any.whl | Bin 198467 -> 0 bytes .../pkg_resources-0.0.0-py2.py3-none-any.whl | Bin 124163 -> 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.20.0-py2.py3-none-any.whl | Bin 65192 -> 0 bytes .../retrying-1.3.3-py2.py3-none-any.whl | Bin 14137 -> 0 bytes .../setuptools-40.6.2-py2.py3-none-any.whl | Bin 466281 -> 0 bytes .../six-1.12.0-py2.py3-none-any.whl | Bin 17683 -> 0 bytes .../urllib3-1.24-py2.py3-none-any.whl | Bin 117354 -> 0 bytes .../webencodings-0.5-py2.py3-none-any.whl | Bin 18159 -> 0 bytes .../wheel-0.32.3-py2.py3-none-any.whl | Bin 28504 -> 0 bytes 961 files changed, 129021 deletions(-) delete mode 100644 flask/__pycache__/helloworld.cpython-36.pyc delete mode 100644 flask/helloworld.py delete mode 100644 flask/install-dependensies.sh delete mode 100644 flask/venv/bin/activate delete mode 100644 flask/venv/bin/activate.csh delete mode 100644 flask/venv/bin/activate.fish delete mode 100755 flask/venv/bin/dotenv delete mode 100755 flask/venv/bin/easy_install delete mode 100755 flask/venv/bin/easy_install-3.6 delete mode 100755 flask/venv/bin/flask delete mode 100755 flask/venv/bin/pip delete mode 100755 flask/venv/bin/pip3 delete mode 100755 flask/venv/bin/pip3.6 delete mode 120000 flask/venv/bin/python delete mode 120000 flask/venv/bin/python3 delete mode 100755 flask/venv/bin/watchmedo delete mode 100644 flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/INSTALLER delete mode 100644 flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/LICENSE.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/METADATA delete mode 100644 flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/RECORD delete mode 100644 flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/WHEEL delete mode 100644 flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/INSTALLER delete mode 100644 flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/LICENSE.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/METADATA delete mode 100644 flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/RECORD delete mode 100644 flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/WHEEL delete mode 100644 flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/entry_points.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst delete mode 100644 flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/INSTALLER delete mode 100644 flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/LICENSE.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/METADATA delete mode 100644 flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/RECORD delete mode 100644 flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/WHEEL delete mode 100644 flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/entry_points.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/metadata.json delete mode 100644 flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/INSTALLER delete mode 100644 flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/LICENSE.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/METADATA delete mode 100644 flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/RECORD delete mode 100644 flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/WHEEL delete mode 100644 flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/PKG-INFO delete mode 100644 flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/SOURCES.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/dependency_links.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/installed-files.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst delete mode 100644 flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER delete mode 100644 flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/METADATA delete mode 100644 flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/RECORD delete mode 100644 flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/WHEEL delete mode 100644 flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/metadata.json delete mode 100644 flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/DESCRIPTION.rst delete mode 100644 flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/INSTALLER delete mode 100644 flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/METADATA delete mode 100644 flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/RECORD delete mode 100644 flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/WHEEL delete mode 100644 flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/metadata.json delete mode 100644 flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__pycache__/assembling.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__pycache__/compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__pycache__/completion.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__pycache__/constants.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__pycache__/decorators.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__pycache__/dispatching.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__pycache__/exceptions.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__pycache__/helpers.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__pycache__/interaction.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__pycache__/io.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/__pycache__/utils.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/assembling.py delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/completion.py delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/constants.py delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/decorators.py delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/dispatching.py delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/exceptions.py delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/helpers.py delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/interaction.py delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/io.py delete mode 100644 flask/venv/lib/python3.6/site-packages/argh/utils.py delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/PKG-INFO delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/SOURCES.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/dependency_links.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/installed-files.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker/__pycache__/_saferef.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker/__pycache__/_utilities.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker/__pycache__/base.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker/_saferef.py delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker/_utilities.py delete mode 100644 flask/venv/lib/python3.6/site-packages/blinker/base.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/_bashcomplete.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/_compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/_termui_impl.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/_textwrap.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/_unicodefun.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/_winconsole.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/core.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/decorators.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/exceptions.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/formatting.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/globals.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/parser.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/termui.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/testing.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/types.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/__pycache__/utils.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/click/_bashcomplete.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/_compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/_termui_impl.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/_textwrap.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/_unicodefun.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/_winconsole.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/core.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/decorators.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/exceptions.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/formatting.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/globals.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/parser.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/termui.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/testing.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/types.py delete mode 100644 flask/venv/lib/python3.6/site-packages/click/utils.py delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/cli.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/environ.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/ipython.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/main.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/version.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/cli.py delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/environ.py delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/ipython.py delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/main.py delete mode 100644 flask/venv/lib/python3.6/site-packages/dotenv/version.py delete mode 100644 flask/venv/lib/python3.6/site-packages/easy_install.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__main__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/__main__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/_compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/app.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/blueprints.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/cli.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/config.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/ctx.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/debughelpers.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/globals.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/helpers.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/logging.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/sessions.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/signals.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/templating.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/testing.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/views.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/__pycache__/wrappers.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/_compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/app.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/blueprints.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/cli.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/config.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/ctx.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/debughelpers.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/globals.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/helpers.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/json/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/json/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/json/__pycache__/tag.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/json/tag.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/logging.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/sessions.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/signals.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/templating.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/testing.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/views.py delete mode 100644 flask/venv/lib/python3.6/site-packages/flask/wrappers.py delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous-1.1.0.dist-info/INSTALLER delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous-1.1.0.dist-info/LICENSE.rst delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous-1.1.0.dist-info/METADATA delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous-1.1.0.dist-info/RECORD delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous-1.1.0.dist-info/WHEEL delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous-1.1.0.dist-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/__pycache__/_compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/__pycache__/_json.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/__pycache__/encoding.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/__pycache__/exc.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/__pycache__/jws.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/__pycache__/serializer.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/__pycache__/signer.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/__pycache__/timed.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/__pycache__/url_safe.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/_compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/_json.py delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/encoding.py delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/exc.py delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/jws.py delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/serializer.py delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/signer.py delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/timed.py delete mode 100644 flask/venv/lib/python3.6/site-packages/itsdangerous/url_safe.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/_compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/_identifier.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/asyncfilters.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/asyncsupport.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/bccache.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/compiler.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/constants.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/debug.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/defaults.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/environment.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/exceptions.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/ext.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/filters.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/idtracking.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/lexer.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/loaders.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/meta.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/nativetypes.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/nodes.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/optimizer.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/parser.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/runtime.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/sandbox.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/tests.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/utils.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/__pycache__/visitor.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/_compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/_identifier.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/asyncfilters.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/asyncsupport.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/bccache.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/compiler.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/constants.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/debug.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/defaults.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/environment.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/exceptions.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/ext.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/filters.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/idtracking.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/lexer.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/loaders.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/meta.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/nativetypes.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/nodes.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/optimizer.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/parser.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/runtime.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/sandbox.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/tests.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/utils.py delete mode 100644 flask/venv/lib/python3.6/site-packages/jinja2/visitor.py delete mode 100644 flask/venv/lib/python3.6/site-packages/markupsafe/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/markupsafe/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/markupsafe/__pycache__/_compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/markupsafe/__pycache__/_constants.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/markupsafe/__pycache__/_native.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/markupsafe/_compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/markupsafe/_constants.py delete mode 100644 flask/venv/lib/python3.6/site-packages/markupsafe/_native.py delete mode 100644 flask/venv/lib/python3.6/site-packages/markupsafe/_speedups.c delete mode 100755 flask/venv/lib/python3.6/site-packages/markupsafe/_speedups.cpython-36m-x86_64-linux-gnu.so delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools-0.1.2.egg-info/PKG-INFO delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools-0.1.2.egg-info/SOURCES.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools-0.1.2.egg-info/dependency_links.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools-0.1.2.egg-info/installed-files.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools-0.1.2.egg-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools/__pycache__/path.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools/__pycache__/patterns.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools/__pycache__/version.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools/path.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools/patterns.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pathtools/version.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip-18.1.dist-info/INSTALLER delete mode 100644 flask/venv/lib/python3.6/site-packages/pip-18.1.dist-info/LICENSE.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/pip-18.1.dist-info/METADATA delete mode 100644 flask/venv/lib/python3.6/site-packages/pip-18.1.dist-info/RECORD delete mode 100644 flask/venv/lib/python3.6/site-packages/pip-18.1.dist-info/WHEEL delete mode 100644 flask/venv/lib/python3.6/site-packages/pip-18.1.dist-info/entry_points.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/pip-18.1.dist-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/__main__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/__pycache__/__main__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__pycache__/build_env.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__pycache__/cache.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__pycache__/configuration.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__pycache__/download.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__pycache__/exceptions.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__pycache__/index.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__pycache__/locations.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__pycache__/pep425tags.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__pycache__/pyproject.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__pycache__/resolve.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/__pycache__/wheel.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/build_env.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cache.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/parser.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/base_command.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/parser.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/check.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/completion.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/download.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/hash.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/help.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/install.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/list.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/search.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/show.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/check.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/completion.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/configuration.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/download.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/freeze.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/hash.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/help.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/install.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/list.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/search.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/show.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/commands/wheel.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/configuration.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/download.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/exceptions.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/index.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/locations.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/models/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/models/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/models/__pycache__/candidate.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/models/__pycache__/format_control.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/models/__pycache__/index.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/models/__pycache__/link.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/models/candidate.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/models/format_control.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/models/index.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/models/link.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/operations/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/check.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/operations/check.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/operations/freeze.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/operations/prepare.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/pep425tags.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/pyproject.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/__pycache__/constructors.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_file.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_install.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_set.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/constructors.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/req_file.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/req_install.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/req_set.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/req_tracker.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/resolve.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/logging.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/misc.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/models.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/typing.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/ui.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/encoding.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/glibc.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/hashes.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/logging.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/misc.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/models.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/outdated.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/packaging.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/typing.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/utils/ui.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/git.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/vcs/git.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_internal/wheel.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/check.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/colorlog.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/envbuild.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pip/_vendor/pep517/wrappers.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources-0.0.0.dist-info/AUTHORS.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources-0.0.0.dist-info/LICENSE.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources-0.0.0.dist-info/METADATA delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources-0.0.0.dist-info/RECORD delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources-0.0.0.dist-info/WHEEL delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/__pycache__/py31compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/_vendor/six.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/extern/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/pkg_resources/py31compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/python_dotenv-0.10.1.dist-info/DESCRIPTION.rst delete mode 100644 flask/venv/lib/python3.6/site-packages/python_dotenv-0.10.1.dist-info/INSTALLER delete mode 100644 flask/venv/lib/python3.6/site-packages/python_dotenv-0.10.1.dist-info/METADATA delete mode 100644 flask/venv/lib/python3.6/site-packages/python_dotenv-0.10.1.dist-info/RECORD delete mode 100644 flask/venv/lib/python3.6/site-packages/python_dotenv-0.10.1.dist-info/WHEEL delete mode 100644 flask/venv/lib/python3.6/site-packages/python_dotenv-0.10.1.dist-info/entry_points.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/python_dotenv-0.10.1.dist-info/metadata.json delete mode 100644 flask/venv/lib/python3.6/site-packages/python_dotenv-0.10.1.dist-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools-40.6.2.dist-info/AUTHORS.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools-40.6.2.dist-info/INSTALLER delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools-40.6.2.dist-info/LICENSE.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools-40.6.2.dist-info/METADATA delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools-40.6.2.dist-info/RECORD delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools-40.6.2.dist-info/WHEEL delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools-40.6.2.dist-info/dependency_links.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools-40.6.2.dist-info/entry_points.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools-40.6.2.dist-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools-40.6.2.dist-info/zip-safe delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/archive_util.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/build_meta.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/config.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/dep_util.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/depends.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/dist.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/extension.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/glibc.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/glob.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/launch.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/monkey.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/msvc.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/namespaces.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/package_index.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/pep425tags.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/py27compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/py31compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/py33compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/py36compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/sandbox.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/site-patch.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/ssl_support.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/unicode_utils.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/version.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/wheel.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/__pycache__/windows_support.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_deprecation_warning.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/six.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__about__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/_compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/pyparsing.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/_vendor/six.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/archive_util.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/build_meta.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/cli-32.exe delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/cli-64.exe delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/cli.exe delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/alias.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/build_clib.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/build_ext.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/build_py.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/develop.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/dist_info.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/easy_install.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/egg_info.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/install.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/install_lib.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/install_scripts.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/py36compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/register.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/rotate.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/saveopts.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/sdist.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/setopt.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/test.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/upload.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/__pycache__/upload_docs.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/alias.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/bdist_egg.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/bdist_wininst.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/build_clib.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/build_ext.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/build_py.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/develop.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/dist_info.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/easy_install.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/egg_info.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/install.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/install_egg_info.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/install_lib.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/install_scripts.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/py36compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/register.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/rotate.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/saveopts.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/sdist.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/setopt.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/test.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/upload.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/command/upload_docs.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/config.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/dep_util.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/depends.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/dist.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/extension.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/extern/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/extern/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/glibc.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/glob.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/gui-32.exe delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/gui-64.exe delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/gui.exe delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/launch.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/lib2to3_ex.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/monkey.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/msvc.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/namespaces.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/package_index.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/pep425tags.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/py27compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/py31compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/py33compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/py36compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/sandbox.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/script (dev).tmpl delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/script.tmpl delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/site-patch.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/ssl_support.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/unicode_utils.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/version.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/wheel.py delete mode 100644 flask/venv/lib/python3.6/site-packages/setuptools/windows_support.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson-3.16.0.egg-info/PKG-INFO delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson-3.16.0.egg-info/SOURCES.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson-3.16.0.egg-info/dependency_links.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson-3.16.0.egg-info/installed-files.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson-3.16.0.egg-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/__pycache__/compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/__pycache__/decoder.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/__pycache__/encoder.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/__pycache__/errors.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/__pycache__/ordered_dict.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/__pycache__/raw_json.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/__pycache__/scanner.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/__pycache__/tool.cpython-36.pyc delete mode 100755 flask/venv/lib/python3.6/site-packages/simplejson/_speedups.cpython-36m-x86_64-linux-gnu.so delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/decoder.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/encoder.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/errors.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/ordered_dict.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/raw_json.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/scanner.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_bigint_as_string.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_bitsize_int_as_string.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_check_circular.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_decimal.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_decode.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_default.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_dump.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_encode_basestring_ascii.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_encode_for_html.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_errors.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_fail.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_float.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_for_json.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_indent.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_item_sort_key.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_iterable.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_namedtuple.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_pass1.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_pass2.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_pass3.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_raw_json.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_recursion.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_scanstring.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_separators.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_speedups.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_str_subclass.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_subclass.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_tool.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_tuple.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/__pycache__/test_unicode.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_bigint_as_string.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_bitsize_int_as_string.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_check_circular.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_decimal.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_decode.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_default.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_dump.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_encode_basestring_ascii.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_encode_for_html.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_errors.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_fail.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_float.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_for_json.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_indent.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_item_sort_key.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_iterable.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_namedtuple.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_pass1.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_pass2.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_pass3.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_raw_json.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_recursion.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_scanstring.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_separators.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_speedups.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_str_subclass.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_subclass.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_tool.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_tuple.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tests/test_unicode.py delete mode 100644 flask/venv/lib/python3.6/site-packages/simplejson/tool.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/PKG-INFO delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/SOURCES.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/dependency_links.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/entry_points.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/installed-files.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/not-zip-safe delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/requires.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/top_level.txt delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/__pycache__/events.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/__pycache__/version.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/__pycache__/watchmedo.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/events.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/api.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/fsevents.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/fsevents2.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/inotify.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/inotify_buffer.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/inotify_c.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/kqueue.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/polling.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/read_directory_changes.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/winapi.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/api.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/fsevents.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/fsevents2.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/inotify.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/inotify_buffer.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/inotify_c.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/kqueue.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/polling.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/read_directory_changes.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/observers/winapi.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/tricks/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/tricks/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/bricks.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/decorators.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/delayed_queue.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/dirsnapshot.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/echo.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/event_backport.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/importlib2.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/platform.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/unicode_paths.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/win32stat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/bricks.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/decorators.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/delayed_queue.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/dirsnapshot.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/echo.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/event_backport.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/importlib2.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/platform.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/unicode_paths.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/utils/win32stat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/version.py delete mode 100644 flask/venv/lib/python3.6/site-packages/watchdog/watchmedo.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/_compat.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/_internal.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/_reloader.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/datastructures.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/exceptions.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/filesystem.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/formparser.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/http.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/local.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/posixemulation.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/routing.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/script.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/security.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/serving.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/test.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/testapp.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/urls.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/useragents.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/utils.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/websocket.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/wrappers.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/wsgi.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/_compat.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/_internal.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/_reloader.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/atom.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/cache.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/fixers.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/iterio.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/jsrouting.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/limiter.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/lint.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/profiler.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/securecookie.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/sessions.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/testtools.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/wrappers.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/atom.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/cache.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/fixers.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/iterio.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/jsrouting.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/limiter.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/lint.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/profiler.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/securecookie.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/sessions.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/testtools.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/contrib/wrappers.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/datastructures.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/__pycache__/console.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/__pycache__/repr.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/console.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/repr.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/FONT_LICENSE delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/console.png delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/debugger.js delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/jquery.js delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/less.png delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/more.png delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/source.png delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/style.css delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/ubuntu.ttf delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/debug/tbtools.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/exceptions.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/filesystem.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/formparser.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/http.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/local.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/posixemulation.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/routing.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/script.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/security.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/serving.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/test.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/testapp.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/urls.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/useragents.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/utils.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/websocket.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/wrappers.py delete mode 100644 flask/venv/lib/python3.6/site-packages/werkzeug/wsgi.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__init__.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/__init__.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/composer.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/constructor.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/cyaml.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/dumper.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/emitter.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/error.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/events.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/loader.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/nodes.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/parser.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/reader.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/representer.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/resolver.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/scanner.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/serializer.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/__pycache__/tokens.cpython-36.pyc delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/composer.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/constructor.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/cyaml.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/dumper.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/emitter.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/error.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/events.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/loader.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/nodes.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/parser.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/reader.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/representer.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/resolver.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/scanner.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/serializer.py delete mode 100644 flask/venv/lib/python3.6/site-packages/yaml/tokens.py delete mode 120000 flask/venv/lib64 delete mode 100644 flask/venv/pyvenv.cfg delete mode 100644 flask/venv/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/appdirs-1.4.3-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/certifi-2018.8.24-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/chardet-3.0.4-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/colorama-0.3.7-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/distlib-0.2.8-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/distro-1.3.0-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/html5lib-1.0.1-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/idna-2.6-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/ipaddress-0.0.0-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/lockfile-0.12.2-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/packaging-18.0-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/pip-18.1-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/pkg_resources-0.0.0-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/progress-1.2-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/pytoml-0.1.2-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/requests-2.20.0-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/retrying-1.3.3-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/setuptools-40.6.2-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/six-1.12.0-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/urllib3-1.24-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/webencodings-0.5-py2.py3-none-any.whl delete mode 100644 flask/venv/share/python-wheels/wheel-0.32.3-py2.py3-none-any.whl diff --git a/flask/__pycache__/helloworld.cpython-36.pyc b/flask/__pycache__/helloworld.cpython-36.pyc deleted file mode 100644 index 76ae0c2ee2fadf14fba251f5da2cced297fdea23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmYLE!Ab)$6nt-Yvy^I2>b*U#h&gx_5em{%FM2A%5}GI7Hrp)O6tOqapYfM+_2e(~ zy=2m$(Ljw0L?EQ(0~aZ!>rAuKsm?xu z9ihb|6!{PDLxDj&7}ahLD3{UrA7n9Qv>B5|4kYva*^G>_W4|ItSL0XfjGlafiz_`H z3hAu%vT=4z8(+yMa%#4hFYy_*g&C`(y0UCQOjHoOxd4L39}x-7qN2t*WUk n!-;AdQ!SOR>^2Bzcb>XL|Ajv#y4Y=P_0G^;EYy`b#R2{TMAJ&m diff --git a/flask/helloworld.py b/flask/helloworld.py deleted file mode 100644 index 34741de..0000000 --- a/flask/helloworld.py +++ /dev/null @@ -1,5 +0,0 @@ -from flask import Flask -application = Flask(__name__) -@application.route('/') -def helloworld(): - return 'Hello there, world!' diff --git a/flask/install-dependensies.sh b/flask/install-dependensies.sh deleted file mode 100644 index e69de29..0000000 diff --git a/flask/venv/bin/activate b/flask/venv/bin/activate deleted file mode 100644 index 65b2465..0000000 --- a/flask/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="/root/projekti/TeraHz/flask/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/flask/venv/bin/activate.csh b/flask/venv/bin/activate.csh deleted file mode 100644 index 8f97ac4..0000000 --- a/flask/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 "/root/projekti/TeraHz/flask/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/flask/venv/bin/activate.fish b/flask/venv/bin/activate.fish deleted file mode 100644 index 45f6f50..0000000 --- a/flask/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 "/root/projekti/TeraHz/flask/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/flask/venv/bin/dotenv b/flask/venv/bin/dotenv deleted file mode 100755 index 3e09d5c..0000000 --- a/flask/venv/bin/dotenv +++ /dev/null @@ -1,10 +0,0 @@ -#!/root/projekti/TeraHz/flask/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from dotenv.cli import cli - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(cli()) diff --git a/flask/venv/bin/easy_install b/flask/venv/bin/easy_install deleted file mode 100755 index 3e61814..0000000 --- a/flask/venv/bin/easy_install +++ /dev/null @@ -1,10 +0,0 @@ -#!/root/projekti/TeraHz/flask/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/flask/venv/bin/easy_install-3.6 b/flask/venv/bin/easy_install-3.6 deleted file mode 100755 index 3e61814..0000000 --- a/flask/venv/bin/easy_install-3.6 +++ /dev/null @@ -1,10 +0,0 @@ -#!/root/projekti/TeraHz/flask/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/flask/venv/bin/flask b/flask/venv/bin/flask deleted file mode 100755 index 511a9be..0000000 --- a/flask/venv/bin/flask +++ /dev/null @@ -1,10 +0,0 @@ -#!/root/projekti/TeraHz/flask/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/flask/venv/bin/pip b/flask/venv/bin/pip deleted file mode 100755 index 1660757..0000000 --- a/flask/venv/bin/pip +++ /dev/null @@ -1,10 +0,0 @@ -#!/root/projekti/TeraHz/flask/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/flask/venv/bin/pip3 b/flask/venv/bin/pip3 deleted file mode 100755 index 1660757..0000000 --- a/flask/venv/bin/pip3 +++ /dev/null @@ -1,10 +0,0 @@ -#!/root/projekti/TeraHz/flask/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/flask/venv/bin/pip3.6 b/flask/venv/bin/pip3.6 deleted file mode 100755 index 1660757..0000000 --- a/flask/venv/bin/pip3.6 +++ /dev/null @@ -1,10 +0,0 @@ -#!/root/projekti/TeraHz/flask/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/flask/venv/bin/python b/flask/venv/bin/python deleted file mode 120000 index b8a0adb..0000000 --- a/flask/venv/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/flask/venv/bin/python3 b/flask/venv/bin/python3 deleted file mode 120000 index ae65fda..0000000 --- a/flask/venv/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/flask/venv/bin/watchmedo b/flask/venv/bin/watchmedo deleted file mode 100755 index 8eddad5..0000000 --- a/flask/venv/bin/watchmedo +++ /dev/null @@ -1,12 +0,0 @@ -#!/root/projekti/TeraHz/flask/venv/bin/python3 -# EASY-INSTALL-ENTRY-SCRIPT: 'watchdog==0.9.0','console_scripts','watchmedo' -__requires__ = 'watchdog==0.9.0' -import re -import sys -from pkg_resources import load_entry_point - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit( - load_entry_point('watchdog==0.9.0', 'console_scripts', 'watchmedo')() - ) diff --git a/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/INSTALLER b/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/LICENSE.txt b/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/LICENSE.txt deleted file mode 100644 index 87ce152..0000000 --- a/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,39 +0,0 @@ -Copyright © 2014 by the Pallets team. - -Some rights reserved. - -Redistribution and use in source and binary forms of the software as -well as documentation, with or without modification, are permitted -provided that the following conditions are met: - -- Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -- Neither the name of the 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 AND DOCUMENTATION 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 AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. - ----- - -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. diff --git a/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/METADATA b/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/METADATA deleted file mode 100644 index 625bdad..0000000 --- a/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/METADATA +++ /dev/null @@ -1,121 +0,0 @@ -Metadata-Version: 2.1 -Name: Click -Version: 7.0 -Summary: Composable command line interface toolkit -Home-page: https://palletsprojects.com/p/click/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: Pallets Team -Maintainer-email: contact@palletsprojects.com -License: BSD -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 :: 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 -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* - -\$ 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 click - -Click supports Python 3.4 and newer, Python 2.7, and PyPy. - -.. _pip: https://pip.pypa.io/en/stable/quickstart/ - - -A Simple Example ----------------- - -What does it look like? Here is an example of a simple Click program: - -.. 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("Hello, %s!" % name) - - if __name__ == '__main__': - hello() - -And what it looks like when run: - -.. 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/ -* License: `BSD `_ -* Releases: https://pypi.org/project/click/ -* Code: https://github.com/pallets/click -* Issue tracker: https://github.com/pallets/click/issues -* Test status: - - * Linux, Mac: https://travis-ci.org/pallets/click - * Windows: https://ci.appveyor.com/project/pallets/click - -* Test coverage: https://codecov.io/gh/pallets/click - - diff --git a/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/RECORD b/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/RECORD deleted file mode 100644 index b99c0be..0000000 --- a/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/RECORD +++ /dev/null @@ -1,40 +0,0 @@ -Click-7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Click-7.0.dist-info/LICENSE.txt,sha256=4hIxn676T0Wcisk3_chVcECjyrivKTZsoqSNI5AlIlw,1876 -Click-7.0.dist-info/METADATA,sha256=-r8jeke3Zer4diRvT1MjFZuiJ6yTT_qFP39svLqdaLI,3516 -Click-7.0.dist-info/RECORD,, -Click-7.0.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110 -Click-7.0.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 -click/__init__.py,sha256=HjGThQ7tef9kkwCV371TBnrf0SAi6fKfU_jtEnbYTvQ,2789 -click/__pycache__/__init__.cpython-36.pyc,, -click/__pycache__/_bashcomplete.cpython-36.pyc,, -click/__pycache__/_compat.cpython-36.pyc,, -click/__pycache__/_termui_impl.cpython-36.pyc,, -click/__pycache__/_textwrap.cpython-36.pyc,, -click/__pycache__/_unicodefun.cpython-36.pyc,, -click/__pycache__/_winconsole.cpython-36.pyc,, -click/__pycache__/core.cpython-36.pyc,, -click/__pycache__/decorators.cpython-36.pyc,, -click/__pycache__/exceptions.cpython-36.pyc,, -click/__pycache__/formatting.cpython-36.pyc,, -click/__pycache__/globals.cpython-36.pyc,, -click/__pycache__/parser.cpython-36.pyc,, -click/__pycache__/termui.cpython-36.pyc,, -click/__pycache__/testing.cpython-36.pyc,, -click/__pycache__/types.cpython-36.pyc,, -click/__pycache__/utils.cpython-36.pyc,, -click/_bashcomplete.py,sha256=iaNUmtxag0YPfxba3TDYCNietiTMQIrvhRLj-H8okFU,11014 -click/_compat.py,sha256=vYmvoj4opPxo-c-2GMQQjYT_r_QkOKybkfGoeVrt0dA,23399 -click/_termui_impl.py,sha256=xHmLtOJhKUCVD6168yucJ9fknUJPAMs0eUTPgVUO-GQ,19611 -click/_textwrap.py,sha256=gwS4m7bdQiJnzaDG8osFcRb-5vn4t4l2qSCy-5csCEc,1198 -click/_unicodefun.py,sha256=QHy2_5jYlX-36O-JVrTHNnHOqg8tquUR0HmQFev7Ics,4364 -click/_winconsole.py,sha256=PPWVak8Iikm_gAPsxMrzwsVFCvHgaW3jPaDWZ1JBl3U,8965 -click/core.py,sha256=q8FLcDZsagBGSRe5Y9Hi_FGvAeZvusNfoO5EkhkSQ8Y,75305 -click/decorators.py,sha256=idKt6duLUUfAFftrHoREi8MJSd39XW36pUVHthdglwk,11226 -click/exceptions.py,sha256=CNpAjBAE7qjaV4WChxQeak95e5yUOau8AsvT-8m6wss,7663 -click/formatting.py,sha256=eh-cypTUAhpI3HD-K4ZpR3vCiURIO62xXvKkR3tNUTM,8889 -click/globals.py,sha256=oQkou3ZQ5DgrbVM6BwIBirwiqozbjfirzsLGAlLRRdg,1514 -click/parser.py,sha256=m-nGZz4VwprM42_qtFlWFGo7yRJQxkBlRcZodoH593Y,15510 -click/termui.py,sha256=o_ZXB2jyvL2Rce7P_bFGq452iyBq9ykJyRApIPMCZO0,23207 -click/testing.py,sha256=aYGqY_iWLu2p4k7lkuJ6t3fqpf6aPGqTsyLzNY_ngKg,13062 -click/types.py,sha256=2Q929p-aBP_ZYuMFJqJR-Ipucofv3fmDc5JzBDPmzJU,23287 -click/utils.py,sha256=6-D0WkAxvv9FkgHXSHwDIv0l9Gdx9Mm6Z5vuKNLIfZI,15763 diff --git a/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/WHEEL b/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/WHEEL deleted file mode 100644 index 1316c41..0000000 --- a/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.31.1) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/top_level.txt b/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/top_level.txt deleted file mode 100644 index dca9a90..0000000 --- a/flask/venv/lib/python3.6/site-packages/Click-7.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -click diff --git a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/INSTALLER b/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/LICENSE.txt b/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/LICENSE.txt deleted file mode 100644 index 8f9252f..0000000 --- a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/LICENSE.txt +++ /dev/null @@ -1,31 +0,0 @@ -Copyright © 2010 by the Pallets team. - -Some rights reserved. - -Redistribution and use in source and binary forms of the software as -well as documentation, with or without modification, are permitted -provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name of the 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 AND DOCUMENTATION 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 AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. diff --git a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/METADATA b/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/METADATA deleted file mode 100644 index c600e73..0000000 --- a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/METADATA +++ /dev/null @@ -1,130 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask -Version: 1.0.2 -Summary: A simple framework for building complex web applications. -Home-page: https://www.palletsprojects.com/p/flask/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: Pallets team -Maintainer-email: contact@palletsprojects.com -License: BSD -Project-URL: Documentation, http://flask.pocoo.org/docs/ -Project-URL: Code, https://github.com/pallets/flask -Project-URL: Issue tracker, https://github.com/pallets/flask/issues -Platform: any -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.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -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 -Provides-Extra: dev -Provides-Extra: docs -Provides-Extra: dotenv -Requires-Dist: Werkzeug (>=0.14) -Requires-Dist: Jinja2 (>=2.10) -Requires-Dist: itsdangerous (>=0.24) -Requires-Dist: click (>=5.1) -Provides-Extra: dev -Requires-Dist: pytest (>=3); 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' -Provides-Extra: docs -Requires-Dist: sphinx; extra == 'docs' -Requires-Dist: pallets-sphinx-themes; extra == 'docs' -Requires-Dist: sphinxcontrib-log-cabinet; 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 - - $ FLASK_APP=hello.py flask run - * Serving Flask app "hello" - * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) - - -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://www.palletsprojects.com/p/flask/ -* Documentation: http://flask.pocoo.org/docs/ -* License: `BSD `_ -* Releases: https://pypi.org/project/Flask/ -* Code: https://github.com/pallets/flask -* Issue tracker: https://github.com/pallets/flask/issues -* Test status: - - * Linux, Mac: https://travis-ci.org/pallets/flask - * Windows: https://ci.appveyor.com/project/pallets/flask - -* Test coverage: https://codecov.io/gh/pallets/flask - -.. _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/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/RECORD b/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/RECORD deleted file mode 100644 index 6ace8a7..0000000 --- a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/RECORD +++ /dev/null @@ -1,48 +0,0 @@ -../../../bin/flask,sha256=PJpKemt9ycjSY85Fc33FpXJqiYyDexlc2Z9ziSH4wPo,239 -Flask-1.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask-1.0.2.dist-info/LICENSE.txt,sha256=ziEXA3AIuaiUn1qe4cd1XxCESWTYrk4TjN7Qb06J3l8,1575 -Flask-1.0.2.dist-info/METADATA,sha256=iA5tiNWzTtgCVe80aTZGNWsckj853fJyfvHs9U-WZRk,4182 -Flask-1.0.2.dist-info/RECORD,, -Flask-1.0.2.dist-info/WHEEL,sha256=J3CsTk7Mf2JNUyhImI-mjX-fmI4oDjyiXgWT4qgZiCE,110 -Flask-1.0.2.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42 -Flask-1.0.2.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 -flask/__init__.py,sha256=qq8lK6QQbxJALf1igz7qsvUwOTAoKvFGfdLm7jPNsso,1673 -flask/__main__.py,sha256=pgIXrHhxM5MAMvgzAqWpw_t6AXZ1zG38us4JRgJKtxk,291 -flask/__pycache__/__init__.cpython-36.pyc,, -flask/__pycache__/__main__.cpython-36.pyc,, -flask/__pycache__/_compat.cpython-36.pyc,, -flask/__pycache__/app.cpython-36.pyc,, -flask/__pycache__/blueprints.cpython-36.pyc,, -flask/__pycache__/cli.cpython-36.pyc,, -flask/__pycache__/config.cpython-36.pyc,, -flask/__pycache__/ctx.cpython-36.pyc,, -flask/__pycache__/debughelpers.cpython-36.pyc,, -flask/__pycache__/globals.cpython-36.pyc,, -flask/__pycache__/helpers.cpython-36.pyc,, -flask/__pycache__/logging.cpython-36.pyc,, -flask/__pycache__/sessions.cpython-36.pyc,, -flask/__pycache__/signals.cpython-36.pyc,, -flask/__pycache__/templating.cpython-36.pyc,, -flask/__pycache__/testing.cpython-36.pyc,, -flask/__pycache__/views.cpython-36.pyc,, -flask/__pycache__/wrappers.cpython-36.pyc,, -flask/_compat.py,sha256=UDFGhosh6mOdNB-4evKPuneHum1OpcAlwTNJCRm0irQ,2892 -flask/app.py,sha256=ahpe3T8w98rQd_Er5d7uDxK57S1nnqGQx3V3hirBovU,94147 -flask/blueprints.py,sha256=Cyhl_x99tgwqEZPtNDJUFneAfVJxWfEU4bQA7zWS6VU,18331 -flask/cli.py,sha256=30QYAO10Do9LbZYCLgfI_xhKjASdLopL8wKKVUGS2oA,29442 -flask/config.py,sha256=kznUhj4DLYxsTF_4kfDG8GEHto1oZG_kqblyrLFtpqQ,9951 -flask/ctx.py,sha256=leFzS9fzmo0uaLCdxpHc5_iiJZ1H0X_Ig4yPCOvT--g,16224 -flask/debughelpers.py,sha256=1ceC-UyqZTd4KsJkf0OObHPsVt5R3T6vnmYhiWBjV-w,6479 -flask/globals.py,sha256=pGg72QW_-4xUfsI33I5L_y76c21AeqfSqXDcbd8wvXU,1649 -flask/helpers.py,sha256=YCl8D1plTO1evEYP4KIgaY3H8Izww5j4EdgRJ89oHTw,40106 -flask/json/__init__.py,sha256=Ns1Hj805XIxuBMh2z0dYnMVfb_KUgLzDmP3WoUYaPhw,10729 -flask/json/__pycache__/__init__.cpython-36.pyc,, -flask/json/__pycache__/tag.cpython-36.pyc,, -flask/json/tag.py,sha256=9ehzrmt5k7hxf7ZEK0NOs3swvQyU9fWNe-pnYe69N60,8223 -flask/logging.py,sha256=qV9h0vt7NIRkKM9OHDWndzO61E5CeBMlqPJyTt-W2Wc,2231 -flask/sessions.py,sha256=2XHV4ASREhSEZ8bsPQW6pNVNuFtbR-04BzfKg0AfvHo,14452 -flask/signals.py,sha256=BGQbVyCYXnzKK2DVCzppKFyWN1qmrtW1QMAYUs-1Nr8,2211 -flask/templating.py,sha256=FDfWMbpgpC3qObW8GGXRAVrkHFF8K4CHOJymB1wvULI,4914 -flask/testing.py,sha256=XD3gWNvLUV8dqVHwKd9tZzsj81fSHtjOphQ1wTNtlMs,9379 -flask/views.py,sha256=Wy-_WkUVtCfE2zCXYeJehNgHuEtviE4v3HYfJ--MpbY,5733 -flask/wrappers.py,sha256=1Z9hF5-hXQajn_58XITQFRY8efv3Vy3uZ0avBfZu6XI,7511 diff --git a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/WHEEL b/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/WHEEL deleted file mode 100644 index f21b51c..0000000 --- a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.31.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/entry_points.txt b/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/entry_points.txt deleted file mode 100644 index 1eb0252..0000000 --- a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -flask = flask.cli:main - diff --git a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/top_level.txt b/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/top_level.txt deleted file mode 100644 index 7e10602..0000000 --- a/flask/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -flask diff --git a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst b/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst deleted file mode 100644 index 1594da5..0000000 --- a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,37 +0,0 @@ - -Jinja2 -~~~~~~ - -Jinja2 is a template engine written in pure Python. It provides a -`Django`_ inspired non-XML syntax but supports inline expressions and -an optional `sandboxed`_ environment. - -Nutshell --------- - -Here a small example of a Jinja template:: - - {% extends 'base.html' %} - {% block title %}Memberlist{% endblock %} - {% block content %} - - {% endblock %} - -Philosophy ----------- - -Application logic is for the controller but don't try to make the life -for the template designer too hard by giving him too few functionality. - -For more informations visit the new `Jinja2 webpage`_ and `documentation`_. - -.. _sandboxed: https://en.wikipedia.org/wiki/Sandbox_(computer_security) -.. _Django: https://www.djangoproject.com/ -.. _Jinja2 webpage: http://jinja.pocoo.org/ -.. _documentation: http://jinja.pocoo.org/2/documentation/ - - diff --git a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/INSTALLER b/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/LICENSE.txt b/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/LICENSE.txt deleted file mode 100644 index 10145a2..0000000 --- a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/LICENSE.txt +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details. - -Some rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/METADATA b/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/METADATA deleted file mode 100644 index 40f2b46..0000000 --- a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/METADATA +++ /dev/null @@ -1,68 +0,0 @@ -Metadata-Version: 2.0 -Name: Jinja2 -Version: 2.10 -Summary: A small but fast and easy to use stand-alone template engine written in pure python. -Home-page: http://jinja.pocoo.org/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -License: BSD -Description-Content-Type: UNKNOWN -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.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: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Text Processing :: Markup :: HTML -Requires-Dist: MarkupSafe (>=0.23) -Provides-Extra: i18n -Requires-Dist: Babel (>=0.8); extra == 'i18n' - - -Jinja2 -~~~~~~ - -Jinja2 is a template engine written in pure Python. It provides a -`Django`_ inspired non-XML syntax but supports inline expressions and -an optional `sandboxed`_ environment. - -Nutshell --------- - -Here a small example of a Jinja template:: - - {% extends 'base.html' %} - {% block title %}Memberlist{% endblock %} - {% block content %} - - {% endblock %} - -Philosophy ----------- - -Application logic is for the controller but don't try to make the life -for the template designer too hard by giving him too few functionality. - -For more informations visit the new `Jinja2 webpage`_ and `documentation`_. - -.. _sandboxed: https://en.wikipedia.org/wiki/Sandbox_(computer_security) -.. _Django: https://www.djangoproject.com/ -.. _Jinja2 webpage: http://jinja.pocoo.org/ -.. _documentation: http://jinja.pocoo.org/2/documentation/ - - diff --git a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/RECORD b/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/RECORD deleted file mode 100644 index f66e1c4..0000000 --- a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/RECORD +++ /dev/null @@ -1,63 +0,0 @@ -Jinja2-2.10.dist-info/DESCRIPTION.rst,sha256=b5ckFDoM7vVtz_mAsJD4OPteFKCqE7beu353g4COoYI,978 -Jinja2-2.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Jinja2-2.10.dist-info/LICENSE.txt,sha256=JvzUNv3Io51EiWrAPm8d_SXjhJnEjyDYvB3Tvwqqils,1554 -Jinja2-2.10.dist-info/METADATA,sha256=18EgU8zR6-av-0-5y_gXebzK4GnBB_76lALUsl-6QHM,2258 -Jinja2-2.10.dist-info/RECORD,, -Jinja2-2.10.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110 -Jinja2-2.10.dist-info/entry_points.txt,sha256=NdzVcOrqyNyKDxD09aERj__3bFx2paZhizFDsKmVhiA,72 -Jinja2-2.10.dist-info/metadata.json,sha256=NPUJ9TMBxVQAv_kTJzvU8HwmP-4XZvbK9mz6_4YUVl4,1473 -Jinja2-2.10.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 -jinja2/__init__.py,sha256=xJHjaMoy51_KXn1wf0cysH6tUUifUxZCwSOfcJGEYZw,2614 -jinja2/__pycache__/__init__.cpython-36.pyc,, -jinja2/__pycache__/_compat.cpython-36.pyc,, -jinja2/__pycache__/_identifier.cpython-36.pyc,, -jinja2/__pycache__/asyncfilters.cpython-36.pyc,, -jinja2/__pycache__/asyncsupport.cpython-36.pyc,, -jinja2/__pycache__/bccache.cpython-36.pyc,, -jinja2/__pycache__/compiler.cpython-36.pyc,, -jinja2/__pycache__/constants.cpython-36.pyc,, -jinja2/__pycache__/debug.cpython-36.pyc,, -jinja2/__pycache__/defaults.cpython-36.pyc,, -jinja2/__pycache__/environment.cpython-36.pyc,, -jinja2/__pycache__/exceptions.cpython-36.pyc,, -jinja2/__pycache__/ext.cpython-36.pyc,, -jinja2/__pycache__/filters.cpython-36.pyc,, -jinja2/__pycache__/idtracking.cpython-36.pyc,, -jinja2/__pycache__/lexer.cpython-36.pyc,, -jinja2/__pycache__/loaders.cpython-36.pyc,, -jinja2/__pycache__/meta.cpython-36.pyc,, -jinja2/__pycache__/nativetypes.cpython-36.pyc,, -jinja2/__pycache__/nodes.cpython-36.pyc,, -jinja2/__pycache__/optimizer.cpython-36.pyc,, -jinja2/__pycache__/parser.cpython-36.pyc,, -jinja2/__pycache__/runtime.cpython-36.pyc,, -jinja2/__pycache__/sandbox.cpython-36.pyc,, -jinja2/__pycache__/tests.cpython-36.pyc,, -jinja2/__pycache__/utils.cpython-36.pyc,, -jinja2/__pycache__/visitor.cpython-36.pyc,, -jinja2/_compat.py,sha256=xP60CE5Qr8FTYcDE1f54tbZLKGvMwYml4-8T7Q4KG9k,2596 -jinja2/_identifier.py,sha256=W1QBSY-iJsyt6oR_nKSuNNCzV95vLIOYgUNPUI1d5gU,1726 -jinja2/asyncfilters.py,sha256=cTDPvrS8Hp_IkwsZ1m9af_lr5nHysw7uTa5gV0NmZVE,4144 -jinja2/asyncsupport.py,sha256=UErQ3YlTLaSjFb94P4MVn08-aVD9jJxty2JVfMRb-1M,7878 -jinja2/bccache.py,sha256=nQldx0ZRYANMyfvOihRoYFKSlUdd5vJkS7BjxNwlOZM,12794 -jinja2/compiler.py,sha256=BqC5U6JxObSRhblyT_a6Tp5GtEU5z3US1a4jLQaxxgo,65386 -jinja2/constants.py,sha256=uwwV8ZUhHhacAuz5PTwckfsbqBaqM7aKfyJL7kGX5YQ,1626 -jinja2/debug.py,sha256=WTVeUFGUa4v6ReCsYv-iVPa3pkNB75OinJt3PfxNdXs,12045 -jinja2/defaults.py,sha256=Em-95hmsJxIenDCZFB1YSvf9CNhe9rBmytN3yUrBcWA,1400 -jinja2/environment.py,sha256=VnkAkqw8JbjZct4tAyHlpBrka2vqB-Z58RAP-32P1ZY,50849 -jinja2/exceptions.py,sha256=_Rj-NVi98Q6AiEjYQOsP8dEIdu5AlmRHzcSNOPdWix4,4428 -jinja2/ext.py,sha256=atMQydEC86tN1zUsdQiHw5L5cF62nDbqGue25Yiu3N4,24500 -jinja2/filters.py,sha256=yOAJk0MsH-_gEC0i0U6NweVQhbtYaC-uE8xswHFLF4w,36528 -jinja2/idtracking.py,sha256=2GbDSzIvGArEBGLkovLkqEfmYxmWsEf8c3QZwM4uNsw,9197 -jinja2/lexer.py,sha256=ySEPoXd1g7wRjsuw23uimS6nkGN5aqrYwcOKxCaVMBQ,28559 -jinja2/loaders.py,sha256=xiTuURKAEObyym0nU8PCIXu_Qp8fn0AJ5oIADUUm-5Q,17382 -jinja2/meta.py,sha256=fmKHxkmZYAOm9QyWWy8EMd6eefAIh234rkBMW2X4ZR8,4340 -jinja2/nativetypes.py,sha256=_sJhS8f-8Q0QMIC0dm1YEdLyxEyoO-kch8qOL5xUDfE,7308 -jinja2/nodes.py,sha256=L10L_nQDfubLhO3XjpF9qz46FSh2clL-3e49ogVlMmA,30853 -jinja2/optimizer.py,sha256=MsdlFACJ0FRdPtjmCAdt7JQ9SGrXFaDNUaslsWQaG3M,1722 -jinja2/parser.py,sha256=lPzTEbcpTRBLw8ii6OYyExHeAhaZLMA05Hpv4ll3ULk,35875 -jinja2/runtime.py,sha256=DHdD38Pq8gj7uWQC5usJyWFoNWL317A9AvXOW_CLB34,27755 -jinja2/sandbox.py,sha256=TVyZHlNqqTzsv9fv2NvJNmSdWRHTguhyMHdxjWms32U,16708 -jinja2/tests.py,sha256=iJQLwbapZr-EKquTG_fVOVdwHUUKf3SX9eNkjQDF8oU,4237 -jinja2/utils.py,sha256=q24VupGZotQ-uOyrJxCaXtDWhZC1RgsQG7kcdmjck2Q,20629 -jinja2/visitor.py,sha256=JD1H1cANA29JcntFfN5fPyqQxB4bI4wC00BzZa-XHks,3316 diff --git a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/WHEEL b/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/WHEEL deleted file mode 100644 index 7332a41..0000000 --- a/flask/venv/lib/python3.6/site-packages/Jinja2-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/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/entry_points.txt b/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/entry_points.txt deleted file mode 100644 index 32e6b75..0000000 --- a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/entry_points.txt +++ /dev/null @@ -1,4 +0,0 @@ - - [babel.extractors] - jinja2 = jinja2.ext:babel_extract[i18n] - \ No newline at end of file diff --git a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/metadata.json b/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/metadata.json deleted file mode 100644 index 7f5dc38..0000000 --- a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup :: HTML"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://jinja.pocoo.org/"}}, "python.exports": {"babel.extractors": {"jinja2": "jinja2.ext:babel_extract [i18n]"}}}, "extras": ["i18n"], "generator": "bdist_wheel (0.30.0)", "license": "BSD", "metadata_version": "2.0", "name": "Jinja2", "run_requires": [{"extra": "i18n", "requires": ["Babel (>=0.8)"]}, {"requires": ["MarkupSafe (>=0.23)"]}], "summary": "A small but fast and easy to use stand-alone template engine written in pure python.", "version": "2.10"} \ No newline at end of file diff --git a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/top_level.txt b/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/top_level.txt deleted file mode 100644 index 7f7afbf..0000000 --- a/flask/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -jinja2 diff --git a/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/INSTALLER b/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/LICENSE.txt b/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/LICENSE.txt deleted file mode 100644 index 28c9258..0000000 --- a/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,33 +0,0 @@ -`BSD 3-Clause `_ - -Copyright © 2010 by the Pallets team. - -Some rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -- Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -- 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 AND DOCUMENTATION 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 AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. diff --git a/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/METADATA b/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/METADATA deleted file mode 100644 index e532eb0..0000000 --- a/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/METADATA +++ /dev/null @@ -1,103 +0,0 @@ -Metadata-Version: 2.1 -Name: MarkupSafe -Version: 1.1.0 -Summary: Safely add untrusted strings to HTML/XML markup. -Home-page: https://www.palletsprojects.com/p/markupsafe/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -Maintainer: Pallets Team -Maintainer-email: contact@palletsprojects.com -License: BSD -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://psfmember.org/civicrm/contribute/transact?reset=1&id=20 - - -Links ------ - -* Website: https://www.palletsprojects.com/p/markupsafe/ -* Documentation: https://markupsafe.palletsprojects.com/ -* License: `BSD `_ -* 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/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/RECORD b/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/RECORD deleted file mode 100644 index 8f0dba1..0000000 --- a/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/RECORD +++ /dev/null @@ -1,16 +0,0 @@ -MarkupSafe-1.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -MarkupSafe-1.1.0.dist-info/LICENSE.txt,sha256=7V249lpOdvRv2m6SF9gCDtq_nsg8tFpdeTdsWWM_g9M,1614 -MarkupSafe-1.1.0.dist-info/METADATA,sha256=usFnBges7tmAH4_Yt5Ypb8Bco4R9uLUdD0V6YHbvhLw,3585 -MarkupSafe-1.1.0.dist-info/RECORD,, -MarkupSafe-1.1.0.dist-info/WHEEL,sha256=d2ILPScH-y2UwGxsW1PeA2TT-KW0Git4AJ6LeOK8sQo,109 -MarkupSafe-1.1.0.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 -markupsafe/__init__.py,sha256=T5J4pS7LRx1xRqfV3xz-QN_D9pSmfVDJnTrc2cTO4Ro,10164 -markupsafe/__pycache__/__init__.cpython-36.pyc,, -markupsafe/__pycache__/_compat.cpython-36.pyc,, -markupsafe/__pycache__/_constants.cpython-36.pyc,, -markupsafe/__pycache__/_native.cpython-36.pyc,, -markupsafe/_compat.py,sha256=3oSvQpEFzsJ29NKVy-Fqk6ZlRxmlCB5k0G21aN0zNtQ,596 -markupsafe/_constants.py,sha256=ueEz1Jxdw5TKWBbhPr4Ad_2L2MSEh73AYiYe4l3cZy4,4728 -markupsafe/_native.py,sha256=fUrjjbRXIpHM-8l9QXFJ2xg5rv_48U2aN99plyL0kfs,1911 -markupsafe/_speedups.c,sha256=VfElhhq9oulHEd2wBZ2MX9A80r4jFovsVGQD2zxmVk0,9883 -markupsafe/_speedups.cpython-36m-x86_64-linux-gnu.so,sha256=BS7m4DA4L7J_sXAEFkmQeW3HJStGrC1yXYRifVOaTvc,38555 diff --git a/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/WHEEL b/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/WHEEL deleted file mode 100644 index 92946fe..0000000 --- a/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.31.1) -Root-Is-Purelib: false -Tag: cp36-cp36m-manylinux1_x86_64 - diff --git a/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/top_level.txt b/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/top_level.txt deleted file mode 100644 index 75bf729..0000000 --- a/flask/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -markupsafe diff --git a/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/PKG-INFO b/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/PKG-INFO deleted file mode 100644 index 9c20cdc..0000000 --- a/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/PKG-INFO +++ /dev/null @@ -1,33 +0,0 @@ -Metadata-Version: 1.1 -Name: PyYAML -Version: 3.13 -Summary: YAML parser and emitter for Python -Home-page: http://pyyaml.org/wiki/PyYAML -Author: Kirill Simonov -Author-email: xi@resolvent.net -License: MIT -Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.13.tar.gz -Description: YAML is a data serialization format designed for human readability - and interaction with scripting languages. PyYAML is a YAML parser - and emitter for Python. - - PyYAML features a complete YAML 1.1 parser, Unicode support, pickle - support, capable extension API, and sensible error messages. PyYAML - supports standard YAML tags and provides Python-specific tags that - allow to represent an arbitrary Python object. - - PyYAML is applicable for a broad range of tasks from complex - configuration files to object serialization and persistance. -Platform: Any -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Text Processing :: Markup diff --git a/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/SOURCES.txt b/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/SOURCES.txt deleted file mode 100644 index bd794ab..0000000 --- a/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/SOURCES.txt +++ /dev/null @@ -1,28 +0,0 @@ -README -setup.cfg -setup.py -ext/_yaml.c -ext/_yaml.h -ext/_yaml.pxd -ext/_yaml.pyx -lib3/PyYAML.egg-info/PKG-INFO -lib3/PyYAML.egg-info/SOURCES.txt -lib3/PyYAML.egg-info/dependency_links.txt -lib3/PyYAML.egg-info/top_level.txt -lib3/yaml/__init__.py -lib3/yaml/composer.py -lib3/yaml/constructor.py -lib3/yaml/cyaml.py -lib3/yaml/dumper.py -lib3/yaml/emitter.py -lib3/yaml/error.py -lib3/yaml/events.py -lib3/yaml/loader.py -lib3/yaml/nodes.py -lib3/yaml/parser.py -lib3/yaml/reader.py -lib3/yaml/representer.py -lib3/yaml/resolver.py -lib3/yaml/scanner.py -lib3/yaml/serializer.py -lib3/yaml/tokens.py \ No newline at end of file diff --git a/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/dependency_links.txt b/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/installed-files.txt b/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/installed-files.txt deleted file mode 100644 index 810f0cb..0000000 --- a/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/installed-files.txt +++ /dev/null @@ -1,38 +0,0 @@ -../yaml/__init__.py -../yaml/__pycache__/__init__.cpython-36.pyc -../yaml/__pycache__/composer.cpython-36.pyc -../yaml/__pycache__/constructor.cpython-36.pyc -../yaml/__pycache__/cyaml.cpython-36.pyc -../yaml/__pycache__/dumper.cpython-36.pyc -../yaml/__pycache__/emitter.cpython-36.pyc -../yaml/__pycache__/error.cpython-36.pyc -../yaml/__pycache__/events.cpython-36.pyc -../yaml/__pycache__/loader.cpython-36.pyc -../yaml/__pycache__/nodes.cpython-36.pyc -../yaml/__pycache__/parser.cpython-36.pyc -../yaml/__pycache__/reader.cpython-36.pyc -../yaml/__pycache__/representer.cpython-36.pyc -../yaml/__pycache__/resolver.cpython-36.pyc -../yaml/__pycache__/scanner.cpython-36.pyc -../yaml/__pycache__/serializer.cpython-36.pyc -../yaml/__pycache__/tokens.cpython-36.pyc -../yaml/composer.py -../yaml/constructor.py -../yaml/cyaml.py -../yaml/dumper.py -../yaml/emitter.py -../yaml/error.py -../yaml/events.py -../yaml/loader.py -../yaml/nodes.py -../yaml/parser.py -../yaml/reader.py -../yaml/representer.py -../yaml/resolver.py -../yaml/scanner.py -../yaml/serializer.py -../yaml/tokens.py -PKG-INFO -SOURCES.txt -dependency_links.txt -top_level.txt diff --git a/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/top_level.txt b/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/top_level.txt deleted file mode 100644 index e6475e9..0000000 --- a/flask/venv/lib/python3.6/site-packages/PyYAML-3.13.egg-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -_yaml -yaml diff --git a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst b/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst deleted file mode 100644 index 675f08d..0000000 --- a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,80 +0,0 @@ -Werkzeug -======== - -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://www.palletsprojects.com/p/werkzeug/ -* Releases: https://pypi.org/project/Werkzeug/ -* Code: https://github.com/pallets/werkzeug -* Issue tracker: https://github.com/pallets/werkzeug/issues -* Test status: - - * Linux, Mac: https://travis-ci.org/pallets/werkzeug - * Windows: https://ci.appveyor.com/project/davidism/werkzeug - -* Test coverage: https://codecov.io/gh/pallets/werkzeug - -.. _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/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER b/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt b/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt deleted file mode 100644 index 1cc75bb..0000000 --- a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt +++ /dev/null @@ -1,31 +0,0 @@ -Copyright © 2007 by the Pallets team. - -Some rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* 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 AND DOCUMENTATION 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 AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. diff --git a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/METADATA b/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/METADATA deleted file mode 100644 index bfc3c4e..0000000 --- a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/METADATA +++ /dev/null @@ -1,116 +0,0 @@ -Metadata-Version: 2.0 -Name: Werkzeug -Version: 0.14.1 -Summary: The comprehensive WSGI web application library. -Home-page: https://www.palletsprojects.org/p/werkzeug/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -License: BSD -Description-Content-Type: UNKNOWN -Platform: any -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.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: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Provides-Extra: dev -Requires-Dist: coverage; extra == 'dev' -Requires-Dist: pytest; extra == 'dev' -Requires-Dist: sphinx; extra == 'dev' -Requires-Dist: tox; extra == 'dev' -Provides-Extra: termcolor -Requires-Dist: termcolor; extra == 'termcolor' -Provides-Extra: watchdog -Requires-Dist: watchdog; extra == 'watchdog' - -Werkzeug -======== - -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://www.palletsprojects.com/p/werkzeug/ -* Releases: https://pypi.org/project/Werkzeug/ -* Code: https://github.com/pallets/werkzeug -* Issue tracker: https://github.com/pallets/werkzeug/issues -* Test status: - - * Linux, Mac: https://travis-ci.org/pallets/werkzeug - * Windows: https://ci.appveyor.com/project/davidism/werkzeug - -* Test coverage: https://codecov.io/gh/pallets/werkzeug - -.. _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/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/RECORD b/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/RECORD deleted file mode 100644 index 0953881..0000000 --- a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/RECORD +++ /dev/null @@ -1,97 +0,0 @@ -Werkzeug-0.14.1.dist-info/DESCRIPTION.rst,sha256=rOCN36jwsWtWsTpqPG96z7FMilB5qI1CIARSKRuUmz8,2452 -Werkzeug-0.14.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Werkzeug-0.14.1.dist-info/LICENSE.txt,sha256=xndz_dD4m269AF9l_Xbl5V3tM1N3C1LoZC2PEPxWO-8,1534 -Werkzeug-0.14.1.dist-info/METADATA,sha256=FbfadrPdJNUWAxMOKxGUtHe5R3IDSBKYYmAz3FvI3uY,3872 -Werkzeug-0.14.1.dist-info/RECORD,, -Werkzeug-0.14.1.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110 -Werkzeug-0.14.1.dist-info/metadata.json,sha256=4489UTt6HBp2NQil95-pBkjU4Je93SMHvMxZ_rjOpqA,1452 -Werkzeug-0.14.1.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 -werkzeug/__init__.py,sha256=NR0d4n_-U9BLVKlOISean3zUt2vBwhvK-AZE6M0sC0k,6842 -werkzeug/__pycache__/__init__.cpython-36.pyc,, -werkzeug/__pycache__/_compat.cpython-36.pyc,, -werkzeug/__pycache__/_internal.cpython-36.pyc,, -werkzeug/__pycache__/_reloader.cpython-36.pyc,, -werkzeug/__pycache__/datastructures.cpython-36.pyc,, -werkzeug/__pycache__/exceptions.cpython-36.pyc,, -werkzeug/__pycache__/filesystem.cpython-36.pyc,, -werkzeug/__pycache__/formparser.cpython-36.pyc,, -werkzeug/__pycache__/http.cpython-36.pyc,, -werkzeug/__pycache__/local.cpython-36.pyc,, -werkzeug/__pycache__/posixemulation.cpython-36.pyc,, -werkzeug/__pycache__/routing.cpython-36.pyc,, -werkzeug/__pycache__/script.cpython-36.pyc,, -werkzeug/__pycache__/security.cpython-36.pyc,, -werkzeug/__pycache__/serving.cpython-36.pyc,, -werkzeug/__pycache__/test.cpython-36.pyc,, -werkzeug/__pycache__/testapp.cpython-36.pyc,, -werkzeug/__pycache__/urls.cpython-36.pyc,, -werkzeug/__pycache__/useragents.cpython-36.pyc,, -werkzeug/__pycache__/utils.cpython-36.pyc,, -werkzeug/__pycache__/websocket.cpython-36.pyc,, -werkzeug/__pycache__/wrappers.cpython-36.pyc,, -werkzeug/__pycache__/wsgi.cpython-36.pyc,, -werkzeug/_compat.py,sha256=8c4U9o6A_TR9nKCcTbpZNxpqCXcXDVIbFawwKM2s92c,6311 -werkzeug/_internal.py,sha256=GhEyGMlsSz_tYjsDWO9TG35VN7304MM8gjKDrXLEdVc,13873 -werkzeug/_reloader.py,sha256=AyPphcOHPbu6qzW0UbrVvTDJdre5WgpxbhIJN_TqzUc,9264 -werkzeug/contrib/__init__.py,sha256=f7PfttZhbrImqpr5Ezre8CXgwvcGUJK7zWNpO34WWrw,623 -werkzeug/contrib/__pycache__/__init__.cpython-36.pyc,, -werkzeug/contrib/__pycache__/atom.cpython-36.pyc,, -werkzeug/contrib/__pycache__/cache.cpython-36.pyc,, -werkzeug/contrib/__pycache__/fixers.cpython-36.pyc,, -werkzeug/contrib/__pycache__/iterio.cpython-36.pyc,, -werkzeug/contrib/__pycache__/jsrouting.cpython-36.pyc,, -werkzeug/contrib/__pycache__/limiter.cpython-36.pyc,, -werkzeug/contrib/__pycache__/lint.cpython-36.pyc,, -werkzeug/contrib/__pycache__/profiler.cpython-36.pyc,, -werkzeug/contrib/__pycache__/securecookie.cpython-36.pyc,, -werkzeug/contrib/__pycache__/sessions.cpython-36.pyc,, -werkzeug/contrib/__pycache__/testtools.cpython-36.pyc,, -werkzeug/contrib/__pycache__/wrappers.cpython-36.pyc,, -werkzeug/contrib/atom.py,sha256=qqfJcfIn2RYY-3hO3Oz0aLq9YuNubcPQ_KZcNsDwVJo,15575 -werkzeug/contrib/cache.py,sha256=xBImHNj09BmX_7kC5NUCx8f_l4L8_O7zi0jCL21UZKE,32163 -werkzeug/contrib/fixers.py,sha256=gR06T-w71ur-tHQ_31kP_4jpOncPJ4Wc1dOqTvYusr8,10179 -werkzeug/contrib/iterio.py,sha256=RlqDvGhz0RneTpzE8dVc-yWCUv4nkPl1jEc_EDp2fH0,10814 -werkzeug/contrib/jsrouting.py,sha256=QTmgeDoKXvNK02KzXgx9lr3cAH6fAzpwF5bBdPNvJPs,8564 -werkzeug/contrib/limiter.py,sha256=iS8-ahPZ-JLRnmfIBzxpm7O_s3lPsiDMVWv7llAIDCI,1334 -werkzeug/contrib/lint.py,sha256=Mj9NeUN7s4zIUWeQOAVjrmtZIcl3Mm2yDe9BSIr9YGE,12558 -werkzeug/contrib/profiler.py,sha256=ISwCWvwVyGpDLRBRpLjo_qUWma6GXYBrTAco4PEQSHY,5151 -werkzeug/contrib/securecookie.py,sha256=uWMyHDHY3lkeBRiCSayGqWkAIy4a7xAbSE_Hln9ecqc,12196 -werkzeug/contrib/sessions.py,sha256=39LVNvLbm5JWpbxM79WC2l87MJFbqeISARjwYbkJatw,12577 -werkzeug/contrib/testtools.py,sha256=G9xN-qeihJlhExrIZMCahvQOIDxdL9NiX874jiiHFMs,2453 -werkzeug/contrib/wrappers.py,sha256=v7OYlz7wQtDlS9fey75UiRZ1IkUWqCpzbhsLy4k14Hw,10398 -werkzeug/datastructures.py,sha256=3IgNKNqrz-ZjmAG7y3YgEYK-enDiMT_b652PsypWcYg,90080 -werkzeug/debug/__init__.py,sha256=uSn9BqCZ5E3ySgpoZtundpROGsn-uYvZtSFiTfAX24M,17452 -werkzeug/debug/__pycache__/__init__.cpython-36.pyc,, -werkzeug/debug/__pycache__/console.cpython-36.pyc,, -werkzeug/debug/__pycache__/repr.cpython-36.pyc,, -werkzeug/debug/__pycache__/tbtools.cpython-36.pyc,, -werkzeug/debug/console.py,sha256=n3-dsKk1TsjnN-u4ZgmuWCU_HO0qw5IA7ttjhyyMM6I,5607 -werkzeug/debug/repr.py,sha256=bKqstDYGfECpeLerd48s_hxuqK4b6UWnjMu3d_DHO8I,9340 -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=PKPVYuyO4SX1hkqLOwCLvmIEO5154WatFYaXE-zIfKI,6264 -werkzeug/debug/shared/jquery.js,sha256=7LkWEzqTdpEfELxcZZlS6wAx5Ff13zZ83lYO2_ujj7g,95957 -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=IEO0PC2pWmh2aEyGCaN--txuWsRCliuhlbEhPDFwh0A,6270 -werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 -werkzeug/debug/tbtools.py,sha256=rBudXCmkVdAKIcdhxANxgf09g6kQjJWW9_5bjSpr4OY,18451 -werkzeug/exceptions.py,sha256=3wp95Hqj9FqV8MdikV99JRcHse_fSMn27V8tgP5Hw2c,20505 -werkzeug/filesystem.py,sha256=hHWeWo_gqLMzTRfYt8-7n2wWcWUNTnDyudQDLOBEICE,2175 -werkzeug/formparser.py,sha256=mUuCwjzjb8_E4RzrAT2AioLuZSYpqR1KXTK6LScRYzA,21722 -werkzeug/http.py,sha256=RQg4MJuhRv2isNRiEh__Phh09ebpfT3Kuu_GfrZ54_c,40079 -werkzeug/local.py,sha256=QdQhWV5L8p1Y1CJ1CDStwxaUs24SuN5aebHwjVD08C8,14553 -werkzeug/posixemulation.py,sha256=xEF2Bxc-vUCPkiu4IbfWVd3LW7DROYAT-ExW6THqyzw,3519 -werkzeug/routing.py,sha256=2JVtdSgxKGeANy4Z_FP-dKESvKtkYGCZ1J2fARCLGCY,67214 -werkzeug/script.py,sha256=DwaVDcXdaOTffdNvlBdLitxWXjKaRVT32VbhDtljFPY,11365 -werkzeug/security.py,sha256=0m107exslz4QJLWQCpfQJ04z3re4eGHVggRvrQVAdWc,9193 -werkzeug/serving.py,sha256=A0flnIJHufdn2QJ9oeuHfrXwP3LzP8fn3rNW6hbxKUg,31926 -werkzeug/test.py,sha256=XmECSmnpASiYQTct4oMiWr0LT5jHWCtKqnpYKZd2ui8,36100 -werkzeug/testapp.py,sha256=3HQRW1sHZKXuAjCvFMet4KXtQG3loYTFnvn6LWt-4zI,9396 -werkzeug/urls.py,sha256=dUeLg2IeTm0WLmSvFeD4hBZWGdOs-uHudR5-t8n9zPo,36771 -werkzeug/useragents.py,sha256=BhYMf4cBTHyN4U0WsQedePIocmNlH_34C-UwqSThGCc,5865 -werkzeug/utils.py,sha256=BrY1j0DHQ8RTb0K1StIobKuMJhN9SQQkWEARbrh2qpk,22972 -werkzeug/websocket.py,sha256=PpSeDxXD_0UsPAa5hQhQNM6mxibeUgn8lA8eRqiS0vM,11344 -werkzeug/wrappers.py,sha256=kbyL_aFjxELwPgMwfNCYjKu-CR6kNkh-oO8wv3GXbk8,84511 -werkzeug/wsgi.py,sha256=1Nob-aeChWQf7MsiicO8RZt6J90iRzEcik44ev9Qu8s,49347 diff --git a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/WHEEL b/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/WHEEL deleted file mode 100644 index 0de529b..0000000 --- a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.26.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/metadata.json b/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/metadata.json deleted file mode 100644 index bca8d12..0000000 --- a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"generator": "bdist_wheel (0.26.0)", "summary": "The comprehensive WSGI web application library.", "classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"project_urls": {"Home": "https://www.palletsprojects.org/p/werkzeug/"}, "contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}}}, "license": "BSD", "metadata_version": "2.0", "name": "Werkzeug", "platform": "any", "extras": ["dev", "termcolor", "watchdog"], "run_requires": [{"requires": ["coverage", "pytest", "sphinx", "tox"], "extra": "dev"}, {"requires": ["termcolor"], "extra": "termcolor"}, {"requires": ["watchdog"], "extra": "watchdog"}], "version": "0.14.1"} \ No newline at end of file diff --git a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt b/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt deleted file mode 100644 index 6fe8da8..0000000 --- a/flask/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -werkzeug diff --git a/flask/venv/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc deleted file mode 100644 index 519996f46f240d1b3bb77a230e23de98d74af326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277 zcmYk!y-LJD5C`zt-RK4Joo&8{Dw0pOkTTb#BlN<5~fpaIPkTl4-ELc~MOx|NM#jypi%A+&wBB0j)R-e$**U}y;-F+>Hl52d8)t~hw}{h=lU5@( zM^UFCB=1eEwm_u`#qLM#1sSi<@6z~gpJ#Qlp$=VGY+n{;{b*0x^Hu$4)&GquY{vY; RdNmk*$q0&*mhqhJvo9hrO|1X` diff --git a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/DESCRIPTION.rst b/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/DESCRIPTION.rst deleted file mode 100644 index db8d16c..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,272 +0,0 @@ -Argh: The Natural CLI -===================== - -.. image:: https://img.shields.io/coveralls/neithere/argh.svg - :target: https://coveralls.io/r/neithere/argh - -.. image:: https://img.shields.io/travis/neithere/argh.svg - :target: https://travis-ci.org/neithere/argh - -.. image:: https://img.shields.io/pypi/format/argh.svg - :target: https://pypi.python.org/pypi/argh - -.. image:: https://img.shields.io/pypi/status/argh.svg - :target: https://pypi.python.org/pypi/argh - -.. image:: https://img.shields.io/pypi/v/argh.svg - :target: https://pypi.python.org/pypi/argh - -.. image:: https://img.shields.io/pypi/pyversions/argh.svg - :target: https://pypi.python.org/pypi/argh - -.. image:: https://img.shields.io/pypi/dd/argh.svg - :target: https://pypi.python.org/pypi/argh - -.. image:: https://readthedocs.org/projects/argh/badge/?version=stable - :target: http://argh.readthedocs.org/en/stable/ - -.. image:: https://readthedocs.org/projects/argh/badge/?version=latest - :target: http://argh.readthedocs.org/en/latest/ - -Building a command-line interface? Found yourself uttering "argh!" while -struggling with the API of `argparse`? Don't like the complexity but need -the power? - -.. epigraph:: - - Everything should be made as simple as possible, but no simpler. - - -- Albert Einstein (probably) - -`Argh` is a smart wrapper for `argparse`. `Argparse` is a very powerful tool; -`Argh` just makes it easy to use. - -In a nutshell -------------- - -`Argh`-powered applications are *simple* but *flexible*: - -:Modular: - Declaration of commands can be decoupled from assembling and dispatching; - -:Pythonic: - Commands are declared naturally, no complex API calls in most cases; - -:Reusable: - Commands are plain functions, can be used directly outside of CLI context; - -:Layered: - The complexity of code raises with requirements; - -:Transparent: - The full power of argparse is available whenever needed; - -:Namespaced: - Nested commands are a piece of cake, no messing with subparsers (though - they are of course used under the hood); - -:Term-Friendly: - Command output is processed with respect to stream encoding; - -:Unobtrusive: - `Argh` can dispatch a subset of pure-`argparse` code, and pure-`argparse` - code can update and dispatch a parser assembled with `Argh`; - -:DRY: - The amount of boilerplate code is minimal; among other things, `Argh` will: - - * infer command name from function name; - * infer arguments from function signature; - * infer argument type from the default value; - * infer argument action from the default value (for booleans); - * add an alias root command ``help`` for the ``--help`` argument. - -:NIH free: - `Argh` supports *completion*, *progress bars* and everything else by being - friendly to excellent 3rd-party libraries. No need to reinvent the wheel. - -Sounds good? Check the tutorial! - -Relation to argparse --------------------- - -`Argh` is fully compatible with `argparse`. You can mix `Argh`-agnostic and -`Argh`-aware code. Just keep in mind that the dispatcher does some extra work -that a custom dispatcher may not do. - -Installation ------------- - -Using pip:: - - $ pip install argh - -Arch Linux (AUR):: - - $ yaourt python-argh - -Examples --------- - -A very simple application with one command: - -.. code-block:: python - - import argh - - def main(): - return 'Hello world' - - argh.dispatch_command(main) - -Run it: - -.. code-block:: bash - - $ ./app.py - Hello world - -A potentially modular application with multiple commands: - -.. code-block:: python - - import argh - - # declaring: - - def echo(text): - "Returns given word as is." - return text - - def greet(name, greeting='Hello'): - "Greets the user with given name. The greeting is customizable." - return greeting + ', ' + name - - # assembling: - - parser = argh.ArghParser() - parser.add_commands([echo, greet]) - - # dispatching: - - if __name__ == '__main__': - parser.dispatch() - -Of course it works: - -.. code-block:: bash - - $ ./app.py greet Andy - Hello, Andy - - $ ./app.py greet Andy -g Arrrgh - Arrrgh, Andy - -Here's the auto-generated help for this application (note how the docstrings -are reused):: - - $ ./app.py help - - usage: app.py {echo,greet} ... - - positional arguments: - echo Returns given word as is. - greet Greets the user with given name. The greeting is customizable. - -...and for a specific command (an ordinary function signature is converted -to CLI arguments):: - - $ ./app.py help greet - - usage: app.py greet [-g GREETING] name - - Greets the user with given name. The greeting is customizable. - - positional arguments: - name - - optional arguments: - -g GREETING, --greeting GREETING 'Hello' - -(The help messages have been simplified a bit for brevity.) - -`Argh` easily maps plain Python functions to CLI. Sometimes this is not -enough; in these cases the powerful API of `argparse` is also available: - -.. code-block:: python - - @arg('text', default='hello world', nargs='+', help='The message') - def echo(text): - print text - -The approaches can be safely combined even up to this level: - -.. code-block:: python - - # adding help to `foo` which is in the function signature: - @arg('foo', help='blah') - # these are not in the signature so they go to **kwargs: - @arg('baz') - @arg('-q', '--quux') - # the function itself: - def cmd(foo, bar=1, *args, **kwargs): - yield foo - yield bar - yield ', '.join(args) - yield kwargs['baz'] - yield kwargs['quux'] - -Links ------ - -* `Project home page`_ (GitHub) -* `Documentation`_ (Read the Docs) -* `Package distribution`_ (PyPI) -* Questions, requests, bug reports, etc.: - - * `Issue tracker`_ (GitHub) - * `Mailing list`_ (subscribe to get important announcements) - * Direct e-mail (neithere at gmail com) - -.. _project home page: http://github.com/neithere/argh/ -.. _documentation: http://argh.readthedocs.org -.. _package distribution: http://pypi.python.org/pypi/argh -.. _issue tracker: http://github.com/neithere/argh/issues/ -.. _mailing list: http://groups.google.com/group/argh-users - -Author ------- - -Developed by Andrey Mikhaylenko since 2010. - -See file `AUTHORS` for a complete list of contributors to this library. - -Support -------- - -The fastest way to improve this project is to submit tested and documented -patches or detailed bug reports. - -Otherwise you can "flattr" me: |FlattrLink|_ - -.. _FlattrLink: https://flattr.com/submit/auto?user_id=neithere&url=http%3A%2F%2Fpypi.python.org%2Fpypi%2Fargh -.. |FlattrLink| image:: https://api.flattr.com/button/flattr-badge-large.png - :alt: Flattr the Argh project - -Licensing ---------- - -Argh is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Argh is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Argh. If not, see . - - diff --git a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/INSTALLER b/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/METADATA b/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/METADATA deleted file mode 100644 index 64226d2..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/METADATA +++ /dev/null @@ -1,300 +0,0 @@ -Metadata-Version: 2.0 -Name: argh -Version: 0.26.2 -Summary: An unobtrusive argparse wrapper with natural syntax -Home-page: http://github.com/neithere/argh/ -Author: Andrey Mikhaylenko -Author-email: neithere@gmail.com -License: GNU Lesser General Public License (LGPL), Version 3 -Keywords: cli command line argparse optparse argument option -Platform: UNKNOWN -Classifier: Development Status :: 4 - Beta -Classifier: Environment :: Console -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Information Technology -Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Software Development :: User Interfaces -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Provides: argh - -Argh: The Natural CLI -===================== - -.. image:: https://img.shields.io/coveralls/neithere/argh.svg - :target: https://coveralls.io/r/neithere/argh - -.. image:: https://img.shields.io/travis/neithere/argh.svg - :target: https://travis-ci.org/neithere/argh - -.. image:: https://img.shields.io/pypi/format/argh.svg - :target: https://pypi.python.org/pypi/argh - -.. image:: https://img.shields.io/pypi/status/argh.svg - :target: https://pypi.python.org/pypi/argh - -.. image:: https://img.shields.io/pypi/v/argh.svg - :target: https://pypi.python.org/pypi/argh - -.. image:: https://img.shields.io/pypi/pyversions/argh.svg - :target: https://pypi.python.org/pypi/argh - -.. image:: https://img.shields.io/pypi/dd/argh.svg - :target: https://pypi.python.org/pypi/argh - -.. image:: https://readthedocs.org/projects/argh/badge/?version=stable - :target: http://argh.readthedocs.org/en/stable/ - -.. image:: https://readthedocs.org/projects/argh/badge/?version=latest - :target: http://argh.readthedocs.org/en/latest/ - -Building a command-line interface? Found yourself uttering "argh!" while -struggling with the API of `argparse`? Don't like the complexity but need -the power? - -.. epigraph:: - - Everything should be made as simple as possible, but no simpler. - - -- Albert Einstein (probably) - -`Argh` is a smart wrapper for `argparse`. `Argparse` is a very powerful tool; -`Argh` just makes it easy to use. - -In a nutshell -------------- - -`Argh`-powered applications are *simple* but *flexible*: - -:Modular: - Declaration of commands can be decoupled from assembling and dispatching; - -:Pythonic: - Commands are declared naturally, no complex API calls in most cases; - -:Reusable: - Commands are plain functions, can be used directly outside of CLI context; - -:Layered: - The complexity of code raises with requirements; - -:Transparent: - The full power of argparse is available whenever needed; - -:Namespaced: - Nested commands are a piece of cake, no messing with subparsers (though - they are of course used under the hood); - -:Term-Friendly: - Command output is processed with respect to stream encoding; - -:Unobtrusive: - `Argh` can dispatch a subset of pure-`argparse` code, and pure-`argparse` - code can update and dispatch a parser assembled with `Argh`; - -:DRY: - The amount of boilerplate code is minimal; among other things, `Argh` will: - - * infer command name from function name; - * infer arguments from function signature; - * infer argument type from the default value; - * infer argument action from the default value (for booleans); - * add an alias root command ``help`` for the ``--help`` argument. - -:NIH free: - `Argh` supports *completion*, *progress bars* and everything else by being - friendly to excellent 3rd-party libraries. No need to reinvent the wheel. - -Sounds good? Check the tutorial! - -Relation to argparse --------------------- - -`Argh` is fully compatible with `argparse`. You can mix `Argh`-agnostic and -`Argh`-aware code. Just keep in mind that the dispatcher does some extra work -that a custom dispatcher may not do. - -Installation ------------- - -Using pip:: - - $ pip install argh - -Arch Linux (AUR):: - - $ yaourt python-argh - -Examples --------- - -A very simple application with one command: - -.. code-block:: python - - import argh - - def main(): - return 'Hello world' - - argh.dispatch_command(main) - -Run it: - -.. code-block:: bash - - $ ./app.py - Hello world - -A potentially modular application with multiple commands: - -.. code-block:: python - - import argh - - # declaring: - - def echo(text): - "Returns given word as is." - return text - - def greet(name, greeting='Hello'): - "Greets the user with given name. The greeting is customizable." - return greeting + ', ' + name - - # assembling: - - parser = argh.ArghParser() - parser.add_commands([echo, greet]) - - # dispatching: - - if __name__ == '__main__': - parser.dispatch() - -Of course it works: - -.. code-block:: bash - - $ ./app.py greet Andy - Hello, Andy - - $ ./app.py greet Andy -g Arrrgh - Arrrgh, Andy - -Here's the auto-generated help for this application (note how the docstrings -are reused):: - - $ ./app.py help - - usage: app.py {echo,greet} ... - - positional arguments: - echo Returns given word as is. - greet Greets the user with given name. The greeting is customizable. - -...and for a specific command (an ordinary function signature is converted -to CLI arguments):: - - $ ./app.py help greet - - usage: app.py greet [-g GREETING] name - - Greets the user with given name. The greeting is customizable. - - positional arguments: - name - - optional arguments: - -g GREETING, --greeting GREETING 'Hello' - -(The help messages have been simplified a bit for brevity.) - -`Argh` easily maps plain Python functions to CLI. Sometimes this is not -enough; in these cases the powerful API of `argparse` is also available: - -.. code-block:: python - - @arg('text', default='hello world', nargs='+', help='The message') - def echo(text): - print text - -The approaches can be safely combined even up to this level: - -.. code-block:: python - - # adding help to `foo` which is in the function signature: - @arg('foo', help='blah') - # these are not in the signature so they go to **kwargs: - @arg('baz') - @arg('-q', '--quux') - # the function itself: - def cmd(foo, bar=1, *args, **kwargs): - yield foo - yield bar - yield ', '.join(args) - yield kwargs['baz'] - yield kwargs['quux'] - -Links ------ - -* `Project home page`_ (GitHub) -* `Documentation`_ (Read the Docs) -* `Package distribution`_ (PyPI) -* Questions, requests, bug reports, etc.: - - * `Issue tracker`_ (GitHub) - * `Mailing list`_ (subscribe to get important announcements) - * Direct e-mail (neithere at gmail com) - -.. _project home page: http://github.com/neithere/argh/ -.. _documentation: http://argh.readthedocs.org -.. _package distribution: http://pypi.python.org/pypi/argh -.. _issue tracker: http://github.com/neithere/argh/issues/ -.. _mailing list: http://groups.google.com/group/argh-users - -Author ------- - -Developed by Andrey Mikhaylenko since 2010. - -See file `AUTHORS` for a complete list of contributors to this library. - -Support -------- - -The fastest way to improve this project is to submit tested and documented -patches or detailed bug reports. - -Otherwise you can "flattr" me: |FlattrLink|_ - -.. _FlattrLink: https://flattr.com/submit/auto?user_id=neithere&url=http%3A%2F%2Fpypi.python.org%2Fpypi%2Fargh -.. |FlattrLink| image:: https://api.flattr.com/button/flattr-badge-large.png - :alt: Flattr the Argh project - -Licensing ---------- - -Argh is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Argh is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with Argh. If not, see . - - diff --git a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/RECORD b/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/RECORD deleted file mode 100644 index df0f5ca..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/RECORD +++ /dev/null @@ -1,31 +0,0 @@ -argh-0.26.2.dist-info/DESCRIPTION.rst,sha256=lkRPNeZEMGOKCCfCGZ4_-2iPxLvQ3xyccMH7SUfEJ5Q,7304 -argh-0.26.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -argh-0.26.2.dist-info/METADATA,sha256=opzH3aI3sMQFcRmdmcrFR14tZfX6eJYsY6fi9HhivYI,8557 -argh-0.26.2.dist-info/RECORD,, -argh-0.26.2.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 -argh-0.26.2.dist-info/metadata.json,sha256=pbgTgagWaqB_H3oMqcB3xmA4mln1QBf-aAh-iGLHIUA,1408 -argh-0.26.2.dist-info/top_level.txt,sha256=KbRbUYCNA1IhMbo789mEq1eXr9-lhdgo1K6Ww_p7zM0,5 -argh/__init__.py,sha256=GemyWFY_3uaAOGEzxWtvU6trRx_s9Z5OaC7tS1Xaxn0,495 -argh/__pycache__/__init__.cpython-36.pyc,, -argh/__pycache__/assembling.cpython-36.pyc,, -argh/__pycache__/compat.cpython-36.pyc,, -argh/__pycache__/completion.cpython-36.pyc,, -argh/__pycache__/constants.cpython-36.pyc,, -argh/__pycache__/decorators.cpython-36.pyc,, -argh/__pycache__/dispatching.cpython-36.pyc,, -argh/__pycache__/exceptions.cpython-36.pyc,, -argh/__pycache__/helpers.cpython-36.pyc,, -argh/__pycache__/interaction.cpython-36.pyc,, -argh/__pycache__/io.cpython-36.pyc,, -argh/__pycache__/utils.cpython-36.pyc,, -argh/assembling.py,sha256=rHn8Qh5hKk4NhEgqA0NECja4ZnxkHM4ywMqKE5eJEVw,17555 -argh/compat.py,sha256=DThKad-IYxH-vz3DQDdObHOOwCOWvJH4H2rM4Iq_yZs,2834 -argh/completion.py,sha256=oxj9vfyI1WATZRnlwcc7m__-uwM3-Eqdi-WzR3wnMus,2943 -argh/constants.py,sha256=FpUSsGACMlGgZZuaqa79BwVROojE5ABJ2OQgkXS2e6A,3436 -argh/decorators.py,sha256=qAdU2Y2vQdIshrABdJoliNMSSOjetZN4EpkpZ3sQ0AM,6141 -argh/dispatching.py,sha256=5Bg22bf3MJZrvv3B4CtcLu_Nuq_RLLyBxkl4Vlvl4nw,12465 -argh/exceptions.py,sha256=x_UJbpOkdm-qfOdp1A4ERvPB0JkqL74GXTlXwqu6E-I,1545 -argh/helpers.py,sha256=SKAB5AQrmsXczTmL9QkzBJVlWE7zAGqwxhYvpU1menQ,2151 -argh/interaction.py,sha256=XKlTPo0lru_VYd2Jppm-LlZoW8oDVvSgqOyjPjsdzVM,2403 -argh/io.py,sha256=nfnyC53E_KYXJsCg3fEiNqHBqs-e2TC-x1KrkWVI3Vw,2986 -argh/utils.py,sha256=4yI6-_Q33m4vrthwVpFI3ZlIWGZ_bx7Tff7BGuEB1E4,1676 diff --git a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/WHEEL b/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/WHEEL deleted file mode 100644 index 8b6dd1b..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.29.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/metadata.json b/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/metadata.json deleted file mode 100644 index 4b6e876..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: User Interfaces", "Topic :: Software Development :: Libraries :: Python Modules"], "extensions": {"python.details": {"contacts": [{"email": "neithere@gmail.com", "name": "Andrey Mikhaylenko", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://github.com/neithere/argh/"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["cli", "command", "line", "argparse", "optparse", "argument", "option"], "license": "GNU Lesser General Public License (LGPL), Version 3", "metadata_version": "2.0", "name": "argh", "provides": "argh", "summary": "An unobtrusive argparse wrapper with natural syntax", "test_requires": [{"requires": ["iocapture", "mock", "pytest"]}], "version": "0.26.2"} \ No newline at end of file diff --git a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/top_level.txt b/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/top_level.txt deleted file mode 100644 index e795266..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh-0.26.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -argh diff --git a/flask/venv/lib/python3.6/site-packages/argh/__init__.py b/flask/venv/lib/python3.6/site-packages/argh/__init__.py deleted file mode 100644 index 481f1b4..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2010—2014 Andrey Mikhaylenko and contributors -# -# This file is part of Argh. -# -# Argh is free software under terms of the GNU Lesser -# General Public License version 3 (LGPLv3) as published by the Free -# Software Foundation. See the file README.rst for copying conditions. -# -from .assembling import * -from .decorators import * -from .dispatching import * -from .exceptions import * -from .interaction import * -from .helpers import * - - -__version__ = '0.26.2' diff --git a/flask/venv/lib/python3.6/site-packages/argh/__pycache__/__init__.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/argh/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index baf99dfe4aa4139b41c497118943e2bcd490a6be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 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 L6n-pC>GS^!J`KhL diff --git a/flask/venv/lib/python3.6/site-packages/argh/__pycache__/compat.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/argh/__pycache__/compat.cpython-36.pyc deleted file mode 100644 index 88f22184d4737956c1be223c591b1837bfef456c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3202 zcmaJ@Uys|y5#J>#lA?6yyGxulfop7n0=5F59JoLNB(72SlC~)j+o;|AAyV)t?&?H| zBI(`L-RY`(=^03#3iMmFFMY|U$-ed}{RnyL%u>?brDs#vUTApks%J6C&RiZtRIx>|2f?4n!~xJQ4?SSl)nj zPqdfcqBs)K7&)SG7>C^D-U||UtfV$b8jDWcEqy`88*%sdgtxf=f^c7Kp1JY0`4-3z zimmB(yiLg$r2M%@#Lgs=|D*(e;#$1@6)BxB!Oo|o7ySS>lSeA_P9H4A=erG8-*P{@CIk}Yxk6%I;SqI zgbTWG7O;2RKJ!4imwxXM5;1rlmTW&SRV^~zKM*>V2T1R;qg;58dYT~|`Gy}2G$Wk0gAKC5(onCiSLKWrAPf+f#xR!!@?09nIXnIRL)6??a= z^t&ttx>PzXGr_7Mdt!y&QdTI+(DPcT{_mFip25F9W6wsZMiF`>eqtUjfH0m)4zlj8 z#T5BKrgF|^N+?ixmE*U2`yl#hbq8${$C;>CmdZ3&g0E#AjYP?^v?%iOfbB!rMtz>E zI@Q@I0Z*r({&r^l*jxII=3D81sE)*;kayOy(1X4C%00z+#YX9&V6~7#$V-71r-MSU z{XWJH+TI36^Cfv9wL_P#!#mijr8{J2t*5r$6{5zgzp0>(h19ltgOo23d*slQogM3CfiUu z08;1`ywR}k(ik%w*D!83VA4cmmv+Vu_SwHvN)E_^BrYcq1NsQE-hzH9q=Ls%j+;bgrN{kgznIjn^y+7 zztWMd61*}R-|7xbmyJGiC;{Wi*qsFOHonK+0uB@k=V{|aOTG@f8W%bVSgvy|reGZ+ z&G>0ui<0+T`7`|MPQ)BhUCcy}$~SQ%Lc4L|EucPup?sLoiHM%O{W3S!dNMe%>~qPJ z+pu)e6SVl;`cnt#h4br|dBFuB>fDP~UUG4~bV6ckjhpl1|99ageEK7dr3+iM`wAD< zO4bO%^B&#VLlF^78jXf4JB*|kGVMFsOELhg7)rU*< zE9KO9MXvNq^m>q3^`{Fu-?}<+$aYEJDr*W`kZmH+US5RXl8@oy0&csH*6ipF;v1_) zA?UE0{?a|A-vUJ6B>!-p!yV>4AU(%8{r3!=TrwHU<;Ungx`N%~0p6x;oP2Wf-qki+ zxT^mBqJnc>Jpf|0*($pzenq1e<2M`sywX7E$&FWO=yfoCWjYnm1EM6ER(w_<-A$6` zv$R-#36g|Y859^6y~LuC2s`->PQSzn!EZK}eIgS@vFa6w6EM-%o$VVK%8y{EO_;)# zN4s9P)oq1t=-P^ge$%RCHggq*Hh!FxiVd7nhLIQ(9MRG31(%E_Y%|A z;#enmV*@rgAv=S-giBYm5HD)qx`buB7%bK1WAG**t~!n@B&fJrIKz($I~lM?EK` YU8i~b)OW*Q;F;;WTQ?oLMK|gH0OGGs9{>OV diff --git a/flask/venv/lib/python3.6/site-packages/argh/__pycache__/completion.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/argh/__pycache__/completion.cpython-36.pyc deleted file mode 100644 index ac6609db33c93fca93971848da6016d05fe11df5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2687 zcmZ`*(Qe~J6t$By?auBZgb)urjrL`mRpScw0TfuYr4&)Al$BZuh!DxxGqK&+9y2pe zHweMQ@-ut^|B_dp;1hV_+)2DmcNbT2I`+MH&OP_sJ9&KnKKp0y_=n%_2Ekv!)`fNO z6d(HoZZa4LGL)Sn9Ebk9Gw#UlxVyaPSG{rX+n{>47pR>%GarWm{e2%){qF+V8+YZ7 z?5CY^Uxin@YVSojz9V<#&hNpP$<9SE*b_hQ1_8UsR8jCmmvy0Bt}FKID;HzOx-3N{ zx&N57DOKgRJa}%o;Hgo<@oTZwv$+!ToCf!t0O^9SxFI}dqp;g7~ zro@vCxNO?uv0PULf^WNDXE}lr^6H^Oem^xi(AXwU3Sn(trHml^1dT6fsVkHiI9-w< zT@aO5)+r&86C@Pp6`VM+l11+oxP@qd6Ov)m3*>~b zUba<=s9u-Ph;TD)x2DpdEO}7~zw@>YSh!HiTS5zhM8>6pcAyKYc&d>INQEvaQ>hd0 zy*5N#dU&fa3@UpFMMDA>Qk`i6j^)eV;;~5Ps**SSi^k~^5lM|pXimfhsN3?$XSb_D zy|w^EGGzM}_(#GyGnyWM^Yyc{lgra@&L=15N1vaad@&u6(r34#S>9Aq+1!vnWtQd( zK!vJ!ykztytq!PkiKuvt4u;B=1dB7g=T=Zbnh)=fkKH`~kwH+NErch=RN67GSp4(#C%n!Hh zyx$vj`^E?|79h~M!#BDx*2;E>>7j0o;o<*X-f6=>x_mQHAR5d*Ou7f{D`Ov^{+F*Q zcQaCD=+kQ`|T}C6uIIi`>2my&wZ@B+pIK&7Y zE`<5u!GPGLMn$on@RRjqJ#HT{wl(pf@3zV_RFe9q(xw!}W^fE?_F$?=eyz=XR_N=9 zouc#>6AGJPTuZ!zlG?&=H2EulL6opD!f9h8tTC6{b(_gkJl=nJ1O4GaD@SFXyb65a zlb347N%#9v6b(lH5pjYQV}Iii56-{5T-~EaZ%J6a^Ln!;A(`T$?;bwK_}B91j$WCu`#1~+{xm?Ul=ExDhK{`TP?HC|&?!U*&f_NC z=)J^2E>fKNNBY@S_jy z^WyoHp;?fvZ#Ps%_0sQg317R1Td>;;?}cxNgS)HU$pk0IWU|_&J<)K63_M7K-(Ns_ zTGCH~6JxX?YwQN=J3xB226=Zfsc~+Ar^&=Ha;AJd(5>5B6l?F(Qp=`LpM8pzeGj)@ WxEJnqdpjNAc`NL9dfmM)>;4B319*=B diff --git a/flask/venv/lib/python3.6/site-packages/argh/__pycache__/constants.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/argh/__pycache__/constants.cpython-36.pyc deleted file mode 100644 index 4df77f0a4bd605969c884073dc71d2f93a20f29c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2156 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 N^6SgLTK-_A{Xfjio6Z0L diff --git a/flask/venv/lib/python3.6/site-packages/argh/__pycache__/dispatching.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/argh/__pycache__/dispatching.cpython-36.pyc deleted file mode 100644 index 4676f6d021cfaca9db6b37dae675fc14b92a8adb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10041 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 diff --git a/flask/venv/lib/python3.6/site-packages/argh/__pycache__/exceptions.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/argh/__pycache__/exceptions.cpython-36.pyc deleted file mode 100644 index bbba6fd8ce0d18cee07d357edb6c145e8fb7232c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1713 zcmcIlO^+ir5bb=-BopnjbAkgxs@qHs$?$OiMF=e#R%nH^2Usp6q+X|8Ju&OH8{4g< z7r_NC{1pCDuH5(uoOpI;nwez}%mGVXayjL4)$@DKM-Ly){+wQZcXFI%e`L4D81u*Y z{3kFnyUM=I0he$HoKlnF}x_o|)|#@9l5mZVAw z8>U(~&yEV)Xi3HfS~DC|s_VufN;XWvQYCb0UBxnGurc10S``7gF|R6N5X*%YPNbrj zDe&2Ryr1T|5f$h8ewOEzm5q+`2YLQOBlO{yNuEnvw}9>)fcs@7s~h` zv|fDtq2KA<_wGWt>rH34hiO^2E+X z)tbXC+?2loGvShwZ8xge+}$X#$yLf=r!^!Dv2a@9UeNe8_h7o%mm5VBndXk7=@IK@ zlejj8c^lsi5YfLE5DzZ9OHITPOB|U>e`*37i7LSf5XE&=DxIxps{&9XaYKhC(R1+Y z1}pTkb)xnlo$@JHe|5BO!JSexI-qq)wNoZ|Qur$N9ss1|wh0uRD0nT3m&;ko@vY~w z(FAUGyB65L;GIIG@Gm`WH*Bc24e_q#0_mv~N`u+yAZg86psg?=B|}eu+XW5EqjKw{ zGQzdgM1i2jxLCLrsw@b_)J-^4aS4?wiJ%x!TCMFi>VkJ7(qXmgYK_`Mn+UMyAh4gW z(y4Jdj^Nt63vqF|?Cw6!ueePYL&6jPdshPRyg9qp{3->=amAFQ?Y5AW!Of5bK?+*Ck zRiy$V1B1ON8J*#Z@gicyhRuOVKC~c0D)8Z3NP2{MQDO`O6V8! z`-}Ai;(V_c>$@)c&*n!--TRaNk08BfN!cmlO}gJtKkZ)F&)$mp;>$1|oK8+Be**w8 B$DjZJ diff --git a/flask/venv/lib/python3.6/site-packages/argh/__pycache__/helpers.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/argh/__pycache__/helpers.cpython-36.pyc deleted file mode 100644 index 3ec1d229ced41da6b7c79cd7bff98cc0ac72ea2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2395 zcmb7FTW=dh6rR~#+nbG@qyz*=2#t_$NvcLt*T>?#!9*eCIMB_j=w7_uh|ZE+K!CMsZ;L z1yuC|G@ST^Q*I^Hr_kGpmD;{dam`7bwB@(bw%<1MR?{9SZkkAfBP%K zJG^}fGeOV0OWW^p>k;X@^IP86A}NGa-m|KBf5C-h)Td=Pn&~{w(;^XC^evck9>6?} zGOo&fC3L{WIGQE8UhUiE-ovBgNB56|FCQF#dvtPg|G4ZO$+O8QN`)$-Sd=cG!a&E9 z(!&oABdLUp@y@!S>R8kW8bLs1;#-{h_H!}@61aWo`VMz^>yr2_-sTUf^G)^L=SUzS$Ga7~fY?g{lSKvZ+ zG1U{;SQNR`Y@AC546umB`3$&WMi88i^XwOqO+^+9mI^(|xf*!YElE-(?taifnZZ?XtC}>RUbgJu+G76HCTJ@Z2x?LJ$Un0P)Q1cKgi#ML!B0f#k4q>X25-t9DI65JxQLN%R?l( zY9>`+42q|+3-^798W`WCT{_=CT08HczWbWe5AetyG@2~HcNg?`3)KV_>HO~Zl>-?2 z-(=-i#8^1!Q;9J8w(LPCcd$Wv<*jw|29C@o7$^%GV$I)gKz@bb|Aqd}e?fo6M-etU z!fRpUrUR%o?6(`Rn-bS}(bZ7Jdw2-L8`)k~EZ>atrT{^lC=EJ8?@OfOr;qTW6{%Oy zHS*;e9jb%%-+bZlMmC$FR*#JbbU@^5sl-j6K&`Zc)G z%bO~e<(fgXPcy-9uk$h-o2>H_W*-o~d0IjS=VnUqDg`01lL;)rUy8@GsTAA<+d9EA zowHNH3YkM5NuHXsEK-ojt2b^Vr|-x%5F)p+K^H5%jUr7mlv`_cz=1IItEe;qxewF3 zP^&D`_UQaARG@lg8q7cf9QC&`r=hSQD7_#^b3RLO+zo=qvnW}8=>!4K;~+2@%0#>g zGULG#%`frNvbRcpu}Biwy!PoDqk)Hdy^HWLqqy4+?Kx=?6Ez-7PiBd_b zjT>v1?l|lN3_B0lb%%WzU3bbp!cKdn9LHW{kbZo6kMH+>e2@Bcd%O9M_vBUBu&lqW zmB#`3D;V++CTjI8il`l<#O~Qh%TDYhwO$S68r>M%y$#x+9eMT| z+2c8)-qaJEHj2i@{@mNL#QD52cc$>KoH_Uu-n>B@kF28c`s?p4?pu}%{_W|>WW|K=BbwNf&4q&23bdHh(8TVu=MYf&uWkjhUXZ|Nh(yBD?CaC z1~Q_M#CSmf(cIxoq)DcNrg3OzM34kmw6-gq-iTnSM8wCKG8u|!s6{nl3&VZPf^mR% zkFzYE;c!Cun91D$!oSX$G*J>FrY3^k?QImtcnIEE#yDkkJve0}lE-Q#`e2x*@c=^x zgKo;%Aiz%<9DWjUCh^+|QFvmu(hJ6ME}6iSNJ-qD4rzPvOjpWaCAylVz=&o8(ug=@ z7f#YBWC8As@Ze13Y_JcR8W@XLIFfjGX0qyxmRk)@NG!E+q>KSiA#1&dfoT}3=*3gU zGKmG#IEi60=PHT~*5!7(Smi1p+~TRioP|tE@B(s47_v-}Va$BZN41GQ37#iINISg& z7wP^m6u@hFc?aSn+JCpbwd^Vi{394~6*J4wc@y#fu62_nT%53MPi?PD3m zjH@H#t=}bzrrRi5SZO9Q}36(RGis_MV!}@!lueJy4N~*|Io} zbge*4VC$#~{J)UbVS@$4^)UKv2F0LSdm7Cm4;t*Pn=z=d^-NYApJ&&n91*(RcmJ}w z5Q;Bx>vC2cT=K&2ULkGkKu?^NHcwA{TezSRb(lc*R%D}xZ-C`HVpHplLR)}BU%AFf z7>f;IgQ9fdzDkHH-8h9COPag7yn741-z?n0XAyUfpP-w4wtH0aw3o;u_Q|)5n@c?+fUsJZ6t~G%8Ja4Q-(<$8-Jz DxAhl- diff --git a/flask/venv/lib/python3.6/site-packages/argh/__pycache__/io.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/argh/__pycache__/io.cpython-36.pyc deleted file mode 100644 index 73357b92e7d9a25db46a97c0636aefe43d17778b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2301 zcmaJ?-HzKt81--BxY-s;k&qD8+#njMn~L^=YK0JL1)_kqmAa);RFTYjCW*6-ZDz*X z%__@Hco}#k-*QzRfh*28_GVL5urxEaXXg7k-C$3YuIf%>>LYB^aPnJMYxE=hk2cPQV|q>ggYf*vnBhSwkbq{DmWoXa#cXOr z_P9_=CMH|4InPBVHEU93OB9aJB(vo}1&7wm6?o@iWv2TN-@-FiT|}=UbakAf?f@rG zq@o1to{?u}Y*wYLJ6VzNOxCw%(v(V0C1Mblj_OXsfVv|jF~MR5H{h^SN0+N?A)0QF ze1_;4nkHnOFn0T1pPCnW3Av|-Fb>cxZx(p5I7cUe0)~s0F(z1pOCs3#7v9=a->tnx zxN$^y;;DnHRlvEk_C#j`#^<+97gd4IrVExDmhhY%OZHl&#$d`6?V4$tNmd*$P^e*SZTw_+E%}PpzsOSp>MlD@bFNlQ z8-;=~6q)BMR+u?TF1X>0z;6v4%~9Gjo){RI^V77butt_L7n&7tjp=7AGskOtI1U=e z?av3pv*w$)HNhboY9nxDCoI*Bv&k6jKSI5qJbkHnSxSY8mJP7Y4dY27iH{QmJFzK| zr8`xV$^elIcB~{nvEfXPS4Qed8#}FhV#w3e9|$C!E=v%YYh5j6V_qU^gikPFSql)W zau8fIUCJco+19INe!DcyjVeTyNP&PY3`v&C9JK+$JN}R6mA=dJf^i{I1M%P)ot#$g z$SIP>Ia^B6?rM>{|NqEQsrR$=!6m2m|z=C7|(@vR& zL@{}1u#4zRY56D5fDTvz+H7&N4yXb{2Hvb#E*p#BUUOCj5t!?3MDVucCYf6Rci6k5 zCfl{d#7681wU)x^)NXA!&qN`0{+R(`%PdV&QY$5YsZzD&ev9#yJgEDB=%yz?*?w)jlJuB-;3W?DpD(}RCIS3XYD}mJ!q1_<^_Gy41=)0=6R diff --git a/flask/venv/lib/python3.6/site-packages/argh/__pycache__/utils.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/argh/__pycache__/utils.cpython-36.pyc deleted file mode 100644 index 373cf687c17d68083ab4646653f58e58c0500534..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1579 zcmZWpPj4JG6t_LIv(srBiqwK4aj=j;Oq5O#NUgMrBBGW^y_AYAmlbHoJNE8+y^BLkmy;8yQrwkhS}qSxG%6=R;NFPZ4N;!(E{nr<-Bw{eu6IWYhuZgTtNO4 zVm`IO&v;3AxPyjhiS+=y!VA!O4=RY*Ul^f;!unR&R#%4FxuAnWF=GZf)3b(YBeLh*)(TCfYlK-JPFh-5 z>I~BA69X#L%qmVblSUX&sW>e}JtphwT2QX@nO zd1|UyaY7k&W!Kz&mf@sdpr_=SX z&cAC+--1Nl_RX^H!#A@90=*aEyW}p8Nr?45c)xM`t}D;p3=|8DT{^~MOBR9C^zITb zU;>Mtah<@w}AO;TWeaTfKhp&OzwlhKfu(^4tS?Zo(SNP zG->9I`Zo0H{%0ZNG-;$A47&vG&%HzKT_5tp({`~mt1K`#EgB$}(C%gdUh%q{E_A;C z9mkd%2gDmYqq|%agFsP&6Z`?z4(usDPWxSdJmz&V9&1Mg{UL~vt84D7@&ohE8}U7& a{mkQovgWN4hud(>Bp^Z@!=$%@WanSyn!)A( diff --git a/flask/venv/lib/python3.6/site-packages/argh/assembling.py b/flask/venv/lib/python3.6/site-packages/argh/assembling.py deleted file mode 100644 index afe7ba7..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh/assembling.py +++ /dev/null @@ -1,501 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2010—2014 Andrey Mikhaylenko and contributors -# -# This file is part of Argh. -# -# Argh is free software under terms of the GNU Lesser -# General Public License version 3 (LGPLv3) as published by the Free -# Software Foundation. See the file README.rst for copying conditions. -# -""" -Assembling -~~~~~~~~~~ - -Functions and classes to properly assemble your commands in a parser. -""" -import argparse -import sys -import warnings - -from argh.completion import COMPLETION_ENABLED -from argh.compat import OrderedDict -from argh.constants import ( - ATTR_ALIASES, - ATTR_ARGS, - ATTR_NAME, - ATTR_EXPECTS_NAMESPACE_OBJECT, - PARSER_FORMATTER, - DEFAULT_ARGUMENT_TEMPLATE, - DEST_FUNCTION, -) -from argh.utils import get_subparsers, get_arg_spec -from argh.exceptions import AssemblingError - - -__all__ = [ - 'SUPPORTS_ALIASES', - 'set_default_command', - 'add_commands', - 'add_subcommands', -] - - -def _check_support_aliases(): - p = argparse.ArgumentParser() - s = p.add_subparsers() - try: - s.add_parser('x', aliases=[]) - except TypeError: - return False - else: - return True - - -SUPPORTS_ALIASES = _check_support_aliases() -""" -Calculated on load. If `True`, current version of argparse supports -alternative command names (can be set via :func:`~argh.decorators.aliases`). -""" - - -def _get_args_from_signature(function): - if getattr(function, ATTR_EXPECTS_NAMESPACE_OBJECT, False): - return - - spec = get_arg_spec(function) - - defaults = dict(zip(*[reversed(x) for x in (spec.args, - spec.defaults or [])])) - defaults.update(getattr(spec, 'kwonlydefaults', None) or {}) - - kwonly = getattr(spec, 'kwonlyargs', []) - - if sys.version_info < (3,0): - annotations = {} - else: - annotations = dict((k,v) for k,v in function.__annotations__.items() - if isinstance(v, str)) - - # define the list of conflicting option strings - # (short forms, i.e. single-character ones) - chars = [a[0] for a in spec.args + kwonly] - char_counts = dict((char, chars.count(char)) for char in set(chars)) - conflicting_opts = tuple(char for char in char_counts - if 1 < char_counts[char]) - - for name in spec.args + kwonly: - flags = [] # name_or_flags - akwargs = {} # keyword arguments for add_argument() - - if name in annotations: - # help message: func(a : "b") -> add_argument("a", help="b") - akwargs.update(help=annotations.get(name)) - - if name in defaults or name in kwonly: - if name in defaults: - akwargs.update(default=defaults.get(name)) - else: - akwargs.update(required=True) - flags = ('-{0}'.format(name[0]), '--{0}'.format(name)) - if name.startswith(conflicting_opts): - # remove short name - flags = flags[1:] - - else: - # positional argument - flags = (name,) - - # cmd(foo_bar) -> add_argument('foo-bar') - flags = tuple(x.replace('_', '-') for x in flags) - - yield dict(option_strings=flags, **akwargs) - - if spec.varargs: - # *args - yield dict(option_strings=[spec.varargs], nargs='*') - - -def _guess(kwargs): - """ - Adds types, actions, etc. to given argument specification. - For example, ``default=3`` implies ``type=int``. - - :param arg: a :class:`argh.utils.Arg` instance - """ - guessed = {} - - # Parser actions that accept argument 'type' - TYPE_AWARE_ACTIONS = 'store', 'append' - - # guess type/action from default value - value = kwargs.get('default') - if value is not None: - if isinstance(value, bool): - if kwargs.get('action') is None: - # infer action from default value - guessed['action'] = 'store_false' if value else 'store_true' - elif kwargs.get('type') is None: - # infer type from default value - # (make sure that action handler supports this keyword) - if kwargs.get('action', 'store') in TYPE_AWARE_ACTIONS: - guessed['type'] = type(value) - - # guess type from choices (first item) - if kwargs.get('choices') and 'type' not in list(guessed) + list(kwargs): - guessed['type'] = type(kwargs['choices'][0]) - - return dict(kwargs, **guessed) - - -def _is_positional(args, prefix_chars='-'): - assert args - if 1 < len(args) or args[0][0].startswith(tuple(prefix_chars)): - return False - else: - return True - - -def _get_parser_param_kwargs(parser, argspec): - argspec = argspec.copy() # parser methods modify source data - args = argspec['option_strings'] - - if _is_positional(args, prefix_chars=parser.prefix_chars): - get_kwargs = parser._get_positional_kwargs - else: - get_kwargs = parser._get_optional_kwargs - - kwargs = get_kwargs(*args, **argspec) - - kwargs['dest'] = kwargs['dest'].replace('-', '_') - - return kwargs - - -def _get_dest(parser, argspec): - kwargs = _get_parser_param_kwargs(parser, argspec) - return kwargs['dest'] - - -def _require_support_for_default_command_with_subparsers(): - if sys.version_info < (3,4): - raise AssemblingError( - 'Argparse library bundled with this version of Python ' - 'does not support combining a default command with nested ones.') - - -def set_default_command(parser, function): - """ - Sets default command (i.e. a function) for given parser. - - If `parser.description` is empty and the function has a docstring, - it is used as the description. - - .. note:: - - An attempt to set default command to a parser which already has - subparsers (e.g. added with :func:`~argh.assembling.add_commands`) - results in a `AssemblingError`. - - .. note:: - - If there are both explicitly declared arguments (e.g. via - :func:`~argh.decorators.arg`) and ones inferred from the function - signature (e.g. via :func:`~argh.decorators.command`), declared ones - will be merged into inferred ones. If an argument does not conform - function signature, `AssemblingError` is raised. - - .. note:: - - If the parser was created with ``add_help=True`` (which is by default), - option name ``-h`` is silently removed from any argument. - - """ - if parser._subparsers: - _require_support_for_default_command_with_subparsers() - - spec = get_arg_spec(function) - - declared_args = getattr(function, ATTR_ARGS, []) - inferred_args = list(_get_args_from_signature(function)) - - if inferred_args and declared_args: - # We've got a mixture of declared and inferred arguments - - # a mapping of "dest" strings to argument declarations. - # - # * a "dest" string is a normalized form of argument name, i.e.: - # - # '-f', '--foo' → 'foo' - # 'foo-bar' → 'foo_bar' - # - # * argument declaration is a dictionary representing an argument; - # it is obtained either from _get_args_from_signature() or from - # an @arg decorator (as is). - # - dests = OrderedDict() - - for argspec in inferred_args: - dest = _get_parser_param_kwargs(parser, argspec)['dest'] - dests[dest] = argspec - - for declared_kw in declared_args: - # an argument is declared via decorator - dest = _get_dest(parser, declared_kw) - if dest in dests: - # the argument is already known from function signature - # - # now make sure that this declared arg conforms to the function - # signature and therefore only refines an inferred arg: - # - # @arg('my-foo') maps to func(my_foo) - # @arg('--my-bar') maps to func(my_bar=...) - - # either both arguments are positional or both are optional - decl_positional = _is_positional(declared_kw['option_strings']) - infr_positional = _is_positional(dests[dest]['option_strings']) - if decl_positional != infr_positional: - kinds = {True: 'positional', False: 'optional'} - raise AssemblingError( - '{func}: argument "{dest}" declared as {kind_i} ' - '(in function signature) and {kind_d} (via decorator)' - .format( - func=function.__name__, - dest=dest, - kind_i=kinds[infr_positional], - kind_d=kinds[decl_positional], - )) - - # merge explicit argument declaration into the inferred one - # (e.g. `help=...`) - dests[dest].update(**declared_kw) - else: - # the argument is not in function signature - varkw = getattr(spec, 'varkw', getattr(spec, 'keywords', [])) - if varkw: - # function accepts **kwargs; the argument goes into it - dests[dest] = declared_kw - else: - # there's no way we can map the argument declaration - # to function signature - xs = (dests[x]['option_strings'] for x in dests) - raise AssemblingError( - '{func}: argument {flags} does not fit ' - 'function signature: {sig}'.format( - flags=', '.join(declared_kw['option_strings']), - func=function.__name__, - sig=', '.join('/'.join(x) for x in xs))) - - # pack the modified data back into a list - inferred_args = dests.values() - - command_args = inferred_args or declared_args - - # add types, actions, etc. (e.g. default=3 implies type=int) - command_args = [_guess(x) for x in command_args] - - for draft in command_args: - draft = draft.copy() - if 'help' not in draft: - draft.update(help=DEFAULT_ARGUMENT_TEMPLATE) - dest_or_opt_strings = draft.pop('option_strings') - if parser.add_help and '-h' in dest_or_opt_strings: - dest_or_opt_strings = [x for x in dest_or_opt_strings if x != '-h'] - completer = draft.pop('completer', None) - try: - action = parser.add_argument(*dest_or_opt_strings, **draft) - if COMPLETION_ENABLED and completer: - action.completer = completer - except Exception as e: - raise type(e)('{func}: cannot add arg {args}: {msg}'.format( - args='/'.join(dest_or_opt_strings), func=function.__name__, msg=e)) - - if function.__doc__ and not parser.description: - parser.description = function.__doc__ - parser.set_defaults(**{ - DEST_FUNCTION: function, - }) - - -def add_commands(parser, functions, namespace=None, namespace_kwargs=None, - func_kwargs=None, - # deprecated args: - title=None, description=None, help=None): - """ - Adds given functions as commands to given parser. - - :param parser: - - an :class:`argparse.ArgumentParser` instance. - - :param functions: - - a list of functions. A subparser is created for each of them. - If the function is decorated with :func:`~argh.decorators.arg`, the - arguments are passed to :class:`argparse.ArgumentParser.add_argument`. - See also :func:`~argh.dispatching.dispatch` for requirements - concerning function signatures. The command name is inferred from the - function name. Note that the underscores in the name are replaced with - hyphens, i.e. function name "foo_bar" becomes command name "foo-bar". - - :param namespace: - - an optional string representing the group of commands. For example, if - a command named "hello" is added without the namespace, it will be - available as "prog.py hello"; if the namespace if specified as "greet", - then the command will be accessible as "prog.py greet hello". The - namespace itself is not callable, so "prog.py greet" will fail and only - display a help message. - - :param func_kwargs: - - a `dict` of keyword arguments to be passed to each nested ArgumentParser - instance created per command (i.e. per function). Members of this - dictionary have the highest priority, so a function's docstring is - overridden by a `help` in `func_kwargs` (if present). - - :param namespace_kwargs: - - a `dict` of keyword arguments to be passed to the nested ArgumentParser - instance under given `namespace`. - - Deprecated params that should be moved into `namespace_kwargs`: - - :param title: - - passed to :meth:`argparse.ArgumentParser.add_subparsers` as `title`. - - .. deprecated:: 0.26.0 - - Please use `namespace_kwargs` instead. - - :param description: - - passed to :meth:`argparse.ArgumentParser.add_subparsers` as - `description`. - - .. deprecated:: 0.26.0 - - Please use `namespace_kwargs` instead. - - :param help: - - passed to :meth:`argparse.ArgumentParser.add_subparsers` as `help`. - - .. deprecated:: 0.26.0 - - Please use `namespace_kwargs` instead. - - .. note:: - - This function modifies the parser object. Generally side effects are - bad practice but we don't seem to have any choice as ArgumentParser is - pretty opaque. - You may prefer :class:`~argh.helpers.ArghParser.add_commands` for a bit - more predictable API. - - .. note:: - - An attempt to add commands to a parser which already has a default - function (e.g. added with :func:`~argh.assembling.set_default_command`) - results in `AssemblingError`. - - """ - # FIXME "namespace" is a correct name but it clashes with the "namespace" - # that represents arguments (argparse.Namespace and our ArghNamespace). - # We should rename the argument here. - - if DEST_FUNCTION in parser._defaults: - _require_support_for_default_command_with_subparsers() - - namespace_kwargs = namespace_kwargs or {} - - # FIXME remove this by 1.0 - # - if title: - warnings.warn('argument `title` is deprecated in add_commands(),' - ' use `parser_kwargs` instead', DeprecationWarning) - namespace_kwargs['description'] = title - if help: - warnings.warn('argument `help` is deprecated in add_commands(),' - ' use `parser_kwargs` instead', DeprecationWarning) - namespace_kwargs['help'] = help - if description: - warnings.warn('argument `description` is deprecated in add_commands(),' - ' use `parser_kwargs` instead', DeprecationWarning) - namespace_kwargs['description'] = description - # - # / - - subparsers_action = get_subparsers(parser, create=True) - - if namespace: - # Make a nested parser and init a deeper _SubParsersAction under it. - - # Create a named group of commands. It will be listed along with - # root-level commands in ``app.py --help``; in that context its `title` - # can be used as a short description on the right side of its name. - # Normally `title` is shown above the list of commands - # in ``app.py my-namespace --help``. - subsubparser_kw = { - 'help': namespace_kwargs.get('title'), - } - subsubparser = subparsers_action.add_parser(namespace, **subsubparser_kw) - subparsers_action = subsubparser.add_subparsers(**namespace_kwargs) - else: - assert not namespace_kwargs, ('`parser_kwargs` only makes sense ' - 'with `namespace`.') - - for func in functions: - cmd_name, func_parser_kwargs = _extract_command_meta_from_func(func) - - # override any computed kwargs by manually supplied ones - if func_kwargs: - func_parser_kwargs.update(func_kwargs) - - # create and set up the parser for this command - command_parser = subparsers_action.add_parser(cmd_name, **func_parser_kwargs) - set_default_command(command_parser, func) - - -def _extract_command_meta_from_func(func): - # use explicitly defined name; if none, use function name (a_b → a-b) - cmd_name = getattr(func, ATTR_NAME, - func.__name__.replace('_','-')) - - func_parser_kwargs = { - - # add command help from function's docstring - 'help': func.__doc__, - - # set default formatter - 'formatter_class': PARSER_FORMATTER, - - } - - # try adding aliases for command name - if SUPPORTS_ALIASES: - func_parser_kwargs['aliases'] = getattr(func, ATTR_ALIASES, []) - - return cmd_name, func_parser_kwargs - - -def add_subcommands(parser, namespace, functions, **namespace_kwargs): - """ - A wrapper for :func:`add_commands`. - - These examples are equivalent:: - - add_commands(parser, [get, put], namespace='db', - namespace_kwargs={ - 'title': 'database commands', - 'help': 'CRUD for our silly database' - }) - - add_subcommands(parser, 'db', [get, put], - title='database commands', - help='CRUD for our silly database') - - """ - add_commands(parser, functions, namespace=namespace, - namespace_kwargs=namespace_kwargs) diff --git a/flask/venv/lib/python3.6/site-packages/argh/compat.py b/flask/venv/lib/python3.6/site-packages/argh/compat.py deleted file mode 100644 index 58c6a57..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh/compat.py +++ /dev/null @@ -1,92 +0,0 @@ -# originally inspired by "six" by Benjamin Peterson - -import inspect -import sys - - -if sys.version_info < (3,0): - text_type = unicode - binary_type = str - - import StringIO - StringIO = BytesIO = StringIO.StringIO -else: - text_type = str - binary_type = bytes - - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - - -def getargspec_permissive(func): - """ - An `inspect.getargspec` with a relaxed sanity check to support Cython. - - Motivation: - - A Cython-compiled function is *not* an instance of Python's - types.FunctionType. That is the sanity check the standard Py2 - library uses in `inspect.getargspec()`. So, an exception is raised - when calling `argh.dispatch_command(cythonCompiledFunc)`. However, - the CyFunctions do have perfectly usable `.func_code` and - `.func_defaults` which is all `inspect.getargspec` needs. - - This function just copies `inspect.getargspec()` from the standard - library but relaxes the test to a more duck-typing one of having - both `.func_code` and `.func_defaults` attributes. - """ - if inspect.ismethod(func): - func = func.im_func - - # Py2 Stdlib uses isfunction(func) which is too strict for Cython-compiled - # functions though such have perfectly usable func_code, func_defaults. - if not (hasattr(func, "func_code") and hasattr(func, "func_defaults")): - raise TypeError('{!r} missing func_code or func_defaults'.format(func)) - - args, varargs, varkw = inspect.getargs(func.func_code) - return inspect.ArgSpec(args, varargs, varkw, func.func_defaults) - - -if sys.version_info < (3,0): - getargspec = getargspec_permissive -else: - # in Python 3 the basic getargspec doesn't support keyword-only arguments - # and annotations and raises ValueError if they are discovered - getargspec = inspect.getfullargspec - - -class _PrimitiveOrderedDict(dict): - """ - A poor man's OrderedDict replacement for compatibility with Python 2.6. - Implements only the basic features. May easily break if non-overloaded - methods are used. - """ - def __init__(self, *args, **kwargs): - super(_PrimitiveOrderedDict, self).__init__(*args, **kwargs) - self._seq = [] - - def __setitem__(self, key, value): - super(_PrimitiveOrderedDict, self).__setitem__(key, value) - if key not in self._seq: - self._seq.append(key) - - def __delitem__(self, key): - super(_PrimitiveOrderedDict, self).__delitem__(key) - idx = self._seq.index(key) - del self._seq[idx] - - def __iter__(self): - return iter(self._seq) - - def keys(self): - return list(self) - - def values(self): - return [self[k] for k in self] - - -try: - from collections import OrderedDict -except ImportError: - OrderedDict = _PrimitiveOrderedDict diff --git a/flask/venv/lib/python3.6/site-packages/argh/completion.py b/flask/venv/lib/python3.6/site-packages/argh/completion.py deleted file mode 100644 index 01b0818..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh/completion.py +++ /dev/null @@ -1,94 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2010—2014 Andrey Mikhaylenko and contributors -# -# This file is part of Argh. -# -# Argh is free software under terms of the GNU Lesser -# General Public License version 3 (LGPLv3) as published by the Free -# Software Foundation. See the file README.rst for copying conditions. -# -""" -Shell completion -~~~~~~~~~~~~~~~~ - -Command and argument completion is a great way to reduce the number of -keystrokes and improve user experience. - -To display suggestions when you press :kbd:`tab`, a shell must obtain choices -from your program. It calls the program in a specific environment and expects -it to return a list of relevant choices. - -`Argparse` does not support completion out of the box. However, there are -3rd-party apps that do the job, such as argcomplete_ and -python-selfcompletion_. - -`Argh` supports only argcomplete_ which doesn't require subclassing -the parser and monkey-patches it instead. Combining `Argh` -with python-selfcompletion_ isn't much harder though: simply use -`SelfCompletingArgumentParser` instead of vanilla `ArgumentParser`. - -See installation details and gotchas in the documentation of the 3rd-party app -you've chosen for the completion backend. - -`Argh` automatically enables completion if argcomplete_ is available -(see :attr:`COMPLETION_ENABLED`). If completion is undesirable in given app by -design, it can be turned off by setting ``completion=False`` -in :func:`argh.dispatching.dispatch`. - -Note that you don't *have* to add completion via `Argh`; it doesn't matter -whether you let it do it for you or use the underlying API. - -.. _argcomplete: https://github.com/kislyuk/argcomplete -.. _python-selfcompletion: https://github.com/dbarnett/python-selfcompletion - -Argument-level completion -------------------------- - -Argcomplete_ supports custom "completers". The documentation suggests adding -the completer as an attribute of the argument parser action:: - - parser.add_argument("--env-var1").completer = EnvironCompleter - -However, this doesn't fit the normal `Argh`-assisted workflow. -It is recommended to use the :func:`~argh.decorators.arg` decorator:: - - @arg('--env-var1', completer=EnvironCompleter) - def func(...): - ... - -""" -import logging -import os - - -COMPLETION_ENABLED = False -""" -Dynamically set to `True` on load if argcomplete_ was successfully imported. -""" - -try: - import argcomplete -except ImportError: - pass -else: - COMPLETION_ENABLED = True - - -__all__ = ['autocomplete', 'COMPLETION_ENABLED'] - - -logger = logging.getLogger(__package__) - - -def autocomplete(parser): - """ - Adds support for shell completion via argcomplete_ by patching given - `argparse.ArgumentParser` (sub)class. - - If completion is not enabled, logs a debug-level message. - """ - if COMPLETION_ENABLED: - argcomplete.autocomplete(parser) - elif 'bash' in os.getenv('SHELL', ''): - logger.debug('Bash completion not available. Install argcomplete.') diff --git a/flask/venv/lib/python3.6/site-packages/argh/constants.py b/flask/venv/lib/python3.6/site-packages/argh/constants.py deleted file mode 100644 index f295944..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh/constants.py +++ /dev/null @@ -1,103 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2010—2014 Andrey Mikhaylenko and contributors -# -# This file is part of Argh. -# -# Argh is free software under terms of the GNU Lesser -# General Public License version 3 (LGPLv3) as published by the Free -# Software Foundation. See the file README.rst for copying conditions. -# -import argparse - -__all__ = ( - 'ATTR_NAME', 'ATTR_ALIASES', 'ATTR_ARGS', 'ATTR_WRAPPED_EXCEPTIONS', - 'ATTR_WRAPPED_EXCEPTIONS_PROCESSOR', 'ATTR_EXPECTS_NAMESPACE_OBJECT', - 'PARSER_FORMATTER', 'DEFAULT_ARGUMENT_TEMPLATE', 'DEST_FUNCTION', -) - - -# -# Names of function attributes where Argh stores command behaviour -# - -#: explicit command name (differing from function name) -ATTR_NAME = 'argh_name' - -#: alternative command names -ATTR_ALIASES = 'argh_aliases' - -#: declared arguments -ATTR_ARGS = 'argh_args' - -#: list of exception classes that should be wrapped and printed as results -ATTR_WRAPPED_EXCEPTIONS = 'argh_wrap_errors' - -#: a function to preprocess the exception object when it is wrapped -ATTR_WRAPPED_EXCEPTIONS_PROCESSOR = 'argh_wrap_errors_processor' - -#: forcing argparse.Namespace object instead of signature introspection -ATTR_EXPECTS_NAMESPACE_OBJECT = 'argh_expects_namespace_object' - -# -# Dest names in parser defaults -# - -#: dest name for a function mapped to given endpoint (goes to Namespace obj) -DEST_FUNCTION = 'function' - -# -# Other library-wide stuff -# - -class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, - argparse.RawDescriptionHelpFormatter): - def _expand_help(self, action): - """ - This method is copied verbatim from ArgumentDefaultsHelpFormatter with - a couple of lines added just before the end. Reason: we need to - `repr()` default values instead of simply inserting them as is. - This helps notice, for example, an empty string as the default value; - moreover, it prevents breaking argparse due to logical quirks inside - of its formatters. - - Ideally this could be achieved by simply defining - :attr:`DEFAULT_ARGUMENT_TEMPLATE` as ``{default!r}`` but unfortunately - argparse only supports the old printf syntax. - """ - params = dict(vars(action), prog=self._prog) - for name in list(params): - if params[name] is argparse.SUPPRESS: - del params[name] - for name in list(params): - if hasattr(params[name], '__name__'): - params[name] = params[name].__name__ - if params.get('choices') is not None: - choices_str = ', '.join([str(c) for c in params['choices']]) - params['choices'] = choices_str - - # XXX this is added in Argh vs. argparse.ArgumentDefaultsHelpFormatter - # (avoiding empty strings, otherwise Argparse would die with - # an IndexError in _format_action) - # - if 'default' in params: - if params['default'] is None: - params['default'] = '-' - else: - params['default'] = repr(params['default']) - # - # / - - return self._get_help_string(action) % params - - -#: Default formatter to be used in implicitly instantiated ArgumentParser. -PARSER_FORMATTER = CustomFormatter - - -DEFAULT_ARGUMENT_TEMPLATE = '%(default)s' -""" -Default template of argument help message (see issue #64). -The template ``%(default)s`` is used by `argparse` to display the argument's -default value. -""" diff --git a/flask/venv/lib/python3.6/site-packages/argh/decorators.py b/flask/venv/lib/python3.6/site-packages/argh/decorators.py deleted file mode 100644 index da176e6..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh/decorators.py +++ /dev/null @@ -1,195 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2010—2014 Andrey Mikhaylenko and contributors -# -# This file is part of Argh. -# -# Argh is free software under terms of the GNU Lesser -# General Public License version 3 (LGPLv3) as published by the Free -# Software Foundation. See the file README.rst for copying conditions. -# -""" -Command decorators -~~~~~~~~~~~~~~~~~~ -""" -from argh.constants import (ATTR_ALIASES, ATTR_ARGS, ATTR_NAME, - ATTR_WRAPPED_EXCEPTIONS, - ATTR_WRAPPED_EXCEPTIONS_PROCESSOR, - ATTR_EXPECTS_NAMESPACE_OBJECT) - - -__all__ = ['aliases', 'named', 'arg', 'wrap_errors', 'expects_obj'] - - -def named(new_name): - """ - Sets given string as command name instead of the function name. - The string is used verbatim without further processing. - - Usage:: - - @named('load') - def do_load_some_stuff_and_keep_the_original_function_name(args): - ... - - The resulting command will be available only as ``load``. To add aliases - without renaming the command, check :func:`aliases`. - - .. versionadded:: 0.19 - """ - def wrapper(func): - setattr(func, ATTR_NAME, new_name) - return func - return wrapper - - -def aliases(*names): - """ - Defines alternative command name(s) for given function (along with its - original name). Usage:: - - @aliases('co', 'check') - def checkout(args): - ... - - The resulting command will be available as ``checkout``, ``check`` and ``co``. - - .. note:: - - This decorator only works with a recent version of argparse (see `Python - issue 9324`_ and `Python rev 4c0426`_). Such version ships with - **Python 3.2+** and may be available in other environments as a separate - package. Argh does not issue warnings and simply ignores aliases if - they are not supported. See :attr:`~argh.assembling.SUPPORTS_ALIASES`. - - .. _Python issue 9324: http://bugs.python.org/issue9324 - .. _Python rev 4c0426: http://hg.python.org/cpython/rev/4c0426261148/ - - .. versionadded:: 0.19 - """ - def wrapper(func): - setattr(func, ATTR_ALIASES, names) - return func - return wrapper - - -def arg(*args, **kwargs): - """ - Declares an argument for given function. Does not register the function - anywhere, nor does it modify the function in any way. - - The signature of the decorator matches that of - :meth:`argparse.ArgumentParser.add_argument`, only some keywords are not - required if they can be easily guessed (e.g. you don't have to specify type - or action when an `int` or `bool` default value is supplied). - - Typical use cases: - - - In combination with :func:`expects_obj` (which is not recommended); - - in combination with ordinary function signatures to add details that - cannot be expressed with that syntax (e.g. help message). - - Usage:: - - from argh import arg - - @arg('path', help='path to the file to load') - @arg('--format', choices=['yaml','json']) - @arg('-v', '--verbosity', choices=range(0,3), default=2) - def load(path, something=None, format='json', dry_run=False, verbosity=1): - loaders = {'json': json.load, 'yaml': yaml.load} - loader = loaders[args.format] - data = loader(args.path) - if not args.dry_run: - if verbosity < 1: - print('saving to the database') - put_to_database(data) - - In this example: - - - `path` declaration is extended with `help`; - - `format` declaration is extended with `choices`; - - `dry_run` declaration is not duplicated; - - `verbosity` is extended with `choices` and the default value is - overridden. (If both function signature and `@arg` define a default - value for an argument, `@arg` wins.) - - .. note:: - - It is recommended to avoid using this decorator unless there's no way - to tune the argument's behaviour or presentation using ordinary - function signatures. Readability counts, don't repeat yourself. - - """ - def wrapper(func): - declared_args = getattr(func, ATTR_ARGS, []) - # The innermost decorator is called first but appears last in the code. - # We need to preserve the expected order of positional arguments, so - # the outermost decorator inserts its value before the innermost's: - declared_args.insert(0, dict(option_strings=args, **kwargs)) - setattr(func, ATTR_ARGS, declared_args) - return func - return wrapper - - -def wrap_errors(errors=None, processor=None, *args): - """ - Decorator. Wraps given exceptions into - :class:`~argh.exceptions.CommandError`. Usage:: - - @wrap_errors([AssertionError]) - def foo(x=None, y=None): - assert x or y, 'x or y must be specified' - - If the assertion fails, its message will be correctly printed and the - stack hidden. This helps to avoid boilerplate code. - - :param errors: - A list of exception classes to catch. - :param processor: - A callable that expects the exception object and returns a string. - For example, this renders all wrapped errors in red colour:: - - from termcolor import colored - - def failure(err): - return colored(str(err), 'red') - - @wrap_errors(processor=failure) - def my_command(...): - ... - - """ - - def wrapper(func): - if errors: - setattr(func, ATTR_WRAPPED_EXCEPTIONS, errors) - - if processor: - setattr(func, ATTR_WRAPPED_EXCEPTIONS_PROCESSOR, processor) - - return func - return wrapper - - -def expects_obj(func): - """ - Marks given function as expecting a namespace object. - - Usage:: - - @arg('bar') - @arg('--quux', default=123) - @expects_obj - def foo(args): - yield args.bar, args.quux - - This is equivalent to:: - - def foo(bar, quux=123): - yield bar, quux - - In most cases you don't need this decorator. - """ - setattr(func, ATTR_EXPECTS_NAMESPACE_OBJECT, True) - return func diff --git a/flask/venv/lib/python3.6/site-packages/argh/dispatching.py b/flask/venv/lib/python3.6/site-packages/argh/dispatching.py deleted file mode 100644 index 78efc11..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh/dispatching.py +++ /dev/null @@ -1,382 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2010—2014 Andrey Mikhaylenko and contributors -# -# This file is part of Argh. -# -# Argh is free software under terms of the GNU Lesser -# General Public License version 3 (LGPLv3) as published by the Free -# Software Foundation. See the file README.rst for copying conditions. -# -""" -Dispatching -~~~~~~~~~~~ -""" -import argparse -import sys -from types import GeneratorType - -from argh import compat, io -from argh.constants import ( - ATTR_WRAPPED_EXCEPTIONS, - ATTR_WRAPPED_EXCEPTIONS_PROCESSOR, - ATTR_EXPECTS_NAMESPACE_OBJECT, - PARSER_FORMATTER, - DEST_FUNCTION, -) -from argh.completion import autocomplete -from argh.assembling import add_commands, set_default_command -from argh.exceptions import DispatchingError, CommandError -from argh.utils import get_arg_spec - - -__all__ = ['dispatch', 'dispatch_command', 'dispatch_commands', - 'PARSER_FORMATTER', 'EntryPoint'] - - -class ArghNamespace(argparse.Namespace): - """ - A namespace object which collects the stack of functions (the - :attr:`~argh.constants.DEST_FUNCTION` arguments passed to it via - parser's defaults). - """ - def __init__(self, *args, **kw): - super(ArghNamespace, self).__init__(*args, **kw) - self._functions_stack = [] - - def __setattr__(self, k, v): - if k == DEST_FUNCTION: - # don't register the function under DEST_FUNCTION name. - # If `ArgumentParser.parse_known_args()` sees that we already have - # such attribute, it skips it. However, it goes from the topmost - # parser to subparsers. We need the function mapped to the - # subparser. So we fool the `ArgumentParser` and pretend that we - # didn't get a DEST_FUNCTION attribute; however, in fact we collect - # all its values in a stack. The last item in the stack would be - # the function mapped to the innermost parser — the one we need. - self._functions_stack.append(v) - else: - super(ArghNamespace, self).__setattr__(k, v) - - def get_function(self): - return self._functions_stack[-1] - - -def dispatch(parser, argv=None, add_help_command=True, - completion=True, pre_call=None, - output_file=sys.stdout, errors_file=sys.stderr, - raw_output=False, namespace=None, - skip_unknown_args=False): - """ - Parses given list of arguments using given parser, calls the relevant - function and prints the result. - - The target function should expect one positional argument: the - :class:`argparse.Namespace` object. However, if the function is decorated with - :func:`~argh.decorators.plain_signature`, the positional and named - arguments from the namespace object are passed to the function instead - of the object itself. - - :param parser: - - the ArgumentParser instance. - - :param argv: - - a list of strings representing the arguments. If `None`, ``sys.argv`` - is used instead. Default is `None`. - - :param add_help_command: - - if `True`, converts first positional argument "help" to a keyword - argument so that ``help foo`` becomes ``foo --help`` and displays usage - information for "foo". Default is `True`. - - :param output_file: - - A file-like object for output. If `None`, the resulting lines are - collected and returned as a string. Default is ``sys.stdout``. - - :param errors_file: - - Same as `output_file` but for ``sys.stderr``. - - :param raw_output: - - If `True`, results are written to the output file raw, without adding - whitespaces or newlines between yielded strings. Default is `False`. - - :param completion: - - If `True`, shell tab completion is enabled. Default is `True`. (You - will also need to install it.) See :mod:`argh.completion`. - - :param skip_unknown_args: - - If `True`, unknown arguments do not cause an error - (`ArgumentParser.parse_known_args` is used). - - :param namespace: - - An `argparse.Namespace`-like object. By default an - :class:`ArghNamespace` object is used. Please note that support for - combined default and nested functions may be broken if a different - type of object is forced. - - By default the exceptions are not wrapped and will propagate. The only - exception that is always wrapped is :class:`~argh.exceptions.CommandError` - which is interpreted as an expected event so the traceback is hidden. - You can also mark arbitrary exceptions as "wrappable" by using the - :func:`~argh.decorators.wrap_errors` decorator. - """ - if completion: - autocomplete(parser) - - if argv is None: - argv = sys.argv[1:] - - if add_help_command: - if argv and argv[0] == 'help': - argv.pop(0) - argv.append('--help') - - if skip_unknown_args: - parse_args = parser.parse_known_args - else: - parse_args = parser.parse_args - - if not namespace: - namespace = ArghNamespace() - - # this will raise SystemExit if parsing fails - namespace_obj = parse_args(argv, namespace=namespace) - - function = _get_function_from_namespace_obj(namespace_obj) - - if function: - lines = _execute_command(function, namespace_obj, errors_file, - pre_call=pre_call) - else: - # no commands declared, can't dispatch; display help message - lines = [parser.format_usage()] - - if output_file is None: - # user wants a string; we create an internal temporary file-like object - # and will return its contents as a string - if sys.version_info < (3,0): - f = compat.BytesIO() - else: - f = compat.StringIO() - else: - # normally this is stdout; can be any file - f = output_file - - for line in lines: - # print the line as soon as it is generated to ensure that it is - # displayed to the user before anything else happens, e.g. - # raw_input() is called - - io.dump(line, f) - if not raw_output: - # in most cases user wants one message per line - io.dump('\n', f) - - if output_file is None: - # user wanted a string; return contents of our temporary file-like obj - f.seek(0) - return f.read() - - -def _get_function_from_namespace_obj(namespace_obj): - if isinstance(namespace_obj, ArghNamespace): - # our special namespace object keeps the stack of assigned functions - try: - function = namespace_obj.get_function() - except (AttributeError, IndexError): - return None - else: - # a custom (probably vanilla) namespace object keeps the last assigned - # function; this may be wrong but at least something may work - if not hasattr(namespace_obj, DEST_FUNCTION): - return None - function = getattr(namespace_obj, DEST_FUNCTION) - - if not function or not hasattr(function, '__call__'): - return None - - return function - - -def _execute_command(function, namespace_obj, errors_file, pre_call=None): - """ - Assumes that `function` is a callable. Tries different approaches - to call it (with `namespace_obj` or with ordinary signature). - Yields the results line by line. - - If :class:`~argh.exceptions.CommandError` is raised, its message is - appended to the results (i.e. yielded by the generator as a string). - All other exceptions propagate unless marked as wrappable - by :func:`wrap_errors`. - """ - if pre_call: # XXX undocumented because I'm unsure if it's OK - # Actually used in real projects: - # * https://google.com/search?q=argh+dispatch+pre_call - # * https://github.com/neithere/argh/issues/63 - pre_call(namespace_obj) - - # the function is nested to catch certain exceptions (see below) - def _call(): - # Actually call the function - if getattr(function, ATTR_EXPECTS_NAMESPACE_OBJECT, False): - result = function(namespace_obj) - else: - # namespace -> dictionary - _flat_key = lambda key: key.replace('-', '_') - all_input = dict((_flat_key(k), v) - for k,v in vars(namespace_obj).items()) - - # filter the namespace variables so that only those expected - # by the actual function will pass - - spec = get_arg_spec(function) - - positional = [all_input[k] for k in spec.args] - kwonly = getattr(spec, 'kwonlyargs', []) - keywords = dict((k, all_input[k]) for k in kwonly) - - # *args - if spec.varargs: - positional += getattr(namespace_obj, spec.varargs) - - # **kwargs - varkw = getattr(spec, 'varkw', getattr(spec, 'keywords', [])) - if varkw: - not_kwargs = [DEST_FUNCTION] + spec.args + [spec.varargs] + kwonly - for k in vars(namespace_obj): - if k.startswith('_') or k in not_kwargs: - continue - keywords[k] = getattr(namespace_obj, k) - - result = function(*positional, **keywords) - - # Yield the results - if isinstance(result, (GeneratorType, list, tuple)): - # yield each line ASAP, convert CommandError message to a line - for line in result: - yield line - else: - # yield non-empty non-iterable result as a single line - if result is not None: - yield result - - wrappable_exceptions = [CommandError] - wrappable_exceptions += getattr(function, ATTR_WRAPPED_EXCEPTIONS, []) - - try: - result = _call() - for line in result: - yield line - except tuple(wrappable_exceptions) as e: - processor = getattr(function, ATTR_WRAPPED_EXCEPTIONS_PROCESSOR, - lambda e: '{0.__class__.__name__}: {0}'.format(e)) - - errors_file.write(compat.text_type(processor(e))) - errors_file.write('\n') - - -def dispatch_command(function, *args, **kwargs): - """ - A wrapper for :func:`dispatch` that creates a one-command parser. - Uses :attr:`PARSER_FORMATTER`. - - This:: - - dispatch_command(foo) - - ...is a shortcut for:: - - parser = ArgumentParser() - set_default_command(parser, foo) - dispatch(parser) - - This function can be also used as a decorator. - """ - parser = argparse.ArgumentParser(formatter_class=PARSER_FORMATTER) - set_default_command(parser, function) - dispatch(parser, *args, **kwargs) - - -def dispatch_commands(functions, *args, **kwargs): - """ - A wrapper for :func:`dispatch` that creates a parser, adds commands to - the parser and dispatches them. - Uses :attr:`PARSER_FORMATTER`. - - This:: - - dispatch_commands([foo, bar]) - - ...is a shortcut for:: - - parser = ArgumentParser() - add_commands(parser, [foo, bar]) - dispatch(parser) - - """ - parser = argparse.ArgumentParser(formatter_class=PARSER_FORMATTER) - add_commands(parser, functions) - dispatch(parser, *args, **kwargs) - - -class EntryPoint(object): - """ - An object to which functions can be attached and then dispatched. - - When called with an argument, the argument (a function) is registered - at this entry point as a command. - - When called without an argument, dispatching is triggered with all - previously registered commands. - - Usage:: - - from argh import EntryPoint - - app = EntryPoint('main', dict(description='This is a cool app')) - - @app - def ls(): - for i in range(10): - print i - - @app - def greet(): - print 'hello' - - if __name__ == '__main__': - app() - - """ - def __init__(self, name=None, parser_kwargs=None): - self.name = name or 'unnamed' - self.commands = [] - self.parser_kwargs = parser_kwargs or {} - - def __call__(self, f=None): - if f: - self._register_command(f) - return f - - return self._dispatch() - - def _register_command(self, f): - self.commands.append(f) - - def _dispatch(self): - if not self.commands: - raise DispatchingError('no commands for entry point "{0}"' - .format(self.name)) - - parser = argparse.ArgumentParser(**self.parser_kwargs) - add_commands(parser, self.commands) - dispatch(parser) diff --git a/flask/venv/lib/python3.6/site-packages/argh/exceptions.py b/flask/venv/lib/python3.6/site-packages/argh/exceptions.py deleted file mode 100644 index e331826..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh/exceptions.py +++ /dev/null @@ -1,56 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2010—2014 Andrey Mikhaylenko and contributors -# -# This file is part of Argh. -# -# Argh is free software under terms of the GNU Lesser -# General Public License version 3 (LGPLv3) as published by the Free -# Software Foundation. See the file README.rst for copying conditions. -# -""" -Exceptions -~~~~~~~~~~ -""" -class AssemblingError(Exception): - """ - Raised if the parser could not be configured due to malformed - or conflicting command declarations. - """ - - -class DispatchingError(Exception): - """ - Raised if the dispatching could not be completed due to misconfiguration - which could not be determined on an earlier stage. - """ - - -class CommandError(Exception): - """ - Intended to be raised from within a command. The dispatcher wraps this - exception by default and prints its message without traceback. - - Useful for print-and-exit tasks when you expect a failure and don't want - to startle the ordinary user by the cryptic output. - - Consider the following example:: - - def foo(args): - try: - ... - except KeyError as e: - print(u'Could not fetch item: {0}'.format(e)) - return - - It is exactly the same as:: - - def bar(args): - try: - ... - except KeyError as e: - raise CommandError(u'Could not fetch item: {0}'.format(e)) - - This exception can be safely used in both print-style and yield-style - commands (see :doc:`tutorial`). - """ diff --git a/flask/venv/lib/python3.6/site-packages/argh/helpers.py b/flask/venv/lib/python3.6/site-packages/argh/helpers.py deleted file mode 100644 index 3e626d8..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh/helpers.py +++ /dev/null @@ -1,64 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2010—2014 Andrey Mikhaylenko and contributors -# -# This file is part of Argh. -# -# Argh is free software under terms of the GNU Lesser -# General Public License version 3 (LGPLv3) as published by the Free -# Software Foundation. See the file README.rst for copying conditions. -# -""" -Helpers -~~~~~~~ -""" -import argparse - -from argh.completion import autocomplete -from argh.assembling import add_commands, set_default_command -from argh.dispatching import PARSER_FORMATTER, ArghNamespace, dispatch - - -__all__ = ['ArghParser'] - - -class ArghParser(argparse.ArgumentParser): - """ - A subclass of :class:`ArgumentParser` with support for and a couple - of convenience methods. - - All methods are but wrappers for stand-alone functions - :func:`~argh.assembling.add_commands`, - :func:`~argh.completion.autocomplete` and - :func:`~argh.dispatching.dispatch`. - - Uses :attr:`~argh.dispatching.PARSER_FORMATTER`. - """ - def __init__(self, *args, **kwargs): - kwargs.setdefault('formatter_class', PARSER_FORMATTER) - super(ArghParser, self).__init__(*args, **kwargs) - - def set_default_command(self, *args, **kwargs): - "Wrapper for :func:`~argh.assembling.set_default_command`." - return set_default_command(self, *args, **kwargs) - - def add_commands(self, *args, **kwargs): - "Wrapper for :func:`~argh.assembling.add_commands`." - return add_commands(self, *args, **kwargs) - - def autocomplete(self): - "Wrapper for :func:`~argh.completion.autocomplete`." - return autocomplete(self) - - def dispatch(self, *args, **kwargs): - "Wrapper for :func:`~argh.dispatching.dispatch`." - return dispatch(self, *args, **kwargs) - - def parse_args(self, args=None, namespace=None): - """ - Wrapper for :meth:`argparse.ArgumentParser.parse_args`. If `namespace` - is not defined, :class:`argh.dispatching.ArghNamespace` is used. - This is required for functions to be properly used as commands. - """ - namespace = namespace or ArghNamespace() - return super(ArghParser, self).parse_args(args, namespace) diff --git a/flask/venv/lib/python3.6/site-packages/argh/interaction.py b/flask/venv/lib/python3.6/site-packages/argh/interaction.py deleted file mode 100644 index f368ab4..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh/interaction.py +++ /dev/null @@ -1,84 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2010—2014 Andrey Mikhaylenko and contributors -# -# This file is part of Argh. -# -# Argh is free software under terms of the GNU Lesser -# General Public License version 3 (LGPLv3) as published by the Free -# Software Foundation. See the file README.rst for copying conditions. -# -""" -Interaction -~~~~~~~~~~~ -""" -from argh.compat import text_type -from argh.io import safe_input - - -__all__ = ['confirm', 'safe_input'] - - -def confirm(action, default=None, skip=False): - """ - A shortcut for typical confirmation prompt. - - :param action: - - a string describing the action, e.g. "Apply changes". A question mark - will be appended. - - :param default: - - `bool` or `None`. Determines what happens when user hits :kbd:`Enter` - without typing in a choice. If `True`, default choice is "yes". If - `False`, it is "no". If `None` the prompt keeps reappearing until user - types in a choice (not necessarily acceptable) or until the number of - iteration reaches the limit. Default is `None`. - - :param skip: - - `bool`; if `True`, no interactive prompt is used and default choice is - returned (useful for batch mode). Default is `False`. - - Usage:: - - def delete(key, silent=False): - item = db.get(Item, args.key) - if confirm('Delete '+item.title, default=True, skip=silent): - item.delete() - print('Item deleted.') - else: - print('Operation cancelled.') - - Returns `None` on `KeyboardInterrupt` event. - """ - MAX_ITERATIONS = 3 - if skip: - return default - else: - defaults = { - None: ('y','n'), - True: ('Y','n'), - False: ('y','N'), - } - y, n = defaults[default] - prompt = text_type('{action}? ({y}/{n})').format(**locals()) - choice = None - try: - if default is None: - cnt = 1 - while not choice and cnt < MAX_ITERATIONS: - choice = safe_input(prompt) - cnt += 1 - else: - choice = safe_input(prompt) - except KeyboardInterrupt: - return None - if choice in ('yes', 'y', 'Y'): - return True - if choice in ('no', 'n', 'N'): - return False - if default is not None: - return default - return None diff --git a/flask/venv/lib/python3.6/site-packages/argh/io.py b/flask/venv/lib/python3.6/site-packages/argh/io.py deleted file mode 100644 index 35e9006..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh/io.py +++ /dev/null @@ -1,105 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2010—2014 Andrey Mikhaylenko and contributors -# -# This file is part of Argh. -# -# Argh is free software under terms of the GNU Lesser -# General Public License version 3 (LGPLv3) as published by the Free -# Software Foundation. See the file README.rst for copying conditions. -# -""" -Output Processing -~~~~~~~~~~~~~~~~~ -""" -import locale -import sys - -from argh import compat - - -__all__ = ['dump', 'encode_output', 'safe_input'] - - -def _input(prompt): - # this function can be mocked up in tests - if sys.version_info < (3,0): - return raw_input(prompt) - else: - return input(prompt) - - -def safe_input(prompt): - """ - Prompts user for input. Correctly handles prompt message encoding. - """ - - if sys.version_info < (3,0): - if isinstance(prompt, compat.text_type): - # Python 2.x: unicode → bytes - encoding = locale.getpreferredencoding() or 'utf-8' - prompt = prompt.encode(encoding) - else: - if not isinstance(prompt, compat.text_type): - # Python 3.x: bytes → unicode - prompt = prompt.decode() - - return _input(prompt) - - -def encode_output(value, output_file): - """ - Encodes given value so it can be written to given file object. - - Value may be Unicode, binary string or any other data type. - - The exact behaviour depends on the Python version: - - Python 3.x - - `sys.stdout` is a `_io.TextIOWrapper` instance that accepts `str` - (unicode) and breaks on `bytes`. - - It is OK to simply assume that everything is Unicode unless special - handling is introduced in the client code. - - Thus, no additional processing is performed. - - Python 2.x - - `sys.stdout` is a file-like object that accepts `str` (bytes) - and breaks when `unicode` is passed to `sys.stdout.write()`. - - We can expect both Unicode and bytes. They need to be encoded so as - to match the file object encoding. - - The output is binary if the object doesn't explicitly require Unicode. - - """ - if sys.version_info > (3,0): - # Python 3: whatever → unicode - return compat.text_type(value) - else: - # Python 2: handle special cases - stream_encoding = getattr(output_file, 'encoding', None) - if stream_encoding: - if stream_encoding.upper() == 'UTF-8': - return compat.text_type(value) - else: - return value.encode(stream_encoding, 'ignore') - else: - # no explicit encoding requirements; force binary - if isinstance(value, compat.text_type): - # unicode → binary - return value.encode('utf-8') - else: - return str(value) - - -def dump(raw_data, output_file): - """ - Writes given line to given output file. - See :func:`encode_output` for details. - """ - data = encode_output(raw_data, output_file) - output_file.write(data) diff --git a/flask/venv/lib/python3.6/site-packages/argh/utils.py b/flask/venv/lib/python3.6/site-packages/argh/utils.py deleted file mode 100644 index 8650bb7..0000000 --- a/flask/venv/lib/python3.6/site-packages/argh/utils.py +++ /dev/null @@ -1,55 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2010—2014 Andrey Mikhaylenko and contributors -# -# This file is part of Argh. -# -# Argh is free software under terms of the GNU Lesser -# General Public License version 3 (LGPLv3) as published by the Free -# Software Foundation. See the file README.rst for copying conditions. -# -""" -Utilities -~~~~~~~~~ -""" -import argparse -import inspect - -from argh import compat - - -def get_subparsers(parser, create=False): - """ - Returns the :class:`argparse._SubParsersAction` instance for given - :class:`ArgumentParser` instance as would have been returned by - :meth:`ArgumentParser.add_subparsers`. The problem with the latter is that - it only works once and raises an exception on the second attempt, and the - public API seems to lack a method to get *existing* subparsers. - - :param create: - If `True`, creates the subparser if it does not exist. Default if - `False`. - - """ - # note that ArgumentParser._subparsers is *not* what is returned by - # ArgumentParser.add_subparsers(). - if parser._subparsers: - actions = [a for a in parser._actions - if isinstance(a, argparse._SubParsersAction)] - assert len(actions) == 1 - return actions[0] - else: - if create: - return parser.add_subparsers() - - -def get_arg_spec(function): - """ - Returns argument specification for given function. Omits special - arguments of instance methods (`self`) and static methods (usually `cls` - or something like this). - """ - spec = compat.getargspec(function) - if inspect.ismethod(function): - spec = spec._replace(args=spec.args[1:]) - return spec diff --git a/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/PKG-INFO b/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/PKG-INFO deleted file mode 100644 index 7b58794..0000000 --- a/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/PKG-INFO +++ /dev/null @@ -1,101 +0,0 @@ -Metadata-Version: 1.1 -Name: blinker -Version: 1.4 -Summary: Fast, simple object-to-object and broadcast signaling -Home-page: http://pythonhosted.org/blinker/ -Author: Jason Kirtland -Author-email: jek@discorporate.us -License: MIT License -Description: [![Build Status](https://travis-ci.org/jek/blinker.svg?branch=master)](https://travis-ci.org/jek/blinker) - - - # Blinker - - Blinker provides a fast dispatching system that allows any number of - interested parties to subscribe to events, or "signals". - - Signal receivers can subscribe to specific senders or receive signals - sent by any sender. - - >>> from blinker import signal - >>> started = signal('round-started') - >>> def each(round): - ... print "Round %s!" % round - ... - >>> started.connect(each) - - >>> def round_two(round): - ... print "This is round two." - ... - >>> started.connect(round_two, sender=2) - - >>> for round in range(1, 4): - ... started.send(round) - ... - Round 1! - Round 2! - This is round two. - Round 3! - - See the [Blinker documentation](https://pythonhosted.org/blinker/) for more information. - - ## Requirements - - Blinker requires Python 2.4 or higher, Python 3.0 or higher, or Jython 2.5 or higher. - - ## Changelog Summary - - 1.3 (July 3, 2013) - - - The global signal stash behind blinker.signal() is now backed by a - regular name-to-Signal dictionary. Previously, weak references were - held in the mapping and ephemeral usage in code like - ``signal('foo').connect(...)`` could have surprising program behavior - depending on import order of modules. - - blinker.Namespace is now built on a regular dict. Use - blinker.WeakNamespace for the older, weak-referencing behavior. - - Signal.connect('text-sender') uses an alternate hashing strategy to - avoid sharp edges in text identity. - - 1.2 (October 26, 2011) - - - Added Signal.receiver_connected and Signal.receiver_disconnected - per-Signal signals. - - Deprecated the global 'receiver_connected' signal. - - Verified Python 3.2 support (no changes needed!) - - 1.1 (July 21, 2010) - - - Added ``@signal.connect_via(sender)`` decorator - - Added ``signal.connected_to`` shorthand name for the - ``temporarily_connected_to`` context manager. - - 1.0 (March 28, 2010) - - - Python 3.x compatibility - - 0.9 (February 26, 2010) - - - Sphinx docs, project website - - Added ``with a_signal.temporarily_connected_to(receiver): ...`` support - -Keywords: signal emit events broadcast -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.4 -Classifier: Programming Language :: Python :: 2.5 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.0 -Classifier: Programming Language :: Python :: 3.1 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Topic :: Software Development :: Libraries -Classifier: Topic :: Utilities diff --git a/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/SOURCES.txt b/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/SOURCES.txt deleted file mode 100644 index 8a2dace..0000000 --- a/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/SOURCES.txt +++ /dev/null @@ -1,49 +0,0 @@ -AUTHORS -CHANGES -LICENSE -MANIFEST.in -README.md -setup.cfg -setup.py -blinker/__init__.py -blinker/_saferef.py -blinker/_utilities.py -blinker/base.py -blinker.egg-info/PKG-INFO -blinker.egg-info/SOURCES.txt -blinker.egg-info/dependency_links.txt -blinker.egg-info/top_level.txt -docs/html/genindex.html -docs/html/index.html -docs/html/objects.inv -docs/html/search.html -docs/html/searchindex.js -docs/html/_sources/index.txt -docs/html/_static/basic.css -docs/html/_static/blinker-named.png -docs/html/_static/blinker64.png -docs/html/_static/comment-bright.png -docs/html/_static/comment-close.png -docs/html/_static/comment.png -docs/html/_static/doctools.js -docs/html/_static/down-pressed.png -docs/html/_static/down.png -docs/html/_static/file.png -docs/html/_static/flasky.css -docs/html/_static/jquery.js -docs/html/_static/minus.png -docs/html/_static/plus.png -docs/html/_static/pygments.css -docs/html/_static/searchtools.js -docs/html/_static/underscore.js -docs/html/_static/up-pressed.png -docs/html/_static/up.png -docs/html/_static/websupport.js -docs/source/conf.py -docs/source/index.rst -docs/source/_themes/flask_theme_support.py -docs/text/index.txt -tests/test_context.py -tests/test_saferef.py -tests/test_signals.py -tests/test_utilities.py \ No newline at end of file diff --git a/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/dependency_links.txt b/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/installed-files.txt b/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/installed-files.txt deleted file mode 100644 index 08c8af0..0000000 --- a/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/installed-files.txt +++ /dev/null @@ -1,12 +0,0 @@ -../blinker/__init__.py -../blinker/__pycache__/__init__.cpython-36.pyc -../blinker/__pycache__/_saferef.cpython-36.pyc -../blinker/__pycache__/_utilities.cpython-36.pyc -../blinker/__pycache__/base.cpython-36.pyc -../blinker/_saferef.py -../blinker/_utilities.py -../blinker/base.py -PKG-INFO -SOURCES.txt -dependency_links.txt -top_level.txt diff --git a/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/top_level.txt b/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/top_level.txt deleted file mode 100644 index 1ff4ca5..0000000 --- a/flask/venv/lib/python3.6/site-packages/blinker-1.4.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -blinker diff --git a/flask/venv/lib/python3.6/site-packages/blinker/__init__.py b/flask/venv/lib/python3.6/site-packages/blinker/__init__.py deleted file mode 100644 index 3ea239c..0000000 --- a/flask/venv/lib/python3.6/site-packages/blinker/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -from blinker.base import ( - ANY, - NamedSignal, - Namespace, - Signal, - WeakNamespace, - receiver_connected, - signal, -) - -__all__ = [ - 'ANY', - 'NamedSignal', - 'Namespace', - 'Signal', - 'WeakNamespace', - 'receiver_connected', - 'signal', - ] - - -__version__ = '1.4' diff --git a/flask/venv/lib/python3.6/site-packages/blinker/__pycache__/__init__.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/blinker/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index 4e6f99b1ca3754a339287d67d77184c1c55ca2c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432 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 arKu5!XKhj;A3&C@wqc!B59dnzrT+mP#ts<( diff --git a/flask/venv/lib/python3.6/site-packages/blinker/__pycache__/_utilities.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/blinker/__pycache__/_utilities.cpython-36.pyc deleted file mode 100644 index f96c26f3d90bbb7ae329df38cb85e8d8a117d0bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5448 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 diff --git a/flask/venv/lib/python3.6/site-packages/blinker/_saferef.py b/flask/venv/lib/python3.6/site-packages/blinker/_saferef.py deleted file mode 100644 index 269e362..0000000 --- a/flask/venv/lib/python3.6/site-packages/blinker/_saferef.py +++ /dev/null @@ -1,234 +0,0 @@ -# extracted from Louie, http://pylouie.org/ -# updated for Python 3 -# -# Copyright (c) 2006 Patrick K. O'Brien, Mike C. Fletcher, -# Matthew R. Scott -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials provided -# with the distribution. -# -# * Neither the name of the nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -"""Refactored 'safe reference from dispatcher.py""" - -import operator -import sys -import traceback -import weakref - - -try: - callable -except NameError: - def callable(object): - return hasattr(object, '__call__') - - -if sys.version_info < (3,): - get_self = operator.attrgetter('im_self') - get_func = operator.attrgetter('im_func') -else: - get_self = operator.attrgetter('__self__') - get_func = operator.attrgetter('__func__') - - -def safe_ref(target, on_delete=None): - """Return a *safe* weak reference to a callable target. - - - ``target``: The object to be weakly referenced, if it's a bound - method reference, will create a BoundMethodWeakref, otherwise - creates a simple weakref. - - - ``on_delete``: If provided, will have a hard reference stored to - the callable to be called after the safe reference goes out of - scope with the reference object, (either a weakref or a - BoundMethodWeakref) as argument. - """ - try: - im_self = get_self(target) - except AttributeError: - if callable(on_delete): - return weakref.ref(target, on_delete) - else: - return weakref.ref(target) - else: - if im_self is not None: - # Turn a bound method into a BoundMethodWeakref instance. - # Keep track of these instances for lookup by disconnect(). - assert hasattr(target, 'im_func') or hasattr(target, '__func__'), ( - "safe_ref target %r has im_self, but no im_func, " - "don't know how to create reference" % target) - reference = BoundMethodWeakref(target=target, on_delete=on_delete) - return reference - - -class BoundMethodWeakref(object): - """'Safe' and reusable weak references to instance methods. - - BoundMethodWeakref objects provide a mechanism for referencing a - bound method without requiring that the method object itself - (which is normally a transient object) is kept alive. Instead, - the BoundMethodWeakref object keeps weak references to both the - object and the function which together define the instance method. - - Attributes: - - - ``key``: The identity key for the reference, calculated by the - class's calculate_key method applied to the target instance method. - - - ``deletion_methods``: Sequence of callable objects taking single - argument, a reference to this object which will be called when - *either* the target object or target function is garbage - collected (i.e. when this object becomes invalid). These are - specified as the on_delete parameters of safe_ref calls. - - - ``weak_self``: Weak reference to the target object. - - - ``weak_func``: Weak reference to the target function. - - Class Attributes: - - - ``_all_instances``: Class attribute pointing to all live - BoundMethodWeakref objects indexed by the class's - calculate_key(target) method applied to the target objects. - This weak value dictionary is used to short-circuit creation so - that multiple references to the same (object, function) pair - produce the same BoundMethodWeakref instance. - """ - - _all_instances = weakref.WeakValueDictionary() - - def __new__(cls, target, on_delete=None, *arguments, **named): - """Create new instance or return current instance. - - Basically this method of construction allows us to - short-circuit creation of references to already- referenced - instance methods. The key corresponding to the target is - calculated, and if there is already an existing reference, - that is returned, with its deletion_methods attribute updated. - Otherwise the new instance is created and registered in the - table of already-referenced methods. - """ - key = cls.calculate_key(target) - current = cls._all_instances.get(key) - if current is not None: - current.deletion_methods.append(on_delete) - return current - else: - base = super(BoundMethodWeakref, cls).__new__(cls) - cls._all_instances[key] = base - base.__init__(target, on_delete, *arguments, **named) - return base - - def __init__(self, target, on_delete=None): - """Return a weak-reference-like instance for a bound method. - - - ``target``: The instance-method target for the weak reference, - must have im_self and im_func attributes and be - reconstructable via the following, which is true of built-in - instance methods:: - - target.im_func.__get__( target.im_self ) - - - ``on_delete``: Optional callback which will be called when - this weak reference ceases to be valid (i.e. either the - object or the function is garbage collected). Should take a - single argument, which will be passed a pointer to this - object. - """ - def remove(weak, self=self): - """Set self.isDead to True when method or instance is destroyed.""" - methods = self.deletion_methods[:] - del self.deletion_methods[:] - try: - del self.__class__._all_instances[self.key] - except KeyError: - pass - for function in methods: - try: - if callable(function): - function(self) - except Exception: - try: - traceback.print_exc() - except AttributeError: - e = sys.exc_info()[1] - print ('Exception during saferef %s ' - 'cleanup function %s: %s' % (self, function, e)) - self.deletion_methods = [on_delete] - self.key = self.calculate_key(target) - im_self = get_self(target) - im_func = get_func(target) - self.weak_self = weakref.ref(im_self, remove) - self.weak_func = weakref.ref(im_func, remove) - self.self_name = str(im_self) - self.func_name = str(im_func.__name__) - - def calculate_key(cls, target): - """Calculate the reference key for this reference. - - Currently this is a two-tuple of the id()'s of the target - object and the target function respectively. - """ - return (id(get_self(target)), id(get_func(target))) - calculate_key = classmethod(calculate_key) - - def __str__(self): - """Give a friendly representation of the object.""" - return "%s(%s.%s)" % ( - self.__class__.__name__, - self.self_name, - self.func_name, - ) - - __repr__ = __str__ - - def __nonzero__(self): - """Whether we are still a valid reference.""" - return self() is not None - - def __cmp__(self, other): - """Compare with another reference.""" - if not isinstance(other, self.__class__): - return cmp(self.__class__, type(other)) - return cmp(self.key, other.key) - - def __call__(self): - """Return a strong reference to the bound method. - - If the target cannot be retrieved, then will return None, - otherwise returns a bound instance method for our object and - function. - - Note: You may call this method any number of times, as it does - not invalidate the reference. - """ - target = self.weak_self() - if target is not None: - function = self.weak_func() - if function is not None: - return function.__get__(target) - return None diff --git a/flask/venv/lib/python3.6/site-packages/blinker/_utilities.py b/flask/venv/lib/python3.6/site-packages/blinker/_utilities.py deleted file mode 100644 index 056270d..0000000 --- a/flask/venv/lib/python3.6/site-packages/blinker/_utilities.py +++ /dev/null @@ -1,163 +0,0 @@ -from weakref import ref - -from blinker._saferef import BoundMethodWeakref - - -try: - callable -except NameError: - def callable(object): - return hasattr(object, '__call__') - - -try: - from collections import defaultdict -except: - class defaultdict(dict): - - def __init__(self, default_factory=None, *a, **kw): - if (default_factory is not None and - not hasattr(default_factory, '__call__')): - raise TypeError('first argument must be callable') - dict.__init__(self, *a, **kw) - self.default_factory = default_factory - - def __getitem__(self, key): - try: - return dict.__getitem__(self, key) - except KeyError: - return self.__missing__(key) - - def __missing__(self, key): - if self.default_factory is None: - raise KeyError(key) - self[key] = value = self.default_factory() - return value - - def __reduce__(self): - if self.default_factory is None: - args = tuple() - else: - args = self.default_factory, - return type(self), args, None, None, self.items() - - def copy(self): - return self.__copy__() - - def __copy__(self): - return type(self)(self.default_factory, self) - - def __deepcopy__(self, memo): - import copy - return type(self)(self.default_factory, - copy.deepcopy(self.items())) - - def __repr__(self): - return 'defaultdict(%s, %s)' % (self.default_factory, - dict.__repr__(self)) - - -try: - from contextlib import contextmanager -except ImportError: - def contextmanager(fn): - def oops(*args, **kw): - raise RuntimeError("Python 2.5 or above is required to use " - "context managers.") - oops.__name__ = fn.__name__ - return oops - -class _symbol(object): - - def __init__(self, name): - """Construct a new named symbol.""" - self.__name__ = self.name = name - - def __reduce__(self): - return symbol, (self.name,) - - def __repr__(self): - return self.name -_symbol.__name__ = 'symbol' - - -class symbol(object): - """A constant symbol. - - >>> symbol('foo') is symbol('foo') - True - >>> symbol('foo') - foo - - A slight refinement of the MAGICCOOKIE=object() pattern. The primary - advantage of symbol() is its repr(). They are also singletons. - - Repeated calls of symbol('name') will all return the same instance. - - """ - symbols = {} - - def __new__(cls, name): - try: - return cls.symbols[name] - except KeyError: - return cls.symbols.setdefault(name, _symbol(name)) - - -try: - text = (str, unicode) -except NameError: - text = str - - -def hashable_identity(obj): - if hasattr(obj, '__func__'): - return (id(obj.__func__), id(obj.__self__)) - elif hasattr(obj, 'im_func'): - return (id(obj.im_func), id(obj.im_self)) - elif isinstance(obj, text): - return obj - else: - return id(obj) - - -WeakTypes = (ref, BoundMethodWeakref) - - -class annotatable_weakref(ref): - """A weakref.ref that supports custom instance attributes.""" - - -def reference(object, callback=None, **annotations): - """Return an annotated weak ref.""" - if callable(object): - weak = callable_reference(object, callback) - else: - weak = annotatable_weakref(object, callback) - for key, value in annotations.items(): - setattr(weak, key, value) - return weak - - -def callable_reference(object, callback=None): - """Return an annotated weak ref, supporting bound instance methods.""" - if hasattr(object, 'im_self') and object.im_self is not None: - return BoundMethodWeakref(target=object, on_delete=callback) - elif hasattr(object, '__self__') and object.__self__ is not None: - return BoundMethodWeakref(target=object, on_delete=callback) - return annotatable_weakref(object, callback) - - -class lazy_property(object): - """A @property that is only evaluated once.""" - - def __init__(self, deferred): - self._deferred = deferred - self.__doc__ = deferred.__doc__ - - def __get__(self, obj, cls): - if obj is None: - return self - value = self._deferred(obj) - setattr(obj, self._deferred.__name__, value) - return value diff --git a/flask/venv/lib/python3.6/site-packages/blinker/base.py b/flask/venv/lib/python3.6/site-packages/blinker/base.py deleted file mode 100644 index cc5880e..0000000 --- a/flask/venv/lib/python3.6/site-packages/blinker/base.py +++ /dev/null @@ -1,455 +0,0 @@ -# -*- coding: utf-8; fill-column: 76 -*- -"""Signals and events. - -A small implementation of signals, inspired by a snippet of Django signal -API client code seen in a blog post. Signals are first-class objects and -each manages its own receivers and message emission. - -The :func:`signal` function provides singleton behavior for named signals. - -""" -from warnings import warn -from weakref import WeakValueDictionary - -from blinker._utilities import ( - WeakTypes, - contextmanager, - defaultdict, - hashable_identity, - lazy_property, - reference, - symbol, - ) - - -ANY = symbol('ANY') -ANY.__doc__ = 'Token for "any sender".' -ANY_ID = 0 - - -class Signal(object): - """A notification emitter.""" - - #: An :obj:`ANY` convenience synonym, allows ``Signal.ANY`` - #: without an additional import. - ANY = ANY - - @lazy_property - def receiver_connected(self): - """Emitted after each :meth:`connect`. - - The signal sender is the signal instance, and the :meth:`connect` - arguments are passed through: *receiver*, *sender*, and *weak*. - - .. versionadded:: 1.2 - - """ - return Signal(doc="Emitted after a receiver connects.") - - @lazy_property - def receiver_disconnected(self): - """Emitted after :meth:`disconnect`. - - The sender is the signal instance, and the :meth:`disconnect` arguments - are passed through: *receiver* and *sender*. - - Note, this signal is emitted **only** when :meth:`disconnect` is - called explicitly. - - The disconnect signal can not be emitted by an automatic disconnect - (due to a weakly referenced receiver or sender going out of scope), - as the receiver and/or sender instances are no longer available for - use at the time this signal would be emitted. - - An alternative approach is available by subscribing to - :attr:`receiver_connected` and setting up a custom weakref cleanup - callback on weak receivers and senders. - - .. versionadded:: 1.2 - - """ - return Signal(doc="Emitted after a receiver disconnects.") - - def __init__(self, doc=None): - """ - :param doc: optional. If provided, will be assigned to the signal's - __doc__ attribute. - - """ - if doc: - self.__doc__ = doc - #: A mapping of connected receivers. - #: - #: The values of this mapping are not meaningful outside of the - #: internal :class:`Signal` implementation, however the boolean value - #: of the mapping is useful as an extremely efficient check to see if - #: any receivers are connected to the signal. - self.receivers = {} - self._by_receiver = defaultdict(set) - self._by_sender = defaultdict(set) - self._weak_senders = {} - - def connect(self, receiver, sender=ANY, weak=True): - """Connect *receiver* to signal events sent by *sender*. - - :param receiver: A callable. Will be invoked by :meth:`send` with - `sender=` as a single positional argument and any \*\*kwargs that - were provided to a call to :meth:`send`. - - :param sender: Any object or :obj:`ANY`, defaults to ``ANY``. - Restricts notifications delivered to *receiver* to only those - :meth:`send` emissions sent by *sender*. If ``ANY``, the receiver - will always be notified. A *receiver* may be connected to - multiple *sender* values on the same Signal through multiple calls - to :meth:`connect`. - - :param weak: If true, the Signal will hold a weakref to *receiver* - and automatically disconnect when *receiver* goes out of scope or - is garbage collected. Defaults to True. - - """ - receiver_id = hashable_identity(receiver) - if weak: - receiver_ref = reference(receiver, self._cleanup_receiver) - receiver_ref.receiver_id = receiver_id - else: - receiver_ref = receiver - if sender is ANY: - sender_id = ANY_ID - else: - sender_id = hashable_identity(sender) - - self.receivers.setdefault(receiver_id, receiver_ref) - self._by_sender[sender_id].add(receiver_id) - self._by_receiver[receiver_id].add(sender_id) - del receiver_ref - - if sender is not ANY and sender_id not in self._weak_senders: - # wire together a cleanup for weakref-able senders - try: - sender_ref = reference(sender, self._cleanup_sender) - sender_ref.sender_id = sender_id - except TypeError: - pass - else: - self._weak_senders.setdefault(sender_id, sender_ref) - del sender_ref - - # broadcast this connection. if receivers raise, disconnect. - if ('receiver_connected' in self.__dict__ and - self.receiver_connected.receivers): - try: - self.receiver_connected.send(self, - receiver=receiver, - sender=sender, - weak=weak) - except: - self.disconnect(receiver, sender) - raise - if receiver_connected.receivers and self is not receiver_connected: - try: - receiver_connected.send(self, - receiver_arg=receiver, - sender_arg=sender, - weak_arg=weak) - except: - self.disconnect(receiver, sender) - raise - return receiver - - def connect_via(self, sender, weak=False): - """Connect the decorated function as a receiver for *sender*. - - :param sender: Any object or :obj:`ANY`. The decorated function - will only receive :meth:`send` emissions sent by *sender*. If - ``ANY``, the receiver will always be notified. A function may be - decorated multiple times with differing *sender* values. - - :param weak: If true, the Signal will hold a weakref to the - decorated function and automatically disconnect when *receiver* - goes out of scope or is garbage collected. Unlike - :meth:`connect`, this defaults to False. - - The decorated function will be invoked by :meth:`send` with - `sender=` as a single positional argument and any \*\*kwargs that - were provided to the call to :meth:`send`. - - - .. versionadded:: 1.1 - - """ - def decorator(fn): - self.connect(fn, sender, weak) - return fn - return decorator - - @contextmanager - def connected_to(self, receiver, sender=ANY): - """Execute a block with the signal temporarily connected to *receiver*. - - :param receiver: a receiver callable - :param sender: optional, a sender to filter on - - This is a context manager for use in the ``with`` statement. It can - be useful in unit tests. *receiver* is connected to the signal for - the duration of the ``with`` block, and will be disconnected - automatically when exiting the block: - - .. testsetup:: - - from __future__ import with_statement - from blinker import Signal - on_ready = Signal() - receiver = lambda sender: None - - .. testcode:: - - with on_ready.connected_to(receiver): - # do stuff - on_ready.send(123) - - .. versionadded:: 1.1 - - """ - self.connect(receiver, sender=sender, weak=False) - try: - yield None - except: - self.disconnect(receiver) - raise - else: - self.disconnect(receiver) - - def temporarily_connected_to(self, receiver, sender=ANY): - """An alias for :meth:`connected_to`. - - :param receiver: a receiver callable - :param sender: optional, a sender to filter on - - .. versionadded:: 0.9 - - .. versionchanged:: 1.1 - Renamed to :meth:`connected_to`. ``temporarily_connected_to`` was - deprecated in 1.2 and will be removed in a subsequent version. - - """ - warn("temporarily_connected_to is deprecated; " - "use connected_to instead.", - DeprecationWarning) - return self.connected_to(receiver, sender) - - def send(self, *sender, **kwargs): - """Emit this signal on behalf of *sender*, passing on \*\*kwargs. - - Returns a list of 2-tuples, pairing receivers with their return - value. The ordering of receiver notification is undefined. - - :param \*sender: Any object or ``None``. If omitted, synonymous - with ``None``. Only accepts one positional argument. - - :param \*\*kwargs: Data to be sent to receivers. - - """ - # Using '*sender' rather than 'sender=None' allows 'sender' to be - # used as a keyword argument- i.e. it's an invisible name in the - # function signature. - if len(sender) == 0: - sender = None - elif len(sender) > 1: - raise TypeError('send() accepts only one positional argument, ' - '%s given' % len(sender)) - else: - sender = sender[0] - if not self.receivers: - return [] - else: - return [(receiver, receiver(sender, **kwargs)) - for receiver in self.receivers_for(sender)] - - def has_receivers_for(self, sender): - """True if there is probably a receiver for *sender*. - - Performs an optimistic check only. Does not guarantee that all - weakly referenced receivers are still alive. See - :meth:`receivers_for` for a stronger search. - - """ - if not self.receivers: - return False - if self._by_sender[ANY_ID]: - return True - if sender is ANY: - return False - return hashable_identity(sender) in self._by_sender - - def receivers_for(self, sender): - """Iterate all live receivers listening for *sender*.""" - # TODO: test receivers_for(ANY) - if self.receivers: - sender_id = hashable_identity(sender) - if sender_id in self._by_sender: - ids = (self._by_sender[ANY_ID] | - self._by_sender[sender_id]) - else: - ids = self._by_sender[ANY_ID].copy() - for receiver_id in ids: - receiver = self.receivers.get(receiver_id) - if receiver is None: - continue - if isinstance(receiver, WeakTypes): - strong = receiver() - if strong is None: - self._disconnect(receiver_id, ANY_ID) - continue - receiver = strong - yield receiver - - def disconnect(self, receiver, sender=ANY): - """Disconnect *receiver* from this signal's events. - - :param receiver: a previously :meth:`connected` callable - - :param sender: a specific sender to disconnect from, or :obj:`ANY` - to disconnect from all senders. Defaults to ``ANY``. - - """ - if sender is ANY: - sender_id = ANY_ID - else: - sender_id = hashable_identity(sender) - receiver_id = hashable_identity(receiver) - self._disconnect(receiver_id, sender_id) - - if ('receiver_disconnected' in self.__dict__ and - self.receiver_disconnected.receivers): - self.receiver_disconnected.send(self, - receiver=receiver, - sender=sender) - - def _disconnect(self, receiver_id, sender_id): - if sender_id == ANY_ID: - if self._by_receiver.pop(receiver_id, False): - for bucket in self._by_sender.values(): - bucket.discard(receiver_id) - self.receivers.pop(receiver_id, None) - else: - self._by_sender[sender_id].discard(receiver_id) - self._by_receiver[receiver_id].discard(sender_id) - - def _cleanup_receiver(self, receiver_ref): - """Disconnect a receiver from all senders.""" - self._disconnect(receiver_ref.receiver_id, ANY_ID) - - def _cleanup_sender(self, sender_ref): - """Disconnect all receivers from a sender.""" - sender_id = sender_ref.sender_id - assert sender_id != ANY_ID - self._weak_senders.pop(sender_id, None) - for receiver_id in self._by_sender.pop(sender_id, ()): - self._by_receiver[receiver_id].discard(sender_id) - - def _cleanup_bookkeeping(self): - """Prune unused sender/receiver bookeeping. Not threadsafe. - - Connecting & disconnecting leave behind a small amount of bookeeping - for the receiver and sender values. Typical workloads using Blinker, - for example in most web apps, Flask, CLI scripts, etc., are not - adversely affected by this bookkeeping. - - With a long-running Python process performing dynamic signal routing - with high volume- e.g. connecting to function closures, "senders" are - all unique object instances, and doing all of this over and over- you - may see memory usage will grow due to extraneous bookeeping. (An empty - set() for each stale sender/receiver pair.) - - This method will prune that bookeeping away, with the caveat that such - pruning is not threadsafe. The risk is that cleanup of a fully - disconnected receiver/sender pair occurs while another thread is - connecting that same pair. If you are in the highly dynamic, unique - receiver/sender situation that has lead you to this method, that - failure mode is perhaps not a big deal for you. - """ - for mapping in (self._by_sender, self._by_receiver): - for _id, bucket in list(mapping.items()): - if not bucket: - mapping.pop(_id, None) - - def _clear_state(self): - """Throw away all signal state. Useful for unit tests.""" - self._weak_senders.clear() - self.receivers.clear() - self._by_sender.clear() - self._by_receiver.clear() - - -receiver_connected = Signal("""\ -Sent by a :class:`Signal` after a receiver connects. - -:argument: the Signal that was connected to -:keyword receiver_arg: the connected receiver -:keyword sender_arg: the sender to connect to -:keyword weak_arg: true if the connection to receiver_arg is a weak reference - -.. deprecated:: 1.2 - -As of 1.2, individual signals have their own private -:attr:`~Signal.receiver_connected` and -:attr:`~Signal.receiver_disconnected` signals with a slightly simplified -call signature. This global signal is planned to be removed in 1.6. - -""") - - -class NamedSignal(Signal): - """A named generic notification emitter.""" - - def __init__(self, name, doc=None): - Signal.__init__(self, doc) - - #: The name of this signal. - self.name = name - - def __repr__(self): - base = Signal.__repr__(self) - return "%s; %r>" % (base[:-1], self.name) - - -class Namespace(dict): - """A mapping of signal names to signals.""" - - def signal(self, name, doc=None): - """Return the :class:`NamedSignal` *name*, creating it if required. - - Repeated calls to this function will return the same signal object. - - """ - try: - return self[name] - except KeyError: - return self.setdefault(name, NamedSignal(name, doc)) - - -class WeakNamespace(WeakValueDictionary): - """A weak mapping of signal names to signals. - - Automatically cleans up unused Signals when the last reference goes out - of scope. This namespace implementation exists for a measure of legacy - compatibility with Blinker <= 1.2, and may be dropped in the future. - - .. versionadded:: 1.3 - - """ - - def signal(self, name, doc=None): - """Return the :class:`NamedSignal` *name*, creating it if required. - - Repeated calls to this function will return the same signal object. - - """ - try: - return self[name] - except KeyError: - return self.setdefault(name, NamedSignal(name, doc)) - - -signal = Namespace().signal diff --git a/flask/venv/lib/python3.6/site-packages/click/__init__.py b/flask/venv/lib/python3.6/site-packages/click/__init__.py deleted file mode 100644 index d3c3366..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/__init__.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -""" -click -~~~~~ - -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. - -:copyright: © 2014 by the Pallets team. -:license: BSD, see LICENSE.rst for more details. -""" - -# Core classes -from .core import Context, BaseCommand, Command, MultiCommand, Group, \ - CommandCollection, Parameter, Option, Argument - -# Globals -from .globals import get_current_context - -# Decorators -from .decorators import pass_context, pass_obj, make_pass_decorator, \ - command, group, argument, option, confirmation_option, \ - password_option, version_option, help_option - -# Types -from .types import ParamType, File, Path, Choice, IntRange, Tuple, \ - DateTime, STRING, INT, FLOAT, BOOL, UUID, UNPROCESSED, FloatRange - -# Utilities -from .utils import echo, get_binary_stream, get_text_stream, open_file, \ - format_filename, get_app_dir, get_os_args - -# Terminal functions -from .termui import prompt, confirm, get_terminal_size, echo_via_pager, \ - progressbar, clear, style, unstyle, secho, edit, launch, getchar, \ - pause - -# Exceptions -from .exceptions import ClickException, UsageError, BadParameter, \ - FileError, Abort, NoSuchOption, BadOptionUsage, BadArgumentUsage, \ - MissingParameter - -# Formatting -from .formatting import HelpFormatter, wrap_text - -# Parsing -from .parser import OptionParser - - -__all__ = [ - # Core classes - 'Context', 'BaseCommand', 'Command', 'MultiCommand', 'Group', - 'CommandCollection', 'Parameter', 'Option', 'Argument', - - # Globals - 'get_current_context', - - # Decorators - 'pass_context', 'pass_obj', 'make_pass_decorator', 'command', 'group', - 'argument', 'option', 'confirmation_option', 'password_option', - 'version_option', 'help_option', - - # Types - 'ParamType', 'File', 'Path', 'Choice', 'IntRange', 'Tuple', - 'DateTime', 'STRING', 'INT', 'FLOAT', 'BOOL', 'UUID', 'UNPROCESSED', - 'FloatRange', - - # Utilities - 'echo', 'get_binary_stream', 'get_text_stream', 'open_file', - 'format_filename', 'get_app_dir', 'get_os_args', - - # Terminal functions - 'prompt', 'confirm', 'get_terminal_size', 'echo_via_pager', - 'progressbar', 'clear', 'style', 'unstyle', 'secho', 'edit', 'launch', - 'getchar', 'pause', - - # Exceptions - 'ClickException', 'UsageError', 'BadParameter', 'FileError', - 'Abort', 'NoSuchOption', 'BadOptionUsage', 'BadArgumentUsage', - 'MissingParameter', - - # Formatting - 'HelpFormatter', 'wrap_text', - - # Parsing - 'OptionParser', -] - - -# Controls if click should emit the warning about the use of unicode -# literals. -disable_unicode_literals_warning = False - - -__version__ = '7.0' diff --git a/flask/venv/lib/python3.6/site-packages/click/__pycache__/__init__.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/click/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index 5fcb78b51000766a905b5f5f48897b4707b153df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2620 zcmb`IOLN;s630pL4N{b3`Tc}#*)na3dfKvO*_KE>EJvoamUQV#6$(U;NyKOXg&9Ux z4*5R$8u=J=P3<9<{Q!H~X^?VqOm>%5_z^vr>FMcz&&QJW%n4n3Rq$!x9OK^#%VVW+(Wx4`a=qg;LYjBOO!}WAbA-F*|;U?XJTXY+4(;c`& zci}GGgL`CyP50qGJ%9)F5FXMD%+MovM33Py&BAOtz8E~A1~lj?Jf&ywjOJjD=3$ffZVXReBE3=>@!?HCUsU@RDA^D_VzjdJV5>12*Ulyh+EF zgSYe!-q9v((iUt{3tH5MHf_T;?Z6K0!Y=K>UfQ=3yr+HGrw{NUwXNVgI)DT7Ud0-Y zV;v`O5~uJIPUB^~f>-exUdJ1F6K~;dyn}b~9@=;xAK*ir!AJNQXYmO(@F_mSIh@BP zF5n_A;WDn^Dn7>-xP~wB6|UoJ+`u>Z7T@6}Zea`CxQ#owi+lJU_wfUMhX?qv*M^VS zfes$RAs!uP8vhuyjOdmZ_}&-mXZ~4Mn+@BSwrfkD;y~C(=c*rtHbpovmLJO4PXyZC zb6fR=EfofS*N$QpyNMLGifnSf2q>!^n?wUM@>?KVNBd?((MMKX<6%D6rU%4udmkaUw^Te7nfEq7IEYTfiQ6?;ZoCDHz^RI6zg{D zcze#4Lf8lU?VZl?PBW3p{v2_*iLg;9*AHaV`rTwP)2QfDI|`Nfs&utw7SJB9oLkcr z=-S6Yp!^G~uxFMR>#335j!X!i@}p2!j@-m0p+usKhjH3e-b#7{5}|5j^>j}t#~UPx zF&%F>W235Tu`A_;t;?wub$`&)EQgbtD7+|fRg~zGH;SpyOQR^eBmcT+l;j|$jpxsP zLM~g*sBwbboJ9#Jg`g_D6PHC^6zl{oQ9=;HCor~S^J&h2+jbYb`4aO*_pTZe}SI)8e)zpbmMouf~O z?VaP}oo#LH29Z1T)F|n^@cNOS;w*Lj&`r)AsS+csp5P|d=c1t!#UgY*b6^ujRkPOA z2u<>Jl{>p}?4X|vjYv8sOR_Ppi*aHKOK}#{91SNkdXbqgaHRi}&~=W&`O$Yx>U&1X zsu|Nugp^%3(FHFM{3q49nY%Oyhc5-0hMpJbD_soSLFn~$$pqr{xp(Xiq%dVxPxt7~ zS5FM3vQDL$Vkb$Au(g(pf0R#!lRo@V*y=`!(zQ->Y_`d$tm>xs@HKUzCyjkkX`_~p zzLaJkfAiTG)8p@r$h&F2xJD~yi5sVRHN{yQx-;FSNRlzLFOnQ1&nPg8j1r^Fs4&c> zlu4?L8e^PMXG}0A8B>f)jA_PY#udg@#x=%u#tp_z#x2He#vR68#yy73xX*aNc*vMx zJYqa%%rc%Z8jPomXN)<KMZLs@OZmqf4X&mX2<6z`Dj?SA6E&f)TO+5us*9~NvZ?L|d3G%?HZO)B$UFX7Dxlhf?Nn7}h>3#zL8^#c{w! zKfQ;XLFjuC3McSQ{6+@n%uPb$L028;;xKi7$s`?Co$>Fb1x4{f?8o!w?p4O!{Mxeo z8hrgBSx9g05go@5edRdK_*|DahPU-w-bs>cET5ap*K(_c&HPM$qcB&P%+(53wwxQw e8D{gjTDG1Y%ayZ5^VE%9Hmzg1e6Co`=l%m-KHdrd diff --git a/flask/venv/lib/python3.6/site-packages/click/__pycache__/_bashcomplete.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/click/__pycache__/_bashcomplete.cpython-36.pyc deleted file mode 100644 index 9d646152bf2466de388c12850de1b3e099731736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9078 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 Szs)N!6;^Wmcc70|I`F^TF^;PM diff --git a/flask/venv/lib/python3.6/site-packages/click/__pycache__/_textwrap.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/click/__pycache__/_textwrap.cpython-36.pyc deleted file mode 100644 index 80a6b9d7fcdb5eb69ce69bfcda91456abce486da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1299 zcmZuxPmdcl6o0m7CbP3?Xanso2ZXpWmAWgHLnTz9N=1M;5{1Nq8nzXBI{FOx!~V#_bj@1NiN{Bypzb0@n^pTGPg0{9d52JYb*F82_H z0>umz^veyK^MW(@7L-uYTTqdPMr=eO6#D`4_!i?~ma{Oa7HzLr{k&|;b8RcKzZ(LT zXSm$wC^QsILBSPM{4EqhM?>WeD`FL^1Z{~LVeK>={)h!%*s|-eV2rsm4scPy=eXRj zD0=Xb7suH2hOc7}4YS{QEdDX96Q3yX@o%J$eBxsTTRru>;eNDX419{Q;wiLK&t0*# zGyFgxp8{+nn%y!y<@RqJmYT?;Am-&N+�pyp(3qp3CcnRW2mdX{&SEbmx{y{&D^1<%FxqOm4e@oY`iqdcuB@~)`c)qyQ@Xwo)v^!5YWF+X zDW3h;7wGAmA5IEXQaxagwYHz*KzSaX7ZEj+p#@aze2km$i3 z+wIs*rr;-F@B-oW7>|C8m+a>OZZ^w#nAC0E*QJqlt909kdv1B=^wkpeohgrOhKGh^ zh$yBDqtLaVRoo}rdzo7t2k{|Q7$Z`)+?6GZyNd!4mV`}ka+aZfbG#4Be#*ayB$!30 zY>D|jD(8sD>Pw_2YZwvgYxw2iOTHHC2vH)c;v2e*>Rn9{AKsvK zL+?z?ERisOx+WioV||$_5q2MLZfC;w|O$a6cHZ+x37b!)e6al z8TN=`i3NLT91eKOMQh%CiY_-n0mzF72uF%*%5IMKq1cO`<)e^F*_LxHWyqwQFVqrg zC&O6Et7T~hkNt>_Bp%sg5}%RyuZ^un_h9Lj(}Qz_Y|7K|c)YdY15D|Ah~FXG{qLCi YY^X_D|5q-gPltZKA|xH%6!KpD0~m@!aR2}S diff --git a/flask/venv/lib/python3.6/site-packages/click/__pycache__/_unicodefun.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/click/__pycache__/_unicodefun.cpython-36.pyc deleted file mode 100644 index 4eedd8beebcb992584951c18a276d14a37cf401e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3331 zcma)8%WvGq8Rw8(E|-=aKVni9T=_Ho<1GC^SA!8 za?Y~;W1aZ9SU<$4{)B;BoMqOanc0Auy*;qG&7I7dx&xP4f{i=E8+W7}jK2#vPK4tJJp!ML-qXHVw1HR;LmoQ>Ua2kdl~_SoazlF6?C>n_+FY~QmM z_M2PS`{Ul+8VBQ34=p*I+b^tb>&>lKpallI&n59z_o7{)hcccDY17`1q8ytjs;xsW z$mC}k_7LLVijvGYeyX@*)d3l(Qa1k#F?rcpsNF=W2x1CszpT> zn|fMqmT9?>=Ae{i8~5(0SvDKXO~Y|JMlJqfmG{eo`g$}>bAALoCK?&xKLTEL6@$fm z7BIK{R+)#@S?1avlWRCVwje2s9LZSlODs53KDS^qYsFHlnvHFF+3cMq>^ir&Jz?@T zL5yp;)6Rl1YtFRC-6g|$=Ubb>4PhJa`AcIQIF7p?%RK%VrrIJ~gj{HmXu(505@Dr8 zSPYxxPgEIxFj$yQ%R=gY7`_~(D#ZUt#CvIW5b{(dMJ3~1;M);NO!!hACUG97xt0a5 z5)rCuM`t43sdn);4-fDlB&z}6>!J$PsHifI6QxDW4NGEHf>$7_ZrliuY#R;>**tEo z5-Kgzd{+U_6C6zo3F0|!O=F!Fd8mX4M_QNa!DeI6ehEtptx8#pp##;2vuu_JdQ{|h zH=!zWx@3}xJ&~<G43!RLF1iF{M`1WT`*xxTl?)!$xHOO`>Huyw+FqQm^Xf6 zj*J&J!$rDzElNfrnM7dzXCy*gP~^21oXTY@_&m56t$a^j2mIKjde{&?<5K^I$+abY z3f6<`a2b{{qz5DfgtWV~mdHs9_R7jHyO#DQf&83V^oK;jUR$~SXSf!3CXW1)FmQKa z>n>78XJUWHH(P6jngtA1#I6!fhz% z({Sw$4;G$2Gk5hzOI!XhcgJVB!%r>kg*$tQ-MOXpTkEf%ExPmW_r2+`7d`@# zO?udUy^T9>z6LL_g@JqzYM1AJLqlKXSLXI5Nbn6aiS-wUUp&qgQl&y*#@a-u$oEoN z-h2H@4>#_=@6dezy_Ym|*UTIDUmn^)aQOE}oTn6RadtBH z9)w^>Q?fvY*J2vx1=2vODTcy7zI?KAKWJD{;l4oFnmn?H6+cQc(?V&4{zM?lNb#mh zNgeo#Y!BfU><~05@?pALQ4%mpYEZT$`-g8$wrUwrRY^IFR4T%)zTqKkAMB6PWJGEu zlvC)KgO7l6(=^>3X=Jw0Fs_T11JUH6RH+Ji?I1+H0`8WLU|3{Xu}`~`R@;kZN?6o` zAPDhm-h|J#qDRl3ebI9CKPQi#|LzEW_{~XKvQ$Bk7)i7$p-&|6Mx0hgqI{%Xa-aYi z*QDf<^8Zj4Q=?=72RdT(*fvM+$ST1Ht2_vAszdwJu=W~$YxfzrJN#D=v_*yLfUzI+ z3zsE|jesZ&am!wVJJ_ijmu{8c+6S_r2;_wh4VP7E7^Py;)|CKDUcd?Hj+j9OtrW*} zT7J36g2iVe!RyTql{?M?zpJo}%3cH2FO2R87u!^KIrQ@iU9mQ0*A1kQ4 zaW|@+g{f1IUTi&m8sbRgC}^a2s!`-&CoJC&w+e)FrvHy(B=XIB{n>F%GU%p=uidty zX;G^Fx-CCJsLGodu)am>Up4Cw@N1@i$zK9qdsJ-`Md4pesR<#Cq*g z*H-r)&k|9R5^B3pD2de$%4H&ysyo|7De~Ige!Bg*K1Gp2*(cVb?*8G$V<`)2=%{x~ zmFcSTMAV&~11&%q^r>|V6bie}(j2f3mG83dAXbE|eMDW;?m02%wL31-9GMB`5xnlU z>Xa)a&dOI+uG6V7B-eXJ#(_6f5k#pwVy0y*e@z!{xi?s$R2j8yJqXZwMoB~ot#*lx zK|qDMIsR!;z7WBq)8RqXwg|w#cL#VC$6(o1jBOO+Rdxm)9ttubD9M1GVQU8FG1m#$ zihTx9x`R{ONAboh*Nk18+0J>q`xq~%W2DXzFxR)~L_P+c^%c2^Nd`3B#!z?B22aaa zHyuiMiY^OjMS67RNuyzTg>F;3X&MBB=!AIGO-R#t_@6h=e?zUjI)lLn6TZFDU32_% H{`nsP=5fwk diff --git a/flask/venv/lib/python3.6/site-packages/click/__pycache__/_winconsole.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/click/__pycache__/_winconsole.cpython-36.pyc deleted file mode 100644 index 7deb5461630a515013087e0847e333389ce2aa7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8743 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 F{{f2oo9_Ss diff --git a/flask/venv/lib/python3.6/site-packages/click/__pycache__/formatting.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/click/__pycache__/formatting.cpython-36.pyc deleted file mode 100644 index d143a944e83b44336c3d46c74f07a3ec81ea436c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8517 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 diff --git a/flask/venv/lib/python3.6/site-packages/click/__pycache__/globals.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/click/__pycache__/globals.cpython-36.pyc deleted file mode 100644 index 06b1b9d75d2f39889e7d22cfc49cd1fcc3afd462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1846 zcmZuxL2uhO6ecChaU3TDTD02^1Gr*C=c09r4#Ngx7&Zhekc%;-K5W4Nn-*z{4kZdC z<=BCDse9cI8TOBK-6{JCyKIk?)H*{6h$1QKz3+YReecWTL6{o#C<}f@tOYLG^mTyH1-FIH46z9(aiKNOEQzIvuSl#i%hz^5$T$&(#55x_P71>r zp@vX$O*h1#-W}UlFXGR370w7 zhL|EwTp+b+9w%x_t`h;LsaPZyg7roOu%NlI5VpujoX~6`vIP;=z>S2i1lXKW#|k*U z!(z=}*P9tDk{2d<-;Jkam~xv8r)TvaCRRD0?lV59j0^^31=t}(${1(EA^B?Xy!tfE zsirA0LP7?IzyLAaI{Kz#U4Su%O#57u6_o{0Zpd_`GWaCsBvVbgJy@61z2Wk-qC(P{ zta8VJ`#CM7BdMkU?tn8*h2ez0&&ZIkA%ho1W<|<>)LQB3z~3t)V`+SK>ni)^)3GZM z2M!=n$R^al-Eth={tKfYl?MxMskORnPrOFTlOJFwW`(WHm)-M>@wInV_VyivtlAY( ze<1C|^w0BCo93sv$e)P}&`A00>lbD%*Gqlsz1QC;Cr}*^$G0mh}U%pFW!$}VbKyV1BMr97c9dq+F^`X0OAa9p8N#m!kt1ge%)lJ z(LOYC3lR^jvK=VSEB7 z23i9`fxZuO?3T@NS@Q5*U={ow^caQ#ba3l&OrB??H;*G?n;id5>#UC2E{UJZ_=Cc8}s_8&&$KGsJNUqA3g zRYo2Q>>k3QzUL;--8%vwK;Kew#eqaXJ*fkF3^%JPjXF@FUEIO?LuVJi?Bh}YpggpR u=9EE~(~jIKRW9AW8nmO||FGxoozKp8ZZhB!m>^|&7o#;QsM*L&| diff --git a/flask/venv/lib/python3.6/site-packages/click/__pycache__/parser.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/click/__pycache__/parser.cpython-36.pyc deleted file mode 100644 index 3888bf69e21cdac7b72cdbc87d8fffe8d46419a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11435 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

9r+w;FKdA z*anP=9yW8zVWenV`kmB(e~6eOi*0Hrp6E9N`iR+uz-Ic@Q_Wa_hkTz?kFI+DaY>JOgWPBZ{b@rSqYC zP=CZI#LDa1_1n9QF9#9N@&V!$)YWot-MIgacMPdLCw}X06U-wYQa8?AaTVrPz#ikIKdr;Lig*_WEk(3Sn*s+ z+5$cE`bGk72r7&zE@xs$Xf+ay=z}6M-HCk{pXU7+Es}q}+5aNtNJ7Kq0nDy^g5>j-mEUHgF>gGC z=ybWti#comGDr?$(|yMm@Irn8*?R`J9yXA@w=}YcI)}%U0=peJgIdc_Z@g!ecpriQ z1Om7s8+d(sk5;e=g(li}aiMeMw6s$)zs>4)uWQfyIUZ;F925gW&vv(4Nhp1RO8Lpv zD2W-AH=D; z-j$mpeF72~QCAd=2p1lR5TN1-b+lcrF?6sAg5p$pM1>uPd+K-ab>f`V0A=U7K3*Ca z(9##J3+4qtd$Z5~A68l&6c33MlY{ymKKAx-NCv<#r1}>9z=H0E3L)|u5@fqhvf~?o zpj6g)?jMP&wLt3w{&c#E!5j zgN~`Vc904o8a+E5x%cn||8g!QV`8Tr)(Vd^`Yl{s#sW&3t6>sVXt?Quu()14Ny``w zK0{g(Ju*}&D$4^A=TdFYRR8h2wGw?GIUqVG@G4LFTM96Q#Ye(-} z=K-c5Nq(Slr1lx{y%f(?_Z6&C7<9}svGs!ge~wvU+DrVRKGcHlX+ifivZiPW>5Sk z%Js;x{86!R-M8?hFJgiaDjgiYXS zVDbPHaZv=w^<@JiG|~j+j_T$vG`zk5x{5#FVQUkC81ByV#-Of#l{?^P!kC8o3-}_9 zK~wJ2!HdGXR39}crp93Dpox}f0Xb-*_0O_a-o&hwgJ0)OQC$BnBb*80fF3N}|8=&^ zJmjER%E8hi4>=&eFJa`fIm$)aY<2avasMi85Z3-l<$fYl%_=QJK+f8UB*RjO8L}^X$o3-ssO|F)fow1*?ARfE8#u&oz#(?v5P!dPh=E^MHmwF#O(u02 zw;Tf9!*@M>@E-AT50~L`eWab`(sF%lepw&(=dm{2?$zX;_sB74DA&rP$FF@RT_%<3 zn)?CO!KoDWo8J5ia#Q}Mpwe>4f86r=x-EZOo>2nCvp4Z=z^amF!sd$)z1x?gGGl z7ZpFpBgWTjIac!`l-Px4(_8VH-WNRIdtR|k`@G8WQa6wkOT96mPC+nI{Rc+PXs;J( z8?60dksq>*sx#rA@5o=f$gQnDlrM28R|f<-_Ga`ZZn#W&+IkCbU0-9pat>_;QE;GF XTjpiQd&zUXhFAAiS6)~-ztZ?0r-Rf# diff --git a/flask/venv/lib/python3.6/site-packages/click/__pycache__/termui.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/click/__pycache__/termui.cpython-36.pyc deleted file mode 100644 index d33a3da36f714e30c2cebed947c286e83f3a2fa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20784 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 diff --git a/flask/venv/lib/python3.6/site-packages/click/__pycache__/testing.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/click/__pycache__/testing.cpython-36.pyc deleted file mode 100644 index d01b7c8aa997c6cf40d26f8b27b86b1468d37689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11588 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 V3v8Fqn~WJOy=JaIYi+Gx{vRuSW2OKA diff --git a/flask/venv/lib/python3.6/site-packages/click/__pycache__/types.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/click/__pycache__/types.cpython-36.pyc deleted file mode 100644 index 8af44ca5495deddafbde248156f6e3e5ed584b89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21831 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 QE|_zwua=RAEdL7s2Us0GjsO4v diff --git a/flask/venv/lib/python3.6/site-packages/click/__pycache__/utils.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/click/__pycache__/utils.cpython-36.pyc deleted file mode 100644 index d56d92a59c3756d7e17a830a18ed2f77c26d2132..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15212 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 diff --git a/flask/venv/lib/python3.6/site-packages/click/_bashcomplete.py b/flask/venv/lib/python3.6/site-packages/click/_bashcomplete.py deleted file mode 100644 index a5f1084..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/_bashcomplete.py +++ /dev/null @@ -1,293 +0,0 @@ -import copy -import os -import re - -from .utils import echo -from .parser import split_arg_string -from .core import MultiCommand, Option, Argument -from .types import Choice - -try: - from collections import abc -except ImportError: - import collections as abc - -WORDBREAK = '=' - -# Note, only BASH version 4.4 and later have the nosort option. -COMPLETION_SCRIPT_BASH = ''' -%(complete_func)s() { - local IFS=$'\n' - COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \\ - COMP_CWORD=$COMP_CWORD \\ - %(autocomplete_var)s=complete $1 ) ) - return 0 -} - -%(complete_func)setup() { - local COMPLETION_OPTIONS="" - local BASH_VERSION_ARR=(${BASH_VERSION//./ }) - # Only BASH version 4.4 and later have the nosort option. - if [ ${BASH_VERSION_ARR[0]} -gt 4 ] || ([ ${BASH_VERSION_ARR[0]} -eq 4 ] && [ ${BASH_VERSION_ARR[1]} -ge 4 ]); then - COMPLETION_OPTIONS="-o nosort" - fi - - complete $COMPLETION_OPTIONS -F %(complete_func)s %(script_names)s -} - -%(complete_func)setup -''' - -COMPLETION_SCRIPT_ZSH = ''' -%(complete_func)s() { - local -a completions - local -a completions_with_descriptions - local -a response - response=("${(@f)$( env COMP_WORDS=\"${words[*]}\" \\ - COMP_CWORD=$((CURRENT-1)) \\ - %(autocomplete_var)s=\"complete_zsh\" \\ - %(script_names)s )}") - - for key descr in ${(kv)response}; do - if [[ "$descr" == "_" ]]; then - completions+=("$key") - else - completions_with_descriptions+=("$key":"$descr") - fi - done - - if [ -n "$completions_with_descriptions" ]; then - _describe -V unsorted completions_with_descriptions -U -Q - fi - - if [ -n "$completions" ]; then - compadd -U -V unsorted -Q -a completions - fi - compstate[insert]="automenu" -} - -compdef %(complete_func)s %(script_names)s -''' - -_invalid_ident_char_re = re.compile(r'[^a-zA-Z0-9_]') - - -def get_completion_script(prog_name, complete_var, shell): - cf_name = _invalid_ident_char_re.sub('', prog_name.replace('-', '_')) - script = COMPLETION_SCRIPT_ZSH if shell == 'zsh' else COMPLETION_SCRIPT_BASH - return (script % { - 'complete_func': '_%s_completion' % cf_name, - 'script_names': prog_name, - 'autocomplete_var': complete_var, - }).strip() + ';' - - -def resolve_ctx(cli, prog_name, args): - """ - Parse into a hierarchy of contexts. Contexts are connected through the parent variable. - :param cli: command definition - :param prog_name: the program that is running - :param args: full list of args - :return: the final context/command parsed - """ - ctx = cli.make_context(prog_name, args, resilient_parsing=True) - args = ctx.protected_args + ctx.args - while args: - if isinstance(ctx.command, MultiCommand): - if not ctx.command.chain: - cmd_name, cmd, args = ctx.command.resolve_command(ctx, args) - if cmd is None: - return ctx - ctx = cmd.make_context(cmd_name, args, parent=ctx, - resilient_parsing=True) - args = ctx.protected_args + ctx.args - else: - # Walk chained subcommand contexts saving the last one. - while args: - cmd_name, cmd, args = ctx.command.resolve_command(ctx, args) - if cmd is None: - return ctx - sub_ctx = cmd.make_context(cmd_name, args, parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - resilient_parsing=True) - args = sub_ctx.args - ctx = sub_ctx - args = sub_ctx.protected_args + sub_ctx.args - else: - break - return ctx - - -def start_of_option(param_str): - """ - :param param_str: param_str to check - :return: whether or not this is the start of an option declaration (i.e. starts "-" or "--") - """ - return param_str and param_str[:1] == '-' - - -def is_incomplete_option(all_args, cmd_param): - """ - :param all_args: the full original list of args supplied - :param cmd_param: the current command paramter - :return: whether or not the last option declaration (i.e. starts "-" or "--") is incomplete and - corresponds to this cmd_param. In other words whether this cmd_param option can still accept - values - """ - if not isinstance(cmd_param, Option): - return False - if cmd_param.is_flag: - return False - last_option = None - for index, arg_str in enumerate(reversed([arg for arg in all_args if arg != WORDBREAK])): - if index + 1 > 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 [] - - # 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 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, so use a well defined character '_' to indicate no description is present. - echo(item[1] if item[1] else '_') - - return True - - -def bashcomplete(cli, prog_name, complete_var, complete_instr): - if complete_instr.startswith('source'): - shell = 'zsh' if complete_instr == 'source_zsh' else 'bash' - echo(get_completion_script(prog_name, complete_var, shell)) - return True - elif complete_instr == 'complete' or complete_instr == 'complete_zsh': - return do_complete(cli, prog_name, complete_instr == 'complete_zsh') - return False diff --git a/flask/venv/lib/python3.6/site-packages/click/_compat.py b/flask/venv/lib/python3.6/site-packages/click/_compat.py deleted file mode 100644 index 937e230..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/_compat.py +++ /dev/null @@ -1,703 +0,0 @@ -import re -import io -import os -import sys -import codecs -from weakref import WeakKeyDictionary - - -PY2 = sys.version_info[0] == 2 -CYGWIN = sys.platform.startswith('cygwin') -# Determine local App Engine environment, per Google's own suggestion -APP_ENGINE = ('APPENGINE_RUNTIME' in os.environ and - 'Development/' in os.environ['SERVER_SOFTWARE']) -WIN = sys.platform.startswith('win') and not APP_ENGINE -DEFAULT_COLUMNS = 80 - - -_ansi_re = re.compile(r'\033\[((?:\d|;)*)([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 - bytes = str - raw_input = raw_input - string_types = (str, unicode) - int_types = (int, long) - iteritems = lambda x: x.iteritems() - range_type = xrange - - 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()) - - 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_compatible_text_stream(stream, encoding, errors): - stream_encoding = getattr(stream, 'encoding', None) - stream_errors = getattr(stream, 'errors', None) - - # Perfect match. - if stream_encoding == encoding and stream_errors == errors: - return True - - # Otherwise, it's only a compatible stream if we did not ask for - # an encoding. - if encoding is None: - return stream_encoding is not None - - return False - - def _force_correct_text_reader(text_reader, encoding, errors, - force_readable=False): - if _is_binary_reader(text_reader, False): - binary_reader = text_reader - else: - # If there is no target encoding set, we need to verify that the - # reader is not actually misconfigured. - if encoding is None and not _stream_is_misconfigured(text_reader): - return text_reader - - if _is_compatible_text_stream(text_reader, encoding, errors): - return text_reader - - # If the reader has no encoding, we try to find the underlying - # binary reader for it. If that fails because the environment is - # misconfigured, we silently go with the same reader because this - # is too common to happen. In that case, mojibake is better than - # exceptions. - binary_reader = _find_binary_reader(text_reader) - if binary_reader is None: - return text_reader - - # At this point, we default the errors to replace instead of strict - # because nobody handles those errors anyways and at this point - # we're so fundamentally fucked that nothing can repair it. - if errors is None: - errors = 'replace' - return _make_text_stream(binary_reader, encoding, errors, - force_readable=force_readable) - - def _force_correct_text_writer(text_writer, encoding, errors, - force_writable=False): - if _is_binary_writer(text_writer, False): - binary_writer = text_writer - else: - # If there is no target encoding set, we need to verify that the - # writer is not actually misconfigured. - if encoding is None and not _stream_is_misconfigured(text_writer): - return text_writer - - if _is_compatible_text_stream(text_writer, encoding, errors): - return text_writer - - # If the writer has no encoding, we try to find the underlying - # binary writer for it. If that fails because the environment is - # misconfigured, we silently go with the same writer because this - # is too common to happen. In that case, mojibake is better than - # exceptions. - binary_writer = _find_binary_writer(text_writer) - if binary_writer is None: - return text_writer - - # At this point, we default the errors to replace instead of strict - # because nobody handles those errors anyways and at this point - # we're so fundamentally fucked that nothing can repair it. - if errors is None: - errors = 'replace' - return _make_text_stream(binary_writer, encoding, errors, - 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 open_stream(filename, mode='r', encoding=None, errors='strict', - atomic=False): - # 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 'b' in mode: - return get_binary_stdout(), False - return get_text_stdout(encoding=encoding, errors=errors), False - if 'b' in mode: - 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: - if encoding is None: - return open(filename, mode), True - return io.open(filename, mode, encoding=encoding, errors=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 tempfile - fd, tmp_filename = tempfile.mkstemp(dir=os.path.dirname(filename), - prefix='.__atomic-write') - - if encoding is not None: - f = io.open(fd, mode, encoding=encoding, errors=errors) - else: - f = os.fdopen(fd, mode) - - 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 should_strip_ansi(stream=None, color=None): - if color is None: - if stream is None: - stream = sys.stdin - return not isatty(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/flask/venv/lib/python3.6/site-packages/click/_termui_impl.py b/flask/venv/lib/python3.6/site-packages/click/_termui_impl.py deleted file mode 100644 index 00a8e5e..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/_termui_impl.py +++ /dev/null @@ -1,621 +0,0 @@ -# -*- coding: utf-8 -*- -""" -click._termui_impl -~~~~~~~~~~~~~~~~~~ - -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. - -:copyright: © 2014 by the Pallets team. -:license: BSD, see LICENSE.rst for more details. -""" - -import os -import sys -import time -import math -import contextlib -from ._compat import _default_text_stdout, range_type, PY2, isatty, \ - open_stream, strip_ansi, term_len, get_best_encoding, WIN, int_types, \ - CYGWIN -from .utils import echo -from .exceptions import ClickException - - -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 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: - days = t - return '%dd %02d:%02d:%02d' % (days, hours, minutes, seconds) - else: - return '%02d:%02d:%02d' % (hours, minutes, seconds) - return '' - - def format_pos(self): - pos = str(self.pos) - if self.length_known: - pos += '/%s' % self.length - return pos - - def format_pct(self): - return ('% 4d%%' % 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): - """ - Returns a generator which yields the items added to the bar during - construction, and updates the progress bar *after* the yielded block - returns. - """ - 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 "%s"' % 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 = 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(cmd + ' "' + 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 'vim', 'nano': - if os.system('which %s >/dev/null 2>&1' % 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('%s "%s"' % (editor, filename), - env=environ, shell=True) - exit_code = c.wait() - if exit_code != 0: - raise ClickException('%s: Editing failed!' % editor) - except OSError as e: - raise ClickException('%s: Editing failed: %s' % (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,"%s"' % _unquote_file( - url.replace('"', '')) - else: - args = 'start %s "" "%s"' % ( - wait and '/WAIT' or '', url.replace('"', '')) - return os.system(args) - elif CYGWIN: - if locate: - url = _unquote_file(url) - args = 'cygstart "%s"' % (os.path.dirname(url).replace('"', '')) - else: - args = 'cygstart %s "%s"' % ( - wait and '-w' or '', url.replace('"', '')) - 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/flask/venv/lib/python3.6/site-packages/click/_textwrap.py b/flask/venv/lib/python3.6/site-packages/click/_textwrap.py deleted file mode 100644 index 7e77603..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/_textwrap.py +++ /dev/null @@ -1,38 +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/flask/venv/lib/python3.6/site-packages/click/_unicodefun.py b/flask/venv/lib/python3.6/site-packages/click/_unicodefun.py deleted file mode 100644 index 620edff..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/_unicodefun.py +++ /dev/null @@ -1,125 +0,0 @@ -import os -import sys -import codecs - -from ._compat import PY2 - - -# If someone wants to vendor click, we want to ensure the -# correct package is discovered. Ideally we could use a -# relative import here but unfortunately Python does not -# support that. -click = sys.modules[__name__.rsplit('.', 1)[0]] - - -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 - if not PY2 or click.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\n' - 'locales were discovered. This most likely requires resolving\n' - 'by reconfiguring the locale system.' - ) - elif has_c_utf8: - extra += ( - 'This system supports the C.UTF-8 locale which is recommended.\n' - 'You might be able to resolve your issue by exporting the\n' - '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\n' - 'you can pick from. The following suitable locales were\n' - 'discovered: %s' - ) % ', '.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\n' - 'but the locale system could not pick up from it because\n' - 'it does not exist. The exported locale is "%s" but it\n' - 'is not supported' - ) % 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/en/7.x/python3/ for' - ' mitigation steps.' + extra - ) diff --git a/flask/venv/lib/python3.6/site-packages/click/_winconsole.py b/flask/venv/lib/python3.6/site-packages/click/_winconsole.py deleted file mode 100644 index bbb080d..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/_winconsole.py +++ /dev/null @@ -1,307 +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 io -import os -import sys -import zlib -import time -import ctypes -import msvcrt -from ._compat import _NonClosingTextIOWrapper, text_type, PY2 -from ctypes import byref, POINTER, c_int, c_char, c_char_p, \ - c_void_p, py_object, c_ssize_t, c_ulong, windll, WINFUNCTYPE -try: - from ctypes import pythonapi - PyObject_GetBuffer = pythonapi.PyObject_GetBuffer - PyBuffer_Release = pythonapi.PyBuffer_Release -except ImportError: - pythonapi = None -from ctypes.wintypes import LPWSTR, LPCWSTR - - -c_ssize_p = POINTER(c_ssize_t) - -kernel32 = windll.kernel32 -GetStdHandle = kernel32.GetStdHandle -ReadConsoleW = kernel32.ReadConsoleW -WriteConsoleW = kernel32.WriteConsoleW -GetLastError = kernel32.GetLastError -GetCommandLineW = WINFUNCTYPE(LPWSTR)( - ('GetCommandLineW', windll.kernel32)) -CommandLineToArgvW = WINFUNCTYPE( - POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( - ('CommandLineToArgvW', windll.shell32)) - - -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(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: %s' % 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 %s' % 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(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 '' % ( - 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)) - argv = [argv_unicode[i] for i in range(0, argc.value)] - - 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 _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 \ - hasattr(f, 'isatty') and f.isatty(): - 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/flask/venv/lib/python3.6/site-packages/click/core.py b/flask/venv/lib/python3.6/site-packages/click/core.py deleted file mode 100644 index 7a1e342..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/core.py +++ /dev/null @@ -1,1856 +0,0 @@ -import errno -import inspect -import os -import sys -from contextlib import contextmanager -from itertools import repeat -from functools import update_wrapper - -from .types import convert_type, IntRange, BOOL -from .utils import PacifyFlushWrapper, make_str, make_default_short_help, \ - echo, get_os_args -from .exceptions import ClickException, UsageError, BadParameter, Abort, \ - MissingParameter, Exit -from .termui import prompt, confirm, style -from .formatting import HelpFormatter, join_options -from .parser import OptionParser, split_opt -from .globals import push_context, pop_context - -from ._compat import PY2, isidentifier, iteritems, string_types -from ._unicodefun import _check_for_unicode_literals, _verify_python3_env - - -_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 = '_%s_COMPLETE' % (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('%s. Command "%s" is set to chain and "%s" was ' - 'added as subcommand but it in itself is a ' - 'multi command. ("%s" is a %s within a chained ' - '%s named "%s").' % ( - 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: - # This will become a warning in Click 3.0: - from warnings import warn - warn(Warning('Invoked legacy parameter callback "%s". The new ' - 'signature for such callbacks starting with ' - 'click 2.0 is (ctx, param, value).' - % callback), 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 that - fly. - """ - 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. - - :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. - """ - - 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): - #: 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 = '%s_%s' % (parent.auto_envvar_prefix, - self.info_name.upper()) - else: - auto_envvar_prefix = auto_envvar_prefix.upper() - 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._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 = __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 = 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): - """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): - """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 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 and sys.argv[0] or __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. - - :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 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, - 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.hidden = hidden - self.deprecated = deprecated - - def get_usage(self, ctx): - 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.""" - 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. This creates a - formatter and will call into the following formatting methods: - """ - 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 calls into 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): - 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%s (%s)' - % (len(args) != 1 and 's' or '', - ' '.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 = args and '*' or 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 "%s".' % 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`. - """ - 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`. - """ - 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. - - .. versionchanged:: 2.0 - Changed signature for parameter callback to also be passed the - parameter. In Click 2.0, the old callback format will still work, - but it will raise a warning to give you change to migrate the - code easier. - - :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. Before Click - 2.0, the signature was ``(ctx, 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. - """ - 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 - - @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 %s. This is ' - 'not supported; nargs needs to be set to ' - 'a fixed value > 1.' % 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: - return os.environ.get(self.envvar) - - 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('"%s"' % 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 is None: - 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 = decl[:1] == '/' and ';' or '/' - 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 (%s). ' - 'Did you mean to declare an argument instead ' - 'of an option?' % 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) - 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 += ' ' + 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 = '%s_%s' % (ctx.auto_envvar_prefix, self.name.upper()) - if envvar is not None: - extra.append('env var: %s' % ( - ', '.join('%s' % d for d in envvar) - if isinstance(envvar, (list, tuple)) - else envvar, )) - if self.default is not None and self.show_default: - if isinstance(self.show_default, string_types): - default_string = '({})'.format(self.show_default) - elif isinstance(self.default, (list, tuple)): - default_string = ', '.join('%s' % 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 = '%s[%s]' % (help and help + ' ' or '', '; '.join(extra)) - - return ((any_prefix_is_slash and '; ' or ' / ').join(rv), help) - - def get_default(self, ctx): - # If we're a non boolean flag out 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 = '%s_%s' % (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 = '[%s]' % 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 %d' % len(decls)) - return name, [arg], [] - - def get_usage_pieces(self, ctx): - return [self.make_metavar()] - - def get_error_hint(self, ctx): - return '"%s"' % self.make_metavar() - - def add_to_parser(self, parser, ctx): - parser.add_argument(dest=self.name, nargs=self.nargs, - obj=self) - - -# Circular dependency between decorators and core -from .decorators import command, group diff --git a/flask/venv/lib/python3.6/site-packages/click/decorators.py b/flask/venv/lib/python3.6/site-packages/click/decorators.py deleted file mode 100644 index c57c530..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/decorators.py +++ /dev/null @@ -1,311 +0,0 @@ -import sys -import inspect - -from functools import update_wrapper - -from ._compat import iteritems -from ._unicodefun import _check_for_unicode_literals -from .utils import echo -from .globals import get_current_context - - -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 %r existing' - % 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. 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 script_name, 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 - - -# Circular dependencies between core and decorators -from .core import Command, Group, Argument, Option diff --git a/flask/venv/lib/python3.6/site-packages/click/exceptions.py b/flask/venv/lib/python3.6/site-packages/click/exceptions.py deleted file mode 100644 index 6fa1765..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/exceptions.py +++ /dev/null @@ -1,235 +0,0 @@ -from ._compat import PY2, filename_to_ui, get_text_stderr -from .utils import echo - - -def _join_param_hints(param_hint): - if isinstance(param_hint, (tuple, list)): - return ' / '.join('"%s"' % 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: %s' % 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 and self.ctx.command or 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 "%s %s" for help.\n' - % (self.ctx.command_path, self.ctx.help_option_names[0])) - if self.ctx is not None: - color = self.ctx.color - echo(self.ctx.get_usage() + '\n%s' % hint, file=file, color=color) - echo('Error: %s' % 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: %s' % self.message - param_hint = _join_param_hints(param_hint) - - return 'Invalid value for %s: %s' % (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 += '. ' + msg_extra - else: - msg = msg_extra - - return 'Missing %s%s%s%s' % ( - param_type, - param_hint and ' %s' % param_hint or '', - msg and '. ' or '.', - msg or '', - ) - - -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: %s' % 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 %s?' % self.possibilities[0]) - else: - possibilities = sorted(self.possibilities) - bits.append('(Possible options: %s)' % ', '.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 %s: %s' % (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. - """ - def __init__(self, code=0): - self.exit_code = code diff --git a/flask/venv/lib/python3.6/site-packages/click/formatting.py b/flask/venv/lib/python3.6/site-packages/click/formatting.py deleted file mode 100644 index a3d6a4d..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/formatting.py +++ /dev/null @@ -1,256 +0,0 @@ -from contextlib import contextmanager -from .termui import get_terminal_size -from .parser import split_opt -from ._compat import term_len - - -# 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 = '%*s%s ' % (self.current_indent, prefix, prog) - text_width = self.width - self.current_indent - - if text_width >= (term_len(usage_prefix) + 20): - # The arguments will fit to the right of the prefix. - indent = ' ' * term_len(usage_prefix) - self.write(wrap_text(args, text_width, - initial_indent=usage_prefix, - subsequent_indent=indent)) - else: - # The prefix is too long, put the arguments on the next line. - self.write(usage_prefix) - self.write('\n') - indent = ' ' * (max(self.current_indent, term_len(prefix)) + 4) - self.write(wrap_text(args, text_width, - initial_indent=indent, - subsequent_indent=indent)) - - self.write('\n') - - def write_heading(self, heading): - """Writes a heading into the buffer.""" - self.write('%*s%s:\n' % (self.current_indent, '', heading)) - - 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('%*s%s' % (self.current_indent, '', first)) - if not second: - self.write('\n') - continue - if term_len(first) <= first_col - col_spacing: - self.write(' ' * (first_col - term_len(first))) - else: - self.write('\n') - self.write(' ' * (first_col + self.current_indent)) - - text_width = max(self.width - first_col - 2, 10) - lines = iter(wrap_text(second, text_width).splitlines()) - if lines: - self.write(next(lines) + '\n') - for line in lines: - self.write('%*s%s\n' % ( - first_col + self.current_indent, '', line)) - 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/flask/venv/lib/python3.6/site-packages/click/globals.py b/flask/venv/lib/python3.6/site-packages/click/globals.py deleted file mode 100644 index 843b594..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/globals.py +++ /dev/null @@ -1,48 +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: is set to `True` the return value is `None` if no context - is available. The default behavior is to raise a - :exc:`RuntimeError`. - """ - try: - return getattr(_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/flask/venv/lib/python3.6/site-packages/click/parser.py b/flask/venv/lib/python3.6/site-packages/click/parser.py deleted file mode 100644 index 1c3ae9c..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/parser.py +++ /dev/null @@ -1,427 +0,0 @@ -# -*- coding: utf-8 -*- -""" -click.parser -~~~~~~~~~~~~ - -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. -""" - -import re -from collections import deque -from .exceptions import UsageError, NoSuchOption, BadOptionUsage, \ - BadArgumentUsage - - -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, '%s option requires an argument' % opt) - raise BadOptionUsage(opt, '%s option requires %d arguments' % (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"('([^'\\]*(?:\\.[^'\\]*)*)'" - r'|"([^"\\]*(?:\\.[^"\\]*)*)"' - 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 (%s)' - % 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 %r' % 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 %s takes %d values' - % (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 = set(['-', '--']) - 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, '%s option does not take a value' % 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(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/flask/venv/lib/python3.6/site-packages/click/termui.py b/flask/venv/lib/python3.6/site-packages/click/termui.py deleted file mode 100644 index bf9a3aa..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/termui.py +++ /dev/null @@ -1,606 +0,0 @@ -import os -import sys -import struct -import inspect -import itertools - -from ._compat import raw_input, text_type, string_types, \ - isatty, strip_ansi, get_winterm_size, DEFAULT_COLUMNS, WIN -from .utils import echo -from .exceptions import Abort, UsageError -from .types import convert_type, Choice, Path -from .globals import resolve_color_default - - -# 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 += ' (' + ", ".join(map(str, type.choices)) + ')' - if default is not None and show_default: - prompt = '%s [%s]' % (prompt, default) - return prompt + suffix - - -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 = hide_input and hidden_prompt_func or 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: %s' % e.message, err=err) - 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, - default and 'Y/n' or '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 displayed. 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. - - 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[%dm' % (_ansi_colors[fg])) - except KeyError: - raise TypeError('Unknown color %r' % fg) - if bg: - try: - bits.append('\033[%dm' % (_ansi_colors[bg] + 10)) - except KeyError: - raise TypeError('Unknown color %r' % bg) - if bold is not None: - bits.append('\033[%dm' % (1 if bold else 22)) - if dim is not None: - bits.append('\033[%dm' % (2 if dim else 22)) - if underline is not None: - bits.append('\033[%dm' % (4 if underline else 24)) - if blink is not None: - bits.append('\033[%dm' % (5 if blink else 25)) - if reverse is not None: - bits.append('\033[%dm' % (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/flask/venv/lib/python3.6/site-packages/click/testing.py b/flask/venv/lib/python3.6/site-packages/click/testing.py deleted file mode 100644 index 1b2924e..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/testing.py +++ /dev/null @@ -1,374 +0,0 @@ -import os -import sys -import shutil -import tempfile -import contextlib -import shlex - -from ._compat import iteritems, PY2, string_types - - -# If someone wants to vendor click, we want to ensure the -# correct package is discovered. Ideally we could use a -# relative import here but unfortunately Python does not -# support that. -clickpkg = sys.modules[__name__.rsplit('.', 1)[0]] - - -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 False(y) 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 not self.stderr_bytes: - raise ValueError("stderr not separately captured") - return self.stderr_bytes.decode(self.runner.charset, 'replace') \ - .replace('\r\n', '\n') - - - def __repr__(self): - return '<%s %s>' % ( - type(self).__name__, - self.exception and repr(self.exception) or '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 = clickpkg.formatting.FORCED_WIDTH - clickpkg.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(val + '\n') - sys.stdout.flush() - return val - - def hidden_input(prompt=None): - sys.stdout.write((prompt or '') + '\n') - 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 = clickpkg.termui.visible_prompt_func - old_hidden_prompt_func = clickpkg.termui.hidden_prompt_func - old__getchar_func = clickpkg.termui._getchar - old_should_strip_ansi = clickpkg.utils.should_strip_ansi - clickpkg.termui.visible_prompt_func = visible_input - clickpkg.termui.hidden_prompt_func = hidden_input - clickpkg.termui._getchar = _getchar - clickpkg.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 - clickpkg.termui.visible_prompt_func = old_visible_prompt_func - clickpkg.termui.hidden_prompt_func = old_hidden_prompt_func - clickpkg.termui._getchar = old__getchar_func - clickpkg.utils.should_strip_ansi = old_should_strip_ansi - clickpkg.formatting.FORCED_WIDTH = old_forced_width - - def invoke(self, cli, args=None, input=None, env=None, - catch_exceptions=True, color=False, mix_stderr=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() - stderr = outstreams[1] and 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): - pass diff --git a/flask/venv/lib/python3.6/site-packages/click/types.py b/flask/venv/lib/python3.6/site-packages/click/types.py deleted file mode 100644 index 1f88032..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/types.py +++ /dev/null @@ -1,668 +0,0 @@ -import os -import stat -from datetime import datetime - -from ._compat import open_stream, text_type, filename_to_ui, \ - get_filesystem_encoding, get_streerror, _get_argv_encoding, PY2 -from .exceptions import BadParameter -from .utils import safecall, LazyFile - - -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') - 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. - - 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 '[%s]' % '|'.join(self.choices) - - def get_missing_message(self, param): - return 'Choose from:\n\t%s.' % ',\n\t'.join(self.choices) - - def convert(self, value, param, ctx): - # Exact match - if value in self.choices: - return value - - # 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 = 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(choice) for choice in - self.choices] - - if not self.case_sensitive: - normed_value = normed_value.lower() - normed_choices = [choice.lower() for choice in normed_choices] - - if normed_value in normed_choices: - return normed_value - - self.fail('invalid choice: %s. (choose from %s)' % - (value, ', '.join(self.choices)), param, ctx) - - def __repr__(self): - return 'Choice(%r)' % 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, UnicodeError): - self.fail('%s is not a valid integer' % 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('%s is bigger than the maximum valid value ' - '%s.' % (rv, self.max), param, ctx) - elif self.max is None: - self.fail('%s is smaller than the minimum valid value ' - '%s.' % (rv, self.min), param, ctx) - else: - self.fail('%s is not in the valid range of %s to %s.' - % (rv, self.min, self.max), param, ctx) - return rv - - def __repr__(self): - return 'IntRange(%r, %r)' % (self.min, self.max) - - -class FloatParamType(ParamType): - name = 'float' - - def convert(self, value, param, ctx): - try: - return float(value) - except (UnicodeError, ValueError): - self.fail('%s is not a valid floating point value' % - 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('%s is bigger than the maximum valid value ' - '%s.' % (rv, self.max), param, ctx) - elif self.max is None: - self.fail('%s is smaller than the minimum valid value ' - '%s.' % (rv, self.min), param, ctx) - else: - self.fail('%s is not in the valid range of %s to %s.' - % (rv, self.min, self.max), param, ctx) - return rv - - def __repr__(self): - return 'FloatRange(%r, %r)' % (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('%s is not a valid boolean' % 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 (UnicodeError, ValueError): - self.fail('%s is not a valid UUID value' % 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: - self.fail('Could not open file: %s: %s' % ( - 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('%s "%s" does not exist.' % ( - self.path_type, - filename_to_ui(value) - ), param, ctx) - - if not self.file_okay and stat.S_ISREG(st.st_mode): - self.fail('%s "%s" is a file.' % ( - self.path_type, - filename_to_ui(value) - ), param, ctx) - if not self.dir_okay and stat.S_ISDIR(st.st_mode): - self.fail('%s "%s" is a directory.' % ( - self.path_type, - filename_to_ui(value) - ), param, ctx) - if self.writable and not os.access(value, os.W_OK): - self.fail('%s "%s" is not writable.' % ( - self.path_type, - filename_to_ui(value) - ), param, ctx) - if self.readable and not os.access(value, os.R_OK): - self.fail('%s "%s" is not readable.' % ( - 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 "<" + " ".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 ty into the most appropriate param - ty. - """ - 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 (%s).' % 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/flask/venv/lib/python3.6/site-packages/click/utils.py b/flask/venv/lib/python3.6/site-packages/click/utils.py deleted file mode 100644 index fc84369..0000000 --- a/flask/venv/lib/python3.6/site-packages/click/utils.py +++ /dev/null @@ -1,440 +0,0 @@ -import os -import sys - -from .globals import resolve_color_default - -from ._compat import text_type, open_stream, get_filesystem_encoding, \ - get_streerror, string_types, PY2, binary_streams, text_streams, \ - filename_to_ui, auto_wrap_for_ansi, strip_ansi, should_strip_ansi, \ - _default_text_stdout, _default_text_stderr, is_bytes, WIN - -if not PY2: - from ._compat import _find_binary_writer -elif WIN: - from ._winconsole import _get_windows_argv, \ - _hash_py_argv, _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 = result and 1 + len(word) or 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 '' % (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: - 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 %r' % 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 %r' % 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 = roaming and 'APPDATA' or '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('~/.' + _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/flask/venv/lib/python3.6/site-packages/dotenv/__init__.py b/flask/venv/lib/python3.6/site-packages/dotenv/__init__.py deleted file mode 100644 index 50f27cd..0000000 --- a/flask/venv/lib/python3.6/site-packages/dotenv/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -from .main import load_dotenv, get_key, set_key, unset_key, find_dotenv, dotenv_values - - -def load_ipython_extension(ipython): - from .ipython import load_ipython_extension - load_ipython_extension(ipython) - - -def get_cli_string(path=None, action=None, key=None, value=None, quote=None): - """Returns a string suitable for running as a shell script. - - Useful for converting a arguments passed to a fabric task - to be passed to a `local` or `run` command. - """ - command = ['dotenv'] - if quote: - command.append('-q %s' % quote) - if path: - command.append('-f %s' % path) - if action: - command.append(action) - if key: - command.append(key) - if value: - if ' ' in value: - command.append('"%s"' % value) - else: - command.append(value) - - return ' '.join(command).strip() - - -__all__ = ['get_cli_string', - 'load_dotenv', - 'dotenv_values', - 'get_key', - 'set_key', - 'unset_key', - 'find_dotenv', - 'load_ipython_extension'] diff --git a/flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/__init__.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index 37a5a4f4849c1f182bf7c82ec5565b6a28b61214..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1042 zcmZuv&1&2*5SIME-fZZhgdBPhfgHB5S!fT1Qc5AW9&%{u#S|Q^rQLWV%Z?<6WN}W( z%M|)VzV_0-LQWmYZb_kI=11e1(P-v-J)5OJlhd!O0HGh~2_;~E0M;KtFvPGx70z(w zWnSfHeidXv6=q=-Wf4ZqWBvomVm4zTiym;6u!zMhVH1|JDcfWICdno&_>AWJzc3V> zNBvaPl;x~8TweF_hMWA7-}bQ{jY%v2nA3GB|3=P+jQpC4mg~Y6v*e9@3R)k6V3>Kf zh zOH(z=rfe3a)P@SNc=Jl%h?}ii4&@d@o6Aw0(IDhTbOkh9JuFnNWF9(zeA%3D`7nyw$JUn@#MLauLKJ^|1wf5 zmlbyYkR?->ItT7YODkN3Fs4`K?d>Gv&g3sL67a4b;t3lJ!Z zaDewmPC;8v@G~#<)B*fg7O^U}!Y*4`FenQFW%oZ1&n(T;KB#CZhv5Ij4FxPpUC}c1cU8?=!QWf_>*pYdpM>e5ho64G0nx4gGXMYp diff --git a/flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/cli.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/cli.cpython-36.pyc deleted file mode 100644 index 40415d1fe1ba27982c66c0f2c9f88c8ea38e2b92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2948 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 diff --git a/flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/ipython.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/ipython.cpython-36.pyc deleted file mode 100644 index f9af16fcf74b00f0a2bbdc68797312d083246b52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1473 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 acg!hOuQ{bkwd|HpJExq*@=N7Hx$r;V*uzBt diff --git a/flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/version.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/dotenv/__pycache__/version.cpython-36.pyc deleted file mode 100644 index 5ab2a014bbb1ac97e46a63d78b51307205f7b735..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmXr!<>h+8;T$8*z`*brh~a<{$Z`PUVh$jY!Vtxf!Whh;$yCK=pl1j~ewvK8xZ~r? zQj3Z+^Yh~4S27ea0TqIYUzYkMxdr+KnFYF;dBr7(IXSxKM#U956 1 - and string[0] == string[-1] == char - ) - - -def parse_binding(string, position): - match = _binding.match(string, position) - (matched, key, value) = match.groups() - if key is None or value is None: - key = None - value = None - else: - value_quoted = is_surrounded_by(value, "'") or is_surrounded_by(value, '"') - if value_quoted: - value = decode_escapes(value[1:-1]) - else: - value = value.strip() - return (Binding(key=key, value=value, original=matched), match.end()) - - -def parse_stream(stream): - string = stream.read() - position = 0 - length = len(string) - while position < length: - (binding, position) = parse_binding(string, position) - yield binding - - -class DotEnv(): - - def __init__(self, dotenv_path, verbose=False): - self.dotenv_path = dotenv_path - self._dict = None - self.verbose = verbose - - @contextmanager - def _get_stream(self): - if isinstance(self.dotenv_path, StringIO): - yield self.dotenv_path - elif os.path.isfile(self.dotenv_path): - with io.open(self.dotenv_path) as stream: - yield stream - else: - if self.verbose: - warnings.warn("File doesn't exist {}".format(self.dotenv_path)) - yield StringIO('') - - def dict(self): - """Return dotenv as dict""" - if self._dict: - return self._dict - - values = OrderedDict(self.parse()) - self._dict = resolve_nested_variables(values) - return self._dict - - def parse(self): - with self._get_stream() as stream: - for mapping in parse_stream(stream): - if mapping.key is not None and mapping.value is not None: - yield mapping.key, mapping.value - - def set_as_environment_variables(self, override=False): - """ - Load the current dotenv as system environemt variable. - """ - for k, v in self.dict().items(): - if k in os.environ and not override: - continue - # With Python2 on Windows, force environment variables to str to avoid - # "TypeError: environment can only contain strings" in Python's subprocess.py. - if PY2 and WIN: - if isinstance(k, text_type) or isinstance(v, text_type): - k = k.encode('ascii') - v = v.encode('ascii') - os.environ[k] = v - - return True - - def get(self, key): - """ - """ - data = self.dict() - - if key in data: - return data[key] - - if self.verbose: - warnings.warn("key %s not found in %s." % (key, self.dotenv_path)) - - -def get_key(dotenv_path, key_to_get): - """ - Gets the value of a given key from the given .env - - If the .env path given doesn't exist, fails - """ - return DotEnv(dotenv_path, verbose=True).get(key_to_get) - - -@contextmanager -def rewrite(path): - try: - with tempfile.NamedTemporaryFile(mode="w+", delete=False) as dest: - with io.open(path) as source: - yield (source, dest) - except BaseException: - if os.path.isfile(dest.name): - os.unlink(dest.name) - raise - else: - shutil.move(dest.name, path) - - -def set_key(dotenv_path, key_to_set, value_to_set, quote_mode="always"): - """ - Adds or Updates a key/value to the given .env - - If the .env path given doesn't exist, fails instead of risking creating - an orphan .env somewhere in the filesystem - """ - value_to_set = value_to_set.strip("'").strip('"') - if not os.path.exists(dotenv_path): - warnings.warn("can't write to %s - it doesn't exist." % dotenv_path) - return None, key_to_set, value_to_set - - if " " in value_to_set: - quote_mode = "always" - - line_template = '{}="{}"\n' if quote_mode == "always" else '{}={}\n' - line_out = line_template.format(key_to_set, value_to_set) - - with rewrite(dotenv_path) as (source, dest): - replaced = False - for mapping in parse_stream(source): - if mapping.key == key_to_set: - dest.write(line_out) - replaced = True - else: - dest.write(mapping.original) - if not replaced: - dest.write(line_out) - - return True, key_to_set, value_to_set - - -def unset_key(dotenv_path, key_to_unset, quote_mode="always"): - """ - Removes a given key from the given .env - - If the .env path given doesn't exist, fails - If the given key doesn't exist in the .env, fails - """ - if not os.path.exists(dotenv_path): - warnings.warn("can't delete from %s - it doesn't exist." % dotenv_path) - return None, key_to_unset - - removed = False - with rewrite(dotenv_path) as (source, dest): - for mapping in parse_stream(source): - if mapping.key == key_to_unset: - removed = True - else: - dest.write(mapping.original) - - if not removed: - warnings.warn("key %s not removed from %s - key doesn't exist." % (key_to_unset, dotenv_path)) - return None, key_to_unset - - return removed, key_to_unset - - -def resolve_nested_variables(values): - def _replacement(name): - """ - get appropriate value for a variable name. - first search in environ, if not found, - then look into the dotenv variables - """ - ret = os.getenv(name, new_values.get(name, "")) - return ret - - def _re_sub_callback(match_object): - """ - From a match object gets the variable name and returns - the correct replacement - """ - return _replacement(match_object.group()[2:-1]) - - new_values = {} - - for k, v in values.items(): - new_values[k] = __posix_variable.sub(_re_sub_callback, v) - - return new_values - - -def _walk_to_root(path): - """ - Yield directories starting from the given directory up to the root - """ - if not os.path.exists(path): - raise IOError('Starting path not found') - - if os.path.isfile(path): - path = os.path.dirname(path) - - last_dir = None - current_dir = os.path.abspath(path) - while last_dir != current_dir: - yield current_dir - parent_dir = os.path.abspath(os.path.join(current_dir, os.path.pardir)) - last_dir, current_dir = current_dir, parent_dir - - -def find_dotenv(filename='.env', raise_error_if_not_found=False, usecwd=False): - """ - Search in increasingly higher folders for the given file - - Returns path to the file if found, or an empty string otherwise - """ - if usecwd or '__file__' not in globals(): - # should work without __file__, e.g. in REPL or IPython notebook - path = os.getcwd() - else: - # will work for .py files - frame = sys._getframe() - # find first frame that is outside of this file - while frame.f_code.co_filename == __file__: - frame = frame.f_back - frame_filename = frame.f_code.co_filename - path = os.path.dirname(os.path.abspath(frame_filename)) - - for dirname in _walk_to_root(path): - check_path = os.path.join(dirname, filename) - if os.path.isfile(check_path): - return check_path - - if raise_error_if_not_found: - raise IOError('File not found') - - return '' - - -def load_dotenv(dotenv_path=None, stream=None, verbose=False, override=False): - f = dotenv_path or stream or find_dotenv() - return DotEnv(f, verbose=verbose).set_as_environment_variables(override=override) - - -def dotenv_values(dotenv_path=None, stream=None, verbose=False): - f = dotenv_path or stream or find_dotenv() - return DotEnv(f, verbose=verbose).dict() - - -def run_command(command, env): - """Run command in sub process. - - Runs the command in a sub process with the variables from `env` - added in the current environment variables. - - Parameters - ---------- - command: List[str] - The command and it's parameters - env: Dict - The additional environment variables - - Returns - ------- - int - The return code of the command - - """ - # copy the current environment variables and add the vales from - # `env` - cmd_env = os.environ.copy() - cmd_env.update(env) - - p = Popen(command, - universal_newlines=True, - bufsize=0, - shell=False, - env=cmd_env) - _, _ = p.communicate() - - return p.returncode diff --git a/flask/venv/lib/python3.6/site-packages/dotenv/version.py b/flask/venv/lib/python3.6/site-packages/dotenv/version.py deleted file mode 100644 index 1f4c4d4..0000000 --- a/flask/venv/lib/python3.6/site-packages/dotenv/version.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "0.10.1" diff --git a/flask/venv/lib/python3.6/site-packages/easy_install.py b/flask/venv/lib/python3.6/site-packages/easy_install.py deleted file mode 100644 index d87e984..0000000 --- a/flask/venv/lib/python3.6/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/flask/venv/lib/python3.6/site-packages/flask/__init__.py b/flask/venv/lib/python3.6/site-packages/flask/__init__.py deleted file mode 100644 index ded1982..0000000 --- a/flask/venv/lib/python3.6/site-packages/flask/__init__.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask - ~~~~~ - - A microframework based on Werkzeug. It's extensively documented - and follows best practice patterns. - - :copyright: © 2010 by the Pallets team. - :license: BSD, see LICENSE for more details. -""" - -__version__ = '1.0.2' - -# utilities we import from Werkzeug and Jinja2 that are unused -# in the module but are exported as public interface. -from werkzeug.exceptions import abort -from werkzeug.utils import redirect -from jinja2 import Markup, escape - -from .app import Flask, Request, Response -from .config import Config -from .helpers import url_for, flash, send_file, send_from_directory, \ - get_flashed_messages, get_template_attribute, make_response, safe_join, \ - stream_with_context -from .globals import current_app, g, request, session, _request_ctx_stack, \ - _app_ctx_stack -from .ctx import has_request_context, has_app_context, \ - after_this_request, copy_current_request_context -from .blueprints import Blueprint -from .templating import render_template, render_template_string - -# the signals -from .signals import signals_available, template_rendered, request_started, \ - request_finished, got_request_exception, request_tearing_down, \ - appcontext_tearing_down, appcontext_pushed, \ - appcontext_popped, message_flashed, before_render_template - -# We're not exposing the actual json module but a convenient wrapper around -# it. -from . import json - -# This was the only thing that Flask used to export at one point and it had -# a more generic name. -jsonify = json.jsonify - -# backwards compat, goes away in 1.0 -from .sessions import SecureCookieSession as Session -json_available = True diff --git a/flask/venv/lib/python3.6/site-packages/flask/__main__.py b/flask/venv/lib/python3.6/site-packages/flask/__main__.py deleted file mode 100644 index 4aee654..0000000 --- a/flask/venv/lib/python3.6/site-packages/flask/__main__.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.__main__ - ~~~~~~~~~~~~~~ - - Alias for flask.run for the command line. - - :copyright: © 2010 by the Pallets team. - :license: BSD, see LICENSE for more details. -""" - -if __name__ == '__main__': - from .cli import main - main(as_module=True) diff --git a/flask/venv/lib/python3.6/site-packages/flask/__pycache__/__init__.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/flask/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index eba1acb1f47f37afb1e7fec70d0e2b45f92e9534..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1794 zcmZ9MTW=Fb6oA*)b!^9pxCiwe9D6{C_WLW!3O9?E4^h6=Cbaz$0a=RVYU4bRocS94J3b!hMgGMQHOjEb%4i@D42VWmw@Wu*z3qjjzEvU(app>JnV$m*EP(0vmh-uJWsJ zjbDT7{Ca-hPz-MH8*r1~gj@U;+~&7)eN)|myZml0&#QZIpWlZr@8;*0dH@gkL)he- zu*J8a$9u5Nw_%6xz%Ji~J-!Ez_#=4CAHx&=B>&BV`U3X(e!-Lb$4~iFta4F(2?zWu zylwMm(bAFE?M(i{uGJYn0~MHYF8xkVJr}=a5QjP)=m6wNs>iG!7#XoNVZTT{ekUix z9%HZUJ;UUwm5GVpN_EDfG@O7;tc-FeK@zb+s#JPnSYH~;G983A4kgP1Yo$(1?>yQ; zm}X}>9**n*`|~~9+u7Y={WE4qlKm7YC9Ppr2GGmB9w_vX7~c!Q@@-jWk(`f$`_n!!#Mh!|t5(Ct3-N>nha8k()CziNqjQ z(sj;7oq{-zmFhFMJd{@CrZN&BjR}U*xK+|x37HD46xbXc_a|1mc?iZ*=xJbd9t@;7 zPU8ffTa7IdC$SxgFvXsq+HTb~!im;60TE=GD-4~lr`h`kW5sFWme5^ZkO=LmFg6Is zu0`e_&)u@?i~{q~@Z7yyAZ2bjRV)Pq9HX$K_`=w2&@9C)jf+^*3=3}Vg__7r#|gE5 z0dtMW!?bj_`acCGh^E7C!?jI3Oag@oyv5N5eQa=h_A|_s+{lO=o)?FOY1~7%I8zMb zBsL?|tPE3oQJOprWoD@_%QHjVGzuxA^dxa>SnjmDnB*rH?N2VUN$&VFRhng#&UC`F ziM!Rl#ATt8epWZGRQcGX34V8uBsNbTrs+7AN9RNP`E~be=L<|J6v8!xcq=sxQwZKU znZ1t}r5H{BioA7kGqLzC=n^Tb$8mBT?CCNdbcHk}EJXWstP$oAu8Jk&dh0qJ{E<`{ z#?uYDZxZGSEy4m}kb>{$KKUU0ySr^6+s@)_D^76jl-kXn+A^IBRQnT+#JA z(u|?I+re-&9y$qGD26CAgbSTSRk*wL+d2VaSOxXz4>6qV6OCm-7lMuAplV`Fiwxs> zASaU9%FhH>wO?zXnl?H3>2-`OJ0&mMJlDov*FNj(rC7eGjx%SAJK3aMRpI$Y=OVIO Mbi+d6h429W0%IU{(*OVf diff --git a/flask/venv/lib/python3.6/site-packages/flask/__pycache__/_compat.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/flask/__pycache__/_compat.cpython-36.pyc deleted file mode 100644 index 765a3ed9801084b6b92e731a7190f62cb7b7afc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3193 zcmbVO-EtH+7M8kuei;uKjKSb+lx&h^5*Pz1ijQ zc#4q!l9!(IFun&(e@zJyBqV|gFQp-sbjK5Pfe3%s3w;rY+6xi}($`OAEv(DhkcJJ} zguW%}ZmlgE?tMx$-Ma%wt#oG84Np@{ghkr^vvt#CdpM6!YPNydMHO zyLtV_b+$QXW?QngC{3l&%*bfecN>?}B$k<$%j~oD&#y8qC42Z_Wp%K=%7(dOqg;V4 z(nLwB`|Tew5(hte(8oZLd+?2I1)2_^J0!p%9sB^DrTfYUk?VfCzGOzlQjrwbl1v-0 z{Js;}7Y7h~JJlSZRW5#60daA-u;p*x`)jd8j=FfgEfhfc_ZIvaYP z4H6@j4R+;Nqdnr-9#uQSTY!N>{~f@p0h?_7X_W3sKvpdTo1XO;`_li7T?5NUzXg5y z2pSI7-I8Xwm!^^0(hwgYX|6+{Wm^xvjL|B5@I7T~5hjOpha7slEj0%tdgx8)b9x9( zlpX~3W;i!0isfb$?{aRt&l0nJEa~~yGli`=5@5Lb3IVpEq>2(P87R}}IYQg;Q|DlG zg6nAjHDLu@NG6pDa1L}}>Aqhj`6}#s-GRRW+D6bf`tI8Ag>511o7~nvLIo$a!EKex z4sHoKWEEjoOmUSt`>ryx`IkYS$=-6Cm1Le+J3-^ryYm%|hlEqSAzlEfyv$60@YJrEs9MtyA@Y*L338y&U%aS-365^mPGaNzKW5U1Ub(f;I5fU0X_#hb- zsT|47Xl`!VgDe_J+cw*Y=6LI9mo&g`&CP6p_$8~z3X-15XPkeE z;21xI9`xR5Tff>h=moY3W6%j<(dK-Vi@g-b9nQbqi_&sMy#u(VnVxzZ$LvVpDy3~r zPkj#-oE=T7-iNV04OI~C&`6EBBOHzrm~kN;X3sB?947w#btUeUW#O7C`7XBwX?;z81w2*BZ2WtJ14Rfv4quVmSXA^*H`$ z+dG&!vdXOudNuVftgAm__a1gwp4AQP+yRd}^o{xux^-v{ut}SqlWag>_uj_v6nP9a zVF~_WJ1@J(`fE>ahAo~5paVX(;1F<)xTR+K+oqB4t>#ca zeo`wW%{Jh>1TIgbFv-*f6nROmW^jhd=L(B$RCUk>X`XG_R=i$av^J3YGIrqAjR3S494~5d_X(&Ov9rdtj@tM Jn8D}_{TW?4xGewx diff --git a/flask/venv/lib/python3.6/site-packages/flask/__pycache__/app.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/flask/__pycache__/app.cpython-36.pyc deleted file mode 100644 index 7a3df8106c4ea4fb37308ac2ecdf96a9cbfee15c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70868 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 ZJ!8)ue|sY*8>AmLZSH(58M9hf{06kM>J$I~ diff --git a/flask/venv/lib/python3.6/site-packages/flask/__pycache__/blueprints.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/flask/__pycache__/blueprints.cpython-36.pyc deleted file mode 100644 index 3a69efc38604513ba41fa5aef6b242d0c18a3926..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20457 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 XtYcb+ALJpt*cI89N1fuqqV>N4Ic5E7 diff --git a/flask/venv/lib/python3.6/site-packages/flask/__pycache__/config.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/flask/__pycache__/config.cpython-36.pyc deleted file mode 100644 index b8dc64af33464a458b94b9e7e3441779c0732bc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9960 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 diff --git a/flask/venv/lib/python3.6/site-packages/flask/__pycache__/debughelpers.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/flask/__pycache__/debughelpers.cpython-36.pyc deleted file mode 100644 index ebefbc13ea11daeba6c80f3a282346a34d576097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6569 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 J)i5MO@(%>u;WhvO diff --git a/flask/venv/lib/python3.6/site-packages/flask/__pycache__/helpers.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/flask/__pycache__/helpers.cpython-36.pyc deleted file mode 100644 index 5c2d448d9c4096a35a588e45b8aaf999b77a26a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33029 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�fz zeoVM8lLiIrtT&SBH0W=wKiXPveb8Bdxb{J3YyC&h)>{;|lc32D2aw~h^24DxbVOmjR;=OOp&YqD3&9G$S0-qsxFQ9ri+TNp4`x&jA8WKnt~)~M2cprC|>uFjdCo&(z>#CI7tghjvj%4QI4q-zCImw;a*QF34{PhLw#o0bpq zZ}zBOKtKBXr81oS7Yh)oP32=qi|iOxKd5=iI5O#J!G2z`KAUG!i>11G0{4w*CCYa^udUoL?Bo12ZxbC=j?-HXdc?fS^;9bi)pR~OVD z((||I^oULb_|^C6^Z}hV==7LQn{=YpdqrC&a>P!Pg*VYKz!B1VuzdrIz!fBYb-QY> z;;7hV994V8wiUhE!;$?+x8B7OzK2tO5so(2$dWAYSFoAO7R7c|Vi{Q0vAjl`YzkOj zqYXB+yhdAVXnBn`(k#UDc0Ob(I~i}ofu~7c8dE5J=M^|z9tb0BgUccgW%thP9vhZ* z)W;^gy*~SoRm7InZhmuKm%(An6DxH6h_)T1yYk{io|x+BmEA_AjYeA7p!MU}B1fe@0zK--bfRsV>L+xfeF%9> zqT2NIoFlnLh@Sd~$sszVW3G`#Q+O$0yNqR+IJin+Odhl@Zh^`q*PP#57CNY`K^xGR zha+5oKj5P-9*V+&t*#M23BAzfp#36RtWztzhxe>A;&cg5%XnHkdHJ-60;6?WVxE`j zjZ?I=;M*empr-Z>csMRY@|QnJcfi5zRtD~I2ipxARrN85h$~v~A@8h+uO#wMOE0vm z4KmPpP8ZM>Em|wuQxumdEQN|3YNL{?&pf3@BaDkEMyNlb8;cT%bNpwU-6UocEH9ue zgDq~x5)K>JCa!8YCXKIT`dklBY^LDMto}P(WURJuWiZoG(G9-~W}E6Bn2CKvV4-Gc zQSZq@TS+}a8!TL)#>?!q^{%b(BNkO*zsh})0BU?y!PNp^*|@6fw?D1odXb*)FGb5# zFNP3n=y`=lt({g+%QW_B(rS5Zr`b^BQqG4Ge1el=SeD3Hb?95#Ocq-x1)ao2DkrjIo#$~`aY|x5 z7=`L*^bu_oO1f$+18>!L z?`zLPJ}ADP+R1*1-E&ii!rq9t8>uedW4rsBfVGYH?$hKix`8IyjNCm{rGd!Y^b{$a$7KyJIh?AH+KA$uh_l!n+i&YY^bU2w ednFN?;R5Oq?}|Q(D>p9x!OHT=UliUe7yl0qg&i9J diff --git a/flask/venv/lib/python3.6/site-packages/flask/__pycache__/signals.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/flask/__pycache__/signals.cpython-36.pyc deleted file mode 100644 index 45e96024c104163141b9a02b770a84f2af58817a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2382 zcmZuy-EP}96qaP!Q5>iFY1;K>055hEpmDoyz<{7AilyxkU`UH)z&33FL5p;vM3z*N zZepX@#nLy~Ro`ORW9W7_-7D;B-=QSWE=Gg&A$fQX&v(8c=4KAyNKlajUTT&sSl~|qzyrP3@NGx0{GnHXj2J}d0G(pRZbwG)wLbTosBY=*PRC9?$+EH8?3 zSo=6kigKpYvvYgM{(R3KJ^cJ38_gK(uva*);M*!O89IZ9S(>Qas6+Pk>9hOHD8;@# zK6-v~`kajm%_fCbOe%}(m|_3L-w4**_p9|2F;S)ziTXaFrM7h-JViHmF(@zgk>Egv zl-zfI+>t&Y>*@fTCkg3Nqkrm0=%$asdT;%=!A$^N{{+r9_zQ8VP93oOohmdc8&_eD z8&n-xB=0@FhExAMd|)T#gEB1-(%e`CdhpdFbDdpZ=m#z}&Dg*`EN4}(mT!||x|8S6 zw-#4}<9lZ_%?j}nE$nUvucOf_*k?-aS=8Hzr zKSejsFf33byw+t$hCnW?sULT1%Eu^y5Hv@R(AUxX=o|6i=dL8&`kHKtUElML$Nv$_ zuxY+Ttwbwf6%%X>d|3ki8g`Z1b4L|}cpXEC+i7l<9wXh@5|#nn;tDiWxlHpjR*e56 z^VGsbmceA2)y71=Fr%~vr$BX)&+IuJRhdyk#*UFOB~S%pCJS0$C_tIq+-Ip>m~jp+ zrp7XGf(S~~7W!;j7naB+te_%l7sLkGuIWy}tWu8>e?;JKV*v3y?!65#g1R*U1Kq_= zwZ=Kf#`%6nhnTxX-6M(ER}YkK;!2vQmh(?BGo19thtIO;*6PTSr!`6ujG@BR3fIPMx%X8vUH?{o{=i>KptIXC^Rn#Z|Hq+qxl1eEv8k7xm8fVp!LDnhLE*WO2!;kwXLLWP zd{G6LS0B5G9%o`QlH$o{IAPGeRpi=js>@AH&xNKhiYCnTCJnb}pn9X1BA3-#QslWx zY}}WrY2}@BVYpU_O5Z4LIG(zAb9H*pstHgQI?ZOhIi@7HMLbxZE#2Soz*RhDlU_iV z$*3C!{Z14{!9CxV<$Q-sXDGb`jSDKRL8~y|((3h88GC@dX$!^ec3}*X znRBe{wJTt`20adBah1>SoD~-4>%;0gQKe0beEx|jOI+WoYYQh!`a4S-<;hOhFNz=1Uf4qt#1FM+eFzk~#@ x!HHLv95`_c4sXEuKWbFbf)C8RnNHTDD~;>!jH<=rU=FL<`5sX4`CG1dDt*+qAA4G(nRkQqZ(!BvYnH zd4_UqgX*E)Q_=QV^e^nKzoF;-1-$ms{R=(yd1okEHj-@*J(R|bhV#XFpZ9q`#-A=O zHvj29eslK&!}y0W^EhZfK#@5rX7~m(nH8Hu%eRKM?+j~x%`}+JoVY%0_>H0KyXw6b z&kdV?b2#tMBXVkUCa1z6o*-q^i}8Y&OA-k`wVmVkSCe+vK{Vii-`5P zm!;m%qht`?UDLDHyXojqME#v?-TV93-rYN&-0`*#)r#j~9CKRD!{M6Ray^c^Jdu3e zd-USTswX-3HlID-=)BnQda3Y+so);tSs2A~t@$m^Y_#p7`6!fpGYuIR#r#IHABi-f zV-?FUwHUmUW>3>`!oD?Wg;ksn1m7ETnFZbKAdp$u-7Q){I2xV2W7fG61&-MXHs`Fk zxXp2nX-6=f(4~{mW0&PIe&r)nnK3XYMrNTlBV%IaCNp>E#I@WU*tx~5`$i76qv!M7 z7&z#$sb^3_%R$S6a%x8}p735cjxzwI)WW@Pnq>SS^F|`=aw$`>=6TPO0q+9Mtx~qF zRR!sm#DpkKw!AQ5-d2B0Bi$*?e$gnW7L9UJyDsWDbzx`eNHowAO{(UpT0qsd{W{hF zHNOtH@LO17|7$}mVens{-p+=j+oNc7D@p)r9N+rvt~`hj2I97&Rauu(fLv>%!{VcW zY3V97l@cn+U^Rw3kIHcBX5Dm5*KDfNG{rgeR@l=N3*`Zdyo8DyzR3*VVy161APc%X z%ppVt>FMa3SE<;QUL5UmFZ2ZOkK<63?&&U*<4>K>yyl$94b9@9=ksYXgk`Q}i3uQ^w zQW%rqJy0*{a?CB&FTJSeC7d)LibJi>E{RSLiALoYC~_4QGjnUVAyz;+;~11;=6xeG z2Uc$MF!E>9G;%XH0-G6t#_AOHSea7W@h^7;4>KP0<8(WWg8`X!pht@(GP+q~bAupC zqAUms8_a-NI+DjdaRDbN8tI52lZqy~T1LNEL3I;Fx~L3jb-`?zM=LYiu1$CCv}*-E zK``MH%^(=2Y#dX2Aqe)yVO)+hf`FynAW(bHe2)k!)JF-NYbcWZuj@FLVnY`%)l<>v z0lMBzBUS^QYNhwBYv1cPw9ob3(%a6l7BF2ZEOEg|?1e?El_~cpVi?*W~Rfh-cMg8JJ(C1ko)3NCC zfFB@eMG5@$@@#i6lv&$W;uZ5Vc3rqrn9m4YG*34D45yal6Ah4a!92S99@$S;RMO93 z(ISeH{;z2CjR~x5;vBpo93Z**#Q1IJjWwxF>W5eI`oPo}Od7evj9pjU%NrBtm62R> z5JGmF;<;(iANFW`X(ZNbBe#KDJ+I}Bo_!2U-dlO4vj}7l6J!gyi!ar4E4PnrywR?6 z;*U9;U}n+xe-8%<7T6t8!};1~aka$o#2FJoLE9kA2(3)E8^vM}Wn7e=K#FTvD#(}$ ziV1LP{sQCMGnX7yB960)LLb` zCkFfj4BSVN)G!bc9Bak2pd1%}EkuVE3x33MF>1{Mh1{8H?1fQk=$_Wl+l4QUy@l5(uTCQkd$R>u!U<{!N6PX%>Lpaf4XP9d zXC(g!1J6+;9nLVd)GearjsHSUvV+PgkiKk`E{fblMFJvA0WB0su4sXK)^9+#gOAmy zb!>pJS0*-ScQW&4j!Z_++q((+m2Sn>hPrS%YAE7Vp;5w|mF!AvlDL?w2G1C!LhUu3 zmWV;Y0^!11MoQqCN7vsc{wz_ul>N~|>LvM=dIxA^2#ga1!2!Zzg}`;4qYa#6gG}q- zz8bG74Av9|Cv)!{T+S_;34B@;2P^BjqYQHMm9cjRBxvO3v8f%dTiB9k+S5|>E9&DB zL!2#IafFm~>Xf8t)1Zxnqi|@XBuaq{Od=c94EY#yG;7XqD`aV^(ttK&_JQ1}-x zc`9L8B@13pq(dcIC9zHjyth%dqXzoXK2LOZpl=YIfay6@NvLzMJDk23SpgnRq| zheU+JW^s)3AY<0IHMP^amaNpSmSsN_5q+L`fQ(%3q~n;;%5WbyOLeeFrCskl%k=J5 zChJo$bkfys=xY!4h(_)yGg_lT^-zep(rFh|;qdt5aiSFQ`wZ=BML zAR-nv?qD<4M)_K?q!FmLI6|l9VzZ85(K5wP(eppz;?w`YMMb%aS-3+{s^-ZIS0nw; zh12AmUTxRBms47tsB5a>aGa%FcEb^8rwOcg*IF*W)J<7+v6|xee&YULaYy_FYEnEA z_t5g^$-wdN3W5$7th$y^@jy_XdX@(l&+wpJ`UgzabeJpYu#TQi`I(U%A@PE6WIiPV&;5RR4Cm0`X={z6EoCB VAL$%?=CbWBEiW!Va_8LTe*+Fd(d_^L diff --git a/flask/venv/lib/python3.6/site-packages/flask/__pycache__/testing.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/flask/__pycache__/testing.cpython-36.pyc deleted file mode 100644 index 02a151501788f43b470123f16de2a980c618f7a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7834 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 R_Z%cSw`Q-o>+SW6{{gvWFQNbd diff --git a/flask/venv/lib/python3.6/site-packages/flask/__pycache__/wrappers.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/flask/__pycache__/wrappers.cpython-36.pyc deleted file mode 100644 index 641cd86d66f91b91fa01dda5f4c99b18978c2f4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6740 zcmai2&2J=E5%2El`SjT9bs!{RiC#iTc7k_yH$fsAMNtyt-E7!6VQtvZTB)bq{l;#) zr+f0cXT2WAImD52%7GISH{gJRIC0>>0U?e^@CWpT0~f-dz=>Z~f6UmPC1Z8_^;f-m zRloXG)q8b$x%KbH#)JFc(zJhRbH6IaZ{mnYIC+|-dAer=`p~cpoyL`*GBmB~ux8cy z+6)@Qrq$$eHE0c&tR-E$t$8)C{;B5GW&5;ZE#tc3HF4dPRk?g>S|;wayd~UOl6AgQ z^V-{5XL>ep+G?FUjTOXhKwfNqh;V6(p878qv_NBPLefy3mJ`z`z z{AeuWL^z=*l#EAF7|TvK`?BXoqhsao?I%6)*Du5?H*Ve#yT>f$11AV1NtDj8%hU7% z-<9~dC*I!v!Mcd06nF1zY;J9Dib15rFj7)@GI9JM?zXxktFWNK={v!>Y=fXLyxQ zwNu@yV{Cd=9yc-%SWWK|TUxhTUfWy#RI`@66c`BR`x>H=^M%3dNAF zctN{SvJZ=0w4R7|52Q=BiNr`n4}DJx62w*-IV$$UJ>fbdXV(w>#FsD!Kk9bHL-^5; zLdWx@*XxO!-5dPG)v+@A8Tqk+|MBxUO|=8Gv^LjEIT_5?QYkr7tg5cWsUx^NTUGPcD~;=;m*fz9Apc!M%qzUy?(A_zq2j?SE-Kt7>-X$ajep=6#f2I6v}=- z3uST`BCfF~6ShJ}S4&tBTQfVY&?OOJ2S-e>)M}HJnQ=%Hmv7?<{ih&h%d{~d%MfNi zCwv-Pn5ybJ?!GMMBq(-_Y|hJg|J=msnoXL~TQ;bLRlJGUGClOkm6;wFU%a*Bns}Ff zEgY*jSg${0Fs-O7tef$)mgtAg+0{1m9ld~OM*Ok|tud-hE1vPWeqtW4B<4YNYM$yR z)%#jFFtwz1*iygKwUe5zP2Qav>XCQ5PtJ7xo&VB8tlv?zY+Q+pIwQ%)A()CYxp39h4VabZ~I!yfmfhwo-WUMlzk*$Q2 zMS54-F$Eor zLD_Kr*&JQz3Badeb~TGaO50AjzUfZ*R$aXd$TCY<-|}iL=xSm z|E}a$DGNxYA{Ea&s|dt$5o8gfE$Mg{#B$I;YEo#&D&&L$jq=4&`i;lCG3Bao=46sg z7DN7_A^i}FiUO|FNZU3`_t@BJV>1Z+QS8U+5+183=tSY4R>=)<+WH9@caxTrKDpRK zofZdlT4keJwag|wU1}0OQ$syWb!jzW?4c9bbY)x3>^)qaV*y2>`#l`-Rh+ctHN9oD zbkk@XhQ6Y&>L&lS^fukqTly6PXJfK9BZq?C78BKr5Sk$9hz1hvK*!ne41~RYioZ|v z#5mPHK}d4o{S(Z;!RR9n&yiZl@0b2&B(uByID9D)yf#;Q1ozSj95ICTh$^xyaGVUi z>%jB>LoflhlyhE-uGj&9Jvng30i+aFA!l@<9ApL{arU)~>N4*2X9Zec$VaXmQ2{U) zDYL}x?mOWg*DXlxS>ckQO57vi!Vx_PI46-1Q{Y=fgM7gh8%~&oN2w8n4M7^t9z@MC z*>N-$M^2a^Je@@B%6;dd51Dk^g$&eEWVGGmc{zv%ULNLIxRjy*yU~5E{A_FT+%2XW zigi!AQC`;N96?07q77EU)M* z#)PStYtQcDc-rbzZr$4Hw9|%dht5#icG|M-VdRYi8nh<&4vSsCxY}TYt;Dj6|e7=*bzrau=d$xchsSYP{yjS*<-FsPY)2H0Q zqDU3CTHe**dla+?T3Qfk=I@TFow%QiA{Y1}Zj6F4%{72oS!Wg!kEH7ld{?0G%u~?T znPQrvXM@1AhEoFg5es|z(G$7z>qC3v{jHtNtsVRB z=GN_T|dl7 zom!)kzjEvlxNU$thCx7&sQtMd;%WiQicx*J#HCWiAQkHIW;p@m0*@hFethq425}RHHA z4V+N?p#qMrHs{BE8PLX+x<*sw?H-Ni@(!n*>$vw@9Gr4Ay;U{!8VWij9)0qS!cylZ z?zEL4QP0uoc{+WYPUIM?S;l~MSw-UnAhk;rs~6}!D*o7kYMn-;!JJmJY)GhzaKw}} z8%ySrX___EptW|ZUE?(6;z9WN9Pia~^EamepsPsaXxUs;=mJ z=l5_wL9*Db%L@>M8FEw6-Yial_ak)}i@-nRW`@J@yp(~8hBF2Sp_54DA4)7Jtw8jl zcxUImyR%LxFRk)?3tsrq*iR@}K#`mSy@+aE{un}BC9&z0kwTubDPhs34cN$aKu4@t zUcR2mbwlS++J(mbY(pi%Jy03?Gp2vo0O+H6i^RP!5o7*~7Gx%TY!+s%$P$aQaJF^& z6=`@;wOs7-QL#+T3G(e|6e%`57ouePd3D!I4;EzvmG*E`=KR5UMzqYt$jO9p5`&h6 zMbRzc20oJ53`b`+3C{0H&Z>LTw`B6SXsfcYNS5)ULtomlKau%v(xjQlN6Gd5WEh<3 zw1_O3k%<|Ie@}U{jCxSY_yr>@*Z|@>^>28m*zx&hv0vQ1xZzVWC(TFkN=N(*PG@V1 z#7HXOQR9GE-Dp;7qFQS;Cj`6LGRe9NrdN`mF6T45G6;&mnm6wNjyom+Qp*C8CI36c;48s uma~d}FNk)XAkHhpjIX%QS(Faa#_L)C^#*M%a=Jn;&{uJ^E2|IIZvPLRS~(N| diff --git a/flask/venv/lib/python3.6/site-packages/flask/_compat.py b/flask/venv/lib/python3.6/site-packages/flask/_compat.py deleted file mode 100644 index a3b5b9c..0000000 --- a/flask/venv/lib/python3.6/site-packages/flask/_compat.py +++ /dev/null @@ -1,99 +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 by the Pallets team. - :license: BSD, see LICENSE for more details. -""" - -import sys - -PY2 = sys.version_info[0] == 2 -_identity = lambda x: x - - -if not PY2: - text_type = str - string_types = (str,) - integer_types = (int,) - - 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 - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - implements_to_string = _identity - -else: - text_type = unicode - string_types = (str, unicode) - integer_types = (int, long) - - iterkeys = lambda d: d.iterkeys() - itervalues = lambda d: d.itervalues() - iteritems = lambda d: d.iteritems() - - from inspect import getargspec - from cStringIO import StringIO - - 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__(cls, 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: - raise - except TypeError: - BROKEN_PYPY_CTXMGR_EXIT = True - except AssertionError: - pass diff --git a/flask/venv/lib/python3.6/site-packages/flask/app.py b/flask/venv/lib/python3.6/site-packages/flask/app.py deleted file mode 100644 index 87c5900..0000000 --- a/flask/venv/lib/python3.6/site-packages/flask/app.py +++ /dev/null @@ -1,2315 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.app - ~~~~~~~~~ - - This module implements the central WSGI application object. - - :copyright: © 2010 by the Pallets team. - :license: BSD, see LICENSE for more details. -""" - -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, ImmutableDict -from werkzeug.exceptions import BadRequest, BadRequestKeyError, HTTPException, \ - InternalServerError, MethodNotAllowed, default_exceptions -from werkzeug.routing import BuildError, Map, RequestRedirect, Rule - -from . import cli, json -from ._compat import integer_types, reraise, string_types, text_type -from .config import Config, ConfigAttribute -from .ctx import AppContext, RequestContext, _AppCtxGlobals -from .globals import _request_ctx_stack, g, request, session -from .helpers import ( - _PackageBoundObject, - _endpoint_from_view_func, find_package, get_env, get_debug_flag, - get_flashed_messages, locked_cached_property, url_for, get_load_dotenv -) -from .logging import create_logger -from .sessions import SecureCookieSessionInterface -from .signals import appcontext_tearing_down, got_request_exception, \ - request_finished, request_started, request_tearing_down -from .templating import DispatchingJinjaLoader, Environment, \ - _default_template_ctx_processor -from .wrappers import Request, 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 directly to the Jinja2 environment. - jinja_options = ImmutableDict( - 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 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 - ) - - if static_url_path is not None: - self.static_url_path = static_url_path - - if static_folder is not None: - 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 = Map() - - 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 - ) - - #: The click command line context for this application. Commands - #: registered here show up in the :command:`flask` command once the - #: application has been discovered. The default commands are - #: provided by Flask itself and can be overridden. - #: - #: This is an instance of a :class:`click.Group` object. - self.cli = cli.AppGroup(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): - """The ``'flask.app'`` logger, a standard Python - :class:`~logging.Logger`. - - 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 :ref:`logging` for more information. - - .. versionchanged:: 1.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 Jinja2 environment used to load templates.""" - 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) - - def _get_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 - - def _set_templates_auto_reload(self, value): - self.config['TEMPLATES_AUTO_RELOAD'] = value - - templates_auto_reload = property( - _get_templates_auto_reload, _set_templates_auto_reload - ) - del _get_templates_auto_reload, _set_templates_auto_reload - - def create_jinja_environment(self): - """Creates the Jinja2 environment based on :attr:`jinja_options` - and :meth:`select_jinja_autoescape`. Since 0.7 this also adds - the Jinja2 globals and filters after initialization. Override - this function to customize the behavior. - - .. versionadded:: 0.5 - .. versionchanged:: 0.11 - ``Environment.auto_reload`` set in accordance with - ``TEMPLATES_AUTO_RELOAD`` configuration option. - """ - 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') - - def _get_debug(self): - return self.config['DEBUG'] - - def _set_debug(self, value): - self.config['DEBUG'] = value - self.jinja_env.auto_reload = self.templates_auto_reload - - #: 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. - debug = property(_get_debug, _set_debug) - del _get_debug, _set_debug - - 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 - port = int(port or sn_port or _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 flask.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 flask.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): - """Ensure that we register only exceptions as handler keys""" - 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. - - .. 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 - - 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 are - :class:`~werkzeug.exception.HTTPException`\s which are forwarded by - this function 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 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. - - # MultiDict passes the key to the exception, but that's ignored - # when generating the response message. Set an informative - # description for key errors in debug mode or when trapping errors. - if ( - (self.debug or self.config['TRAP_BAD_REQUEST_ERRORS']) - and isinstance(e, BadRequestKeyError) - # only set it if it's still the default description - and e.description is BadRequestKeyError.description - ): - e.description = "KeyError: '{0}'".format(*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): - """Default exception handling that kicks in when an exception - occurs that is not caught. In debug mode the exception will - be re-raised immediately, otherwise it is logged and the handler - for a 500 internal server error is used. If no such handler - exists, a default 500 internal server error message is displayed. - - .. versionadded:: 0.3 - """ - exc_type, exc_value, tb = sys.exc_info() - - got_request_exception.send(self, exception=e) - handler = self._find_error_handler(InternalServerError()) - - 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)) - if handler is None: - return InternalServerError() - return self.finalize_request(handler(e), 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 as e: - 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. - - ``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 - else: - # 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, 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]) - - # 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 flask.testing import make_test_environ_builder - - builder = make_test_environ_builder(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: - 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/flask/venv/lib/python3.6/site-packages/flask/blueprints.py b/flask/venv/lib/python3.6/site-packages/flask/blueprints.py deleted file mode 100644 index 5ce5561..0000000 --- a/flask/venv/lib/python3.6/site-packages/flask/blueprints.py +++ /dev/null @@ -1,448 +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 by the Pallets team. - :license: BSD, see LICENSE for more details. -""" -from functools import update_wrapper -from werkzeug.urls import url_join - -from .helpers import _PackageBoundObject, _endpoint_from_view_func - - -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 blueprint is an object that records - functions that will be called with the - :class:`~flask.blueprints.BlueprintSetupState` later to register functions - or other things on the main application. See :ref:`blueprints` for more - information. - - .. versionadded:: 0.7 - """ - - 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): - _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 - - 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) - - 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/flask/venv/lib/python3.6/site-packages/flask/cli.py b/flask/venv/lib/python3.6/site-packages/flask/cli.py deleted file mode 100644 index efc1733..0000000 --- a/flask/venv/lib/python3.6/site-packages/flask/cli.py +++ /dev/null @@ -1,898 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.cli - ~~~~~~~~~ - - A simple command line application to run flask apps. - - :copyright: © 2010 by the Pallets team. - :license: BSD, see LICENSE for more details. -""" - -from __future__ import print_function - -import ast -import inspect -import os -import re -import ssl -import sys -import traceback -from functools import update_wrapper -from operator import attrgetter -from threading import Lock, Thread - -import click -from werkzeug.utils import import_string - -from . import __version__ -from ._compat import getargspec, iteritems, reraise, text_type -from .globals import current_app -from .helpers import get_debug_flag, get_env, get_load_dotenv - -try: - import dotenv -except ImportError: - dotenv = 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 k, v in iteritems(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: - 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 flask 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) - - if os.path.splitext(path)[1] == '.py': - path = os.path.splitext(path)[0] - - 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 - - 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 - message = 'Flask %(version)s\nPython %(python_version)s' - click.echo(message % { - 'version': __version__, - 'python_version': sys.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 - 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 - 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 - self._app = rv = self.loader() - self._bg_loading_exc_info = None - return rv - - def __call__(self, environ, start_response): - __traceback_hide__ = True - 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): - """Help 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): - #: 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._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 - - 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 = (self.app_import_path.split(':', 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.' - ) - - debug = get_debug_flag() - - # Update the app's debug flag through the descriptor so that other - # values repopulate as well. - if debug is not None: - app.debug = debug - - 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 wil 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. - - .. 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, **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 - - 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) - - 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. - - .. versionadded:: 1.0 - """ - if dotenv is None: - if path or os.path.exists('.env') or os.path.exists('.flaskenv'): - click.secho( - ' * Tip: There are .env files present.' - ' Do "pip install python-dotenv" to use them.', - fg='yellow') - return - - if path is not None: - return dotenv.load_dotenv(path) - - 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: Do not use the development server in a production' - ' environment.', 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): - try: - return self.path_type(value, param, ctx) - except click.BadParameter: - value = click.STRING(value, param, ctx).lower() - - if value == 'adhoc': - try: - import OpenSSL - 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): - 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): - 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 - - -@click.command('run', short_help='Runs 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.') -@pass_script_info -def run_command(info, host, port, reload, debugger, eager_loading, - with_threads, cert): - """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) - - -@click.command('shell', short_help='Runs a shell in the app context.') -@with_appcontext -def shell_command(): - """Runs 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 flask.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): - args = sys.argv[1:] - - if as_module: - this_module = 'flask' - - if sys.version_info < (2, 7): - this_module += '.cli' - - name = 'python -m ' + this_module - - # Python rewrites "python -m flask" to the path to the file in argv. - # Restore the original command so that the reloader works. - sys.argv = ['-m', this_module] + args - else: - name = None - - cli.main(args=args, prog_name=name) - - -if __name__ == '__main__': - main(as_module=True) diff --git a/flask/venv/lib/python3.6/site-packages/flask/config.py b/flask/venv/lib/python3.6/site-packages/flask/config.py deleted file mode 100644 index d6074ba..0000000 --- a/flask/venv/lib/python3.6/site-packages/flask/config.py +++ /dev/null @@ -1,265 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.config - ~~~~~~~~~~~~ - - Implements the configuration related objects. - - :copyright: © 2010 by the Pallets team. - :license: BSD, see LICENSE for more details. -""" - -import os -import types -import errno - -from werkzeug.utils import import_string -from ._compat import string_types, iteritems -from . import json - - -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) - - 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/flask/venv/lib/python3.6/site-packages/flask/ctx.py b/flask/venv/lib/python3.6/site-packages/flask/ctx.py deleted file mode 100644 index 8472c92..0000000 --- a/flask/venv/lib/python3.6/site-packages/flask/ctx.py +++ /dev/null @@ -1,457 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.ctx - ~~~~~~~~~ - - Implements the objects required to keep the context. - - :copyright: © 2010 by the Pallets team. - :license: BSD, see LICENSE for more details. -""" - -import sys -from functools import update_wrapper - -from werkzeug.exceptions import HTTPException - -from .globals import _request_ctx_stack, _app_ctx_stack -from .signals import appcontext_pushed, appcontext_popped -from ._compat import BROKEN_PYPY_CTXMGR_EXIT, reraise - - -# 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. - - 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 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): - self.app = app - if request is None: - request = app.request_class(environ) - self.request = request - self.url_adapter = app.create_url_adapter(self.request) - self.flashes = None - self.session = None - - # 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 = [] - - self.match_request() - - def _get_g(self): - return _app_ctx_stack.top.g - def _set_g(self, value): - _app_ctx_stack.top.g = value - g = property(_get_g, _set_g) - del _get_g, _set_g - - 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 - """ - return self.__class__(self.app, - environ=self.request.environ, - request=self.request - ) - - def match_request(self): - """Can be overridden by a subclass to hook into the matching - of the request. - """ - try: - url_rule, self.request.view_args = \ - self.url_adapter.match(return_rule=True) - self.request.url_rule = url_rule - 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) - - 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/flask/venv/lib/python3.6/site-packages/flask/debughelpers.py b/flask/venv/lib/python3.6/site-packages/flask/debughelpers.py deleted file mode 100644 index e9765f2..0000000 --- a/flask/venv/lib/python3.6/site-packages/flask/debughelpers.py +++ /dev/null @@ -1,168 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.debughelpers - ~~~~~~~~~~~~~~~~~~ - - Various helpers to make the development experience better. - - :copyright: © 2010 by the Pallets team. - :license: BSD, see LICENSE for more details. -""" - -import os -from warnings import warn - -from ._compat import implements_to_string, 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/flask/venv/lib/python3.6/site-packages/flask/globals.py b/flask/venv/lib/python3.6/site-packages/flask/globals.py deleted file mode 100644 index 7d50a6f..0000000 --- a/flask/venv/lib/python3.6/site-packages/flask/globals.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.globals - ~~~~~~~~~~~~~ - - Defines all the global objects that are proxies to the current - active context. - - :copyright: © 2010 by the Pallets team. - :license: BSD, see LICENSE for more details. -""" - -from functools import partial -from werkzeug.local import LocalStack, LocalProxy - - -_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/flask/venv/lib/python3.6/site-packages/flask/helpers.py b/flask/venv/lib/python3.6/site-packages/flask/helpers.py deleted file mode 100644 index df0b91f..0000000 --- a/flask/venv/lib/python3.6/site-packages/flask/helpers.py +++ /dev/null @@ -1,1044 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.helpers - ~~~~~~~~~~~~~ - - Implements various helpers. - - :copyright: © 2010 by the Pallets team. - :license: BSD, see LICENSE for more details. -""" - -import os -import socket -import sys -import pkgutil -import posixpath -import mimetypes -from time import time -from zlib import adler32 -from threading import RLock -import unicodedata -from werkzeug.routing import BuildError -from functools import update_wrapper - -from werkzeug.urls import url_quote -from werkzeug.datastructures import Headers, Range -from werkzeug.exceptions import BadRequest, NotFound, \ - RequestedRangeNotSatisfiable - -from werkzeug.wsgi import wrap_file -from jinja2 import FileSystemLoader - -from .signals import message_flashed -from .globals import session, _request_ctx_stack, _app_ctx_stack, \ - current_app, request -from ._compat import string_types, text_type, PY2 - -# 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 `. - - 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 - defaults to `localhost`. - :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 - - :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 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') - - try: - attachment_filename = attachment_filename.encode('latin-1') - except UnicodeEncodeError: - filenames = { - 'filename': unicodedata.normalize( - 'NFKD', attachment_filename).encode('latin-1', 'ignore'), - 'filename*': "UTF-8''%s" % url_quote(attachment_filename), - } - 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 - 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 = 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(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.split('.')[0] - loader = pkgutil.get_loader(root_mod_name) - if loader is None or import_name == '__main__': - # import name is not found, or interactive/main module - package_path = 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__(import_name) - filename = sys.modules[import_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) - - 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 - - def _get_static_folder(self): - if self._static_folder is not None: - return os.path.join(self.root_path, self._static_folder) - - def _set_static_folder(self, value): - self._static_folder = value - - static_folder = property( - _get_static_folder, _set_static_folder, - doc='The absolute path to the configured static folder.' - ) - del _get_static_folder, _set_static_folder - - def _get_static_url_path(self): - if self._static_url_path is not None: - return self._static_url_path - - if self.static_folder is not None: - return '/' + os.path.basename(self.static_folder) - - def _set_static_url_path(self, value): - self._static_url_path = value - - static_url_path = property( - _get_static_url_path, _set_static_url_path, - doc='The URL prefix that the static route will be registered for.' - ) - del _get_static_url_path, _set_static_url_path - - @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: resource file opening mode, default is 'rb'. - """ - if mode not in ('r', '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/flask/venv/lib/python3.6/site-packages/flask/json/__init__.py b/flask/venv/lib/python3.6/site-packages/flask/json/__init__.py deleted file mode 100644 index fbe6b92..0000000 --- a/flask/venv/lib/python3.6/site-packages/flask/json/__init__.py +++ /dev/null @@ -1,327 +0,0 @@ -# -*- coding: utf-8 -*- -""" -flask.json -~~~~~~~~~~ - -:copyright: © 2010 by the Pallets team. -:license: BSD, see LICENSE for more details. -""" -import codecs -import io -import uuid -from datetime import date, datetime -from flask.globals import current_app, request -from flask._compat import text_type, PY2 - -from werkzeug.http import http_date -from jinja2 import Markup - -# Use the same json implementation as itsdangerous on which we -# depend anyways. -from itsdangerous import json as _json - - -# 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 simplejson - encoder by also supporting ``datetime`` objects, ``UUID`` as well as - ``Markup`` objects which are serialized as RFC 822 datetime strings (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 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): - """Inject default arguments for dump functions.""" - if current_app: - bp = current_app.blueprints.get(request.blueprint) if request else None - kwargs.setdefault( - 'cls', - bp.json_encoder if bp and bp.json_encoder - else current_app.json_encoder - ) - - if not current_app.config['JSON_AS_ASCII']: - kwargs.setdefault('ensure_ascii', False) - - kwargs.setdefault('sort_keys', current_app.config['JSON_SORT_KEYS']) - else: - kwargs.setdefault('sort_keys', True) - kwargs.setdefault('cls', JSONEncoder) - - -def _load_arg_defaults(kwargs): - """Inject default arguments for load functions.""" - if current_app: - bp = current_app.blueprints.get(request.blueprint) if request else None - kwargs.setdefault( - 'cls', - bp.json_decoder if bp and bp.json_decoder - else current_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, **kwargs): - """Serialize ``obj`` to a JSON formatted ``str`` by using the application's - configured encoder (:attr:`~flask.Flask.json_encoder`) if there is an - application on the stack. - - This function can return ``unicode`` strings or ascii-only bytestrings by - default which coerce into unicode strings automatically. That behavior by - default is controlled by the ``JSON_AS_ASCII`` configuration variable - and can be overridden by the simplejson ``ensure_ascii`` parameter. - """ - _dump_arg_defaults(kwargs) - 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, **kwargs): - """Like :func:`dumps` but writes into a file object.""" - _dump_arg_defaults(kwargs) - 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, **kwargs): - """Unserialize a JSON object from a string ``s`` by using the application's - configured decoder (:attr:`~flask.Flask.json_decoder`) if there is an - application on the stack. - """ - _load_arg_defaults(kwargs) - 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, **kwargs): - """Like :func:`loads` but reads from a file object. - """ - _load_arg_defaults(kwargs) - 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 ``' - self.assertEqual( - r'"\u003c/script\u003e\u003cscript\u003e' - r'alert(\"gotcha\")\u003c/script\u003e"', - self.encoder.encode(bad_string)) - self.assertEqual( - bad_string, self.decoder.decode( - self.encoder.encode(bad_string))) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_errors.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_errors.py deleted file mode 100644 index d573825..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_errors.py +++ /dev/null @@ -1,68 +0,0 @@ -import sys, pickle -from unittest import TestCase - -import simplejson as json -from simplejson.compat import text_type, b - -class TestErrors(TestCase): - def test_string_keys_error(self): - data = [{'a': 'A', 'b': (2, 4), 'c': 3.0, ('d',): 'D tuple'}] - try: - json.dumps(data) - except TypeError: - err = sys.exc_info()[1] - else: - self.fail('Expected TypeError') - self.assertEqual(str(err), - 'keys must be str, int, float, bool or None, not tuple') - - def test_not_serializable(self): - try: - json.dumps(json) - except TypeError: - err = sys.exc_info()[1] - else: - self.fail('Expected TypeError') - self.assertEqual(str(err), - 'Object of type module is not JSON serializable') - - def test_decode_error(self): - err = None - try: - json.loads('{}\na\nb') - except json.JSONDecodeError: - err = sys.exc_info()[1] - else: - self.fail('Expected JSONDecodeError') - self.assertEqual(err.lineno, 2) - self.assertEqual(err.colno, 1) - self.assertEqual(err.endlineno, 3) - self.assertEqual(err.endcolno, 2) - - def test_scan_error(self): - err = None - for t in (text_type, b): - try: - json.loads(t('{"asdf": "')) - except json.JSONDecodeError: - err = sys.exc_info()[1] - else: - self.fail('Expected JSONDecodeError') - self.assertEqual(err.lineno, 1) - self.assertEqual(err.colno, 10) - - def test_error_is_pickable(self): - err = None - try: - json.loads('{}\na\nb') - except json.JSONDecodeError: - err = sys.exc_info()[1] - else: - self.fail('Expected JSONDecodeError') - s = pickle.dumps(err) - e = pickle.loads(s) - - self.assertEqual(err.msg, e.msg) - self.assertEqual(err.doc, e.doc) - self.assertEqual(err.pos, e.pos) - self.assertEqual(err.end, e.end) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_fail.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_fail.py deleted file mode 100644 index 788f3a5..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_fail.py +++ /dev/null @@ -1,176 +0,0 @@ -import sys -from unittest import TestCase - -import simplejson as json - -# 2007-10-05 -JSONDOCS = [ - # http://json.org/JSON_checker/test/fail1.json - '"A JSON payload should be an object or array, not a string."', - # http://json.org/JSON_checker/test/fail2.json - '["Unclosed array"', - # http://json.org/JSON_checker/test/fail3.json - '{unquoted_key: "keys must be quoted"}', - # http://json.org/JSON_checker/test/fail4.json - '["extra comma",]', - # http://json.org/JSON_checker/test/fail5.json - '["double extra comma",,]', - # http://json.org/JSON_checker/test/fail6.json - '[ , "<-- missing value"]', - # http://json.org/JSON_checker/test/fail7.json - '["Comma after the close"],', - # http://json.org/JSON_checker/test/fail8.json - '["Extra close"]]', - # http://json.org/JSON_checker/test/fail9.json - '{"Extra comma": true,}', - # http://json.org/JSON_checker/test/fail10.json - '{"Extra value after close": true} "misplaced quoted value"', - # http://json.org/JSON_checker/test/fail11.json - '{"Illegal expression": 1 + 2}', - # http://json.org/JSON_checker/test/fail12.json - '{"Illegal invocation": alert()}', - # http://json.org/JSON_checker/test/fail13.json - '{"Numbers cannot have leading zeroes": 013}', - # http://json.org/JSON_checker/test/fail14.json - '{"Numbers cannot be hex": 0x14}', - # http://json.org/JSON_checker/test/fail15.json - '["Illegal backslash escape: \\x15"]', - # http://json.org/JSON_checker/test/fail16.json - '[\\naked]', - # http://json.org/JSON_checker/test/fail17.json - '["Illegal backslash escape: \\017"]', - # http://json.org/JSON_checker/test/fail18.json - '[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', - # http://json.org/JSON_checker/test/fail19.json - '{"Missing colon" null}', - # http://json.org/JSON_checker/test/fail20.json - '{"Double colon":: null}', - # http://json.org/JSON_checker/test/fail21.json - '{"Comma instead of colon", null}', - # http://json.org/JSON_checker/test/fail22.json - '["Colon instead of comma": false]', - # http://json.org/JSON_checker/test/fail23.json - '["Bad value", truth]', - # http://json.org/JSON_checker/test/fail24.json - "['single quote']", - # http://json.org/JSON_checker/test/fail25.json - '["\ttab\tcharacter\tin\tstring\t"]', - # http://json.org/JSON_checker/test/fail26.json - '["tab\\ character\\ in\\ string\\ "]', - # http://json.org/JSON_checker/test/fail27.json - '["line\nbreak"]', - # http://json.org/JSON_checker/test/fail28.json - '["line\\\nbreak"]', - # http://json.org/JSON_checker/test/fail29.json - '[0e]', - # http://json.org/JSON_checker/test/fail30.json - '[0e+]', - # http://json.org/JSON_checker/test/fail31.json - '[0e+-1]', - # http://json.org/JSON_checker/test/fail32.json - '{"Comma instead if closing brace": true,', - # http://json.org/JSON_checker/test/fail33.json - '["mismatch"}', - # http://code.google.com/p/simplejson/issues/detail?id=3 - u'["A\u001FZ control characters in string"]', - # misc based on coverage - '{', - '{]', - '{"foo": "bar"]', - '{"foo": "bar"', - 'nul', - 'nulx', - '-', - '-x', - '-e', - '-e0', - '-Infinite', - '-Inf', - 'Infinit', - 'Infinite', - 'NaM', - 'NuN', - 'falsy', - 'fal', - 'trug', - 'tru', - '1e', - '1ex', - '1e-', - '1e-x', -] - -SKIPS = { - 1: "why not have a string payload?", - 18: "spec doesn't specify any nesting limitations", -} - -class TestFail(TestCase): - def test_failures(self): - for idx, doc in enumerate(JSONDOCS): - idx = idx + 1 - if idx in SKIPS: - json.loads(doc) - continue - try: - json.loads(doc) - except json.JSONDecodeError: - pass - else: - self.fail("Expected failure for fail%d.json: %r" % (idx, doc)) - - def test_array_decoder_issue46(self): - # http://code.google.com/p/simplejson/issues/detail?id=46 - for doc in [u'[,]', '[,]']: - try: - json.loads(doc) - except json.JSONDecodeError: - e = sys.exc_info()[1] - self.assertEqual(e.pos, 1) - self.assertEqual(e.lineno, 1) - self.assertEqual(e.colno, 2) - except Exception: - e = sys.exc_info()[1] - self.fail("Unexpected exception raised %r %s" % (e, e)) - else: - self.fail("Unexpected success parsing '[,]'") - - def test_truncated_input(self): - test_cases = [ - ('', 'Expecting value', 0), - ('[', "Expecting value or ']'", 1), - ('[42', "Expecting ',' delimiter", 3), - ('[42,', 'Expecting value', 4), - ('["', 'Unterminated string starting at', 1), - ('["spam', 'Unterminated string starting at', 1), - ('["spam"', "Expecting ',' delimiter", 7), - ('["spam",', 'Expecting value', 8), - ('{', 'Expecting property name enclosed in double quotes', 1), - ('{"', 'Unterminated string starting at', 1), - ('{"spam', 'Unterminated string starting at', 1), - ('{"spam"', "Expecting ':' delimiter", 7), - ('{"spam":', 'Expecting value', 8), - ('{"spam":42', "Expecting ',' delimiter", 10), - ('{"spam":42,', 'Expecting property name enclosed in double quotes', - 11), - ('"', 'Unterminated string starting at', 0), - ('"spam', 'Unterminated string starting at', 0), - ('[,', "Expecting value", 1), - ] - for data, msg, idx in test_cases: - try: - json.loads(data) - except json.JSONDecodeError: - e = sys.exc_info()[1] - self.assertEqual( - e.msg[:len(msg)], - msg, - "%r doesn't start with %r for %r" % (e.msg, msg, data)) - self.assertEqual( - e.pos, idx, - "pos %r != %r for %r" % (e.pos, idx, data)) - except Exception: - e = sys.exc_info()[1] - self.fail("Unexpected exception raised %r %s" % (e, e)) - else: - self.fail("Unexpected success parsing '%r'" % (data,)) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_float.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_float.py deleted file mode 100644 index e382ec2..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_float.py +++ /dev/null @@ -1,35 +0,0 @@ -import math -from unittest import TestCase -from simplejson.compat import long_type, text_type -import simplejson as json -from simplejson.decoder import NaN, PosInf, NegInf - -class TestFloat(TestCase): - def test_degenerates_allow(self): - for inf in (PosInf, NegInf): - self.assertEqual(json.loads(json.dumps(inf)), inf) - # Python 2.5 doesn't have math.isnan - nan = json.loads(json.dumps(NaN)) - self.assertTrue((0 + nan) != nan) - - def test_degenerates_ignore(self): - for f in (PosInf, NegInf, NaN): - self.assertEqual(json.loads(json.dumps(f, ignore_nan=True)), None) - - def test_degenerates_deny(self): - for f in (PosInf, NegInf, NaN): - self.assertRaises(ValueError, json.dumps, f, allow_nan=False) - - def test_floats(self): - for num in [1617161771.7650001, math.pi, math.pi**100, - math.pi**-100, 3.1]: - self.assertEqual(float(json.dumps(num)), num) - self.assertEqual(json.loads(json.dumps(num)), num) - self.assertEqual(json.loads(text_type(json.dumps(num))), num) - - def test_ints(self): - for num in [1, long_type(1), 1<<32, 1<<64]: - self.assertEqual(json.dumps(num), str(num)) - self.assertEqual(int(json.dumps(num)), num) - self.assertEqual(json.loads(json.dumps(num)), num) - self.assertEqual(json.loads(text_type(json.dumps(num))), num) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_for_json.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_for_json.py deleted file mode 100644 index b791b88..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_for_json.py +++ /dev/null @@ -1,97 +0,0 @@ -import unittest -import simplejson as json - - -class ForJson(object): - def for_json(self): - return {'for_json': 1} - - -class NestedForJson(object): - def for_json(self): - return {'nested': ForJson()} - - -class ForJsonList(object): - def for_json(self): - return ['list'] - - -class DictForJson(dict): - def for_json(self): - return {'alpha': 1} - - -class ListForJson(list): - def for_json(self): - return ['list'] - - -class TestForJson(unittest.TestCase): - def assertRoundTrip(self, obj, other, for_json=True): - if for_json is None: - # None will use the default - s = json.dumps(obj) - else: - s = json.dumps(obj, for_json=for_json) - self.assertEqual( - json.loads(s), - other) - - def test_for_json_encodes_stand_alone_object(self): - self.assertRoundTrip( - ForJson(), - ForJson().for_json()) - - def test_for_json_encodes_object_nested_in_dict(self): - self.assertRoundTrip( - {'hooray': ForJson()}, - {'hooray': ForJson().for_json()}) - - def test_for_json_encodes_object_nested_in_list_within_dict(self): - self.assertRoundTrip( - {'list': [0, ForJson(), 2, 3]}, - {'list': [0, ForJson().for_json(), 2, 3]}) - - def test_for_json_encodes_object_nested_within_object(self): - self.assertRoundTrip( - NestedForJson(), - {'nested': {'for_json': 1}}) - - def test_for_json_encodes_list(self): - self.assertRoundTrip( - ForJsonList(), - ForJsonList().for_json()) - - def test_for_json_encodes_list_within_object(self): - self.assertRoundTrip( - {'nested': ForJsonList()}, - {'nested': ForJsonList().for_json()}) - - def test_for_json_encodes_dict_subclass(self): - self.assertRoundTrip( - DictForJson(a=1), - DictForJson(a=1).for_json()) - - def test_for_json_encodes_list_subclass(self): - self.assertRoundTrip( - ListForJson(['l']), - ListForJson(['l']).for_json()) - - def test_for_json_ignored_if_not_true_with_dict_subclass(self): - for for_json in (None, False): - self.assertRoundTrip( - DictForJson(a=1), - {'a': 1}, - for_json=for_json) - - def test_for_json_ignored_if_not_true_with_list_subclass(self): - for for_json in (None, False): - self.assertRoundTrip( - ListForJson(['l']), - ['l'], - for_json=for_json) - - def test_raises_typeerror_if_for_json_not_true_with_object(self): - self.assertRaises(TypeError, json.dumps, ForJson()) - self.assertRaises(TypeError, json.dumps, ForJson(), for_json=False) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_indent.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_indent.py deleted file mode 100644 index cea25a5..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_indent.py +++ /dev/null @@ -1,86 +0,0 @@ -from unittest import TestCase -import textwrap - -import simplejson as json -from simplejson.compat import StringIO - -class TestIndent(TestCase): - def test_indent(self): - h = [['blorpie'], ['whoops'], [], 'd-shtaeou', 'd-nthiouh', - 'i-vhbjkhnth', - {'nifty': 87}, {'field': 'yes', 'morefield': False} ] - - expect = textwrap.dedent("""\ - [ - \t[ - \t\t"blorpie" - \t], - \t[ - \t\t"whoops" - \t], - \t[], - \t"d-shtaeou", - \t"d-nthiouh", - \t"i-vhbjkhnth", - \t{ - \t\t"nifty": 87 - \t}, - \t{ - \t\t"field": "yes", - \t\t"morefield": false - \t} - ]""") - - - d1 = json.dumps(h) - d2 = json.dumps(h, indent='\t', sort_keys=True, separators=(',', ': ')) - d3 = json.dumps(h, indent=' ', sort_keys=True, separators=(',', ': ')) - d4 = json.dumps(h, indent=2, sort_keys=True, separators=(',', ': ')) - - h1 = json.loads(d1) - h2 = json.loads(d2) - h3 = json.loads(d3) - h4 = json.loads(d4) - - self.assertEqual(h1, h) - self.assertEqual(h2, h) - self.assertEqual(h3, h) - self.assertEqual(h4, h) - self.assertEqual(d3, expect.replace('\t', ' ')) - self.assertEqual(d4, expect.replace('\t', ' ')) - # NOTE: Python 2.4 textwrap.dedent converts tabs to spaces, - # so the following is expected to fail. Python 2.4 is not a - # supported platform in simplejson 2.1.0+. - self.assertEqual(d2, expect) - - def test_indent0(self): - h = {3: 1} - def check(indent, expected): - d1 = json.dumps(h, indent=indent) - self.assertEqual(d1, expected) - - sio = StringIO() - json.dump(h, sio, indent=indent) - self.assertEqual(sio.getvalue(), expected) - - # indent=0 should emit newlines - check(0, '{\n"3": 1\n}') - # indent=None is more compact - check(None, '{"3": 1}') - - def test_separators(self): - lst = [1,2,3,4] - expect = '[\n1,\n2,\n3,\n4\n]' - expect_spaces = '[\n1, \n2, \n3, \n4\n]' - # Ensure that separators still works - self.assertEqual( - expect_spaces, - json.dumps(lst, indent=0, separators=(', ', ': '))) - # Force the new defaults - self.assertEqual( - expect, - json.dumps(lst, indent=0, separators=(',', ': '))) - # Added in 2.1.4 - self.assertEqual( - expect, - json.dumps(lst, indent=0)) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_item_sort_key.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_item_sort_key.py deleted file mode 100644 index 98971b8..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_item_sort_key.py +++ /dev/null @@ -1,27 +0,0 @@ -from unittest import TestCase - -import simplejson as json -from operator import itemgetter - -class TestItemSortKey(TestCase): - def test_simple_first(self): - a = {'a': 1, 'c': 5, 'jack': 'jill', 'pick': 'axe', 'array': [1, 5, 6, 9], 'tuple': (83, 12, 3), 'crate': 'dog', 'zeak': 'oh'} - self.assertEqual( - '{"a": 1, "c": 5, "crate": "dog", "jack": "jill", "pick": "axe", "zeak": "oh", "array": [1, 5, 6, 9], "tuple": [83, 12, 3]}', - json.dumps(a, item_sort_key=json.simple_first)) - - def test_case(self): - a = {'a': 1, 'c': 5, 'Jack': 'jill', 'pick': 'axe', 'Array': [1, 5, 6, 9], 'tuple': (83, 12, 3), 'crate': 'dog', 'zeak': 'oh'} - self.assertEqual( - '{"Array": [1, 5, 6, 9], "Jack": "jill", "a": 1, "c": 5, "crate": "dog", "pick": "axe", "tuple": [83, 12, 3], "zeak": "oh"}', - json.dumps(a, item_sort_key=itemgetter(0))) - self.assertEqual( - '{"a": 1, "Array": [1, 5, 6, 9], "c": 5, "crate": "dog", "Jack": "jill", "pick": "axe", "tuple": [83, 12, 3], "zeak": "oh"}', - json.dumps(a, item_sort_key=lambda kv: kv[0].lower())) - - def test_item_sort_key_value(self): - # https://github.com/simplejson/simplejson/issues/173 - a = {'a': 1, 'b': 0} - self.assertEqual( - '{"b": 0, "a": 1}', - json.dumps(a, item_sort_key=lambda kv: kv[1])) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_iterable.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_iterable.py deleted file mode 100644 index 35d3e75..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_iterable.py +++ /dev/null @@ -1,31 +0,0 @@ -import unittest -from simplejson.compat import StringIO - -import simplejson as json - -def iter_dumps(obj, **kw): - return ''.join(json.JSONEncoder(**kw).iterencode(obj)) - -def sio_dump(obj, **kw): - sio = StringIO() - json.dumps(obj, **kw) - return sio.getvalue() - -class TestIterable(unittest.TestCase): - def test_iterable(self): - for l in ([], [1], [1, 2], [1, 2, 3]): - for opts in [{}, {'indent': 2}]: - for dumps in (json.dumps, iter_dumps, sio_dump): - expect = dumps(l, **opts) - default_expect = dumps(sum(l), **opts) - # Default is False - self.assertRaises(TypeError, dumps, iter(l), **opts) - self.assertRaises(TypeError, dumps, iter(l), iterable_as_array=False, **opts) - self.assertEqual(expect, dumps(iter(l), iterable_as_array=True, **opts)) - # Ensure that the "default" gets called - self.assertEqual(default_expect, dumps(iter(l), default=sum, **opts)) - self.assertEqual(default_expect, dumps(iter(l), iterable_as_array=False, default=sum, **opts)) - # Ensure that the "default" does not get called - self.assertEqual( - expect, - dumps(iter(l), iterable_as_array=True, default=sum, **opts)) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_namedtuple.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_namedtuple.py deleted file mode 100644 index 4387894..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_namedtuple.py +++ /dev/null @@ -1,122 +0,0 @@ -from __future__ import absolute_import -import unittest -import simplejson as json -from simplejson.compat import StringIO - -try: - from collections import namedtuple -except ImportError: - class Value(tuple): - def __new__(cls, *args): - return tuple.__new__(cls, args) - - def _asdict(self): - return {'value': self[0]} - class Point(tuple): - def __new__(cls, *args): - return tuple.__new__(cls, args) - - def _asdict(self): - return {'x': self[0], 'y': self[1]} -else: - Value = namedtuple('Value', ['value']) - Point = namedtuple('Point', ['x', 'y']) - -class DuckValue(object): - def __init__(self, *args): - self.value = Value(*args) - - def _asdict(self): - return self.value._asdict() - -class DuckPoint(object): - def __init__(self, *args): - self.point = Point(*args) - - def _asdict(self): - return self.point._asdict() - -class DeadDuck(object): - _asdict = None - -class DeadDict(dict): - _asdict = None - -CONSTRUCTORS = [ - lambda v: v, - lambda v: [v], - lambda v: [{'key': v}], -] - -class TestNamedTuple(unittest.TestCase): - def test_namedtuple_dumps(self): - for v in [Value(1), Point(1, 2), DuckValue(1), DuckPoint(1, 2)]: - d = v._asdict() - self.assertEqual(d, json.loads(json.dumps(v))) - self.assertEqual( - d, - json.loads(json.dumps(v, namedtuple_as_object=True))) - self.assertEqual(d, json.loads(json.dumps(v, tuple_as_array=False))) - self.assertEqual( - d, - json.loads(json.dumps(v, namedtuple_as_object=True, - tuple_as_array=False))) - - def test_namedtuple_dumps_false(self): - for v in [Value(1), Point(1, 2)]: - l = list(v) - self.assertEqual( - l, - json.loads(json.dumps(v, namedtuple_as_object=False))) - self.assertRaises(TypeError, json.dumps, v, - tuple_as_array=False, namedtuple_as_object=False) - - def test_namedtuple_dump(self): - for v in [Value(1), Point(1, 2), DuckValue(1), DuckPoint(1, 2)]: - d = v._asdict() - sio = StringIO() - json.dump(v, sio) - self.assertEqual(d, json.loads(sio.getvalue())) - sio = StringIO() - json.dump(v, sio, namedtuple_as_object=True) - self.assertEqual( - d, - json.loads(sio.getvalue())) - sio = StringIO() - json.dump(v, sio, tuple_as_array=False) - self.assertEqual(d, json.loads(sio.getvalue())) - sio = StringIO() - json.dump(v, sio, namedtuple_as_object=True, - tuple_as_array=False) - self.assertEqual( - d, - json.loads(sio.getvalue())) - - def test_namedtuple_dump_false(self): - for v in [Value(1), Point(1, 2)]: - l = list(v) - sio = StringIO() - json.dump(v, sio, namedtuple_as_object=False) - self.assertEqual( - l, - json.loads(sio.getvalue())) - self.assertRaises(TypeError, json.dump, v, StringIO(), - tuple_as_array=False, namedtuple_as_object=False) - - def test_asdict_not_callable_dump(self): - for f in CONSTRUCTORS: - self.assertRaises(TypeError, - json.dump, f(DeadDuck()), StringIO(), namedtuple_as_object=True) - sio = StringIO() - json.dump(f(DeadDict()), sio, namedtuple_as_object=True) - self.assertEqual( - json.dumps(f({})), - sio.getvalue()) - - def test_asdict_not_callable_dumps(self): - for f in CONSTRUCTORS: - self.assertRaises(TypeError, - json.dumps, f(DeadDuck()), namedtuple_as_object=True) - self.assertEqual( - json.dumps(f({})), - json.dumps(f(DeadDict()), namedtuple_as_object=True)) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_pass1.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_pass1.py deleted file mode 100644 index f0b5b10..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_pass1.py +++ /dev/null @@ -1,71 +0,0 @@ -from unittest import TestCase - -import simplejson as json - -# from http://json.org/JSON_checker/test/pass1.json -JSON = r''' -[ - "JSON Test Pattern pass1", - {"object with 1 member":["array with 1 element"]}, - {}, - [], - -42, - true, - false, - null, - { - "integer": 1234567890, - "real": -9876.543210, - "e": 0.123456789e-12, - "E": 1.234567890E+34, - "": 23456789012E66, - "zero": 0, - "one": 1, - "space": " ", - "quote": "\"", - "backslash": "\\", - "controls": "\b\f\n\r\t", - "slash": "/ & \/", - "alpha": "abcdefghijklmnopqrstuvwyz", - "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", - "digit": "0123456789", - "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", - "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", - "true": true, - "false": false, - "null": null, - "array":[ ], - "object":{ }, - "address": "50 St. James Street", - "url": "http://www.JSON.org/", - "comment": "// /* */": " ", - " s p a c e d " :[1,2 , 3 - -, - -4 , 5 , 6 ,7 ],"compact": [1,2,3,4,5,6,7], - "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", - "quotes": "" \u0022 %22 0x22 034 "", - "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" -: "A key can be any string" - }, - 0.5 ,98.6 -, -99.44 -, - -1066, -1e1, -0.1e1, -1e-1, -1e00,2e+00,2e-00 -,"rosebud"] -''' - -class TestPass1(TestCase): - def test_parse(self): - # test in/out equivalence and parsing - res = json.loads(JSON) - out = json.dumps(res) - self.assertEqual(res, json.loads(out)) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_pass2.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_pass2.py deleted file mode 100644 index 5d812b3..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_pass2.py +++ /dev/null @@ -1,14 +0,0 @@ -from unittest import TestCase -import simplejson as json - -# from http://json.org/JSON_checker/test/pass2.json -JSON = r''' -[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] -''' - -class TestPass2(TestCase): - def test_parse(self): - # test in/out equivalence and parsing - res = json.loads(JSON) - out = json.dumps(res) - self.assertEqual(res, json.loads(out)) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_pass3.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_pass3.py deleted file mode 100644 index 821d60b..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_pass3.py +++ /dev/null @@ -1,20 +0,0 @@ -from unittest import TestCase - -import simplejson as json - -# from http://json.org/JSON_checker/test/pass3.json -JSON = r''' -{ - "JSON Test Pattern pass3": { - "The outermost value": "must be an object or array.", - "In this test": "It is an object." - } -} -''' - -class TestPass3(TestCase): - def test_parse(self): - # test in/out equivalence and parsing - res = json.loads(JSON) - out = json.dumps(res) - self.assertEqual(res, json.loads(out)) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_raw_json.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_raw_json.py deleted file mode 100644 index 1dfcc2c..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_raw_json.py +++ /dev/null @@ -1,47 +0,0 @@ -import unittest -import simplejson as json - -dct1 = { - 'key1': 'value1' -} - -dct2 = { - 'key2': 'value2', - 'd1': dct1 -} - -dct3 = { - 'key2': 'value2', - 'd1': json.dumps(dct1) -} - -dct4 = { - 'key2': 'value2', - 'd1': json.RawJSON(json.dumps(dct1)) -} - - -class TestRawJson(unittest.TestCase): - - def test_normal_str(self): - self.assertNotEqual(json.dumps(dct2), json.dumps(dct3)) - - def test_raw_json_str(self): - self.assertEqual(json.dumps(dct2), json.dumps(dct4)) - self.assertEqual(dct2, json.loads(json.dumps(dct4))) - - def test_list(self): - self.assertEqual( - json.dumps([dct2]), - json.dumps([json.RawJSON(json.dumps(dct2))])) - self.assertEqual( - [dct2], - json.loads(json.dumps([json.RawJSON(json.dumps(dct2))]))) - - def test_direct(self): - self.assertEqual( - json.dumps(dct2), - json.dumps(json.RawJSON(json.dumps(dct2)))) - self.assertEqual( - dct2, - json.loads(json.dumps(json.RawJSON(json.dumps(dct2))))) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_recursion.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_recursion.py deleted file mode 100644 index 662eb66..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_recursion.py +++ /dev/null @@ -1,67 +0,0 @@ -from unittest import TestCase - -import simplejson as json - -class JSONTestObject: - pass - - -class RecursiveJSONEncoder(json.JSONEncoder): - recurse = False - def default(self, o): - if o is JSONTestObject: - if self.recurse: - return [JSONTestObject] - else: - return 'JSONTestObject' - return json.JSONEncoder.default(o) - - -class TestRecursion(TestCase): - def test_listrecursion(self): - x = [] - x.append(x) - try: - json.dumps(x) - except ValueError: - pass - else: - self.fail("didn't raise ValueError on list recursion") - x = [] - y = [x] - x.append(y) - try: - json.dumps(x) - except ValueError: - pass - else: - self.fail("didn't raise ValueError on alternating list recursion") - y = [] - x = [y, y] - # ensure that the marker is cleared - json.dumps(x) - - def test_dictrecursion(self): - x = {} - x["test"] = x - try: - json.dumps(x) - except ValueError: - pass - else: - self.fail("didn't raise ValueError on dict recursion") - x = {} - y = {"a": x, "b": x} - # ensure that the marker is cleared - json.dumps(y) - - def test_defaultrecursion(self): - enc = RecursiveJSONEncoder() - self.assertEqual(enc.encode(JSONTestObject), '"JSONTestObject"') - enc.recurse = True - try: - enc.encode(JSONTestObject) - except ValueError: - pass - else: - self.fail("didn't raise ValueError on default recursion") diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_scanstring.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_scanstring.py deleted file mode 100644 index d5de180..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_scanstring.py +++ /dev/null @@ -1,196 +0,0 @@ -import sys -from unittest import TestCase - -import simplejson as json -import simplejson.decoder -from simplejson.compat import b, PY3 - -class TestScanString(TestCase): - # The bytes type is intentionally not used in most of these tests - # under Python 3 because the decoder immediately coerces to str before - # calling scanstring. In Python 2 we are testing the code paths - # for both unicode and str. - # - # The reason this is done is because Python 3 would require - # entirely different code paths for parsing bytes and str. - # - def test_py_scanstring(self): - self._test_scanstring(simplejson.decoder.py_scanstring) - - def test_c_scanstring(self): - if not simplejson.decoder.c_scanstring: - return - self._test_scanstring(simplejson.decoder.c_scanstring) - - self.assertTrue(isinstance(simplejson.decoder.c_scanstring('""', 0)[0], str)) - - def _test_scanstring(self, scanstring): - if sys.maxunicode == 65535: - self.assertEqual( - scanstring(u'"z\U0001d120x"', 1, None, True), - (u'z\U0001d120x', 6)) - else: - self.assertEqual( - scanstring(u'"z\U0001d120x"', 1, None, True), - (u'z\U0001d120x', 5)) - - self.assertEqual( - scanstring('"\\u007b"', 1, None, True), - (u'{', 8)) - - self.assertEqual( - scanstring('"A JSON payload should be an object or array, not a string."', 1, None, True), - (u'A JSON payload should be an object or array, not a string.', 60)) - - self.assertEqual( - scanstring('["Unclosed array"', 2, None, True), - (u'Unclosed array', 17)) - - self.assertEqual( - scanstring('["extra comma",]', 2, None, True), - (u'extra comma', 14)) - - self.assertEqual( - scanstring('["double extra comma",,]', 2, None, True), - (u'double extra comma', 21)) - - self.assertEqual( - scanstring('["Comma after the close"],', 2, None, True), - (u'Comma after the close', 24)) - - self.assertEqual( - scanstring('["Extra close"]]', 2, None, True), - (u'Extra close', 14)) - - self.assertEqual( - scanstring('{"Extra comma": true,}', 2, None, True), - (u'Extra comma', 14)) - - self.assertEqual( - scanstring('{"Extra value after close": true} "misplaced quoted value"', 2, None, True), - (u'Extra value after close', 26)) - - self.assertEqual( - scanstring('{"Illegal expression": 1 + 2}', 2, None, True), - (u'Illegal expression', 21)) - - self.assertEqual( - scanstring('{"Illegal invocation": alert()}', 2, None, True), - (u'Illegal invocation', 21)) - - self.assertEqual( - scanstring('{"Numbers cannot have leading zeroes": 013}', 2, None, True), - (u'Numbers cannot have leading zeroes', 37)) - - self.assertEqual( - scanstring('{"Numbers cannot be hex": 0x14}', 2, None, True), - (u'Numbers cannot be hex', 24)) - - self.assertEqual( - scanstring('[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', 21, None, True), - (u'Too deep', 30)) - - self.assertEqual( - scanstring('{"Missing colon" null}', 2, None, True), - (u'Missing colon', 16)) - - self.assertEqual( - scanstring('{"Double colon":: null}', 2, None, True), - (u'Double colon', 15)) - - self.assertEqual( - scanstring('{"Comma instead of colon", null}', 2, None, True), - (u'Comma instead of colon', 25)) - - self.assertEqual( - scanstring('["Colon instead of comma": false]', 2, None, True), - (u'Colon instead of comma', 25)) - - self.assertEqual( - scanstring('["Bad value", truth]', 2, None, True), - (u'Bad value', 12)) - - for c in map(chr, range(0x00, 0x1f)): - self.assertEqual( - scanstring(c + '"', 0, None, False), - (c, 2)) - self.assertRaises( - ValueError, - scanstring, c + '"', 0, None, True) - - self.assertRaises(ValueError, scanstring, '', 0, None, True) - self.assertRaises(ValueError, scanstring, 'a', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u0', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u01', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u012', 0, None, True) - self.assertRaises(ValueError, scanstring, '\\u0123', 0, None, True) - if sys.maxunicode > 65535: - self.assertRaises(ValueError, - scanstring, '\\ud834\\u"', 0, None, True) - self.assertRaises(ValueError, - scanstring, '\\ud834\\x0123"', 0, None, True) - - def test_issue3623(self): - self.assertRaises(ValueError, json.decoder.scanstring, "xxx", 1, - "xxx") - self.assertRaises(UnicodeDecodeError, - json.encoder.encode_basestring_ascii, b("xx\xff")) - - def test_overflow(self): - # Python 2.5 does not have maxsize, Python 3 does not have maxint - maxsize = getattr(sys, 'maxsize', getattr(sys, 'maxint', None)) - assert maxsize is not None - self.assertRaises(OverflowError, json.decoder.scanstring, "xxx", - maxsize + 1) - - def test_surrogates(self): - scanstring = json.decoder.scanstring - - def assertScan(given, expect, test_utf8=True): - givens = [given] - if not PY3 and test_utf8: - givens.append(given.encode('utf8')) - for given in givens: - (res, count) = scanstring(given, 1, None, True) - self.assertEqual(len(given), count) - self.assertEqual(res, expect) - - assertScan( - u'"z\\ud834\\u0079x"', - u'z\ud834yx') - assertScan( - u'"z\\ud834\\udd20x"', - u'z\U0001d120x') - assertScan( - u'"z\\ud834\\ud834\\udd20x"', - u'z\ud834\U0001d120x') - assertScan( - u'"z\\ud834x"', - u'z\ud834x') - assertScan( - u'"z\\udd20x"', - u'z\udd20x') - assertScan( - u'"z\ud834x"', - u'z\ud834x') - # It may look strange to join strings together, but Python is drunk. - # https://gist.github.com/etrepum/5538443 - assertScan( - u'"z\\ud834\udd20x12345"', - u''.join([u'z\ud834', u'\udd20x12345'])) - assertScan( - u'"z\ud834\\udd20x"', - u''.join([u'z\ud834', u'\udd20x'])) - # these have different behavior given UTF8 input, because the surrogate - # pair may be joined (in maxunicode > 65535 builds) - assertScan( - u''.join([u'"z\ud834', u'\udd20x"']), - u''.join([u'z\ud834', u'\udd20x']), - test_utf8=False) - - self.assertRaises(ValueError, - scanstring, u'"z\\ud83x"', 1, None, True) - self.assertRaises(ValueError, - scanstring, u'"z\\ud834\\udd2x"', 1, None, True) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_separators.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_separators.py deleted file mode 100644 index 91b4d4f..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_separators.py +++ /dev/null @@ -1,42 +0,0 @@ -import textwrap -from unittest import TestCase - -import simplejson as json - - -class TestSeparators(TestCase): - def test_separators(self): - h = [['blorpie'], ['whoops'], [], 'd-shtaeou', 'd-nthiouh', 'i-vhbjkhnth', - {'nifty': 87}, {'field': 'yes', 'morefield': False} ] - - expect = textwrap.dedent("""\ - [ - [ - "blorpie" - ] , - [ - "whoops" - ] , - [] , - "d-shtaeou" , - "d-nthiouh" , - "i-vhbjkhnth" , - { - "nifty" : 87 - } , - { - "field" : "yes" , - "morefield" : false - } - ]""") - - - d1 = json.dumps(h) - d2 = json.dumps(h, indent=' ', sort_keys=True, separators=(' ,', ' : ')) - - h1 = json.loads(d1) - h2 = json.loads(d2) - - self.assertEqual(h1, h) - self.assertEqual(h2, h) - self.assertEqual(d2, expect) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_speedups.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_speedups.py deleted file mode 100644 index 8b146df..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_speedups.py +++ /dev/null @@ -1,114 +0,0 @@ -from __future__ import with_statement - -import sys -import unittest -from unittest import TestCase - -import simplejson -from simplejson import encoder, decoder, scanner -from simplejson.compat import PY3, long_type, b - - -def has_speedups(): - return encoder.c_make_encoder is not None - - -def skip_if_speedups_missing(func): - def wrapper(*args, **kwargs): - if not has_speedups(): - if hasattr(unittest, 'SkipTest'): - raise unittest.SkipTest("C Extension not available") - else: - sys.stdout.write("C Extension not available") - return - return func(*args, **kwargs) - - return wrapper - - -class BadBool: - def __bool__(self): - 1/0 - __nonzero__ = __bool__ - - -class TestDecode(TestCase): - @skip_if_speedups_missing - def test_make_scanner(self): - self.assertRaises(AttributeError, scanner.c_make_scanner, 1) - - @skip_if_speedups_missing - def test_bad_bool_args(self): - def test(value): - decoder.JSONDecoder(strict=BadBool()).decode(value) - self.assertRaises(ZeroDivisionError, test, '""') - self.assertRaises(ZeroDivisionError, test, '{}') - if not PY3: - self.assertRaises(ZeroDivisionError, test, u'""') - self.assertRaises(ZeroDivisionError, test, u'{}') - -class TestEncode(TestCase): - @skip_if_speedups_missing - def test_make_encoder(self): - self.assertRaises( - TypeError, - encoder.c_make_encoder, - None, - ("\xCD\x7D\x3D\x4E\x12\x4C\xF9\x79\xD7" - "\x52\xBA\x82\xF2\x27\x4A\x7D\xA0\xCA\x75"), - None - ) - - @skip_if_speedups_missing - def test_bad_str_encoder(self): - # Issue #31505: There shouldn't be an assertion failure in case - # c_make_encoder() receives a bad encoder() argument. - import decimal - def bad_encoder1(*args): - return None - enc = encoder.c_make_encoder( - None, lambda obj: str(obj), - bad_encoder1, None, ': ', ', ', - False, False, False, {}, False, False, False, - None, None, 'utf-8', False, False, decimal.Decimal, False) - self.assertRaises(TypeError, enc, 'spam', 4) - self.assertRaises(TypeError, enc, {'spam': 42}, 4) - - def bad_encoder2(*args): - 1/0 - enc = encoder.c_make_encoder( - None, lambda obj: str(obj), - bad_encoder2, None, ': ', ', ', - False, False, False, {}, False, False, False, - None, None, 'utf-8', False, False, decimal.Decimal, False) - self.assertRaises(ZeroDivisionError, enc, 'spam', 4) - - @skip_if_speedups_missing - def test_bad_bool_args(self): - def test(name): - encoder.JSONEncoder(**{name: BadBool()}).encode({}) - self.assertRaises(ZeroDivisionError, test, 'skipkeys') - self.assertRaises(ZeroDivisionError, test, 'ensure_ascii') - self.assertRaises(ZeroDivisionError, test, 'check_circular') - self.assertRaises(ZeroDivisionError, test, 'allow_nan') - self.assertRaises(ZeroDivisionError, test, 'sort_keys') - self.assertRaises(ZeroDivisionError, test, 'use_decimal') - self.assertRaises(ZeroDivisionError, test, 'namedtuple_as_object') - self.assertRaises(ZeroDivisionError, test, 'tuple_as_array') - self.assertRaises(ZeroDivisionError, test, 'bigint_as_string') - self.assertRaises(ZeroDivisionError, test, 'for_json') - self.assertRaises(ZeroDivisionError, test, 'ignore_nan') - self.assertRaises(ZeroDivisionError, test, 'iterable_as_array') - - @skip_if_speedups_missing - def test_int_as_string_bitcount_overflow(self): - long_count = long_type(2)**32+31 - def test(): - encoder.JSONEncoder(int_as_string_bitcount=long_count).encode(0) - self.assertRaises((TypeError, OverflowError), test) - - if PY3: - @skip_if_speedups_missing - def test_bad_encoding(self): - with self.assertRaises(UnicodeEncodeError): - encoder.JSONEncoder(encoding='\udcff').encode({b('key'): 123}) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_str_subclass.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_str_subclass.py deleted file mode 100644 index b6c8351..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_str_subclass.py +++ /dev/null @@ -1,21 +0,0 @@ -from unittest import TestCase - -import simplejson -from simplejson.compat import text_type - -# Tests for issue demonstrated in https://github.com/simplejson/simplejson/issues/144 -class WonkyTextSubclass(text_type): - def __getslice__(self, start, end): - return self.__class__('not what you wanted!') - -class TestStrSubclass(TestCase): - def test_dump_load(self): - for s in ['', '"hello"', 'text', u'\u005c']: - self.assertEqual( - s, - simplejson.loads(simplejson.dumps(WonkyTextSubclass(s)))) - - self.assertEqual( - s, - simplejson.loads(simplejson.dumps(WonkyTextSubclass(s), - ensure_ascii=False))) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_subclass.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_subclass.py deleted file mode 100644 index 2bae3b6..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_subclass.py +++ /dev/null @@ -1,37 +0,0 @@ -from unittest import TestCase -import simplejson as json - -from decimal import Decimal - -class AlternateInt(int): - def __repr__(self): - return 'invalid json' - __str__ = __repr__ - - -class AlternateFloat(float): - def __repr__(self): - return 'invalid json' - __str__ = __repr__ - - -# class AlternateDecimal(Decimal): -# def __repr__(self): -# return 'invalid json' - - -class TestSubclass(TestCase): - def test_int(self): - self.assertEqual(json.dumps(AlternateInt(1)), '1') - self.assertEqual(json.dumps(AlternateInt(-1)), '-1') - self.assertEqual(json.loads(json.dumps({AlternateInt(1): 1})), {'1': 1}) - - def test_float(self): - self.assertEqual(json.dumps(AlternateFloat(1.0)), '1.0') - self.assertEqual(json.dumps(AlternateFloat(-1.0)), '-1.0') - self.assertEqual(json.loads(json.dumps({AlternateFloat(1.0): 1})), {'1.0': 1}) - - # NOTE: Decimal subclasses are not supported as-is - # def test_decimal(self): - # self.assertEqual(json.dumps(AlternateDecimal('1.0')), '1.0') - # self.assertEqual(json.dumps(AlternateDecimal('-1.0')), '-1.0') diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_tool.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_tool.py deleted file mode 100644 index 914bff8..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_tool.py +++ /dev/null @@ -1,114 +0,0 @@ -from __future__ import with_statement -import os -import sys -import textwrap -import unittest -import subprocess -import tempfile -try: - # Python 3.x - from test.support import strip_python_stderr -except ImportError: - # Python 2.6+ - try: - from test.test_support import strip_python_stderr - except ImportError: - # Python 2.5 - import re - def strip_python_stderr(stderr): - return re.sub( - r"\[\d+ refs\]\r?\n?$".encode(), - "".encode(), - stderr).strip() - -def open_temp_file(): - if sys.version_info >= (2, 6): - file = tempfile.NamedTemporaryFile(delete=False) - filename = file.name - else: - fd, filename = tempfile.mkstemp() - file = os.fdopen(fd, 'w+b') - return file, filename - -class TestTool(unittest.TestCase): - data = """ - - [["blorpie"],[ "whoops" ] , [ - ],\t"d-shtaeou",\r"d-nthiouh", - "i-vhbjkhnth", {"nifty":87}, {"morefield" :\tfalse,"field" - :"yes"} ] - """ - - expect = textwrap.dedent("""\ - [ - [ - "blorpie" - ], - [ - "whoops" - ], - [], - "d-shtaeou", - "d-nthiouh", - "i-vhbjkhnth", - { - "nifty": 87 - }, - { - "field": "yes", - "morefield": false - } - ] - """) - - def runTool(self, args=None, data=None): - argv = [sys.executable, '-m', 'simplejson.tool'] - if args: - argv.extend(args) - proc = subprocess.Popen(argv, - stdin=subprocess.PIPE, - stderr=subprocess.PIPE, - stdout=subprocess.PIPE) - out, err = proc.communicate(data) - self.assertEqual(strip_python_stderr(err), ''.encode()) - self.assertEqual(proc.returncode, 0) - return out.decode('utf8').splitlines() - - def test_stdin_stdout(self): - self.assertEqual( - self.runTool(data=self.data.encode()), - self.expect.splitlines()) - - def test_infile_stdout(self): - infile, infile_name = open_temp_file() - try: - infile.write(self.data.encode()) - infile.close() - self.assertEqual( - self.runTool(args=[infile_name]), - self.expect.splitlines()) - finally: - os.unlink(infile_name) - - def test_infile_outfile(self): - infile, infile_name = open_temp_file() - try: - infile.write(self.data.encode()) - infile.close() - # outfile will get overwritten by tool, so the delete - # may not work on some platforms. Do it manually. - outfile, outfile_name = open_temp_file() - try: - outfile.close() - self.assertEqual( - self.runTool(args=[infile_name, outfile_name]), - []) - with open(outfile_name, 'rb') as f: - self.assertEqual( - f.read().decode('utf8').splitlines(), - self.expect.splitlines() - ) - finally: - os.unlink(outfile_name) - finally: - os.unlink(infile_name) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_tuple.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_tuple.py deleted file mode 100644 index 4ad7b0e..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_tuple.py +++ /dev/null @@ -1,47 +0,0 @@ -import unittest - -from simplejson.compat import StringIO -import simplejson as json - -class TestTuples(unittest.TestCase): - def test_tuple_array_dumps(self): - t = (1, 2, 3) - expect = json.dumps(list(t)) - # Default is True - self.assertEqual(expect, json.dumps(t)) - self.assertEqual(expect, json.dumps(t, tuple_as_array=True)) - self.assertRaises(TypeError, json.dumps, t, tuple_as_array=False) - # Ensure that the "default" does not get called - self.assertEqual(expect, json.dumps(t, default=repr)) - self.assertEqual(expect, json.dumps(t, tuple_as_array=True, - default=repr)) - # Ensure that the "default" gets called - self.assertEqual( - json.dumps(repr(t)), - json.dumps(t, tuple_as_array=False, default=repr)) - - def test_tuple_array_dump(self): - t = (1, 2, 3) - expect = json.dumps(list(t)) - # Default is True - sio = StringIO() - json.dump(t, sio) - self.assertEqual(expect, sio.getvalue()) - sio = StringIO() - json.dump(t, sio, tuple_as_array=True) - self.assertEqual(expect, sio.getvalue()) - self.assertRaises(TypeError, json.dump, t, StringIO(), - tuple_as_array=False) - # Ensure that the "default" does not get called - sio = StringIO() - json.dump(t, sio, default=repr) - self.assertEqual(expect, sio.getvalue()) - sio = StringIO() - json.dump(t, sio, tuple_as_array=True, default=repr) - self.assertEqual(expect, sio.getvalue()) - # Ensure that the "default" gets called - sio = StringIO() - json.dump(t, sio, tuple_as_array=False, default=repr) - self.assertEqual( - json.dumps(repr(t)), - sio.getvalue()) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_unicode.py b/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_unicode.py deleted file mode 100644 index 0c7b1a6..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tests/test_unicode.py +++ /dev/null @@ -1,154 +0,0 @@ -import sys -import codecs -from unittest import TestCase - -import simplejson as json -from simplejson.compat import unichr, text_type, b, BytesIO - -class TestUnicode(TestCase): - def test_encoding1(self): - encoder = json.JSONEncoder(encoding='utf-8') - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - s = u.encode('utf-8') - ju = encoder.encode(u) - js = encoder.encode(s) - self.assertEqual(ju, js) - - def test_encoding2(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - s = u.encode('utf-8') - ju = json.dumps(u, encoding='utf-8') - js = json.dumps(s, encoding='utf-8') - self.assertEqual(ju, js) - - def test_encoding3(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - j = json.dumps(u) - self.assertEqual(j, '"\\u03b1\\u03a9"') - - def test_encoding4(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - j = json.dumps([u]) - self.assertEqual(j, '["\\u03b1\\u03a9"]') - - def test_encoding5(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - j = json.dumps(u, ensure_ascii=False) - self.assertEqual(j, u'"' + u + u'"') - - def test_encoding6(self): - u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' - j = json.dumps([u], ensure_ascii=False) - self.assertEqual(j, u'["' + u + u'"]') - - def test_big_unicode_encode(self): - u = u'\U0001d120' - self.assertEqual(json.dumps(u), '"\\ud834\\udd20"') - self.assertEqual(json.dumps(u, ensure_ascii=False), u'"\U0001d120"') - - def test_big_unicode_decode(self): - u = u'z\U0001d120x' - self.assertEqual(json.loads('"' + u + '"'), u) - self.assertEqual(json.loads('"z\\ud834\\udd20x"'), u) - - def test_unicode_decode(self): - for i in range(0, 0xd7ff): - u = unichr(i) - #s = '"\\u{0:04x}"'.format(i) - s = '"\\u%04x"' % (i,) - self.assertEqual(json.loads(s), u) - - def test_object_pairs_hook_with_unicode(self): - s = u'{"xkd":1, "kcw":2, "art":3, "hxm":4, "qrt":5, "pad":6, "hoy":7}' - p = [(u"xkd", 1), (u"kcw", 2), (u"art", 3), (u"hxm", 4), - (u"qrt", 5), (u"pad", 6), (u"hoy", 7)] - self.assertEqual(json.loads(s), eval(s)) - self.assertEqual(json.loads(s, object_pairs_hook=lambda x: x), p) - od = json.loads(s, object_pairs_hook=json.OrderedDict) - self.assertEqual(od, json.OrderedDict(p)) - self.assertEqual(type(od), json.OrderedDict) - # the object_pairs_hook takes priority over the object_hook - self.assertEqual(json.loads(s, - object_pairs_hook=json.OrderedDict, - object_hook=lambda x: None), - json.OrderedDict(p)) - - - def test_default_encoding(self): - self.assertEqual(json.loads(u'{"a": "\xe9"}'.encode('utf-8')), - {'a': u'\xe9'}) - - def test_unicode_preservation(self): - self.assertEqual(type(json.loads(u'""')), text_type) - self.assertEqual(type(json.loads(u'"a"')), text_type) - self.assertEqual(type(json.loads(u'["a"]')[0]), text_type) - - def test_ensure_ascii_false_returns_unicode(self): - # http://code.google.com/p/simplejson/issues/detail?id=48 - self.assertEqual(type(json.dumps([], ensure_ascii=False)), text_type) - self.assertEqual(type(json.dumps(0, ensure_ascii=False)), text_type) - self.assertEqual(type(json.dumps({}, ensure_ascii=False)), text_type) - self.assertEqual(type(json.dumps("", ensure_ascii=False)), text_type) - - def test_ensure_ascii_false_bytestring_encoding(self): - # http://code.google.com/p/simplejson/issues/detail?id=48 - doc1 = {u'quux': b('Arr\xc3\xaat sur images')} - doc2 = {u'quux': u'Arr\xeat sur images'} - doc_ascii = '{"quux": "Arr\\u00eat sur images"}' - doc_unicode = u'{"quux": "Arr\xeat sur images"}' - self.assertEqual(json.dumps(doc1), doc_ascii) - self.assertEqual(json.dumps(doc2), doc_ascii) - self.assertEqual(json.dumps(doc1, ensure_ascii=False), doc_unicode) - self.assertEqual(json.dumps(doc2, ensure_ascii=False), doc_unicode) - - def test_ensure_ascii_linebreak_encoding(self): - # http://timelessrepo.com/json-isnt-a-javascript-subset - s1 = u'\u2029\u2028' - s2 = s1.encode('utf8') - expect = '"\\u2029\\u2028"' - expect_non_ascii = u'"\u2029\u2028"' - self.assertEqual(json.dumps(s1), expect) - self.assertEqual(json.dumps(s2), expect) - self.assertEqual(json.dumps(s1, ensure_ascii=False), expect_non_ascii) - self.assertEqual(json.dumps(s2, ensure_ascii=False), expect_non_ascii) - - def test_invalid_escape_sequences(self): - # incomplete escape sequence - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u1') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u12') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u123') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u1234') - # invalid escape sequence - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u123x"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u12x4"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\u1x34"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ux234"') - if sys.maxunicode > 65535: - # invalid escape sequence for low surrogate - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u0"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u00"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u000"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u000x"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u00x0"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u0x00"') - self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\ux000"') - - def test_ensure_ascii_still_works(self): - # in the ascii range, ensure that everything is the same - for c in map(unichr, range(0, 127)): - self.assertEqual( - json.dumps(c, ensure_ascii=False), - json.dumps(c)) - snowman = u'\N{SNOWMAN}' - self.assertEqual( - json.dumps(c, ensure_ascii=False), - '"' + c + '"') - - def test_strip_bom(self): - content = u"\u3053\u3093\u306b\u3061\u308f" - json_doc = codecs.BOM_UTF8 + b(json.dumps(content)) - self.assertEqual(json.load(BytesIO(json_doc)), content) - for doc in json_doc, json_doc.decode('utf8'): - self.assertEqual(json.loads(doc), content) diff --git a/flask/venv/lib/python3.6/site-packages/simplejson/tool.py b/flask/venv/lib/python3.6/site-packages/simplejson/tool.py deleted file mode 100644 index 062e8e2..0000000 --- a/flask/venv/lib/python3.6/site-packages/simplejson/tool.py +++ /dev/null @@ -1,42 +0,0 @@ -r"""Command-line tool to validate and pretty-print JSON - -Usage:: - - $ echo '{"json":"obj"}' | python -m simplejson.tool - { - "json": "obj" - } - $ echo '{ 1.2:3.4}' | python -m simplejson.tool - Expecting property name: line 1 column 2 (char 2) - -""" -from __future__ import with_statement -import sys -import simplejson as json - -def main(): - if len(sys.argv) == 1: - infile = sys.stdin - outfile = sys.stdout - elif len(sys.argv) == 2: - infile = open(sys.argv[1], 'r') - outfile = sys.stdout - elif len(sys.argv) == 3: - infile = open(sys.argv[1], 'r') - outfile = open(sys.argv[2], 'w') - else: - raise SystemExit(sys.argv[0] + " [infile [outfile]]") - with infile: - try: - obj = json.load(infile, - object_pairs_hook=json.OrderedDict, - use_decimal=True) - except ValueError: - raise SystemExit(sys.exc_info()[1]) - with outfile: - json.dump(obj, outfile, sort_keys=True, indent=' ', use_decimal=True) - outfile.write('\n') - - -if __name__ == '__main__': - main() diff --git a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/PKG-INFO b/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/PKG-INFO deleted file mode 100644 index 39d2f3b..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/PKG-INFO +++ /dev/null @@ -1,334 +0,0 @@ -Metadata-Version: 1.1 -Name: watchdog -Version: 0.9.0 -Summary: Filesystem events monitoring -Home-page: http://github.com/gorakhargosh/watchdog -Author: Yesudeep Mangalapilly -Author-email: yesudeep@gmail.com -License: Apache License 2.0 -Description: Watchdog - ======== - Python API and shell utilities to monitor file system events. - - - Example API Usage - ----------------- - A simple program that uses watchdog to monitor directories specified - as command-line arguments and logs events generated: - - .. code-block:: python - - import sys - import time - import logging - from watchdog.observers import Observer - from watchdog.events import LoggingEventHandler - - if __name__ == "__main__": - logging.basicConfig(level=logging.INFO, - format='%(asctime)s - %(message)s', - datefmt='%Y-%m-%d %H:%M:%S') - path = sys.argv[1] if len(sys.argv) > 1 else '.' - event_handler = LoggingEventHandler() - observer = Observer() - observer.schedule(event_handler, path, recursive=True) - observer.start() - try: - while True: - time.sleep(1) - except KeyboardInterrupt: - observer.stop() - observer.join() - - - Shell Utilities - --------------- - Watchdog comes with a utility script called ``watchmedo``. - Please type ``watchmedo --help`` at the shell prompt to - know more about this tool. - - Here is how you can log the current directory recursively - for events related only to ``*.py`` and ``*.txt`` files while - ignoring all directory events: - - .. code-block:: bash - - watchmedo log \ - --patterns="*.py;*.txt" \ - --ignore-directories \ - --recursive \ - . - - You can use the ``shell-command`` subcommand to execute shell commands in - response to events: - - .. code-block:: bash - - watchmedo shell-command \ - --patterns="*.py;*.txt" \ - --recursive \ - --command='echo "${watch_src_path}"' \ - . - - Please see the help information for these commands by typing: - - .. code-block:: bash - - watchmedo [command] --help - - - About ``watchmedo`` Tricks - ~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``watchmedo`` can read ``tricks.yaml`` files and execute tricks within them in - response to file system events. Tricks are actually event handlers that - subclass ``watchdog.tricks.Trick`` and are written by plugin authors. Trick - classes are augmented with a few additional features that regular event handlers - don't need. - - An example ``tricks.yaml`` file: - - .. code-block:: yaml - - tricks: - - watchdog.tricks.LoggerTrick: - patterns: ["*.py", "*.js"] - - watchmedo_webtricks.GoogleClosureTrick: - patterns: ['*.js'] - hash_names: true - mappings_format: json # json|yaml|python - mappings_module: app/javascript_mappings - suffix: .min.js - compilation_level: advanced # simple|advanced - source_directory: app/static/js/ - destination_directory: app/public/js/ - files: - index-page: - - app/static/js/vendor/jquery*.js - - app/static/js/base.js - - app/static/js/index-page.js - about-page: - - app/static/js/vendor/jquery*.js - - app/static/js/base.js - - app/static/js/about-page/**/*.js - - The directory containing the ``tricks.yaml`` file will be monitored. Each trick - class is initialized with its corresponding keys in the ``tricks.yaml`` file as - arguments and events are fed to an instance of this class as they arrive. - - Tricks will be included in the 0.5.0 release. I need community input about them. - Please file enhancement requests at the `issue tracker`_. - - - Installation - ------------ - Installing from PyPI using ``pip``: - - .. code-block:: bash - - $ pip install watchdog - - Installing from PyPI using ``easy_install``: - - .. code-block:: bash - - $ easy_install watchdog - - Installing from source: - - .. code-block:: bash - - $ python setup.py install - - - Installation Caveats - ~~~~~~~~~~~~~~~~~~~~ - The ``watchmedo`` script depends on PyYAML_ which links with LibYAML_, - which brings a performance boost to the PyYAML parser. However, installing - LibYAML_ is optional but recommended. On Mac OS X, you can use homebrew_ - to install LibYAML: - - .. code-block:: bash - - $ brew install libyaml - - On Linux, use your favorite package manager to install LibYAML. Here's how you - do it on Ubuntu: - - .. code-block:: bash - - $ sudo aptitude install libyaml-dev - - On Windows, please install PyYAML_ using the binaries they provide. - - Documentation - ------------- - You can browse the latest release documentation_ online. - - Contribute - ---------- - Fork the `repository`_ on GitHub and send a pull request, or file an issue - ticket at the `issue tracker`_. For general help and questions use the official - `mailing list`_ or ask on `stackoverflow`_ with tag `python-watchdog`. - - Create and activate your virtual environment, then:: - - pip install pytest - pip install -e . - py.test tests - - - Supported Platforms - ------------------- - * Linux 2.6 (inotify) - * Mac OS X (FSEvents, kqueue) - * FreeBSD/BSD (kqueue) - * Windows (ReadDirectoryChangesW with I/O completion ports; - ReadDirectoryChangesW worker threads) - * OS-independent (polling the disk for directory snapshots and comparing them - periodically; slow and not recommended) - - Note that when using watchdog with kqueue, you need the - number of file descriptors allowed to be opened by programs - running on your system to be increased to more than the - number of files that you will be monitoring. The easiest way - to do that is to edit your ``~/.profile`` file and add - a line similar to:: - - ulimit -n 1024 - - This is an inherent problem with kqueue because it uses - file descriptors to monitor files. That plus the enormous - amount of bookkeeping that watchdog needs to do in order - to monitor file descriptors just makes this a painful way - to monitor files and directories. In essence, kqueue is - not a very scalable way to monitor a deeply nested - directory of files and directories with a large number of - files. - - About using watchdog with editors like Vim - ------------------------------------------ - Vim does not modify files unless directed to do so. - It creates backup files and then swaps them in to replace - the files you are editing on the disk. This means that - if you use Vim to edit your files, the on-modified events - for those files will not be triggered by watchdog. - You may need to configure Vim to appropriately to disable - this feature. - - - Dependencies - ------------ - 1. Python 2.6 or above. - 2. pathtools_ - 3. select_backport_ (select.kqueue replacement for 2.6 on BSD/Mac OS X) - 4. XCode_ (only on Mac OS X) - 5. PyYAML_ (only for ``watchmedo`` script) - 6. argh_ (only for ``watchmedo`` script) - - - Licensing - --------- - Watchdog is licensed under the terms of the `Apache License, version 2.0`_. - - Copyright 2011 `Yesudeep Mangalapilly`_. - - Copyright 2012 Google, Inc. - - Project `source code`_ is available at Github. Please report bugs and file - enhancement requests at the `issue tracker`_. - - Why Watchdog? - ------------- - Too many people tried to do the same thing and none did what I needed Python - to do: - - * pnotify_ - * `unison fsmonitor`_ - * fsmonitor_ - * guard_ - * pyinotify_ - * `inotify-tools`_ - * jnotify_ - * treewalker_ - * `file.monitor`_ - * pyfilesystem_ - - .. links: - .. _Yesudeep Mangalapilly: yesudeep@gmail.com - .. _source code: http://github.com/gorakhargosh/watchdog - .. _issue tracker: http://github.com/gorakhargosh/watchdog/issues - .. _Apache License, version 2.0: http://www.apache.org/licenses/LICENSE-2.0 - .. _documentation: http://packages.python.org/watchdog/ - .. _stackoverflow: http://stackoverflow.com/questions/tagged/python-watchdog - .. _mailing list: http://groups.google.com/group/watchdog-python - .. _repository: http://github.com/gorakhargosh/watchdog - .. _issue tracker: http://github.com/gorakhargosh/watchdog/issues - - .. _homebrew: http://mxcl.github.com/homebrew/ - .. _select_backport: http://pypi.python.org/pypi/select_backport - .. _argh: http://pypi.python.org/pypi/argh - .. _PyYAML: http://www.pyyaml.org/ - .. _XCode: http://developer.apple.com/technologies/tools/xcode.html - .. _LibYAML: http://pyyaml.org/wiki/LibYAML - .. _pathtools: http://github.com/gorakhargosh/pathtools - - .. _pnotify: http://mark.heily.com/pnotify - .. _unison fsmonitor: https://webdav.seas.upenn.edu/viewvc/unison/trunk/src/fsmonitor.py?view=markup&pathrev=471 - .. _fsmonitor: http://github.com/shaurz/fsmonitor - .. _guard: http://github.com/guard/guard - .. _pyinotify: http://github.com/seb-m/pyinotify - .. _inotify-tools: http://github.com/rvoicilas/inotify-tools - .. _jnotify: http://jnotify.sourceforge.net/ - .. _treewalker: http://github.com/jbd/treewatcher - .. _file.monitor: http://github.com/pke/file.monitor - .. _pyfilesystem: http://code.google.com/p/pyfilesystem - - - .. :changelog: - - API changes - ----------- - - 0.8.2 - ~~~~~ - - - Event emitters are no longer started on schedule if ``Observer`` is not - already running. - - - 0.8.0 - ~~~~~ - - - ``DirectorySnapshot``: methods returning internal stat info replaced by - ``mtime``, ``inode`` and ``path`` methods. - - ``DirectorySnapshot``: ``walker_callback`` parameter deprecated. - -Keywords: python filesystem monitoring monitor FSEvents kqueue inotify ReadDirectoryChangesW polling DirectorySnapshot -Platform: UNKNOWN -Classifier: Development Status :: 3 - Alpha -Classifier: Environment :: Console -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: System Administrators -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Natural Language :: English -Classifier: Operating System :: POSIX :: Linux -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: POSIX :: BSD -Classifier: Operating System :: Microsoft :: Windows :: Windows NT/2000 -Classifier: Operating System :: OS Independent -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.2 -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 :: 3.7 -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Programming Language :: C -Classifier: Topic :: Software Development :: Libraries -Classifier: Topic :: System :: Monitoring -Classifier: Topic :: System :: Filesystems -Classifier: Topic :: Utilities diff --git a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/SOURCES.txt b/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/SOURCES.txt deleted file mode 100644 index 5dd0b82..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/SOURCES.txt +++ /dev/null @@ -1,75 +0,0 @@ -AUTHORS -COPYING -LICENSE -MANIFEST.in -README.rst -changelog.rst -setup.cfg -setup.py -docs/Makefile -docs/dependencies.txt -docs/echo.py.txt -docs/eclipse_cdt_style.xml -docs/make.bat -docs/source/api.rst -docs/source/conf.py -docs/source/global.rst.inc -docs/source/hacking.rst -docs/source/index.rst -docs/source/installation.rst -docs/source/quickstart.rst -docs/source/examples/logger.py -docs/source/examples/patterns.py -docs/source/examples/simple.py -docs/source/examples/tricks.json -docs/source/examples/tricks.yaml -src/watchdog_fsevents.c -src/watchdog/__init__.py -src/watchdog/events.py -src/watchdog/version.py -src/watchdog/watchmedo.py -src/watchdog.egg-info/PKG-INFO -src/watchdog.egg-info/SOURCES.txt -src/watchdog.egg-info/dependency_links.txt -src/watchdog.egg-info/entry_points.txt -src/watchdog.egg-info/not-zip-safe -src/watchdog.egg-info/requires.txt -src/watchdog.egg-info/top_level.txt -src/watchdog/observers/__init__.py -src/watchdog/observers/api.py -src/watchdog/observers/fsevents.py -src/watchdog/observers/fsevents2.py -src/watchdog/observers/inotify.py -src/watchdog/observers/inotify_buffer.py -src/watchdog/observers/inotify_c.py -src/watchdog/observers/kqueue.py -src/watchdog/observers/polling.py -src/watchdog/observers/read_directory_changes.py -src/watchdog/observers/winapi.py -src/watchdog/tricks/__init__.py -src/watchdog/utils/__init__.py -src/watchdog/utils/bricks.py -src/watchdog/utils/compat.py -src/watchdog/utils/decorators.py -src/watchdog/utils/delayed_queue.py -src/watchdog/utils/dirsnapshot.py -src/watchdog/utils/echo.py -src/watchdog/utils/event_backport.py -src/watchdog/utils/importlib2.py -src/watchdog/utils/platform.py -src/watchdog/utils/unicode_paths.py -src/watchdog/utils/win32stat.py -tests/__init__.py -tests/shell.py -tests/test_delayed_queue.py -tests/test_emitter.py -tests/test_inotify_buffer.py -tests/test_inotify_c.py -tests/test_observer.py -tests/test_skip_repeats_queue.py -tests/test_snapshot_diff.py -tests/legacy/test_watch_observers_winapi.py -tests/legacy/test_watchdog_events.py -tests/legacy/test_watchdog_observers_api.py -tests/legacy/test_watchdog_observers_polling.py -tests/legacy/utils.py \ No newline at end of file diff --git a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/dependency_links.txt b/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/entry_points.txt b/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/entry_points.txt deleted file mode 100644 index 043c91e..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -watchmedo = watchdog.watchmedo:main - diff --git a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/installed-files.txt b/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/installed-files.txt deleted file mode 100644 index 8b27537..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/installed-files.txt +++ /dev/null @@ -1,64 +0,0 @@ -../../../../bin/watchmedo -../watchdog/__init__.py -../watchdog/__pycache__/__init__.cpython-36.pyc -../watchdog/__pycache__/events.cpython-36.pyc -../watchdog/__pycache__/version.cpython-36.pyc -../watchdog/__pycache__/watchmedo.cpython-36.pyc -../watchdog/events.py -../watchdog/observers/__init__.py -../watchdog/observers/__pycache__/__init__.cpython-36.pyc -../watchdog/observers/__pycache__/api.cpython-36.pyc -../watchdog/observers/__pycache__/fsevents.cpython-36.pyc -../watchdog/observers/__pycache__/fsevents2.cpython-36.pyc -../watchdog/observers/__pycache__/inotify.cpython-36.pyc -../watchdog/observers/__pycache__/inotify_buffer.cpython-36.pyc -../watchdog/observers/__pycache__/inotify_c.cpython-36.pyc -../watchdog/observers/__pycache__/kqueue.cpython-36.pyc -../watchdog/observers/__pycache__/polling.cpython-36.pyc -../watchdog/observers/__pycache__/read_directory_changes.cpython-36.pyc -../watchdog/observers/__pycache__/winapi.cpython-36.pyc -../watchdog/observers/api.py -../watchdog/observers/fsevents.py -../watchdog/observers/fsevents2.py -../watchdog/observers/inotify.py -../watchdog/observers/inotify_buffer.py -../watchdog/observers/inotify_c.py -../watchdog/observers/kqueue.py -../watchdog/observers/polling.py -../watchdog/observers/read_directory_changes.py -../watchdog/observers/winapi.py -../watchdog/tricks/__init__.py -../watchdog/tricks/__pycache__/__init__.cpython-36.pyc -../watchdog/utils/__init__.py -../watchdog/utils/__pycache__/__init__.cpython-36.pyc -../watchdog/utils/__pycache__/bricks.cpython-36.pyc -../watchdog/utils/__pycache__/compat.cpython-36.pyc -../watchdog/utils/__pycache__/decorators.cpython-36.pyc -../watchdog/utils/__pycache__/delayed_queue.cpython-36.pyc -../watchdog/utils/__pycache__/dirsnapshot.cpython-36.pyc -../watchdog/utils/__pycache__/echo.cpython-36.pyc -../watchdog/utils/__pycache__/event_backport.cpython-36.pyc -../watchdog/utils/__pycache__/importlib2.cpython-36.pyc -../watchdog/utils/__pycache__/platform.cpython-36.pyc -../watchdog/utils/__pycache__/unicode_paths.cpython-36.pyc -../watchdog/utils/__pycache__/win32stat.cpython-36.pyc -../watchdog/utils/bricks.py -../watchdog/utils/compat.py -../watchdog/utils/decorators.py -../watchdog/utils/delayed_queue.py -../watchdog/utils/dirsnapshot.py -../watchdog/utils/echo.py -../watchdog/utils/event_backport.py -../watchdog/utils/importlib2.py -../watchdog/utils/platform.py -../watchdog/utils/unicode_paths.py -../watchdog/utils/win32stat.py -../watchdog/version.py -../watchdog/watchmedo.py -PKG-INFO -SOURCES.txt -dependency_links.txt -entry_points.txt -not-zip-safe -requires.txt -top_level.txt diff --git a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/not-zip-safe b/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/not-zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/not-zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/requires.txt b/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/requires.txt deleted file mode 100644 index 55db381..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/requires.txt +++ /dev/null @@ -1,3 +0,0 @@ -PyYAML>=3.10 -argh>=0.24.1 -pathtools>=0.1.1 diff --git a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/top_level.txt b/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/top_level.txt deleted file mode 100644 index e59495e..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog-0.9.0.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -watchdog diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/__init__.py b/flask/venv/lib/python3.6/site-packages/watchdog/__init__.py deleted file mode 100644 index 1a641ff..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/__pycache__/__init__.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index 5eb99bcd1f7721f0b6c6194e34646fff600f2786..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmXr!<>gW+Y>8gO#K7>F0SPby*$zNl%mO4*7=jrz8U0o=6oG^h#IHd8qWt_4{eq(W ztkmq1O#P75qC}4>{j{9K;%xo0)VwnNoXjNsg36MN{5)elGyUSsl2qM-#N_P6^weVg o^2CzljFkLz{rLFIyv&mLc)fzkTO2mI`6;D2sdgZ%ih-B`0J?xHEC2ui diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/__pycache__/events.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/__pycache__/events.cpython-36.pyc deleted file mode 100644 index 4e5ea49ece01990326d394dee6fa0f1d9724ac0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20433 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 diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/__pycache__/version.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/__pycache__/version.cpython-36.pyc deleted file mode 100644 index c362506bb2f6d3213db7ac033a7481607c0a1253..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 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 -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -:module: watchdog.events -:synopsis: File system events and event handlers. -:author: yesudeep@google.com (Yesudeep Mangalapilly) - -Event Classes -------------- -.. autoclass:: FileSystemEvent - :members: - :show-inheritance: - :inherited-members: - -.. autoclass:: FileSystemMovedEvent - :members: - :show-inheritance: - -.. autoclass:: FileMovedEvent - :members: - :show-inheritance: - -.. autoclass:: DirMovedEvent - :members: - :show-inheritance: - -.. autoclass:: FileModifiedEvent - :members: - :show-inheritance: - -.. autoclass:: DirModifiedEvent - :members: - :show-inheritance: - -.. autoclass:: FileCreatedEvent - :members: - :show-inheritance: - -.. autoclass:: DirCreatedEvent - :members: - :show-inheritance: - -.. autoclass:: FileDeletedEvent - :members: - :show-inheritance: - -.. autoclass:: DirDeletedEvent - :members: - :show-inheritance: - - -Event Handler Classes ---------------------- -.. autoclass:: FileSystemEventHandler - :members: - :show-inheritance: - -.. autoclass:: PatternMatchingEventHandler - :members: - :show-inheritance: - -.. autoclass:: RegexMatchingEventHandler - :members: - :show-inheritance: - -.. autoclass:: LoggingEventHandler - :members: - :show-inheritance: - -""" - -import os.path -import logging -import re -from pathtools.patterns import match_any_paths -from watchdog.utils import has_attribute -from watchdog.utils import unicode_paths - - -EVENT_TYPE_MOVED = 'moved' -EVENT_TYPE_DELETED = 'deleted' -EVENT_TYPE_CREATED = 'created' -EVENT_TYPE_MODIFIED = 'modified' - - -class FileSystemEvent(object): - """ - Immutable type that represents a file system event that is triggered - when a change occurs on the monitored file system. - - All FileSystemEvent objects are required to be immutable and hence - can be used as keys in dictionaries or be added to sets. - """ - - event_type = None - """The type of the event as a string.""" - - is_directory = False - """True if event was emitted for a directory; False otherwise.""" - - def __init__(self, src_path): - self._src_path = src_path - - @property - def src_path(self): - """Source path of the file system object that triggered this event.""" - return self._src_path - - def __str__(self): - return self.__repr__() - - def __repr__(self): - return ("<%(class_name)s: event_type=%(event_type)s, " - "src_path=%(src_path)r, " - "is_directory=%(is_directory)s>" - ) % (dict( - class_name=self.__class__.__name__, - event_type=self.event_type, - src_path=self.src_path, - is_directory=self.is_directory)) - - # Used for comparison of events. - @property - def key(self): - return (self.event_type, self.src_path, self.is_directory) - - def __eq__(self, event): - return self.key == event.key - - def __ne__(self, event): - return self.key != event.key - - def __hash__(self): - return hash(self.key) - - -class FileSystemMovedEvent(FileSystemEvent): - """ - File system event representing any kind of file system movement. - """ - - event_type = EVENT_TYPE_MOVED - - def __init__(self, src_path, dest_path): - super(FileSystemMovedEvent, self).__init__(src_path) - self._dest_path = dest_path - - @property - def dest_path(self): - """The destination path of the move event.""" - return self._dest_path - - # Used for hashing this as an immutable object. - @property - def key(self): - return (self.event_type, self.src_path, self.dest_path, self.is_directory) - - def __repr__(self): - return ("<%(class_name)s: src_path=%(src_path)r, " - "dest_path=%(dest_path)r, " - "is_directory=%(is_directory)s>" - ) % (dict(class_name=self.__class__.__name__, - src_path=self.src_path, - dest_path=self.dest_path, - is_directory=self.is_directory)) - - -# File events. - - -class FileDeletedEvent(FileSystemEvent): - """File system event representing file deletion on the file system.""" - - event_type = EVENT_TYPE_DELETED - - def __init__(self, src_path): - super(FileDeletedEvent, self).__init__(src_path) - - def __repr__(self): - return "<%(class_name)s: src_path=%(src_path)r>" %\ - dict(class_name=self.__class__.__name__, - src_path=self.src_path) - - -class FileModifiedEvent(FileSystemEvent): - """File system event representing file modification on the file system.""" - - event_type = EVENT_TYPE_MODIFIED - - def __init__(self, src_path): - super(FileModifiedEvent, self).__init__(src_path) - - def __repr__(self): - return ("<%(class_name)s: src_path=%(src_path)r>" - ) % (dict(class_name=self.__class__.__name__, - src_path=self.src_path)) - - -class FileCreatedEvent(FileSystemEvent): - """File system event representing file creation on the file system.""" - - event_type = EVENT_TYPE_CREATED - - def __init__(self, src_path): - super(FileCreatedEvent, self).__init__(src_path) - - def __repr__(self): - return ("<%(class_name)s: src_path=%(src_path)r>" - ) % (dict(class_name=self.__class__.__name__, - src_path=self.src_path)) - - -class FileMovedEvent(FileSystemMovedEvent): - """File system event representing file movement on the file system.""" - - def __init__(self, src_path, dest_path): - super(FileMovedEvent, self).__init__(src_path, dest_path) - - def __repr__(self): - return ("<%(class_name)s: src_path=%(src_path)r, " - "dest_path=%(dest_path)r>" - ) % (dict(class_name=self.__class__.__name__, - src_path=self.src_path, - dest_path=self.dest_path)) - - -# Directory events. - - -class DirDeletedEvent(FileSystemEvent): - """File system event representing directory deletion on the file system.""" - - event_type = EVENT_TYPE_DELETED - is_directory = True - - def __init__(self, src_path): - super(DirDeletedEvent, self).__init__(src_path) - - def __repr__(self): - return ("<%(class_name)s: src_path=%(src_path)r>" - ) % (dict(class_name=self.__class__.__name__, - src_path=self.src_path)) - - -class DirModifiedEvent(FileSystemEvent): - """ - File system event representing directory modification on the file system. - """ - - event_type = EVENT_TYPE_MODIFIED - is_directory = True - - def __init__(self, src_path): - super(DirModifiedEvent, self).__init__(src_path) - - def __repr__(self): - return ("<%(class_name)s: src_path=%(src_path)r>" - ) % (dict(class_name=self.__class__.__name__, - src_path=self.src_path)) - - -class DirCreatedEvent(FileSystemEvent): - """File system event representing directory creation on the file system.""" - - event_type = EVENT_TYPE_CREATED - is_directory = True - - def __init__(self, src_path): - super(DirCreatedEvent, self).__init__(src_path) - - def __repr__(self): - return ("<%(class_name)s: src_path=%(src_path)r>" - ) % (dict(class_name=self.__class__.__name__, - src_path=self.src_path)) - - -class DirMovedEvent(FileSystemMovedEvent): - """File system event representing directory movement on the file system.""" - - is_directory = True - - def __init__(self, src_path, dest_path): - super(DirMovedEvent, self).__init__(src_path, dest_path) - - def __repr__(self): - return ("<%(class_name)s: src_path=%(src_path)r, " - "dest_path=%(dest_path)r>" - ) % (dict(class_name=self.__class__.__name__, - src_path=self.src_path, - dest_path=self.dest_path)) - - -class FileSystemEventHandler(object): - """ - Base file system event handler that you can override methods from. - """ - - def dispatch(self, event): - """Dispatches events to the appropriate methods. - - :param event: - The event object representing the file system event. - :type event: - :class:`FileSystemEvent` - """ - self.on_any_event(event) - _method_map = { - EVENT_TYPE_MODIFIED: self.on_modified, - EVENT_TYPE_MOVED: self.on_moved, - EVENT_TYPE_CREATED: self.on_created, - EVENT_TYPE_DELETED: self.on_deleted, - } - event_type = event.event_type - _method_map[event_type](event) - - def on_any_event(self, event): - """Catch-all event handler. - - :param event: - The event object representing the file system event. - :type event: - :class:`FileSystemEvent` - """ - - def on_moved(self, event): - """Called when a file or a directory is moved or renamed. - - :param event: - Event representing file/directory movement. - :type event: - :class:`DirMovedEvent` or :class:`FileMovedEvent` - """ - - def on_created(self, event): - """Called when a file or directory is created. - - :param event: - Event representing file/directory creation. - :type event: - :class:`DirCreatedEvent` or :class:`FileCreatedEvent` - """ - - def on_deleted(self, event): - """Called when a file or directory is deleted. - - :param event: - Event representing file/directory deletion. - :type event: - :class:`DirDeletedEvent` or :class:`FileDeletedEvent` - """ - - def on_modified(self, event): - """Called when a file or directory is modified. - - :param event: - Event representing file/directory modification. - :type event: - :class:`DirModifiedEvent` or :class:`FileModifiedEvent` - """ - - -class PatternMatchingEventHandler(FileSystemEventHandler): - """ - Matches given patterns with file paths associated with occurring events. - """ - - def __init__(self, patterns=None, ignore_patterns=None, - ignore_directories=False, case_sensitive=False): - super(PatternMatchingEventHandler, self).__init__() - - self._patterns = patterns - self._ignore_patterns = ignore_patterns - self._ignore_directories = ignore_directories - self._case_sensitive = case_sensitive - - @property - def patterns(self): - """ - (Read-only) - Patterns to allow matching event paths. - """ - return self._patterns - - @property - def ignore_patterns(self): - """ - (Read-only) - Patterns to ignore matching event paths. - """ - return self._ignore_patterns - - @property - def ignore_directories(self): - """ - (Read-only) - ``True`` if directories should be ignored; ``False`` otherwise. - """ - return self._ignore_directories - - @property - def case_sensitive(self): - """ - (Read-only) - ``True`` if path names should be matched sensitive to case; ``False`` - otherwise. - """ - return self._case_sensitive - - def dispatch(self, event): - """Dispatches events to the appropriate methods. - - :param event: - The event object representing the file system event. - :type event: - :class:`FileSystemEvent` - """ - if self.ignore_directories and event.is_directory: - return - - paths = [] - if has_attribute(event, 'dest_path'): - paths.append(unicode_paths.decode(event.dest_path)) - if event.src_path: - paths.append(unicode_paths.decode(event.src_path)) - - if match_any_paths(paths, - included_patterns=self.patterns, - excluded_patterns=self.ignore_patterns, - case_sensitive=self.case_sensitive): - self.on_any_event(event) - _method_map = { - EVENT_TYPE_MODIFIED: self.on_modified, - EVENT_TYPE_MOVED: self.on_moved, - EVENT_TYPE_CREATED: self.on_created, - EVENT_TYPE_DELETED: self.on_deleted, - } - event_type = event.event_type - _method_map[event_type](event) - - -class RegexMatchingEventHandler(FileSystemEventHandler): - """ - Matches given regexes with file paths associated with occurring events. - """ - - def __init__(self, regexes=[r".*"], ignore_regexes=[], - ignore_directories=False, case_sensitive=False): - super(RegexMatchingEventHandler, self).__init__() - - if case_sensitive: - self._regexes = [re.compile(r) for r in regexes] - self._ignore_regexes = [re.compile(r) for r in ignore_regexes] - else: - self._regexes = [re.compile(r, re.I) for r in regexes] - self._ignore_regexes = [re.compile(r, re.I) for r in ignore_regexes] - self._ignore_directories = ignore_directories - self._case_sensitive = case_sensitive - - @property - def regexes(self): - """ - (Read-only) - Regexes to allow matching event paths. - """ - return self._regexes - - @property - def ignore_regexes(self): - """ - (Read-only) - Regexes to ignore matching event paths. - """ - return self._ignore_regexes - - @property - def ignore_directories(self): - """ - (Read-only) - ``True`` if directories should be ignored; ``False`` otherwise. - """ - return self._ignore_directories - - @property - def case_sensitive(self): - """ - (Read-only) - ``True`` if path names should be matched sensitive to case; ``False`` - otherwise. - """ - return self._case_sensitive - - def dispatch(self, event): - """Dispatches events to the appropriate methods. - - :param event: - The event object representing the file system event. - :type event: - :class:`FileSystemEvent` - """ - if self.ignore_directories and event.is_directory: - return - - paths = [] - if has_attribute(event, 'dest_path'): - paths.append(unicode_paths.decode(event.dest_path)) - if event.src_path: - paths.append(unicode_paths.decode(event.src_path)) - - if any(r.match(p) for r in self.ignore_regexes for p in paths): - return - - if any(r.match(p) for r in self.regexes for p in paths): - self.on_any_event(event) - _method_map = { - EVENT_TYPE_MODIFIED: self.on_modified, - EVENT_TYPE_MOVED: self.on_moved, - EVENT_TYPE_CREATED: self.on_created, - EVENT_TYPE_DELETED: self.on_deleted, - } - event_type = event.event_type - _method_map[event_type](event) - - -class LoggingEventHandler(FileSystemEventHandler): - """Logs all the events captured.""" - - def on_moved(self, event): - super(LoggingEventHandler, self).on_moved(event) - - what = 'directory' if event.is_directory else 'file' - logging.info("Moved %s: from %s to %s", what, event.src_path, - event.dest_path) - - def on_created(self, event): - super(LoggingEventHandler, self).on_created(event) - - what = 'directory' if event.is_directory else 'file' - logging.info("Created %s: %s", what, event.src_path) - - def on_deleted(self, event): - super(LoggingEventHandler, self).on_deleted(event) - - what = 'directory' if event.is_directory else 'file' - logging.info("Deleted %s: %s", what, event.src_path) - - def on_modified(self, event): - super(LoggingEventHandler, self).on_modified(event) - - what = 'directory' if event.is_directory else 'file' - logging.info("Modified %s: %s", what, event.src_path) - - -class LoggingFileSystemEventHandler(LoggingEventHandler): - """ - For backwards-compatibility. Please use :class:`LoggingEventHandler` - instead. - """ - - -def generate_sub_moved_events(src_dir_path, dest_dir_path): - """Generates an event list of :class:`DirMovedEvent` and - :class:`FileMovedEvent` objects for all the files and directories within - the given moved directory that were moved along with the directory. - - :param src_dir_path: - The source path of the moved directory. - :param dest_dir_path: - The destination path of the moved directory. - :returns: - An iterable of file system events of type :class:`DirMovedEvent` and - :class:`FileMovedEvent`. - """ - for root, directories, filenames in os.walk(dest_dir_path): - for directory in directories: - full_path = os.path.join(root, directory) - renamed_path = full_path.replace(dest_dir_path, src_dir_path) if src_dir_path else None - yield DirMovedEvent(renamed_path, full_path) - for filename in filenames: - full_path = os.path.join(root, filename) - renamed_path = full_path.replace(dest_dir_path, src_dir_path) if src_dir_path else None - yield FileMovedEvent(renamed_path, full_path) - - -def generate_sub_created_events(src_dir_path): - """Generates an event list of :class:`DirCreatedEvent` and - :class:`FileCreatedEvent` objects for all the files and directories within - the given moved directory that were moved along with the directory. - - :param src_dir_path: - The source path of the created directory. - :returns: - An iterable of file system events of type :class:`DirCreatedEvent` and - :class:`FileCreatedEvent`. - """ - for root, directories, filenames in os.walk(src_dir_path): - for directory in directories: - yield DirCreatedEvent(os.path.join(root, directory)) - for filename in filenames: - yield FileCreatedEvent(os.path.join(root, filename)) \ No newline at end of file diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/__init__.py b/flask/venv/lib/python3.6/site-packages/watchdog/observers/__init__.py deleted file mode 100644 index 2b03ef2..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/observers/__init__.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -:module: watchdog.observers -:synopsis: Observer that picks a native implementation if available. -:author: yesudeep@google.com (Yesudeep Mangalapilly) - - -Classes -======= -.. autoclass:: Observer - :members: - :show-inheritance: - :inherited-members: - -Observer thread that schedules watching directories and dispatches -calls to event handlers. - -You can also import platform specific classes directly and use it instead -of :class:`Observer`. Here is a list of implemented observer classes.: - -============== ================================ ============================== -Class Platforms Note -============== ================================ ============================== -|Inotify| Linux 2.6.13+ ``inotify(7)`` based observer -|FSEvents| Mac OS X FSEvents based observer -|Kqueue| Mac OS X and BSD with kqueue(2) ``kqueue(2)`` based observer -|WinApi| MS Windows Windows API-based observer -|Polling| Any fallback implementation -============== ================================ ============================== - -.. |Inotify| replace:: :class:`.inotify.InotifyObserver` -.. |FSEvents| replace:: :class:`.fsevents.FSEventsObserver` -.. |Kqueue| replace:: :class:`.kqueue.KqueueObserver` -.. |WinApi| replace:: :class:`.read_directory_changes.WindowsApiObserver` -.. |WinApiAsync| replace:: :class:`.read_directory_changes_async.WindowsApiAsyncObserver` -.. |Polling| replace:: :class:`.polling.PollingObserver` - -""" - -import warnings -from watchdog.utils import platform -from watchdog.utils import UnsupportedLibc - -if platform.is_linux(): - try: - from .inotify import InotifyObserver as Observer - except UnsupportedLibc: - from .polling import PollingObserver as Observer - -elif platform.is_darwin(): - # FIXME: catching too broad. Error prone - try: - from .fsevents import FSEventsObserver as Observer - except: - try: - from .kqueue import KqueueObserver as Observer - warnings.warn("Failed to import fsevents. Fall back to kqueue") - except: - from .polling import PollingObserver as Observer - warnings.warn("Failed to import fsevents and kqueue. Fall back to polling.") - -elif platform.is_bsd(): - from .kqueue import KqueueObserver as Observer - -elif platform.is_windows(): - # TODO: find a reliable way of checking Windows version and import - # polling explicitly for Windows XP - try: - from .read_directory_changes import WindowsApiObserver as Observer - except: - from .polling import PollingObserver as Observer - warnings.warn("Failed to import read_directory_changes. Fall back to polling.") - -else: - from .polling import PollingObserver as Observer - -__all__ = ["Observer"] diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/__init__.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index b3c8f89fc640c0bdddb968ea9d7f8ac88badb741..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2621 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 JTlVU+{{iiG%{Bl4 diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/fsevents2.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/fsevents2.cpython-36.pyc deleted file mode 100644 index 2ec02e70e870f27ad5ff1aaecbbfad60a5a95cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6968 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 diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/inotify_buffer.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/inotify_buffer.cpython-36.pyc deleted file mode 100644 index 2817dcf7d5de63adebb31edf23848c27bdf4d4ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2550 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 Ie$+Pp19(6$%m4rY diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/read_directory_changes.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/read_directory_changes.cpython-36.pyc deleted file mode 100644 index 7b5515af2d74507a8518cd8b93c9cfb99bdcb084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3111 zcmZ`5O>Y~=b!R`wCAp+XS(YWsP1k7Sf6xKr3(J#yZL6P96ulJaZ|JY+X|KIBf1#(oH^VPk&Jy!x=DjyF@B8u7dcE5H+q*yH z8;0>8W9749{Q!peJAlZDNMfXf5`t?pF{!C$i`r^-r~|W=l+rRSr!IBV3azA7T1{)T zmU`4n>$ILWXd_*tYw8X=X{IgOO4sRndV}6bH|U1KJIT#-lWwNB=&f{%ZUL@Dx4$%^ za^$``L?OHQG6UPFpuMeT{+T3OphgOaY+L)E4Q@te)XE|6EYFS?>r$gdI8W3|fjxQ5k0NU{rzGjjHIa zqIDFHqU=oUj^mk@=e+8}H^ck8Uq8A30@RLtrmf)1(}DCSf(icsbOE1f@gITsCrliv z(=ziTa8W4zWAKhI-URZeX-Bb#80h%n?7(;gL;M_oG=?NMa*~_5 zbzu`jnnUZt$c+F(9v}ofs6n2!OWXtQ!VQ9W6w4qeD)JOf9gj{5doK%L7EX}hRGyg` zoNEh~9MhVLgy7YLO<3V5p^CDMQmuH#mj(Ij@FJ;_4glPKeynCDs z#LF%O((7&#zvzzN%F}H0Y3H-9h$Xu}9)vFkV3Dr6Gs;f7*(`KKS4F|n^E1PA#&7ve zc<&1sq6EMoO;RQ2x34*=GuJc3sK5_r6Na+fIxHmEXGn(T1=ugJ=614q3ut@?Kw*yu zV5DtWwh6zDXjE2%kC0(48wJ{on8;kJyYUf&oZr1J(|g<>77a=q3TE)81i^;Jg{o%S ziKY^Uqx3%_QDgOuZ2TBFg^C?gBIom%UB+_fDtoA8hck5;7%xg84yMz_0(mgJ%&7@0 z`;z?SYp8r=YF&~y4|B6;T$1lUpW4zHmWE};TgvUB3;Yhu6~31{Q|r||SXcSKU|q_s zsiU}SdFg`ie@ZWRU}aAAX^a0=)`tzbhBkO}M>aLJXMEq7x^RChcaiey&qrvnR$j*4 zsEKR2u6Y$5U%bKpJA282m;Nm`My9+ut*CRA9B>QH%}c`fmb}wyUIk1^-hvZb@1Ib# zKQ5(|+j!Ts_NJ59K+fjWQ!jXU`z3kx*^#02zs>I{DR-7H9~no`wSH$D7~jDR{x+W# zM*9wLf*Z8kF(#=OivSABgo_wz>=vL3GZXx$xUh#=JStql!vG_fHWcq@kU}}nlIY5Q z#LfyQ7LZ~b-#Vmfk8C{}>NeA_kmjgThhOi>|%b*a|C51iz<5K$7luw1w*{ zP44}a_f}LEzlHPS0RUZxY|NWxInd^YvfO_Quz5&0I4OHMj z{P{=MtHtU=`0oHpH);;0yBeU4Ckd{-04nn!nNi9?5M^Ny@HLQ0l}hg8>Mnv$5G*U0 zT45RESaLpxA<(I=ZJVCsTCT0|A)po?I`07tf$sV7h6=&!6zfZk=Kl!JW7W*&TWFM6 z=5@am;VDCvgl>D#mi&47j{ymtANB%V3VcHM#6gk>9~!Chov;5Ka4~C`^Gb&EqG6(< zx?xH)ClUFRh5zPMuC+~CpEd9xgg_Gyq=G z>o!<4CTz*~@$L?SE`nboXdu9=R<2*V>Q_LR!ccFZt2koXcQ7W7Cvw6eCOGQMHvtso zOmtKe`x&Bs0f4T}yKP6uyv|6h0Xkn*Zel8`gjVURl3nNP=Hm3CS9c&q)t?J(DkVRL zAKm@{ug+Cn)KsIzUdG!9(7Z~U4=G-_ztJK81+ob|<(V$zk86J7ZIw4%+iLdz4>)il ABLDyZ diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/winapi.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/observers/__pycache__/winapi.cpython-36.pyc deleted file mode 100644 index 6f699be96887b73ce8753321029192a62bfa740c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6828 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 F{{wcLH=+Ol diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/api.py b/flask/venv/lib/python3.6/site-packages/watchdog/observers/api.py deleted file mode 100644 index 30f2e9a..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/observers/api.py +++ /dev/null @@ -1,369 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import with_statement -import threading -from watchdog.utils import BaseThread -from watchdog.utils.compat import queue -from watchdog.utils.bricks import SkipRepeatsQueue - -DEFAULT_EMITTER_TIMEOUT = 1 # in seconds. -DEFAULT_OBSERVER_TIMEOUT = 1 # in seconds. - - -# Collection classes -class EventQueue(SkipRepeatsQueue): - """Thread-safe event queue based on a special queue that skips adding - the same event (:class:`FileSystemEvent`) multiple times consecutively. - Thus avoiding dispatching multiple event handling - calls when multiple identical events are produced quicker than an observer - can consume them. - """ - - -class ObservedWatch(object): - """An scheduled watch. - - :param path: - Path string. - :param recursive: - ``True`` if watch is recursive; ``False`` otherwise. - """ - - def __init__(self, path, recursive): - self._path = path - self._is_recursive = recursive - - @property - def path(self): - """The path that this watch monitors.""" - return self._path - - @property - def is_recursive(self): - """Determines whether subdirectories are watched for the path.""" - return self._is_recursive - - @property - def key(self): - return self.path, self.is_recursive - - def __eq__(self, watch): - return self.key == watch.key - - def __ne__(self, watch): - return self.key != watch.key - - def __hash__(self): - return hash(self.key) - - def __repr__(self): - return "" % ( - self.path, self.is_recursive) - - -# Observer classes -class EventEmitter(BaseThread): - """ - Producer thread base class subclassed by event emitters - that generate events and populate a queue with them. - - :param event_queue: - The event queue to populate with generated events. - :type event_queue: - :class:`watchdog.events.EventQueue` - :param watch: - The watch to observe and produce events for. - :type watch: - :class:`ObservedWatch` - :param timeout: - Timeout (in seconds) between successive attempts at reading events. - :type timeout: - ``float`` - """ - - def __init__(self, event_queue, watch, timeout=DEFAULT_EMITTER_TIMEOUT): - BaseThread.__init__(self) - self._event_queue = event_queue - self._watch = watch - self._timeout = timeout - - @property - def timeout(self): - """ - Blocking timeout for reading events. - """ - return self._timeout - - @property - def watch(self): - """ - The watch associated with this emitter. - """ - return self._watch - - def queue_event(self, event): - """ - Queues a single event. - - :param event: - Event to be queued. - :type event: - An instance of :class:`watchdog.events.FileSystemEvent` - or a subclass. - """ - self._event_queue.put((event, self.watch)) - - def queue_events(self, timeout): - """Override this method to populate the event queue with events - per interval period. - - :param timeout: - Timeout (in seconds) between successive attempts at - reading events. - :type timeout: - ``float`` - """ - - def run(self): - try: - while self.should_keep_running(): - self.queue_events(self.timeout) - finally: - pass - - -class EventDispatcher(BaseThread): - """ - Consumer thread base class subclassed by event observer threads - that dispatch events from an event queue to appropriate event handlers. - - :param timeout: - Event queue blocking timeout (in seconds). - :type timeout: - ``float`` - """ - - def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT): - BaseThread.__init__(self) - self._event_queue = EventQueue() - self._timeout = timeout - - @property - def timeout(self): - """Event queue block timeout.""" - return self._timeout - - @property - def event_queue(self): - """The event queue which is populated with file system events - by emitters and from which events are dispatched by a dispatcher - thread.""" - return self._event_queue - - def dispatch_events(self, event_queue, timeout): - """Override this method to consume events from an event queue, blocking - on the queue for the specified timeout before raising :class:`queue.Empty`. - - :param event_queue: - Event queue to populate with one set of events. - :type event_queue: - :class:`EventQueue` - :param timeout: - Interval period (in seconds) to wait before timing out on the - event queue. - :type timeout: - ``float`` - :raises: - :class:`queue.Empty` - """ - - def run(self): - while self.should_keep_running(): - try: - self.dispatch_events(self.event_queue, self.timeout) - except queue.Empty: - continue - - -class BaseObserver(EventDispatcher): - """Base observer.""" - - def __init__(self, emitter_class, timeout=DEFAULT_OBSERVER_TIMEOUT): - EventDispatcher.__init__(self, timeout) - self._emitter_class = emitter_class - self._lock = threading.RLock() - self._watches = set() - self._handlers = dict() - self._emitters = set() - self._emitter_for_watch = dict() - - def _add_emitter(self, emitter): - self._emitter_for_watch[emitter.watch] = emitter - self._emitters.add(emitter) - - def _remove_emitter(self, emitter): - del self._emitter_for_watch[emitter.watch] - self._emitters.remove(emitter) - emitter.stop() - try: - emitter.join() - except RuntimeError: - pass - - def _clear_emitters(self): - for emitter in self._emitters: - emitter.stop() - for emitter in self._emitters: - try: - emitter.join() - except RuntimeError: - pass - self._emitters.clear() - self._emitter_for_watch.clear() - - def _add_handler_for_watch(self, event_handler, watch): - if watch not in self._handlers: - self._handlers[watch] = set() - self._handlers[watch].add(event_handler) - - def _remove_handlers_for_watch(self, watch): - del self._handlers[watch] - - @property - def emitters(self): - """Returns event emitter created by this observer.""" - return self._emitters - - def start(self): - for emitter in self._emitters: - emitter.start() - super(BaseObserver, self).start() - - def schedule(self, event_handler, path, recursive=False): - """ - Schedules watching a path and calls appropriate methods specified - in the given event handler in response to file system events. - - :param event_handler: - An event handler instance that has appropriate event handling - methods which will be called by the observer in response to - file system events. - :type event_handler: - :class:`watchdog.events.FileSystemEventHandler` or a subclass - :param path: - Directory path that will be monitored. - :type path: - ``str`` - :param recursive: - ``True`` if events will be emitted for sub-directories - traversed recursively; ``False`` otherwise. - :type recursive: - ``bool`` - :return: - An :class:`ObservedWatch` object instance representing - a watch. - """ - with self._lock: - watch = ObservedWatch(path, recursive) - self._add_handler_for_watch(event_handler, watch) - - # If we don't have an emitter for this watch already, create it. - if self._emitter_for_watch.get(watch) is None: - emitter = self._emitter_class(event_queue=self.event_queue, - watch=watch, - timeout=self.timeout) - self._add_emitter(emitter) - if self.is_alive(): - emitter.start() - self._watches.add(watch) - return watch - - def add_handler_for_watch(self, event_handler, watch): - """Adds a handler for the given watch. - - :param event_handler: - An event handler instance that has appropriate event handling - methods which will be called by the observer in response to - file system events. - :type event_handler: - :class:`watchdog.events.FileSystemEventHandler` or a subclass - :param watch: - The watch to add a handler for. - :type watch: - An instance of :class:`ObservedWatch` or a subclass of - :class:`ObservedWatch` - """ - with self._lock: - self._add_handler_for_watch(event_handler, watch) - - def remove_handler_for_watch(self, event_handler, watch): - """Removes a handler for the given watch. - - :param event_handler: - An event handler instance that has appropriate event handling - methods which will be called by the observer in response to - file system events. - :type event_handler: - :class:`watchdog.events.FileSystemEventHandler` or a subclass - :param watch: - The watch to remove a handler for. - :type watch: - An instance of :class:`ObservedWatch` or a subclass of - :class:`ObservedWatch` - """ - with self._lock: - self._handlers[watch].remove(event_handler) - - def unschedule(self, watch): - """Unschedules a watch. - - :param watch: - The watch to unschedule. - :type watch: - An instance of :class:`ObservedWatch` or a subclass of - :class:`ObservedWatch` - """ - with self._lock: - emitter = self._emitter_for_watch[watch] - del self._handlers[watch] - self._remove_emitter(emitter) - self._watches.remove(watch) - - def unschedule_all(self): - """Unschedules all watches and detaches all associated event - handlers.""" - with self._lock: - self._handlers.clear() - self._clear_emitters() - self._watches.clear() - - def on_thread_stop(self): - self.unschedule_all() - - def dispatch_events(self, event_queue, timeout): - event, watch = event_queue.get(block=True, timeout=timeout) - - with self._lock: - # To allow unschedule/stop and safe removal of event handlers - # within event handlers itself, check if the handler is still - # registered after every dispatch. - for handler in list(self._handlers.get(watch, [])): - if handler in self._handlers.get(watch, []): - handler.dispatch(event) - event_queue.task_done() diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/fsevents.py b/flask/venv/lib/python3.6/site-packages/watchdog/observers/fsevents.py deleted file mode 100644 index 5edfebe..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/observers/fsevents.py +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -:module: watchdog.observers.fsevents -:synopsis: FSEvents based emitter implementation. -:author: yesudeep@google.com (Yesudeep Mangalapilly) -:platforms: Mac OS X -""" - -from __future__ import with_statement - -import sys -import threading -import unicodedata -import _watchdog_fsevents as _fsevents - -from watchdog.events import ( - FileDeletedEvent, - FileModifiedEvent, - FileCreatedEvent, - FileMovedEvent, - DirDeletedEvent, - DirModifiedEvent, - DirCreatedEvent, - DirMovedEvent -) - -from watchdog.utils.dirsnapshot import DirectorySnapshot -from watchdog.observers.api import ( - BaseObserver, - EventEmitter, - DEFAULT_EMITTER_TIMEOUT, - DEFAULT_OBSERVER_TIMEOUT -) - - -class FSEventsEmitter(EventEmitter): - - """ - Mac OS X FSEvents Emitter class. - - :param event_queue: - The event queue to fill with events. - :param watch: - A watch object representing the directory to monitor. - :type watch: - :class:`watchdog.observers.api.ObservedWatch` - :param timeout: - Read events blocking timeout (in seconds). - :type timeout: - ``float`` - """ - - def __init__(self, event_queue, watch, timeout=DEFAULT_EMITTER_TIMEOUT): - EventEmitter.__init__(self, event_queue, watch, timeout) - self._lock = threading.Lock() - self.snapshot = DirectorySnapshot(watch.path, watch.is_recursive) - - def on_thread_stop(self): - _fsevents.remove_watch(self.watch) - _fsevents.stop(self) - - def queue_events(self, timeout): - with self._lock: - if not self.watch.is_recursive\ - and self.watch.path not in self.pathnames: - return - new_snapshot = DirectorySnapshot(self.watch.path, - self.watch.is_recursive) - events = new_snapshot - self.snapshot - self.snapshot = new_snapshot - - # Files. - for src_path in events.files_deleted: - self.queue_event(FileDeletedEvent(src_path)) - for src_path in events.files_modified: - self.queue_event(FileModifiedEvent(src_path)) - for src_path in events.files_created: - self.queue_event(FileCreatedEvent(src_path)) - for src_path, dest_path in events.files_moved: - self.queue_event(FileMovedEvent(src_path, dest_path)) - - # Directories. - for src_path in events.dirs_deleted: - self.queue_event(DirDeletedEvent(src_path)) - for src_path in events.dirs_modified: - self.queue_event(DirModifiedEvent(src_path)) - for src_path in events.dirs_created: - self.queue_event(DirCreatedEvent(src_path)) - for src_path, dest_path in events.dirs_moved: - self.queue_event(DirMovedEvent(src_path, dest_path)) - - def run(self): - try: - def callback(pathnames, flags, emitter=self): - emitter.queue_events(emitter.timeout) - - # for pathname, flag in zip(pathnames, flags): - # if emitter.watch.is_recursive: # and pathname != emitter.watch.path: - # new_sub_snapshot = DirectorySnapshot(pathname, True) - # old_sub_snapshot = self.snapshot.copy(pathname) - # diff = new_sub_snapshot - old_sub_snapshot - # self.snapshot += new_subsnapshot - # else: - # new_snapshot = DirectorySnapshot(emitter.watch.path, False) - # diff = new_snapshot - emitter.snapshot - # emitter.snapshot = new_snapshot - - # INFO: FSEvents reports directory notifications recursively - # by default, so we do not need to add subdirectory paths. - #pathnames = set([self.watch.path]) - # if self.watch.is_recursive: - # for root, directory_names, _ in os.walk(self.watch.path): - # for directory_name in directory_names: - # full_path = absolute_path( - # os.path.join(root, directory_name)) - # pathnames.add(full_path) - self.pathnames = [self.watch.path] - _fsevents.add_watch(self, - self.watch, - callback, - self.pathnames) - _fsevents.read_events(self) - except: - pass - - -class FSEventsObserver(BaseObserver): - - def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT): - BaseObserver.__init__(self, emitter_class=FSEventsEmitter, - timeout=timeout) - - def schedule(self, event_handler, path, recursive=False): - # Python 2/3 compat - try: - str_class = unicode - except NameError: - str_class = str - - # Fix for issue #26: Trace/BPT error when given a unicode path - # string. https://github.com/gorakhargosh/watchdog/issues#issue/26 - if isinstance(path, str_class): - #path = unicode(path, 'utf-8') - path = unicodedata.normalize('NFC', path) - # We only encode the path in Python 2 for backwards compatibility. - # On Python 3 we want the path to stay as unicode if possible for - # the sake of path matching not having to be rewritten to use the - # bytes API instead of strings. The _watchdog_fsevent.so code for - # Python 3 can handle both str and bytes paths, which is why we - # do not HAVE to encode it with Python 3. The Python 2 code in - # _watchdog_fsevents.so was not changed for the sake of backwards - # compatibility. - if sys.version_info < (3,): - path = path.encode('utf-8') - return BaseObserver.schedule(self, event_handler, path, recursive) diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/fsevents2.py b/flask/venv/lib/python3.6/site-packages/watchdog/observers/fsevents2.py deleted file mode 100644 index 20bf064..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/observers/fsevents2.py +++ /dev/null @@ -1,239 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright 2014 Thomas Amland -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -:module: watchdog.observers.fsevents2 -:synopsis: FSEvents based emitter implementation. -:platforms: Mac OS X -""" - -import os -import logging -import unicodedata -from threading import Thread -from watchdog.utils.compat import queue - -from watchdog.events import ( - FileDeletedEvent, - FileModifiedEvent, - FileCreatedEvent, - FileMovedEvent, - DirDeletedEvent, - DirModifiedEvent, - DirCreatedEvent, - DirMovedEvent -) -from watchdog.observers.api import ( - BaseObserver, - EventEmitter, - DEFAULT_EMITTER_TIMEOUT, - DEFAULT_OBSERVER_TIMEOUT, -) - -# pyobjc -import AppKit -from FSEvents import ( - FSEventStreamCreate, - CFRunLoopGetCurrent, - FSEventStreamScheduleWithRunLoop, - FSEventStreamStart, - CFRunLoopRun, - CFRunLoopStop, - FSEventStreamStop, - FSEventStreamInvalidate, - FSEventStreamRelease, -) - -from FSEvents import ( - kCFAllocatorDefault, - kCFRunLoopDefaultMode, - kFSEventStreamEventIdSinceNow, - kFSEventStreamCreateFlagNoDefer, - kFSEventStreamCreateFlagFileEvents, - kFSEventStreamEventFlagItemCreated, - kFSEventStreamEventFlagItemRemoved, - kFSEventStreamEventFlagItemInodeMetaMod, - kFSEventStreamEventFlagItemRenamed, - kFSEventStreamEventFlagItemModified, - kFSEventStreamEventFlagItemFinderInfoMod, - kFSEventStreamEventFlagItemChangeOwner, - kFSEventStreamEventFlagItemXattrMod, - kFSEventStreamEventFlagItemIsDir, - kFSEventStreamEventFlagItemIsSymlink, -) - -logger = logging.getLogger(__name__) - - -class FSEventsQueue(Thread): - """ Low level FSEvents client. """ - - def __init__(self, path): - Thread.__init__(self) - self._queue = queue.Queue() - self._run_loop = None - - if isinstance(path, bytes): - path = path.decode('utf-8') - self._path = unicodedata.normalize('NFC', path) - - context = None - latency = 1.0 - self._stream_ref = FSEventStreamCreate( - kCFAllocatorDefault, self._callback, context, [self._path], - kFSEventStreamEventIdSinceNow, latency, - kFSEventStreamCreateFlagNoDefer | kFSEventStreamCreateFlagFileEvents) - if self._stream_ref is None: - raise IOError("FSEvents. Could not create stream.") - - def run(self): - pool = AppKit.NSAutoreleasePool.alloc().init() - self._run_loop = CFRunLoopGetCurrent() - FSEventStreamScheduleWithRunLoop( - self._stream_ref, self._run_loop, kCFRunLoopDefaultMode) - if not FSEventStreamStart(self._stream_ref): - FSEventStreamInvalidate(self._stream_ref) - FSEventStreamRelease(self._stream_ref) - raise IOError("FSEvents. Could not start stream.") - - CFRunLoopRun() - FSEventStreamStop(self._stream_ref) - FSEventStreamInvalidate(self._stream_ref) - FSEventStreamRelease(self._stream_ref) - del pool - # Make sure waiting thread is notified - self._queue.put(None) - - def stop(self): - if self._run_loop is not None: - CFRunLoopStop(self._run_loop) - - def _callback(self, streamRef, clientCallBackInfo, numEvents, eventPaths, eventFlags, eventIDs): - events = [NativeEvent(path, flags, _id) for path, flags, _id in - zip(eventPaths, eventFlags, eventIDs)] - logger.debug("FSEvents callback. Got %d events:" % numEvents) - for e in events: - logger.debug(e) - self._queue.put(events) - - def read_events(self): - """ - Returns a list or one or more events, or None if there are no more - events to be read. - """ - if not self.is_alive(): - return None - return self._queue.get() - - -class NativeEvent(object): - def __init__(self, path, flags, event_id): - self.path = path - self.flags = flags - self.event_id = event_id - self.is_created = bool(flags & kFSEventStreamEventFlagItemCreated) - self.is_removed = bool(flags & kFSEventStreamEventFlagItemRemoved) - self.is_renamed = bool(flags & kFSEventStreamEventFlagItemRenamed) - self.is_modified = bool(flags & kFSEventStreamEventFlagItemModified) - self.is_change_owner = bool(flags & kFSEventStreamEventFlagItemChangeOwner) - self.is_inode_meta_mod = bool(flags & kFSEventStreamEventFlagItemInodeMetaMod) - self.is_finder_info_mod = bool(flags & kFSEventStreamEventFlagItemFinderInfoMod) - self.is_xattr_mod = bool(flags & kFSEventStreamEventFlagItemXattrMod) - self.is_symlink = bool(flags & kFSEventStreamEventFlagItemIsSymlink) - self.is_directory = bool(flags & kFSEventStreamEventFlagItemIsDir) - - @property - def _event_type(self): - if self.is_created: return "Created" - if self.is_removed: return "Removed" - if self.is_renamed: return "Renamed" - if self.is_modified: return "Modified" - if self.is_inode_meta_mod: return "InodeMetaMod" - if self.is_xattr_mod: return "XattrMod" - return "Unknown" - - def __repr__(self): - s ="" - return s % (repr(self.path), self._event_type, self.is_directory, hex(self.flags), self.event_id) - - -class FSEventsEmitter(EventEmitter): - """ - FSEvents based event emitter. Handles conversion of native events. - """ - - def __init__(self, event_queue, watch, timeout=DEFAULT_EMITTER_TIMEOUT): - EventEmitter.__init__(self, event_queue, watch, timeout) - self._fsevents = FSEventsQueue(watch.path) - self._fsevents.start() - - def on_thread_stop(self): - self._fsevents.stop() - - def queue_events(self, timeout): - events = self._fsevents.read_events() - if events is None: - return - i = 0 - while i < len(events): - event = events[i] - - # For some reason the create and remove flags are sometimes also - # set for rename and modify type events, so let those take - # precedence. - if event.is_renamed: - # Internal moves appears to always be consecutive in the same - # buffer and have IDs differ by exactly one (while others - # don't) making it possible to pair up the two events coming - # from a singe move operation. (None of this is documented!) - # Otherwise, guess whether file was moved in or out. - #TODO: handle id wrapping - if (i+1 < len(events) and events[i+1].is_renamed and - events[i+1].event_id == event.event_id + 1): - cls = DirMovedEvent if event.is_directory else FileMovedEvent - self.queue_event(cls(event.path, events[i+1].path)) - self.queue_event(DirModifiedEvent(os.path.dirname(event.path))) - self.queue_event(DirModifiedEvent(os.path.dirname(events[i+1].path))) - i += 1 - elif os.path.exists(event.path): - cls = DirCreatedEvent if event.is_directory else FileCreatedEvent - self.queue_event(cls(event.path)) - self.queue_event(DirModifiedEvent(os.path.dirname(event.path))) - else: - cls = DirDeletedEvent if event.is_directory else FileDeletedEvent - self.queue_event(cls(event.path)) - self.queue_event(DirModifiedEvent(os.path.dirname(event.path))) - #TODO: generate events for tree - - elif event.is_modified or event.is_inode_meta_mod or event.is_xattr_mod : - cls = DirModifiedEvent if event.is_directory else FileModifiedEvent - self.queue_event(cls(event.path)) - - elif event.is_created: - cls = DirCreatedEvent if event.is_directory else FileCreatedEvent - self.queue_event(cls(event.path)) - self.queue_event(DirModifiedEvent(os.path.dirname(event.path))) - - elif event.is_removed: - cls = DirDeletedEvent if event.is_directory else FileDeletedEvent - self.queue_event(cls(event.path)) - self.queue_event(DirModifiedEvent(os.path.dirname(event.path))) - i += 1 - - -class FSEventsObserver2(BaseObserver): - def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT): - BaseObserver.__init__(self, emitter_class=FSEventsEmitter, timeout=timeout) diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/inotify.py b/flask/venv/lib/python3.6/site-packages/watchdog/observers/inotify.py deleted file mode 100644 index e6de857..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/observers/inotify.py +++ /dev/null @@ -1,218 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -:module: watchdog.observers.inotify -:synopsis: ``inotify(7)`` based emitter implementation. -:author: Sebastien Martini -:author: Luke McCarthy -:author: yesudeep@google.com (Yesudeep Mangalapilly) -:author: Tim Cuthbertson -:platforms: Linux 2.6.13+. - -.. ADMONITION:: About system requirements - - Recommended minimum kernel version: 2.6.25. - - Quote from the inotify(7) man page: - - "Inotify was merged into the 2.6.13 Linux kernel. The required library - interfaces were added to glibc in version 2.4. (IN_DONT_FOLLOW, - IN_MASK_ADD, and IN_ONLYDIR were only added in version 2.5.)" - - Therefore, you must ensure the system is running at least these versions - appropriate libraries and the kernel. - -.. ADMONITION:: About recursiveness, event order, and event coalescing - - Quote from the inotify(7) man page: - - If successive output inotify events produced on the inotify file - descriptor are identical (same wd, mask, cookie, and name) then they - are coalesced into a single event if the older event has not yet been - read (but see BUGS). - - The events returned by reading from an inotify file descriptor form - an ordered queue. Thus, for example, it is guaranteed that when - renaming from one directory to another, events will be produced in - the correct order on the inotify file descriptor. - - ... - - Inotify monitoring of directories is not recursive: to monitor - subdirectories under a directory, additional watches must be created. - - This emitter implementation therefore automatically adds watches for - sub-directories if running in recursive mode. - -Some extremely useful articles and documentation: - -.. _inotify FAQ: http://inotify.aiken.cz/?section=inotify&page=faq&lang=en -.. _intro to inotify: http://www.linuxjournal.com/article/8478 - -""" - -from __future__ import with_statement - -import os -import threading -from .inotify_buffer import InotifyBuffer - -from watchdog.observers.api import ( - EventEmitter, - BaseObserver, - DEFAULT_EMITTER_TIMEOUT, - DEFAULT_OBSERVER_TIMEOUT -) - -from watchdog.events import ( - DirDeletedEvent, - DirModifiedEvent, - DirMovedEvent, - DirCreatedEvent, - FileDeletedEvent, - FileModifiedEvent, - FileMovedEvent, - FileCreatedEvent, - generate_sub_moved_events, - generate_sub_created_events, -) -from watchdog.utils import unicode_paths - - -class InotifyEmitter(EventEmitter): - """ - inotify(7)-based event emitter. - - :param event_queue: - The event queue to fill with events. - :param watch: - A watch object representing the directory to monitor. - :type watch: - :class:`watchdog.observers.api.ObservedWatch` - :param timeout: - Read events blocking timeout (in seconds). - :type timeout: - ``float`` - """ - - def __init__(self, event_queue, watch, timeout=DEFAULT_EMITTER_TIMEOUT): - EventEmitter.__init__(self, event_queue, watch, timeout) - self._lock = threading.Lock() - self._inotify = None - - def on_thread_start(self): - path = unicode_paths.encode(self.watch.path) - self._inotify = InotifyBuffer(path, self.watch.is_recursive) - - def on_thread_stop(self): - if self._inotify: - self._inotify.close() - - def queue_events(self, timeout, full_events=False): - #If "full_events" is true, then the method will report unmatched move events as seperate events - #This behavior is by default only called by a InotifyFullEmitter - with self._lock: - event = self._inotify.read_event() - if event is None: - return - if isinstance(event, tuple): - move_from, move_to = event - src_path = self._decode_path(move_from.src_path) - dest_path = self._decode_path(move_to.src_path) - cls = DirMovedEvent if move_from.is_directory else FileMovedEvent - self.queue_event(cls(src_path, dest_path)) - self.queue_event(DirModifiedEvent(os.path.dirname(src_path))) - self.queue_event(DirModifiedEvent(os.path.dirname(dest_path))) - if move_from.is_directory and self.watch.is_recursive: - for sub_event in generate_sub_moved_events(src_path, dest_path): - self.queue_event(sub_event) - return - - src_path = self._decode_path(event.src_path) - if event.is_moved_to: - if (full_events): - cls = DirMovedEvent if event.is_directory else FileMovedEvent - self.queue_event(cls(None, src_path)) - else: - cls = DirCreatedEvent if event.is_directory else FileCreatedEvent - self.queue_event(cls(src_path)) - self.queue_event(DirModifiedEvent(os.path.dirname(src_path))) - if event.is_directory and self.watch.is_recursive: - for sub_event in generate_sub_created_events(src_path): - self.queue_event(sub_event) - elif event.is_attrib: - cls = DirModifiedEvent if event.is_directory else FileModifiedEvent - self.queue_event(cls(src_path)) - elif event.is_modify: - cls = DirModifiedEvent if event.is_directory else FileModifiedEvent - self.queue_event(cls(src_path)) - elif event.is_delete or (event.is_moved_from and not full_events): - cls = DirDeletedEvent if event.is_directory else FileDeletedEvent - self.queue_event(cls(src_path)) - self.queue_event(DirModifiedEvent(os.path.dirname(src_path))) - elif event.is_moved_from and full_events: - cls = DirMovedEvent if event.is_directory else FileMovedEvent - self.queue_event(cls(src_path, None)) - self.queue_event(DirModifiedEvent(os.path.dirname(src_path))) - elif event.is_create: - cls = DirCreatedEvent if event.is_directory else FileCreatedEvent - self.queue_event(cls(src_path)) - self.queue_event(DirModifiedEvent(os.path.dirname(src_path))) - - def _decode_path(self, path): - """ Decode path only if unicode string was passed to this emitter. """ - if isinstance(self.watch.path, bytes): - return path - return unicode_paths.decode(path) - - -class InotifyFullEmitter(InotifyEmitter): - """ - inotify(7)-based event emitter. By default this class produces move events even if they are not matched - Such move events will have a ``None`` value for the unmatched part. - - :param event_queue: - The event queue to fill with events. - :param watch: - A watch object representing the directory to monitor. - :type watch: - :class:`watchdog.observers.api.ObservedWatch` - :param timeout: - Read events blocking timeout (in seconds). - :type timeout: - ``float`` - """ - def __init__(self, event_queue, watch, timeout=DEFAULT_EMITTER_TIMEOUT): - InotifyEmitter.__init__(self, event_queue, watch, timeout) - - def queue_events(self, timeout, events=True): - InotifyEmitter.queue_events(self, timeout, full_events=events) - -class InotifyObserver(BaseObserver): - """ - Observer thread that schedules watching directories and dispatches - calls to event handlers. - """ - - def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT, generate_full_events=False): - if (generate_full_events): - BaseObserver.__init__(self, emitter_class=InotifyFullEmitter, timeout=timeout) - else: - BaseObserver.__init__(self, emitter_class=InotifyEmitter, - timeout=timeout) diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/inotify_buffer.py b/flask/venv/lib/python3.6/site-packages/watchdog/observers/inotify_buffer.py deleted file mode 100644 index dce2ae1..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/observers/inotify_buffer.py +++ /dev/null @@ -1,81 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright 2014 Thomas Amland -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -from watchdog.utils import BaseThread -from watchdog.utils.delayed_queue import DelayedQueue -from watchdog.observers.inotify_c import Inotify - -logger = logging.getLogger(__name__) - - -class InotifyBuffer(BaseThread): - """A wrapper for `Inotify` that holds events for `delay` seconds. During - this time, IN_MOVED_FROM and IN_MOVED_TO events are paired. - """ - - delay = 0.5 - - def __init__(self, path, recursive=False): - BaseThread.__init__(self) - self._queue = DelayedQueue(self.delay) - self._inotify = Inotify(path, recursive) - self.start() - - def read_event(self): - """Returns a single event or a tuple of from/to events in case of a - paired move event. If this buffer has been closed, immediately return - None. - """ - return self._queue.get() - - def on_thread_stop(self): - self._inotify.close() - self._queue.close() - - def close(self): - self.stop() - self.join() - - def run(self): - """Read event from `inotify` and add them to `queue`. When reading a - IN_MOVE_TO event, remove the previous added matching IN_MOVE_FROM event - and add them back to the queue as a tuple. - """ - deleted_self = False - while self.should_keep_running() and not deleted_self: - inotify_events = self._inotify.read_events() - for inotify_event in inotify_events: - logger.debug("in-event %s", inotify_event) - if inotify_event.is_moved_to: - - def matching_from_event(event): - return (not isinstance(event, tuple) and event.is_moved_from - and event.cookie == inotify_event.cookie) - - from_event = self._queue.remove(matching_from_event) - if from_event is not None: - self._queue.put((from_event, inotify_event)) - else: - logger.debug("could not find matching move_from event") - self._queue.put(inotify_event) - else: - self._queue.put(inotify_event) - - if inotify_event.is_delete_self and \ - inotify_event.src_path == self._inotify.path: - # Deleted the watched directory, stop watching for events - deleted_self = True diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/inotify_c.py b/flask/venv/lib/python3.6/site-packages/watchdog/observers/inotify_c.py deleted file mode 100644 index 0dc7b50..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/observers/inotify_c.py +++ /dev/null @@ -1,575 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import with_statement -import os -import errno -import struct -import threading -import ctypes -import ctypes.util -from functools import reduce -from ctypes import c_int, c_char_p, c_uint32 -from watchdog.utils import has_attribute -from watchdog.utils import UnsupportedLibc - - -def _load_libc(): - libc_path = None - try: - libc_path = ctypes.util.find_library('c') - except (OSError, IOError, RuntimeError): - # Note: find_library will on some platforms raise these undocumented - # errors, e.g.on android IOError "No usable temporary directory found" - # will be raised. - pass - - if libc_path is not None: - return ctypes.CDLL(libc_path) - - # Fallbacks - try: - return ctypes.CDLL('libc.so') - except (OSError, IOError): - pass - - try: - return ctypes.CDLL('libc.so.6') - except (OSError, IOError): - pass - - # uClibc - try: - return ctypes.CDLL('libc.so.0') - except (OSError, IOError) as err: - raise err - - -libc = _load_libc() - -if not has_attribute(libc, 'inotify_init') or \ - not has_attribute(libc, 'inotify_add_watch') or \ - not has_attribute(libc, 'inotify_rm_watch'): - raise UnsupportedLibc("Unsupported libc version found: %s" % libc._name) - -inotify_add_watch = ctypes.CFUNCTYPE(c_int, c_int, c_char_p, c_uint32, use_errno=True)( - ("inotify_add_watch", libc)) - -inotify_rm_watch = ctypes.CFUNCTYPE(c_int, c_int, c_uint32, use_errno=True)( - ("inotify_rm_watch", libc)) - -inotify_init = ctypes.CFUNCTYPE(c_int, use_errno=True)( - ("inotify_init", libc)) - - -class InotifyConstants(object): - # User-space events - IN_ACCESS = 0x00000001 # File was accessed. - IN_MODIFY = 0x00000002 # File was modified. - IN_ATTRIB = 0x00000004 # Meta-data changed. - IN_CLOSE_WRITE = 0x00000008 # Writable file was closed. - IN_CLOSE_NOWRITE = 0x00000010 # Unwritable file closed. - IN_OPEN = 0x00000020 # File was opened. - IN_MOVED_FROM = 0x00000040 # File was moved from X. - IN_MOVED_TO = 0x00000080 # File was moved to Y. - IN_CREATE = 0x00000100 # Subfile was created. - IN_DELETE = 0x00000200 # Subfile was deleted. - IN_DELETE_SELF = 0x00000400 # Self was deleted. - IN_MOVE_SELF = 0x00000800 # Self was moved. - - # Helper user-space events. - IN_CLOSE = IN_CLOSE_WRITE | IN_CLOSE_NOWRITE # Close. - IN_MOVE = IN_MOVED_FROM | IN_MOVED_TO # Moves. - - # Events sent by the kernel to a watch. - IN_UNMOUNT = 0x00002000 # Backing file system was unmounted. - IN_Q_OVERFLOW = 0x00004000 # Event queued overflowed. - IN_IGNORED = 0x00008000 # File was ignored. - - # Special flags. - IN_ONLYDIR = 0x01000000 # Only watch the path if it's a directory. - IN_DONT_FOLLOW = 0x02000000 # Do not follow a symbolic link. - IN_EXCL_UNLINK = 0x04000000 # Exclude events on unlinked objects - IN_MASK_ADD = 0x20000000 # Add to the mask of an existing watch. - IN_ISDIR = 0x40000000 # Event occurred against directory. - IN_ONESHOT = 0x80000000 # Only send event once. - - # All user-space events. - IN_ALL_EVENTS = reduce( - lambda x, y: x | y, [ - IN_ACCESS, - IN_MODIFY, - IN_ATTRIB, - IN_CLOSE_WRITE, - IN_CLOSE_NOWRITE, - IN_OPEN, - IN_MOVED_FROM, - IN_MOVED_TO, - IN_DELETE, - IN_CREATE, - IN_DELETE_SELF, - IN_MOVE_SELF, - ]) - - # Flags for ``inotify_init1`` - IN_CLOEXEC = 0x02000000 - IN_NONBLOCK = 0x00004000 - - -# Watchdog's API cares only about these events. -WATCHDOG_ALL_EVENTS = reduce( - lambda x, y: x | y, [ - InotifyConstants.IN_MODIFY, - InotifyConstants.IN_ATTRIB, - InotifyConstants.IN_MOVED_FROM, - InotifyConstants.IN_MOVED_TO, - InotifyConstants.IN_CREATE, - InotifyConstants.IN_DELETE, - InotifyConstants.IN_DELETE_SELF, - InotifyConstants.IN_DONT_FOLLOW, - ]) - - -class inotify_event_struct(ctypes.Structure): - """ - Structure representation of the inotify_event structure - (used in buffer size calculations):: - - struct inotify_event { - __s32 wd; /* watch descriptor */ - __u32 mask; /* watch mask */ - __u32 cookie; /* cookie to synchronize two events */ - __u32 len; /* length (including nulls) of name */ - char name[0]; /* stub for possible name */ - }; - """ - _fields_ = [('wd', c_int), - ('mask', c_uint32), - ('cookie', c_uint32), - ('len', c_uint32), - ('name', c_char_p)] - - -EVENT_SIZE = ctypes.sizeof(inotify_event_struct) -DEFAULT_NUM_EVENTS = 2048 -DEFAULT_EVENT_BUFFER_SIZE = DEFAULT_NUM_EVENTS * (EVENT_SIZE + 16) - - -class Inotify(object): - """ - Linux inotify(7) API wrapper class. - - :param path: - The directory path for which we want an inotify object. - :type path: - :class:`bytes` - :param recursive: - ``True`` if subdirectories should be monitored; ``False`` otherwise. - """ - - def __init__(self, path, recursive=False, event_mask=WATCHDOG_ALL_EVENTS): - # The file descriptor associated with the inotify instance. - inotify_fd = inotify_init() - if inotify_fd == -1: - Inotify._raise_error() - self._inotify_fd = inotify_fd - self._lock = threading.Lock() - - # Stores the watch descriptor for a given path. - self._wd_for_path = dict() - self._path_for_wd = dict() - - self._path = path - self._event_mask = event_mask - self._is_recursive = recursive - self._add_dir_watch(path, recursive, event_mask) - self._moved_from_events = dict() - - @property - def event_mask(self): - """The event mask for this inotify instance.""" - return self._event_mask - - @property - def path(self): - """The path associated with the inotify instance.""" - return self._path - - @property - def is_recursive(self): - """Whether we are watching directories recursively.""" - return self._is_recursive - - @property - def fd(self): - """The file descriptor associated with the inotify instance.""" - return self._inotify_fd - - def clear_move_records(self): - """Clear cached records of MOVED_FROM events""" - self._moved_from_events = dict() - - def source_for_move(self, destination_event): - """ - The source path corresponding to the given MOVED_TO event. - - If the source path is outside the monitored directories, None - is returned instead. - """ - if destination_event.cookie in self._moved_from_events: - return self._moved_from_events[destination_event.cookie].src_path - else: - return None - - def remember_move_from_event(self, event): - """ - Save this event as the source event for future MOVED_TO events to - reference. - """ - self._moved_from_events[event.cookie] = event - - def add_watch(self, path): - """ - Adds a watch for the given path. - - :param path: - Path to begin monitoring. - """ - with self._lock: - self._add_watch(path, self._event_mask) - - def remove_watch(self, path): - """ - Removes a watch for the given path. - - :param path: - Path string for which the watch will be removed. - """ - with self._lock: - wd = self._wd_for_path.pop(path) - del self._path_for_wd[wd] - if inotify_rm_watch(self._inotify_fd, wd) == -1: - Inotify._raise_error() - - def close(self): - """ - Closes the inotify instance and removes all associated watches. - """ - with self._lock: - if self._path in self._wd_for_path: - wd = self._wd_for_path[self._path] - inotify_rm_watch(self._inotify_fd, wd) - os.close(self._inotify_fd) - - def read_events(self, event_buffer_size=DEFAULT_EVENT_BUFFER_SIZE): - """ - Reads events from inotify and yields them. - """ - # HACK: We need to traverse the directory path - # recursively and simulate events for newly - # created subdirectories/files. This will handle - # mkdir -p foobar/blah/bar; touch foobar/afile - - def _recursive_simulate(src_path): - events = [] - for root, dirnames, filenames in os.walk(src_path): - for dirname in dirnames: - try: - full_path = os.path.join(root, dirname) - wd_dir = self._add_watch(full_path, self._event_mask) - e = InotifyEvent( - wd_dir, InotifyConstants.IN_CREATE | InotifyConstants.IN_ISDIR, 0, dirname, full_path) - events.append(e) - except OSError: - pass - for filename in filenames: - full_path = os.path.join(root, filename) - wd_parent_dir = self._wd_for_path[os.path.dirname(full_path)] - e = InotifyEvent( - wd_parent_dir, InotifyConstants.IN_CREATE, 0, filename, full_path) - events.append(e) - return events - - event_buffer = None - while True: - try: - event_buffer = os.read(self._inotify_fd, event_buffer_size) - except OSError as e: - if e.errno == errno.EINTR: - continue - break - - with self._lock: - event_list = [] - for wd, mask, cookie, name in Inotify._parse_event_buffer(event_buffer): - if wd == -1: - continue - wd_path = self._path_for_wd[wd] - src_path = os.path.join(wd_path, name) if name else wd_path #avoid trailing slash - inotify_event = InotifyEvent(wd, mask, cookie, name, src_path) - - if inotify_event.is_moved_from: - self.remember_move_from_event(inotify_event) - elif inotify_event.is_moved_to: - move_src_path = self.source_for_move(inotify_event) - if move_src_path in self._wd_for_path: - moved_wd = self._wd_for_path[move_src_path] - del self._wd_for_path[move_src_path] - self._wd_for_path[inotify_event.src_path] = moved_wd - self._path_for_wd[moved_wd] = inotify_event.src_path - src_path = os.path.join(wd_path, name) - inotify_event = InotifyEvent(wd, mask, cookie, name, src_path) - - if inotify_event.is_ignored: - # Clean up book-keeping for deleted watches. - path = self._path_for_wd.pop(wd) - if self._wd_for_path[path] == wd: - del self._wd_for_path[path] - continue - - event_list.append(inotify_event) - - if (self.is_recursive and inotify_event.is_directory and - inotify_event.is_create): - - # TODO: When a directory from another part of the - # filesystem is moved into a watched directory, this - # will not generate events for the directory tree. - # We need to coalesce IN_MOVED_TO events and those - # IN_MOVED_TO events which don't pair up with - # IN_MOVED_FROM events should be marked IN_CREATE - # instead relative to this directory. - try: - self._add_watch(src_path, self._event_mask) - except OSError: - continue - - event_list.extend(_recursive_simulate(src_path)) - - return event_list - - # Non-synchronized methods. - def _add_dir_watch(self, path, recursive, mask): - """ - Adds a watch (optionally recursively) for the given directory path - to monitor events specified by the mask. - - :param path: - Path to monitor - :param recursive: - ``True`` to monitor recursively. - :param mask: - Event bit mask. - """ - if not os.path.isdir(path): - raise OSError('Path is not a directory') - self._add_watch(path, mask) - if recursive: - for root, dirnames, _ in os.walk(path): - for dirname in dirnames: - full_path = os.path.join(root, dirname) - if os.path.islink(full_path): - continue - self._add_watch(full_path, mask) - - def _add_watch(self, path, mask): - """ - Adds a watch for the given path to monitor events specified by the - mask. - - :param path: - Path to monitor - :param mask: - Event bit mask. - """ - wd = inotify_add_watch(self._inotify_fd, path, mask) - if wd == -1: - Inotify._raise_error() - self._wd_for_path[path] = wd - self._path_for_wd[wd] = path - return wd - - @staticmethod - def _raise_error(): - """ - Raises errors for inotify failures. - """ - err = ctypes.get_errno() - if err == errno.ENOSPC: - raise OSError("inotify watch limit reached") - elif err == errno.EMFILE: - raise OSError("inotify instance limit reached") - else: - raise OSError(os.strerror(err)) - - @staticmethod - def _parse_event_buffer(event_buffer): - """ - Parses an event buffer of ``inotify_event`` structs returned by - inotify:: - - struct inotify_event { - __s32 wd; /* watch descriptor */ - __u32 mask; /* watch mask */ - __u32 cookie; /* cookie to synchronize two events */ - __u32 len; /* length (including nulls) of name */ - char name[0]; /* stub for possible name */ - }; - - The ``cookie`` member of this struct is used to pair two related - events, for example, it pairs an IN_MOVED_FROM event with an - IN_MOVED_TO event. - """ - i = 0 - while i + 16 <= len(event_buffer): - wd, mask, cookie, length = struct.unpack_from('iIII', event_buffer, i) - name = event_buffer[i + 16:i + 16 + length].rstrip(b'\0') - i += 16 + length - yield wd, mask, cookie, name - - -class InotifyEvent(object): - """ - Inotify event struct wrapper. - - :param wd: - Watch descriptor - :param mask: - Event mask - :param cookie: - Event cookie - :param name: - Event name. - :param src_path: - Event source path - """ - - def __init__(self, wd, mask, cookie, name, src_path): - self._wd = wd - self._mask = mask - self._cookie = cookie - self._name = name - self._src_path = src_path - - @property - def src_path(self): - return self._src_path - - @property - def wd(self): - return self._wd - - @property - def mask(self): - return self._mask - - @property - def cookie(self): - return self._cookie - - @property - def name(self): - return self._name - - @property - def is_modify(self): - return self._mask & InotifyConstants.IN_MODIFY > 0 - - @property - def is_close_write(self): - return self._mask & InotifyConstants.IN_CLOSE_WRITE > 0 - - @property - def is_close_nowrite(self): - return self._mask & InotifyConstants.IN_CLOSE_NOWRITE > 0 - - @property - def is_access(self): - return self._mask & InotifyConstants.IN_ACCESS > 0 - - @property - def is_delete(self): - return self._mask & InotifyConstants.IN_DELETE > 0 - - @property - def is_delete_self(self): - return self._mask & InotifyConstants.IN_DELETE_SELF > 0 - - @property - def is_create(self): - return self._mask & InotifyConstants.IN_CREATE > 0 - - @property - def is_moved_from(self): - return self._mask & InotifyConstants.IN_MOVED_FROM > 0 - - @property - def is_moved_to(self): - return self._mask & InotifyConstants.IN_MOVED_TO > 0 - - @property - def is_move(self): - return self._mask & InotifyConstants.IN_MOVE > 0 - - @property - def is_move_self(self): - return self._mask & InotifyConstants.IN_MOVE_SELF > 0 - - @property - def is_attrib(self): - return self._mask & InotifyConstants.IN_ATTRIB > 0 - - @property - def is_ignored(self): - return self._mask & InotifyConstants.IN_IGNORED > 0 - - @property - def is_directory(self): - # It looks like the kernel does not provide this information for - # IN_DELETE_SELF and IN_MOVE_SELF. In this case, assume it's a dir. - # See also: https://github.com/seb-m/pyinotify/blob/2c7e8f8/python2/pyinotify.py#L897 - return (self.is_delete_self or self.is_move_self or - self._mask & InotifyConstants.IN_ISDIR > 0) - - @property - def key(self): - return self._src_path, self._wd, self._mask, self._cookie, self._name - - def __eq__(self, inotify_event): - return self.key == inotify_event.key - - def __ne__(self, inotify_event): - return self.key == inotify_event.key - - def __hash__(self): - return hash(self.key) - - @staticmethod - def _get_mask_string(mask): - masks = [] - for c in dir(InotifyConstants): - if c.startswith('IN_') and c not in ['IN_ALL_EVENTS', 'IN_CLOSE', 'IN_MOVE']: - c_val = getattr(InotifyConstants, c) - if mask & c_val: - masks.append(c) - mask_string = '|'.join(masks) - return mask_string - - def __repr__(self): - mask_string = self._get_mask_string(self.mask) - s = "" - return s % (self.src_path, self.wd, mask_string, self.cookie, self.name) diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/kqueue.py b/flask/venv/lib/python3.6/site-packages/watchdog/observers/kqueue.py deleted file mode 100644 index 9ace923..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/observers/kqueue.py +++ /dev/null @@ -1,726 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -:module: watchdog.observers.kqueue -:synopsis: ``kqueue(2)`` based emitter implementation. -:author: yesudeep@google.com (Yesudeep Mangalapilly) -:platforms: Mac OS X and BSD with kqueue(2). - -.. WARNING:: kqueue is a very heavyweight way to monitor file systems. - Each kqueue-detected directory modification triggers - a full directory scan. Traversing the entire directory tree - and opening file descriptors for all files will create - performance problems. We need to find a way to re-scan - only those directories which report changes and do a diff - between two sub-DirectorySnapshots perhaps. - -.. ADMONITION:: About ``select.kqueue`` and Python versions - - * Python 2.5 does not ship with ``select.kqueue`` - * Python 2.6 ships with a broken ``select.kqueue`` that cannot take - multiple events in the event list passed to ``kqueue.control``. - * Python 2.7 ships with a working ``select.kqueue`` - implementation. - - I have backported the Python 2.7 implementation to Python 2.5 and 2.6 - in the ``select_backport`` package available on PyPI. - -.. ADMONITION:: About OS X performance guidelines - - Quote from the `Mac OS X File System Performance Guidelines`_: - - "When you only want to track changes on a file or directory, be sure to - open it using the ``O_EVTONLY`` flag. This flag prevents the file or - directory from being marked as open or in use. This is important - if you are tracking files on a removable volume and the user tries to - unmount the volume. With this flag in place, the system knows it can - dismiss the volume. If you had opened the files or directories without - this flag, the volume would be marked as busy and would not be - unmounted." - - ``O_EVTONLY`` is defined as ``0x8000`` in the OS X header files. - More information here: http://www.mlsite.net/blog/?p=2312 - -Classes -------- -.. autoclass:: KqueueEmitter - :members: - :show-inheritance: - -Collections and Utility Classes -------------------------------- -.. autoclass:: KeventDescriptor - :members: - :show-inheritance: - -.. autoclass:: KeventDescriptorSet - :members: - :show-inheritance: - -.. _Mac OS X File System Performance Guidelines: http://developer.apple.com/library/ios/#documentation/Performance/Conceptual/FileSystem/Articles/TrackingChanges.html#//apple_ref/doc/uid/20001993-CJBJFIDD - -""" - -from __future__ import with_statement -from watchdog.utils import platform - -import threading -import errno -import sys -import stat -import os - -# See the notes for this module in the documentation above ^. -#import select -# if not has_attribute(select, 'kqueue') or sys.version_info < (2, 7, 0): -if sys.version_info < (2, 7, 0): - import select_backport as select -else: - import select - -from pathtools.path import absolute_path - -from watchdog.observers.api import ( - BaseObserver, - EventEmitter, - DEFAULT_OBSERVER_TIMEOUT, - DEFAULT_EMITTER_TIMEOUT -) - -from watchdog.utils.dirsnapshot import DirectorySnapshot - -from watchdog.events import ( - DirMovedEvent, - DirDeletedEvent, - DirCreatedEvent, - DirModifiedEvent, - FileMovedEvent, - FileDeletedEvent, - FileCreatedEvent, - FileModifiedEvent, - EVENT_TYPE_MOVED, - EVENT_TYPE_DELETED, - EVENT_TYPE_CREATED -) - -# Maximum number of events to process. -MAX_EVENTS = 4096 - -# O_EVTONLY value from the header files for OS X only. -O_EVTONLY = 0x8000 - -# Pre-calculated values for the kevent filter, flags, and fflags attributes. -if platform.is_darwin(): - WATCHDOG_OS_OPEN_FLAGS = O_EVTONLY -else: - WATCHDOG_OS_OPEN_FLAGS = os.O_RDONLY | os.O_NONBLOCK -WATCHDOG_KQ_FILTER = select.KQ_FILTER_VNODE -WATCHDOG_KQ_EV_FLAGS = select.KQ_EV_ADD | select.KQ_EV_ENABLE | select.KQ_EV_CLEAR -WATCHDOG_KQ_FFLAGS = ( - select.KQ_NOTE_DELETE | - select.KQ_NOTE_WRITE | - select.KQ_NOTE_EXTEND | - select.KQ_NOTE_ATTRIB | - select.KQ_NOTE_LINK | - select.KQ_NOTE_RENAME | - select.KQ_NOTE_REVOKE -) - -# Flag tests. - - -def is_deleted(kev): - """Determines whether the given kevent represents deletion.""" - return kev.fflags & select.KQ_NOTE_DELETE - - -def is_modified(kev): - """Determines whether the given kevent represents modification.""" - fflags = kev.fflags - return (fflags & select.KQ_NOTE_EXTEND) or (fflags & select.KQ_NOTE_WRITE) - - -def is_attrib_modified(kev): - """Determines whether the given kevent represents attribute modification.""" - return kev.fflags & select.KQ_NOTE_ATTRIB - - -def is_renamed(kev): - """Determines whether the given kevent represents movement.""" - return kev.fflags & select.KQ_NOTE_RENAME - - -class KeventDescriptorSet(object): - - """ - Thread-safe kevent descriptor collection. - """ - - def __init__(self): - # Set of KeventDescriptor - self._descriptors = set() - - # Descriptor for a given path. - self._descriptor_for_path = dict() - - # Descriptor for a given fd. - self._descriptor_for_fd = dict() - - # List of kevent objects. - self._kevents = list() - - self._lock = threading.Lock() - - @property - def kevents(self): - """ - List of kevents monitored. - """ - with self._lock: - return self._kevents - - @property - def paths(self): - """ - List of paths for which kevents have been created. - """ - with self._lock: - return list(self._descriptor_for_path.keys()) - - def get_for_fd(self, fd): - """ - Given a file descriptor, returns the kevent descriptor object - for it. - - :param fd: - OS file descriptor. - :type fd: - ``int`` - :returns: - A :class:`KeventDescriptor` object. - """ - with self._lock: - return self._descriptor_for_fd[fd] - - def get(self, path): - """ - Obtains a :class:`KeventDescriptor` object for the specified path. - - :param path: - Path for which the descriptor will be obtained. - """ - with self._lock: - path = absolute_path(path) - return self._get(path) - - def __contains__(self, path): - """ - Determines whether a :class:`KeventDescriptor has been registered - for the specified path. - - :param path: - Path for which the descriptor will be obtained. - """ - with self._lock: - path = absolute_path(path) - return self._has_path(path) - - def add(self, path, is_directory): - """ - Adds a :class:`KeventDescriptor` to the collection for the given - path. - - :param path: - The path for which a :class:`KeventDescriptor` object will be - added. - :param is_directory: - ``True`` if the path refers to a directory; ``False`` otherwise. - :type is_directory: - ``bool`` - """ - with self._lock: - path = absolute_path(path) - if not self._has_path(path): - self._add_descriptor(KeventDescriptor(path, is_directory)) - - def remove(self, path): - """ - Removes the :class:`KeventDescriptor` object for the given path - if it already exists. - - :param path: - Path for which the :class:`KeventDescriptor` object will be - removed. - """ - with self._lock: - path = absolute_path(path) - if self._has_path(path): - self._remove_descriptor(self._get(path)) - - def clear(self): - """ - Clears the collection and closes all open descriptors. - """ - with self._lock: - for descriptor in self._descriptors: - descriptor.close() - self._descriptors.clear() - self._descriptor_for_fd.clear() - self._descriptor_for_path.clear() - self._kevents = [] - - # Thread-unsafe methods. Locking is provided at a higher level. - def _get(self, path): - """Returns a kevent descriptor for a given path.""" - return self._descriptor_for_path[path] - - def _has_path(self, path): - """Determines whether a :class:`KeventDescriptor` for the specified - path exists already in the collection.""" - return path in self._descriptor_for_path - - def _add_descriptor(self, descriptor): - """ - Adds a descriptor to the collection. - - :param descriptor: - An instance of :class:`KeventDescriptor` to be added. - """ - self._descriptors.add(descriptor) - self._kevents.append(descriptor.kevent) - self._descriptor_for_path[descriptor.path] = descriptor - self._descriptor_for_fd[descriptor.fd] = descriptor - - def _remove_descriptor(self, descriptor): - """ - Removes a descriptor from the collection. - - :param descriptor: - An instance of :class:`KeventDescriptor` to be removed. - """ - self._descriptors.remove(descriptor) - del self._descriptor_for_fd[descriptor.fd] - del self._descriptor_for_path[descriptor.path] - self._kevents.remove(descriptor.kevent) - descriptor.close() - - -class KeventDescriptor(object): - - """ - A kevent descriptor convenience data structure to keep together: - - * kevent - * directory status - * path - * file descriptor - - :param path: - Path string for which a kevent descriptor will be created. - :param is_directory: - ``True`` if the path refers to a directory; ``False`` otherwise. - :type is_directory: - ``bool`` - """ - - def __init__(self, path, is_directory): - self._path = absolute_path(path) - self._is_directory = is_directory - self._fd = os.open(path, WATCHDOG_OS_OPEN_FLAGS) - self._kev = select.kevent(self._fd, - filter=WATCHDOG_KQ_FILTER, - flags=WATCHDOG_KQ_EV_FLAGS, - fflags=WATCHDOG_KQ_FFLAGS) - - @property - def fd(self): - """OS file descriptor for the kevent descriptor.""" - return self._fd - - @property - def path(self): - """The path associated with the kevent descriptor.""" - return self._path - - @property - def kevent(self): - """The kevent object associated with the kevent descriptor.""" - return self._kev - - @property - def is_directory(self): - """Determines whether the kevent descriptor refers to a directory. - - :returns: - ``True`` or ``False`` - """ - return self._is_directory - - def close(self): - """ - Closes the file descriptor associated with a kevent descriptor. - """ - try: - os.close(self.fd) - except OSError: - pass - - @property - def key(self): - return (self.path, self.is_directory) - - def __eq__(self, descriptor): - return self.key == descriptor.key - - def __ne__(self, descriptor): - return self.key != descriptor.key - - def __hash__(self): - return hash(self.key) - - def __repr__(self): - return ""\ - % (self.path, self.is_directory) - - -class KqueueEmitter(EventEmitter): - - """ - kqueue(2)-based event emitter. - - .. ADMONITION:: About ``kqueue(2)`` behavior and this implementation - - ``kqueue(2)`` monitors file system events only for - open descriptors, which means, this emitter does a lot of - book-keeping behind the scenes to keep track of open - descriptors for every entry in the monitored directory tree. - - This also means the number of maximum open file descriptors - on your system must be increased **manually**. - Usually, issuing a call to ``ulimit`` should suffice:: - - ulimit -n 1024 - - Ensure that you pick a number that is larger than the - number of files you expect to be monitored. - - ``kqueue(2)`` does not provide enough information about the - following things: - - * The destination path of a file or directory that is renamed. - * Creation of a file or directory within a directory; in this - case, ``kqueue(2)`` only indicates a modified event on the - parent directory. - - Therefore, this emitter takes a snapshot of the directory - tree when ``kqueue(2)`` detects a change on the file system - to be able to determine the above information. - - :param event_queue: - The event queue to fill with events. - :param watch: - A watch object representing the directory to monitor. - :type watch: - :class:`watchdog.observers.api.ObservedWatch` - :param timeout: - Read events blocking timeout (in seconds). - :type timeout: - ``float`` - """ - - def __init__(self, event_queue, watch, timeout=DEFAULT_EMITTER_TIMEOUT): - EventEmitter.__init__(self, event_queue, watch, timeout) - - self._kq = select.kqueue() - self._lock = threading.RLock() - - # A collection of KeventDescriptor. - self._descriptors = KeventDescriptorSet() - - def walker_callback(path, stat_info, self=self): - self._register_kevent(path, stat.S_ISDIR(stat_info.st_mode)) - - self._snapshot = DirectorySnapshot(watch.path, - watch.is_recursive, - walker_callback) - - def _register_kevent(self, path, is_directory): - """ - Registers a kevent descriptor for the given path. - - :param path: - Path for which a kevent descriptor will be created. - :param is_directory: - ``True`` if the path refers to a directory; ``False`` otherwise. - :type is_directory: - ``bool`` - """ - try: - self._descriptors.add(path, is_directory) - except OSError as e: - if e.errno == errno.ENOENT: - # Probably dealing with a temporary file that was created - # and then quickly deleted before we could open - # a descriptor for it. Therefore, simply queue a sequence - # of created and deleted events for the path. - #path = absolute_path(path) - # if is_directory: - # self.queue_event(DirCreatedEvent(path)) - # self.queue_event(DirDeletedEvent(path)) - # else: - # self.queue_event(FileCreatedEvent(path)) - # self.queue_event(FileDeletedEvent(path)) - - # TODO: We could simply ignore these files. - # Locked files cause the python process to die with - # a bus error when we handle temporary files. - # eg. .git/index.lock when running tig operations. - # I don't fully understand this at the moment. - pass - else: - # All other errors are propagated. - raise - - def _unregister_kevent(self, path): - """ - Convenience function to close the kevent descriptor for a - specified kqueue-monitored path. - - :param path: - Path for which the kevent descriptor will be closed. - """ - self._descriptors.remove(path) - - def queue_event(self, event): - """ - Handles queueing a single event object. - - :param event: - An instance of :class:`watchdog.events.FileSystemEvent` - or a subclass. - """ - # Handles all the book keeping for queued events. - # We do not need to fire moved/deleted events for all subitems in - # a directory tree here, because this function is called by kqueue - # for all those events anyway. - EventEmitter.queue_event(self, event) - if event.event_type == EVENT_TYPE_CREATED: - self._register_kevent(event.src_path, event.is_directory) - elif event.event_type == EVENT_TYPE_MOVED: - self._unregister_kevent(event.src_path) - self._register_kevent(event.dest_path, event.is_directory) - elif event.event_type == EVENT_TYPE_DELETED: - self._unregister_kevent(event.src_path) - - def _queue_dirs_modified(self, - dirs_modified, - ref_snapshot, - new_snapshot): - """ - Queues events for directory modifications by scanning the directory - for changes. - - A scan is a comparison between two snapshots of the same directory - taken at two different times. This also determines whether files - or directories were created, which updated the modified timestamp - for the directory. - """ - if dirs_modified: - for dir_modified in dirs_modified: - self.queue_event(DirModifiedEvent(dir_modified)) - diff_events = new_snapshot - ref_snapshot - for file_created in diff_events.files_created: - self.queue_event(FileCreatedEvent(file_created)) - for directory_created in diff_events.dirs_created: - self.queue_event(DirCreatedEvent(directory_created)) - - def _queue_events_except_renames_and_dir_modifications(self, event_list): - """ - Queues events from the kevent list returned from the call to - :meth:`select.kqueue.control`. - - .. NOTE:: Queues only the deletions, file modifications, - attribute modifications. The other events, namely, - file creation, directory modification, file rename, - directory rename, directory creation, etc. are - determined by comparing directory snapshots. - """ - files_renamed = set() - dirs_renamed = set() - dirs_modified = set() - - for kev in event_list: - descriptor = self._descriptors.get_for_fd(kev.ident) - src_path = descriptor.path - - if is_deleted(kev): - if descriptor.is_directory: - self.queue_event(DirDeletedEvent(src_path)) - else: - self.queue_event(FileDeletedEvent(src_path)) - elif is_attrib_modified(kev): - if descriptor.is_directory: - self.queue_event(DirModifiedEvent(src_path)) - else: - self.queue_event(FileModifiedEvent(src_path)) - elif is_modified(kev): - if descriptor.is_directory: - # When a directory is modified, it may be due to - # sub-file/directory renames or new file/directory - # creation. We determine all this by comparing - # snapshots later. - dirs_modified.add(src_path) - else: - self.queue_event(FileModifiedEvent(src_path)) - elif is_renamed(kev): - # Kqueue does not specify the destination names for renames - # to, so we have to process these after taking a snapshot - # of the directory. - if descriptor.is_directory: - dirs_renamed.add(src_path) - else: - files_renamed.add(src_path) - return files_renamed, dirs_renamed, dirs_modified - - def _queue_renamed(self, - src_path, - is_directory, - ref_snapshot, - new_snapshot): - """ - Compares information from two directory snapshots (one taken before - the rename operation and another taken right after) to determine the - destination path of the file system object renamed, and adds - appropriate events to the event queue. - """ - try: - ref_stat_info = ref_snapshot.stat_info(src_path) - except KeyError: - # Probably caught a temporary file/directory that was renamed - # and deleted. Fires a sequence of created and deleted events - # for the path. - if is_directory: - self.queue_event(DirCreatedEvent(src_path)) - self.queue_event(DirDeletedEvent(src_path)) - else: - self.queue_event(FileCreatedEvent(src_path)) - self.queue_event(FileDeletedEvent(src_path)) - # We don't process any further and bail out assuming - # the event represents deletion/creation instead of movement. - return - - try: - dest_path = absolute_path( - new_snapshot.path_for_inode(ref_stat_info.st_ino)) - if is_directory: - event = DirMovedEvent(src_path, dest_path) - # TODO: Do we need to fire moved events for the items - # inside the directory tree? Does kqueue does this - # all by itself? Check this and then enable this code - # only if it doesn't already. - # A: It doesn't. So I've enabled this block. - if self.watch.is_recursive: - for sub_event in event.sub_moved_events(): - self.queue_event(sub_event) - self.queue_event(event) - else: - self.queue_event(FileMovedEvent(src_path, dest_path)) - except KeyError: - # If the new snapshot does not have an inode for the - # old path, we haven't found the new name. Therefore, - # we mark it as deleted and remove unregister the path. - if is_directory: - self.queue_event(DirDeletedEvent(src_path)) - else: - self.queue_event(FileDeletedEvent(src_path)) - - def _read_events(self, timeout=None): - """ - Reads events from a call to the blocking - :meth:`select.kqueue.control()` method. - - :param timeout: - Blocking timeout for reading events. - :type timeout: - ``float`` (seconds) - """ - return self._kq.control(self._descriptors.kevents, - MAX_EVENTS, - timeout) - - def queue_events(self, timeout): - """ - Queues events by reading them from a call to the blocking - :meth:`select.kqueue.control()` method. - - :param timeout: - Blocking timeout for reading events. - :type timeout: - ``float`` (seconds) - """ - with self._lock: - try: - event_list = self._read_events(timeout) - files_renamed, dirs_renamed, dirs_modified = ( - self._queue_events_except_renames_and_dir_modifications(event_list)) - - # Take a fresh snapshot of the directory and update the - # saved snapshot. - new_snapshot = DirectorySnapshot(self.watch.path, - self.watch.is_recursive) - ref_snapshot = self._snapshot - self._snapshot = new_snapshot - - if files_renamed or dirs_renamed or dirs_modified: - for src_path in files_renamed: - self._queue_renamed(src_path, - False, - ref_snapshot, - new_snapshot) - for src_path in dirs_renamed: - self._queue_renamed(src_path, - True, - ref_snapshot, - new_snapshot) - self._queue_dirs_modified(dirs_modified, - ref_snapshot, - new_snapshot) - except OSError as e: - if e.errno == errno.EBADF: - # logging.debug(e) - pass - else: - raise - - def on_thread_stop(self): - # Clean up. - with self._lock: - self._descriptors.clear() - self._kq.close() - - -class KqueueObserver(BaseObserver): - - """ - Observer thread that schedules watching directories and dispatches - calls to event handlers. - """ - - def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT): - BaseObserver.__init__(self, emitter_class=KqueueEmitter, timeout=timeout) diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/polling.py b/flask/venv/lib/python3.6/site-packages/watchdog/observers/polling.py deleted file mode 100644 index 4ad502c..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/observers/polling.py +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -""" -:module: watchdog.observers.polling -:synopsis: Polling emitter implementation. -:author: yesudeep@google.com (Yesudeep Mangalapilly) - -Classes -------- -.. autoclass:: PollingObserver - :members: - :show-inheritance: - -.. autoclass:: PollingObserverVFS - :members: - :show-inheritance: - :special-members: -""" - -from __future__ import with_statement -import os -import threading -from functools import partial -from watchdog.utils import stat as default_stat -from watchdog.utils.dirsnapshot import DirectorySnapshot, DirectorySnapshotDiff -from watchdog.observers.api import ( - EventEmitter, - BaseObserver, - DEFAULT_OBSERVER_TIMEOUT, - DEFAULT_EMITTER_TIMEOUT -) - -from watchdog.events import ( - DirMovedEvent, - DirDeletedEvent, - DirCreatedEvent, - DirModifiedEvent, - FileMovedEvent, - FileDeletedEvent, - FileCreatedEvent, - FileModifiedEvent -) - - -class PollingEmitter(EventEmitter): - """ - Platform-independent emitter that polls a directory to detect file - system changes. - """ - - def __init__(self, event_queue, watch, timeout=DEFAULT_EMITTER_TIMEOUT, - stat=default_stat, listdir=os.listdir): - EventEmitter.__init__(self, event_queue, watch, timeout) - self._snapshot = None - self._lock = threading.Lock() - self._take_snapshot = lambda: DirectorySnapshot( - self.watch.path, self.watch.is_recursive, stat=stat, listdir=listdir) - - def on_thread_start(self): - self._snapshot = self._take_snapshot() - - def queue_events(self, timeout): - # We don't want to hit the disk continuously. - # timeout behaves like an interval for polling emitters. - if self.stopped_event.wait(timeout): - return - - with self._lock: - if not self.should_keep_running(): - return - - # Get event diff between fresh snapshot and previous snapshot. - # Update snapshot. - try: - new_snapshot = self._take_snapshot() - except OSError: - self.queue_event(DirDeletedEvent(self.watch.path)) - self.stop() - return - - events = DirectorySnapshotDiff(self._snapshot, new_snapshot) - self._snapshot = new_snapshot - - # Files. - for src_path in events.files_deleted: - self.queue_event(FileDeletedEvent(src_path)) - for src_path in events.files_modified: - self.queue_event(FileModifiedEvent(src_path)) - for src_path in events.files_created: - self.queue_event(FileCreatedEvent(src_path)) - for src_path, dest_path in events.files_moved: - self.queue_event(FileMovedEvent(src_path, dest_path)) - - # Directories. - for src_path in events.dirs_deleted: - self.queue_event(DirDeletedEvent(src_path)) - for src_path in events.dirs_modified: - self.queue_event(DirModifiedEvent(src_path)) - for src_path in events.dirs_created: - self.queue_event(DirCreatedEvent(src_path)) - for src_path, dest_path in events.dirs_moved: - self.queue_event(DirMovedEvent(src_path, dest_path)) - - -class PollingObserver(BaseObserver): - """ - Platform-independent observer that polls a directory to detect file - system changes. - """ - - def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT): - BaseObserver.__init__(self, emitter_class=PollingEmitter, timeout=timeout) - - -class PollingObserverVFS(BaseObserver): - """ - File system independent observer that polls a directory to detect changes. - """ - - def __init__(self, stat, listdir, polling_interval=1): - """ - :param stat: stat function. See ``os.stat`` for details. - :param listdir: listdir function. See ``os.listdir`` for details. - :type polling_interval: float - :param polling_interval: interval in seconds between polling the file system. - """ - emitter_cls = partial(PollingEmitter, stat=stat, listdir=listdir) - BaseObserver.__init__(self, emitter_class=emitter_cls, timeout=polling_interval) diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/read_directory_changes.py b/flask/venv/lib/python3.6/site-packages/watchdog/observers/read_directory_changes.py deleted file mode 100644 index bf2044e..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/observers/read_directory_changes.py +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# Copyright 2014 Thomas Amland -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import with_statement - -import threading -import os.path -import time - -from watchdog.events import ( - DirCreatedEvent, - DirMovedEvent, - DirModifiedEvent, - FileCreatedEvent, - FileDeletedEvent, - FileMovedEvent, - FileModifiedEvent, - generate_sub_moved_events, - generate_sub_created_events, -) - -from watchdog.observers.api import ( - EventEmitter, - BaseObserver, - DEFAULT_OBSERVER_TIMEOUT, - DEFAULT_EMITTER_TIMEOUT -) - -from watchdog.observers.winapi import ( - read_events, - get_directory_handle, - close_directory_handle, -) - - -# HACK: -WATCHDOG_TRAVERSE_MOVED_DIR_DELAY = 1 # seconds - - -class WindowsApiEmitter(EventEmitter): - """ - Windows API-based emitter that uses ReadDirectoryChangesW - to detect file system changes for a watch. - """ - - def __init__(self, event_queue, watch, timeout=DEFAULT_EMITTER_TIMEOUT): - EventEmitter.__init__(self, event_queue, watch, timeout) - self._lock = threading.Lock() - self._handle = None - - def on_thread_start(self): - self._handle = get_directory_handle(self.watch.path) - - def on_thread_stop(self): - if self._handle: - close_directory_handle(self._handle) - - def queue_events(self, timeout): - winapi_events = read_events(self._handle, self.watch.is_recursive) - with self._lock: - last_renamed_src_path = "" - for winapi_event in winapi_events: - src_path = os.path.join(self.watch.path, winapi_event.src_path) - - if winapi_event.is_renamed_old: - last_renamed_src_path = src_path - elif winapi_event.is_renamed_new: - dest_path = src_path - src_path = last_renamed_src_path - if os.path.isdir(dest_path): - event = DirMovedEvent(src_path, dest_path) - if self.watch.is_recursive: - # HACK: We introduce a forced delay before - # traversing the moved directory. This will read - # only file movement that finishes within this - # delay time. - time.sleep(WATCHDOG_TRAVERSE_MOVED_DIR_DELAY) - # The following block of code may not - # obtain moved events for the entire tree if - # the I/O is not completed within the above - # delay time. So, it's not guaranteed to work. - # TODO: Come up with a better solution, possibly - # a way to wait for I/O to complete before - # queuing events. - for sub_moved_event in generate_sub_moved_events(src_path, dest_path): - self.queue_event(sub_moved_event) - self.queue_event(event) - else: - self.queue_event(FileMovedEvent(src_path, dest_path)) - elif winapi_event.is_modified: - cls = DirModifiedEvent if os.path.isdir(src_path) else FileModifiedEvent - self.queue_event(cls(src_path)) - elif winapi_event.is_added: - isdir = os.path.isdir(src_path) - cls = DirCreatedEvent if isdir else FileCreatedEvent - self.queue_event(cls(src_path)) - if isdir: - # If a directory is moved from outside the watched folder to inside it - # we only get a created directory event out of it, not any events for its children - # so use the same hack as for file moves to get the child events - time.sleep(WATCHDOG_TRAVERSE_MOVED_DIR_DELAY) - sub_events = generate_sub_created_events(src_path) - for sub_created_event in sub_events: - self.queue_event(sub_created_event) - elif winapi_event.is_removed: - self.queue_event(FileDeletedEvent(src_path)) - - -class WindowsApiObserver(BaseObserver): - """ - Observer thread that schedules watching directories and dispatches - calls to event handlers. - """ - - def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT): - BaseObserver.__init__(self, emitter_class=WindowsApiEmitter, - timeout=timeout) diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/observers/winapi.py b/flask/venv/lib/python3.6/site-packages/watchdog/observers/winapi.py deleted file mode 100644 index 47e9fe8..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/observers/winapi.py +++ /dev/null @@ -1,348 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# winapi.py: Windows API-Python interface (removes dependency on pywin32) -# -# Copyright (C) 2007 Thomas Heller -# Copyright (C) 2010 Will McGugan -# Copyright (C) 2010 Ryan Kelly -# Copyright (C) 2010 Yesudeep Mangalapilly -# Copyright (C) 2014 Thomas Amland -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and / or other materials provided with the distribution. -# * Neither the name of the organization nor the names of its contributors may -# be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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. -# -# Portions of this code were taken from pyfilesystem, which uses the above -# new BSD license. - -from __future__ import with_statement - -import ctypes.wintypes -from functools import reduce - -try: - LPVOID = ctypes.wintypes.LPVOID -except AttributeError: - # LPVOID wasn't defined in Py2.5, guess it was introduced in Py2.6 - LPVOID = ctypes.c_void_p - -# Invalid handle value. -INVALID_HANDLE_VALUE = ctypes.c_void_p(-1).value - -# File notification contants. -FILE_NOTIFY_CHANGE_FILE_NAME = 0x01 -FILE_NOTIFY_CHANGE_DIR_NAME = 0x02 -FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x04 -FILE_NOTIFY_CHANGE_SIZE = 0x08 -FILE_NOTIFY_CHANGE_LAST_WRITE = 0x010 -FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020 -FILE_NOTIFY_CHANGE_CREATION = 0x040 -FILE_NOTIFY_CHANGE_SECURITY = 0x0100 - -FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 -FILE_FLAG_OVERLAPPED = 0x40000000 -FILE_LIST_DIRECTORY = 1 -FILE_SHARE_READ = 0x01 -FILE_SHARE_WRITE = 0x02 -FILE_SHARE_DELETE = 0x04 -OPEN_EXISTING = 3 - -# File action constants. -FILE_ACTION_CREATED = 1 -FILE_ACTION_DELETED = 2 -FILE_ACTION_MODIFIED = 3 -FILE_ACTION_RENAMED_OLD_NAME = 4 -FILE_ACTION_RENAMED_NEW_NAME = 5 -FILE_ACTION_OVERFLOW = 0xFFFF - -# Aliases -FILE_ACTION_ADDED = FILE_ACTION_CREATED -FILE_ACTION_REMOVED = FILE_ACTION_DELETED - -THREAD_TERMINATE = 0x0001 - -# IO waiting constants. -WAIT_ABANDONED = 0x00000080 -WAIT_IO_COMPLETION = 0x000000C0 -WAIT_OBJECT_0 = 0x00000000 -WAIT_TIMEOUT = 0x00000102 - -# Error codes -ERROR_OPERATION_ABORTED = 995 - - -class OVERLAPPED(ctypes.Structure): - _fields_ = [('Internal', LPVOID), - ('InternalHigh', LPVOID), - ('Offset', ctypes.wintypes.DWORD), - ('OffsetHigh', ctypes.wintypes.DWORD), - ('Pointer', LPVOID), - ('hEvent', ctypes.wintypes.HANDLE), - ] - - -def _errcheck_bool(value, func, args): - if not value: - raise ctypes.WinError() - return args - - -def _errcheck_handle(value, func, args): - if not value: - raise ctypes.WinError() - if value == INVALID_HANDLE_VALUE: - raise ctypes.WinError() - return args - - -def _errcheck_dword(value, func, args): - if value == 0xFFFFFFFF: - raise ctypes.WinError() - return args - - -ReadDirectoryChangesW = ctypes.windll.kernel32.ReadDirectoryChangesW -ReadDirectoryChangesW.restype = ctypes.wintypes.BOOL -ReadDirectoryChangesW.errcheck = _errcheck_bool -ReadDirectoryChangesW.argtypes = ( - ctypes.wintypes.HANDLE, # hDirectory - LPVOID, # lpBuffer - ctypes.wintypes.DWORD, # nBufferLength - ctypes.wintypes.BOOL, # bWatchSubtree - ctypes.wintypes.DWORD, # dwNotifyFilter - ctypes.POINTER(ctypes.wintypes.DWORD), # lpBytesReturned - ctypes.POINTER(OVERLAPPED), # lpOverlapped - LPVOID # FileIOCompletionRoutine # lpCompletionRoutine -) - -CreateFileW = ctypes.windll.kernel32.CreateFileW -CreateFileW.restype = ctypes.wintypes.HANDLE -CreateFileW.errcheck = _errcheck_handle -CreateFileW.argtypes = ( - ctypes.wintypes.LPCWSTR, # lpFileName - ctypes.wintypes.DWORD, # dwDesiredAccess - ctypes.wintypes.DWORD, # dwShareMode - LPVOID, # lpSecurityAttributes - ctypes.wintypes.DWORD, # dwCreationDisposition - ctypes.wintypes.DWORD, # dwFlagsAndAttributes - ctypes.wintypes.HANDLE # hTemplateFile -) - -CloseHandle = ctypes.windll.kernel32.CloseHandle -CloseHandle.restype = ctypes.wintypes.BOOL -CloseHandle.argtypes = ( - ctypes.wintypes.HANDLE, # hObject -) - -CancelIoEx = ctypes.windll.kernel32.CancelIoEx -CancelIoEx.restype = ctypes.wintypes.BOOL -CancelIoEx.errcheck = _errcheck_bool -CancelIoEx.argtypes = ( - ctypes.wintypes.HANDLE, # hObject - ctypes.POINTER(OVERLAPPED) # lpOverlapped -) - -CreateEvent = ctypes.windll.kernel32.CreateEventW -CreateEvent.restype = ctypes.wintypes.HANDLE -CreateEvent.errcheck = _errcheck_handle -CreateEvent.argtypes = ( - LPVOID, # lpEventAttributes - ctypes.wintypes.BOOL, # bManualReset - ctypes.wintypes.BOOL, # bInitialState - ctypes.wintypes.LPCWSTR, # lpName -) - -SetEvent = ctypes.windll.kernel32.SetEvent -SetEvent.restype = ctypes.wintypes.BOOL -SetEvent.errcheck = _errcheck_bool -SetEvent.argtypes = ( - ctypes.wintypes.HANDLE, # hEvent -) - -WaitForSingleObjectEx = ctypes.windll.kernel32.WaitForSingleObjectEx -WaitForSingleObjectEx.restype = ctypes.wintypes.DWORD -WaitForSingleObjectEx.errcheck = _errcheck_dword -WaitForSingleObjectEx.argtypes = ( - ctypes.wintypes.HANDLE, # hObject - ctypes.wintypes.DWORD, # dwMilliseconds - ctypes.wintypes.BOOL, # bAlertable -) - -CreateIoCompletionPort = ctypes.windll.kernel32.CreateIoCompletionPort -CreateIoCompletionPort.restype = ctypes.wintypes.HANDLE -CreateIoCompletionPort.errcheck = _errcheck_handle -CreateIoCompletionPort.argtypes = ( - ctypes.wintypes.HANDLE, # FileHandle - ctypes.wintypes.HANDLE, # ExistingCompletionPort - LPVOID, # CompletionKey - ctypes.wintypes.DWORD, # NumberOfConcurrentThreads -) - -GetQueuedCompletionStatus = ctypes.windll.kernel32.GetQueuedCompletionStatus -GetQueuedCompletionStatus.restype = ctypes.wintypes.BOOL -GetQueuedCompletionStatus.errcheck = _errcheck_bool -GetQueuedCompletionStatus.argtypes = ( - ctypes.wintypes.HANDLE, # CompletionPort - LPVOID, # lpNumberOfBytesTransferred - LPVOID, # lpCompletionKey - ctypes.POINTER(OVERLAPPED), # lpOverlapped - ctypes.wintypes.DWORD, # dwMilliseconds -) - -PostQueuedCompletionStatus = ctypes.windll.kernel32.PostQueuedCompletionStatus -PostQueuedCompletionStatus.restype = ctypes.wintypes.BOOL -PostQueuedCompletionStatus.errcheck = _errcheck_bool -PostQueuedCompletionStatus.argtypes = ( - ctypes.wintypes.HANDLE, # CompletionPort - ctypes.wintypes.DWORD, # lpNumberOfBytesTransferred - ctypes.wintypes.DWORD, # lpCompletionKey - ctypes.POINTER(OVERLAPPED), # lpOverlapped -) - - -class FILE_NOTIFY_INFORMATION(ctypes.Structure): - _fields_ = [("NextEntryOffset", ctypes.wintypes.DWORD), - ("Action", ctypes.wintypes.DWORD), - ("FileNameLength", ctypes.wintypes.DWORD), - #("FileName", (ctypes.wintypes.WCHAR * 1))] - ("FileName", (ctypes.c_char * 1))] - -LPFNI = ctypes.POINTER(FILE_NOTIFY_INFORMATION) - - -# We don't need to recalculate these flags every time a call is made to -# the win32 API functions. -WATCHDOG_FILE_FLAGS = FILE_FLAG_BACKUP_SEMANTICS -WATCHDOG_FILE_SHARE_FLAGS = reduce( - lambda x, y: x | y, [ - FILE_SHARE_READ, - FILE_SHARE_WRITE, - FILE_SHARE_DELETE, - ]) -WATCHDOG_FILE_NOTIFY_FLAGS = reduce( - lambda x, y: x | y, [ - FILE_NOTIFY_CHANGE_FILE_NAME, - FILE_NOTIFY_CHANGE_DIR_NAME, - FILE_NOTIFY_CHANGE_ATTRIBUTES, - FILE_NOTIFY_CHANGE_SIZE, - FILE_NOTIFY_CHANGE_LAST_WRITE, - FILE_NOTIFY_CHANGE_SECURITY, - FILE_NOTIFY_CHANGE_LAST_ACCESS, - FILE_NOTIFY_CHANGE_CREATION, - ]) - -BUFFER_SIZE = 2048 - - -def _parse_event_buffer(readBuffer, nBytes): - results = [] - while nBytes > 0: - fni = ctypes.cast(readBuffer, LPFNI)[0] - ptr = ctypes.addressof(fni) + FILE_NOTIFY_INFORMATION.FileName.offset - #filename = ctypes.wstring_at(ptr, fni.FileNameLength) - filename = ctypes.string_at(ptr, fni.FileNameLength) - results.append((fni.Action, filename.decode('utf-16'))) - numToSkip = fni.NextEntryOffset - if numToSkip <= 0: - break - readBuffer = readBuffer[numToSkip:] - nBytes -= numToSkip # numToSkip is long. nBytes should be long too. - return results - - -def get_directory_handle(path): - """Returns a Windows handle to the specified directory path.""" - return CreateFileW(path, FILE_LIST_DIRECTORY, WATCHDOG_FILE_SHARE_FLAGS, - None, OPEN_EXISTING, WATCHDOG_FILE_FLAGS, None) - - -def close_directory_handle(handle): - try: - CancelIoEx(handle, None) # force ReadDirectoryChangesW to return - CloseHandle(handle) # close directory handle - except WindowsError: - try: - CloseHandle(handle) # close directory handle - except: - return - - -def read_directory_changes(handle, recursive): - """Read changes to the directory using the specified directory handle. - - http://timgolden.me.uk/pywin32-docs/win32file__ReadDirectoryChangesW_meth.html - """ - event_buffer = ctypes.create_string_buffer(BUFFER_SIZE) - nbytes = ctypes.wintypes.DWORD() - try: - ReadDirectoryChangesW(handle, ctypes.byref(event_buffer), - len(event_buffer), recursive, - WATCHDOG_FILE_NOTIFY_FLAGS, - ctypes.byref(nbytes), None, None) - except WindowsError as e: - if e.winerror == ERROR_OPERATION_ABORTED: - return [], 0 - raise e - - # Python 2/3 compat - try: - int_class = long - except NameError: - int_class = int - return event_buffer.raw, int_class(nbytes.value) - - -class WinAPINativeEvent(object): - def __init__(self, action, src_path): - self.action = action - self.src_path = src_path - - @property - def is_added(self): - return self.action == FILE_ACTION_CREATED - - @property - def is_removed(self): - return self.action == FILE_ACTION_REMOVED - - @property - def is_modified(self): - return self.action == FILE_ACTION_MODIFIED - - @property - def is_renamed_old(self): - return self.action == FILE_ACTION_RENAMED_OLD_NAME - - @property - def is_renamed_new(self): - return self.action == FILE_ACTION_RENAMED_NEW_NAME - - def __repr__(self): - return ("" % (self.action, self.src_path)) - - -def read_events(handle, recursive): - buf, nbytes = read_directory_changes(handle, recursive) - events = _parse_event_buffer(buf, nbytes) - return [WinAPINativeEvent(action, path) for action, path in events] diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/tricks/__init__.py b/flask/venv/lib/python3.6/site-packages/watchdog/tricks/__init__.py deleted file mode 100644 index 7e1c9fe..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/tricks/__init__.py +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import os -import signal -import subprocess -import time - -from watchdog.utils import echo, has_attribute -from watchdog.events import PatternMatchingEventHandler - - -class Trick(PatternMatchingEventHandler): - - """Your tricks should subclass this class.""" - - @classmethod - def generate_yaml(cls): - context = dict(module_name=cls.__module__, - klass_name=cls.__name__) - template_yaml = """- %(module_name)s.%(klass_name)s: - args: - - argument1 - - argument2 - kwargs: - patterns: - - "*.py" - - "*.js" - ignore_patterns: - - "version.py" - ignore_directories: false -""" - return template_yaml % context - - -class LoggerTrick(Trick): - - """A simple trick that does only logs events.""" - - def on_any_event(self, event): - pass - - @echo.echo - def on_modified(self, event): - pass - - @echo.echo - def on_deleted(self, event): - pass - - @echo.echo - def on_created(self, event): - pass - - @echo.echo - def on_moved(self, event): - pass - - -class ShellCommandTrick(Trick): - - """Executes shell commands in response to matched events.""" - - def __init__(self, shell_command=None, patterns=None, ignore_patterns=None, - ignore_directories=False, wait_for_process=False, - drop_during_process=False): - super(ShellCommandTrick, self).__init__(patterns, ignore_patterns, - ignore_directories) - self.shell_command = shell_command - self.wait_for_process = wait_for_process - self.drop_during_process = drop_during_process - self.process = None - - def on_any_event(self, event): - from string import Template - - if self.drop_during_process and self.process and self.process.poll() is None: - return - - if event.is_directory: - object_type = 'directory' - else: - object_type = 'file' - - context = { - 'watch_src_path': event.src_path, - 'watch_dest_path': '', - 'watch_event_type': event.event_type, - 'watch_object': object_type, - } - - if self.shell_command is None: - if has_attribute(event, 'dest_path'): - context.update({'dest_path': event.dest_path}) - command = 'echo "${watch_event_type} ${watch_object} from ${watch_src_path} to ${watch_dest_path}"' - else: - command = 'echo "${watch_event_type} ${watch_object} ${watch_src_path}"' - else: - if has_attribute(event, 'dest_path'): - context.update({'watch_dest_path': event.dest_path}) - command = self.shell_command - - command = Template(command).safe_substitute(**context) - self.process = subprocess.Popen(command, shell=True) - if self.wait_for_process: - self.process.wait() - - -class AutoRestartTrick(Trick): - - """Starts a long-running subprocess and restarts it on matched events. - - The command parameter is a list of command arguments, such as - ['bin/myserver', '-c', 'etc/myconfig.ini']. - - Call start() after creating the Trick. Call stop() when stopping - the process. - """ - - def __init__(self, command, patterns=None, ignore_patterns=None, - ignore_directories=False, stop_signal=signal.SIGINT, - kill_after=10): - super(AutoRestartTrick, self).__init__( - patterns, ignore_patterns, ignore_directories) - self.command = command - self.stop_signal = stop_signal - self.kill_after = kill_after - self.process = None - - def start(self): - self.process = subprocess.Popen(self.command, preexec_fn=os.setsid) - - def stop(self): - if self.process is None: - return - try: - os.killpg(os.getpgid(self.process.pid), self.stop_signal) - except OSError: - # Process is already gone - pass - else: - kill_time = time.time() + self.kill_after - while time.time() < kill_time: - if self.process.poll() is not None: - break - time.sleep(0.25) - else: - try: - os.killpg(os.getpgid(self.process.pid), 9) - except OSError: - # Process is already gone - pass - self.process = None - - @echo.echo - def on_any_event(self, event): - self.stop() - self.start() diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/tricks/__pycache__/__init__.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/tricks/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index b8c1cb36d658dfbf8f481f7916296a2881c6ef99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4729 zcmb_fOOG4J5uTn0Iee{F4@lyIdU%*fW@#uI}otepG!` z{Z6Y@_Z~n0{5R(eeCkgi+~6!R{PNFyrg_sh_22R>{LRE3IleQh_!UNS zR#F|gzRQfe2DiEM+~AII4=le1zQU{EtD*+J4&LQ8@HNdhz}I;Ld_(h1&h8uS<_pZi z=(Wwl7SV22w01)kgn2IGN0VH%S@GIEa6+cP4fAL>P6v0Mh&2B=OnD+?M17Z!g~EsU z)axL^ptWEf%(sNiO>R9m4w&z78#BoRRxjzm%4 zqoH+q`tKXw<*P>;+p2T<>S23Zy<7LZP!9C}29+iwEd3^G54pF&?LA#edEU6(EZv9X zwyt%?`&$rNFhf-`@gU8l2u_GU5mLojy6Uu$pw)^JRaB!a&Be3aZ{=b%PQqLS`{5}0hap?o!v8(&$}G#fW0?)bULJRM zgbY8PcKg_+y)F*=NjHffb;tYpZkE2&xz$y1E^ds&XfGTH)qP4P!LvcPJi%@d#A%!d z0cKyc1|r2^3w=MN^KwB9v%>04n@!JZ3+Nn^>a{Df4jEYkDVjm>coHUbZb48~gMeod z3Jq-%BY`P#d5WZIB}d2xu@1-^_!L=-Yucu+dAYsbgUC^PEv?nJg)@Y`l83=^E1J{( z1+J<&?Ootp&1v5PSL03CUaM$)nhgd*mX?0)BTvOR08v^yj62Ldo(bh;X|nGn*+6-M zJWF*V6Z4^m{$%*t*l8V{jGFcITFGIRNcx4NyREIiXl7{;ru%_z`~~_dJt~`CJTj}! zQK4_ERszoq`3jN4ji)^?8W;|i824krf3;F+PA{yfT*`cRjdf_`A`!XZ9~@D5eof&* z|W3b>t?*mvc~Auv^r&kf$2`dW!ss*YJ2l@f zqmu7@0qFKCFyUHp`u?s+lH1v6gg{by$gMliM1+t-fdFk@R5mIvPCY5qI7=0rC-X)G zI)X2~rMDeb^&|{~{^TYWKJ`s6DHIIvgP+s4RS| zT`e3n84D?2!vKV*C8QNCJ*!|bt77wM2&C(0G5~f)LaE{`m)SVr6NwnPs;n+r+tt!- z-qeFGQNK8~76ytlC-GkX0DYtff?!+=0u6sbP@bJWF~T{*FnwZ%wZSTjcY5i>Hg}c_ zS{WxDBB7-==x zSk#sgb-%FtaUu$%ZTlNKpan`s6qt95Qzg%Z%5{a0Q-|@Dpc>@+W8pW;n(WaK@fo8o zMW+uaoAS2a`r~?+xwot~Z zoZF|1ibC*C2lB^g&{ifXRu}d-OA@~st6;TJzPlX9uj{a)cR-R!OLDoQG8uC~qx=am zr&QP%0g^eD$2r`(sH42}73W?y7OA%E!X{5b;6Ds2G!?&5?oO$Lpomf#4HrjHOPfDI zoR3dk2QgUFyu@r|85PsEY-Tc>xmKOk*(Pc#X8GSFj!oY@=^jTTV!P7o^|rUS;k>J? z zG817_R?-KW0%09qd0z98m2mgD;a7Q$*YS5nZCE3x(3wkJ<8DLeB%2>i^6d98(op6a zcEdApjr+tZFGL!W4sOUvn!+L|5nr5_2aqNVF2&*;Im*L8}!vn!UkjZ9b~bAvf} zNaHbdtkAE&YF?((>N*rfyI!dD2%leh6sO(Mz7i6t@RjS{l^YRJkw>USGTV;_9YFGx zKXgi!w?o7VJ+rHAFYJ>(9e!yAIi{mm+3^-)*%(q!cSVXW*?0^gt(629YwhTY-u4SR zrtdklNV*xxTST<+P?#+mG?PF9_`?MElNctXm!bV|88=8$ZV~wrk++CYRwsW6vNW^9 z7*3=A8Q&rzkolJ}VfyO20UQPd!bp1PPhs>nK1B&bzPMrK*3hO~Rv9#5Pi7BDQXfkp z5W0hY3NOA1dHFUGy*M*dKp2s$n3wBerJo-r9^@N9BQmYOqPR>`&!3p57Fk^cDW#!& zL{IWxC;;=z$h1M2zyEs9h9*9X>Jhc*is&35qCGIubGDIJ_UiI|I3V87j5K*@y;++A!dmUEF+WE z8(`{qzWLw<-Fey#y-Sj^=b}QkFdh`ufyl>$m>1Rj+B`!>^vR`Z3MDI z4US5L7`IKm%YIE;lNMRqaGQ+oZ|I>s5Cir>Q29FB07PyudQFr~c8O}(^p%&KMmAoh z5Of%1HTp2lp+Fl(;TM0l3d0Pyad`)=^4B1XIlk;7p+WVZkkOYn!*tp7jS~|%2Gq@$ z0W=J+bgIhzPwsxw+bMmHbeFTxS+UNKe@=C)9a_4RMs0G|IZcH)w`Q9*JZaN)E%&^3 zEHVjPjXRS(PE?tJThvnK6x32)_awQRzMSg(T8D!YB32VRO!W%) bz4EI6KJBtP1L89MnwzX?ZC=>CxOwyc@~C9F diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/__init__.py b/flask/venv/lib/python3.6/site-packages/watchdog/utils/__init__.py deleted file mode 100644 index dfe067d..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/utils/__init__.py +++ /dev/null @@ -1,157 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -""" -:module: watchdog.utils -:synopsis: Utility classes and functions. -:author: yesudeep@google.com (Yesudeep Mangalapilly) - -Classes -------- -.. autoclass:: BaseThread - :members: - :show-inheritance: - :inherited-members: - -""" -import os -import sys -import threading -from watchdog.utils import platform -from watchdog.utils.compat import Event - - -if sys.version_info[0] == 2 and platform.is_windows(): - # st_ino is not implemented in os.stat on this platform - import win32stat - stat = win32stat.stat -else: - stat = os.stat - - -def has_attribute(ob, attribute): - """ - :func:`hasattr` swallows exceptions. :func:`has_attribute` tests a Python object for the - presence of an attribute. - - :param ob: - object to inspect - :param attribute: - ``str`` for the name of the attribute. - """ - return getattr(ob, attribute, None) is not None - - -class UnsupportedLibc(Exception): - pass - - -class BaseThread(threading.Thread): - """ Convenience class for creating stoppable threads. """ - - def __init__(self): - threading.Thread.__init__(self) - if has_attribute(self, 'daemon'): - self.daemon = True - else: - self.setDaemon(True) - self._stopped_event = Event() - - if not has_attribute(self._stopped_event, 'is_set'): - self._stopped_event.is_set = self._stopped_event.isSet - - @property - def stopped_event(self): - return self._stopped_event - - def should_keep_running(self): - """Determines whether the thread should continue running.""" - return not self._stopped_event.is_set() - - def on_thread_stop(self): - """Override this method instead of :meth:`stop()`. - :meth:`stop()` calls this method. - - This method is called immediately after the thread is signaled to stop. - """ - pass - - def stop(self): - """Signals the thread to stop.""" - self._stopped_event.set() - self.on_thread_stop() - - def on_thread_start(self): - """Override this method instead of :meth:`start()`. :meth:`start()` - calls this method. - - This method is called right before this thread is started and this - object’s run() method is invoked. - """ - pass - - def start(self): - self.on_thread_start() - threading.Thread.start(self) - - -def load_module(module_name): - """Imports a module given its name and returns a handle to it.""" - try: - __import__(module_name) - except ImportError: - raise ImportError('No module named %s' % module_name) - return sys.modules[module_name] - - -def load_class(dotted_path): - """Loads and returns a class definition provided a dotted path - specification the last part of the dotted path is the class name - and there is at least one module name preceding the class name. - - Notes: - You will need to ensure that the module you are trying to load - exists in the Python path. - - Examples: - - module.name.ClassName # Provided module.name is in the Python path. - - module.ClassName # Provided module is in the Python path. - - What won't work: - - ClassName - - modle.name.ClassName # Typo in module name. - - module.name.ClasNam # Typo in classname. - """ - dotted_path_split = dotted_path.split('.') - if len(dotted_path_split) > 1: - klass_name = dotted_path_split[-1] - module_name = '.'.join(dotted_path_split[:-1]) - - module = load_module(module_name) - if has_attribute(module, klass_name): - klass = getattr(module, klass_name) - return klass - # Finally create and return an instance of the class - # return klass(*args, **kwargs) - else: - raise AttributeError('Module %s does not have class attribute %s' % ( - module_name, klass_name)) - else: - raise ValueError( - 'Dotted module path %s must contain a module name and a classname' % dotted_path) diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/__init__.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index 1a19f251f8b6b0d11e453dc91c6834f7a45380f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4426 zcmb7H%a0pL8Siel?RJmnkqJaQyAVp^vGI!W0FhS6Jd`DgSWtF0QnG}24?R7unsM9h z?xw0d6B|cDOgQluaN*9G|E7gFz$qv0dx76qULf8_PU;VSGpCvE2%%KcB?MI_-Soa@77&Mc!Pku z2M(_eJ=qo2LF3AiU2`hzh9Vqnb+@vbaOur!y#C7RHh<~xfHz(_ydk!)D%~A?hkOg) zTcR@9#mXLU@@+ug;5&R5?|tq)aaw!Re}b*PKW&>R^n-2ikOFtvCc@0PK8t*^P&3rNS4{VXL0(9q1SDel8MMrnXWOBrUBogT;h>S2xLF|4IZHBC0N*;` z^85<^_RLFcF zhB`TVDrEfe^ym!M9Uei?7e{GwdQ=#R@3ucYQi&FaMcf<4=RzGVeD28j+))%IS)!w; zT};YtXn3W(ACO&)u|gSQ-ovx}xtQI-PxY5r!2bh;@%w z5Ouz&a-UaUIahACHjmx9jofZvBevU^M`}2a)GfXTL2i`cDk7$L+5J3&auee#CS;63 zdx#gEWamujyeQ(+RKT++hE$vNNK5piH!*r2k6~0h19#xfz?AFg$_&Zq%9FP_Rw6$O zXU?F?J+oK4LQq6?f*I6#<;qhZ(`*pX7&W*9M*ZWm#$z$cv!`V(QIQh56_yRl23RX= zHmb=8*4W0Ll47oG0Q!MBEQ!N%Co+Nv9tjHBvYMzTLdzT2gKzpuq-Ss1=xf+}fJg0M zaNMRFx`9Ve)1BU2sj$7EzM&RUjZsSt69`2Dxd;P!3*UIXgV!4b%k2#oKLv#KQ*Zjt z8o3Ri>uHkn63u~o4y)57IKtiNV=DOffzNZVs2E1JUC7{>*X1YJ{C-lvkWS3 zw>-n}Tu;|>ebb(ehDg`Z{M?f@-fyq-ZpdtaUM~S9P#bpBzkhlmq)a$DV4~Ovyyu)! zl!iA_c0)$j{SJ~*UfgM&v`yBcq_ersdPuHn9mhNq66n))%*ucY&=`#bPhu_735(C5 zKAc{J0Rt;4InUx0fJm7{eMS1%nD#AZ-pRAbIkxrUz@f+Jw4ZP2@}qL%THd zt`L-S#l82$@JBK)xn6LJ++_?~RuCuhJ)n6DvpxwH5sPFJ2mU|ZU1O4VuV-y#!SO$E z@GBcJmYS@%vYuU7TJ`@oqfE~Gnw<(%$GHz#?Hdznpoayi4s{nS!M~!lch~I*Vw`ko%1?dz?wTgw0NYS1ftzGPS%d6NR@TV01LRN2rzT$_ zz4-DrAS4<|N8ZFxRuu_&y=~>U05QU2P3s2kbZ?CzbMm;=l$1^6HVu>r%X$>?ycb21 z@*}z-nHNIpi98^PcWEGZlHa7ka6@F)QXSQLX^P-3W*^}(T~grsUa-~l13w6YYS56h zyP*ZDnMMmg#$?i@wu)qb=48x=Hin`6z6-sOX1F_ZZejP2?sF&ee(PwXsRK%d-t;HG z8c`9a_Q_UkcAlUnumnq{haqQ>LXTxeFnxSd^+Q{v+tdByd~u3kIs2|^`BeN9gA~Po z%c6fMWiAn36IIqN8HGZ#HSZDV?3zwU9pzS<$9&#INGvGoP8`oe<=JufUHLw~mI|S= zLLp`pLeS(ED7WrQSGzO3xi|FXDf-UZf%6hA49YTY3B3L%?*NKBqWiXD_R>>JvxTxIe4Ryfe=#GHdEOuP)TeD^O(+58;`Qz_o4US30wO1Q%yim(kiY zc*zA)I0B9FTvNmqvF@8_qgFFHOL}NG07$tC4WGuo)Rf(6VeJS7EiG9Jq(+0p#;-tt zV?Wj`6@(+t#JaJ-h3FxpqpR6OF|P#2IofL5-#*XB>=M@tmI?3*+Y9u5CVc=o9iDs6 z1aL8}%ZWjoGcuxKNxVp?M^CIw^G2Pdo>P1HA|4g#g5cpCW1B>3-=`bRF=kYpzReyl zv}dUr7!ve4+;n1zYy%JNd>Pr>@E94M^&#$Mp1n__99rERvL#vrWT@ee_GQjN?dhbT z`@}+D24-~%x5d>l$ZJ?!J7uiAI#ass*VI@YPe1s?Ts0AWa1OLIS*{VN7Yn~w-Yozy zz4yR++}vbj0y;Mu!$YXyiNW476%a8~4PxtJ^!@t3_{k4IxD_Cy7P!Hdl~iP&#Y3a3#%MHCHXbgn zwC1W~ij&FkR(r(RnrO=sQ3gM?;{TihLVW{+56S4?beol1kTCFSm0)|%-~VCI_#dC` Bm{R}% diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/bricks.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/bricks.cpython-36.pyc deleted file mode 100644 index f1dc334917aa982e831e45ec2688776c19d5073b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7531 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 Wi10ViGtSFGVdeWPKd6{1h5rEwdpt1! diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/compat.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/compat.cpython-36.pyc deleted file mode 100644 index af568b6d50737d61c2ddd61684dc0944c356eaaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423 zcmYk0y-ve06os#yrb*kh;sHQn?La(KLJSD8RDuPGKLG(LN^3VwTeXUu| zT6ex>rQTuV?K~q>B+Ug>2pHE-ctG zsWMTidltazewVq&(0XA4p_dM(OXcuZ8L*->SZlawj)$0Z$?EJaZzI;@)3KP?2U XIXl}k5M{;3KE^0O6Ety#Xo7zLFamDy diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/decorators.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/decorators.cpython-36.pyc deleted file mode 100644 index 020babdb3c496607d9b17dfc6cb0abc5a5a305c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5494 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 F{15Te=3f8+ diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/dirsnapshot.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/dirsnapshot.cpython-36.pyc deleted file mode 100644 index 2dab3ff3c332d68fa4e8dad55bce5771ee08d512..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9136 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 Q>yprc-TfIo1{IPup6drU!a!9;M)CLrJ) z48!p>pxe$;LPU5&u)irdSb$(H+XOCHP!Tci0>=e>3m(BHba3FLE!ie=+NYWoeo3Nv68icBPOD5%0uXslv9u0)W}65r0Gzn zj@ch2Y$A*tYkoPvxCKmFa8Vm>5=>n}KTKLqYbImQMjp0|*4h$a`;W|Y>kjYu$Tq4% zA5HbDMjtM8ReP>v?c-UcP#WLM^Xj6}2J_q}rPAkxvOZRN+MP)$u|PD#)W=vD$|ijy zRe{x7=BOt}`^&s34BA5`WP@|xKfFNp?+87`Gpog!Q7?q{{5I4tubqi zUdSa@*?VbO5<%aIWjK(TmJhD4#aPbXkm+p`KY<_gPSF3+Dge2nr2Ta0PB$-k;g10_L$fcLXU;y516@6njsqx_iXpgTj3tP O`t;?#>8oAWuIYajp}9-| diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/platform.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/watchdog/utils/__pycache__/platform.cpython-36.pyc deleted file mode 100644 index 7746a62db3cb29f6dd33dc6a1e919b71cc70dd6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1114 zcmb7DOK;Oa5MDoGJMV-yNJza#g1S->;($;K5o$$oP}3^N93nTfNt`&g+1)gRYx`&T zOM8S9e}NOT4snA-C2DJD_nY;8GxN=Qw^}W2eZKtky+FthvhnD+-owE?G(bR$h)+QG zH86Y~Oy7WlZ-V6)zy{}%_!hM;h;Ks?N{AdNLj~s|RH24*3F^?mxeQvDw3jyurZ_&DpNw!a-_kRTsmnKh+)EJvcyHe1Yd+=EE^w=_D|k+j^FothhDqW>&klW zY40DSQ`U0F(V=(xQC4#Ny4&6$IQ8Cnou2oNu-huOGQWB*OA_IxESb=$2;CFPf`hN_ zFbeq8J*V-x8--_Xx)kFi-raug@=(yHX)u@uBg)-HAO>SdM($jM5qH-GY^O`v98u9< zJNj`jqmMBjzlDZq70uinI=hSBzuKlW&Dy545=3ZI9c9aFibu2rZiJM7~rK*~jwQ8k}5|gQ-naYf*)Blvpc{xj9 Z9?@5-FI>s$=qBEP>@}QYmwR<7OnQMLP+c)gitSlfPhq`vC~bPCc$J|iz+`+7eRE(%pf4@C8?3o!8d2^tOQQ=~TN?i7ZhgUk91Y3aR2E;o8IK zEXk#Id6ATi>uxG%%`ht#`ruWOndn)QI}@T5f+92RXL6Qj#paW~iS=om=kqvO{aJ{| zw5wR1e*@9O@}KWRQI;yKM7iWEm4z?4h@W1DX&%c}c)^Q{Fwf>;Rjc!|IGh}XGE;n9 z;g0cw%kX2Yl5_%VvHt-2tWct$&d_)kN$u(+5e=mu(1Eg z7dATGnb(TTR$Io6io!GTy{4y4?60PxgIN)n9f&aRppmYHzM0-YI7a*TF->+f(3Y%a zG}tRPX%uU(%=@jIaIg~Vln?_m>P+J`Z)j+zq1X5+_$HX}$Vm*>PgWNmIE^AJl8Cy96i>#-WI0%Z^Y*G9;x*whxPqNZBi| zc2zEA)rJEUr@Y?N0f+kv{Q~_keC?CJLD84H8Lp+IL6_iE+>mfe}tk>#wgv}3c3 zlY^RPrc+>9r^qa4m903XBf@N!dq-FfW~|Lq&N^uFtN@zAjpi1#8>8E!JI*FZTcf*t z)7=K?p6=aWVs=P9~9%yS9Be4F@*?}i{-yd^TWV2`f$?2lsu4I+vy0|abRkrIU#yBswe~@);UfEP zvwhgFF88a$uGO$cBdF7R-IwX56@y%)T7Oi@gLDz zC6jd@%-a=9*g%><3Pm2FfB=b!h*bonU*KJR@9accN8K%ezd?;R0MI!ZU2Kq&qAir& zgBa`bcpAvd2aC{3f(?3b133oVSOP5r3={kes2B+QP~!stM&HsaBEi$*{uPyU1c6W| z9rBijw(h4;1`87`{(c1+Qjb|6nR-W3O`ip+U zJ!p0t`~6P$waUhlVUAGQp4&VGeIj%lM{4t>6pwn)>t{BSn!1IcZKcEd6gYc1& zKJhC&7ZOXTNiAA3Y(U$vsQ3(Yf1m-W&@|i!;fjoaif^!`bv!UU5%&m7Z4t}^?dvkw z_&@#Uza&8R$l6X|lZqi$Ko%B2#c+(FR8)SvvjXmH8u~xF=m!R-I^+l~QSk-zmRr(+ z2nxNWOAsV%M&cVqq#;w%tP`28!}~SQ;`U_b%n)D6?8usve^R+JCvOc29=kH;#@m$4 zUC}wE(FKzNy#;5?b$P75BF&l&!;%V-Tqg?LqXLyYzie6*|X_w%d5s?Dd=NBX#>DH@7j$TWVXY z4_mb(w_e--_QkQ=Ydo*D`_28Hy8nJmuhnfF*Sfuid)#TZ`)Z@v{;t+)9xSp4bY3)c z6(3&)6K_1GQ~d_v6*X=O#<&F~0}*cNtDB)kki^$u zef>Z9DqpCq>#}Izy2+VVleYvPWc`$AQ-POR_kt-G ze+8|;7eM?4;Ss{82=@?n5vl-cr6p+z?rd=C33s9sp|U)2lI$K6o@3TKotDaKe>S?}F)pNiph?Gg z`G8XWPA1|1kL11mW*aPYS~DT!vE);EVDp2LT2HSRAd4EN&Z!CJQ>e+%61Ff05=P!K F{|~|FiFp73 diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/bricks.py b/flask/venv/lib/python3.6/site-packages/watchdog/utils/bricks.py deleted file mode 100644 index b6d6516..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/utils/bricks.py +++ /dev/null @@ -1,249 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -""" -Utility collections or "bricks". - -:module: watchdog.utils.bricks -:author: yesudeep@google.com (Yesudeep Mangalapilly) -:author: lalinsky@gmail.com (Lukáš Lalinský) -:author: python@rcn.com (Raymond Hettinger) - -Classes -======= -.. autoclass:: OrderedSetQueue - :members: - :show-inheritance: - :inherited-members: - -.. autoclass:: OrderedSet - -""" - -import sys -import collections -from .compat import queue - -class SkipRepeatsQueue(queue.Queue): - - """Thread-safe implementation of an special queue where a - put of the last-item put'd will be dropped. - - The implementation leverages locking already implemented in the base class - redefining only the primitives. - - Queued items must be immutable and hashable so that they can be used - as dictionary keys. You must implement **only read-only properties** and - the :meth:`Item.__hash__()`, :meth:`Item.__eq__()`, and - :meth:`Item.__ne__()` methods for items to be hashable. - - An example implementation follows:: - - class Item(object): - def __init__(self, a, b): - self._a = a - self._b = b - - @property - def a(self): - return self._a - - @property - def b(self): - return self._b - - def _key(self): - return (self._a, self._b) - - def __eq__(self, item): - return self._key() == item._key() - - def __ne__(self, item): - return self._key() != item._key() - - def __hash__(self): - return hash(self._key()) - - based on the OrderedSetQueue below - """ - - def _init(self, maxsize): - queue.Queue._init(self, maxsize) - self._last_item = None - - def _put(self, item): - if item != self._last_item: - queue.Queue._put(self, item) - self._last_item = item - else: - # `put` increments `unfinished_tasks` even if we did not put - # anything into the queue here - self.unfinished_tasks -= 1 - - def _get(self): - item = queue.Queue._get(self) - if item is self._last_item: - self._last_item = None - return item - - -class OrderedSetQueue(queue.Queue): - - """Thread-safe implementation of an ordered set queue. - - Disallows adding a duplicate item while maintaining the - order of items in the queue. The implementation leverages - locking already implemented in the base class - redefining only the primitives. Since the internal queue - is not replaced, the order is maintained. The set is used - merely to check for the existence of an item. - - Queued items must be immutable and hashable so that they can be used - as dictionary keys. You must implement **only read-only properties** and - the :meth:`Item.__hash__()`, :meth:`Item.__eq__()`, and - :meth:`Item.__ne__()` methods for items to be hashable. - - An example implementation follows:: - - class Item(object): - def __init__(self, a, b): - self._a = a - self._b = b - - @property - def a(self): - return self._a - - @property - def b(self): - return self._b - - def _key(self): - return (self._a, self._b) - - def __eq__(self, item): - return self._key() == item._key() - - def __ne__(self, item): - return self._key() != item._key() - - def __hash__(self): - return hash(self._key()) - - :author: lalinsky@gmail.com (Lukáš Lalinský) - :url: http://stackoverflow.com/questions/1581895/how-check-if-a-task-is-already-in-python-queue - """ - - def _init(self, maxsize): - queue.Queue._init(self, maxsize) - self._set_of_items = set() - - def _put(self, item): - if item not in self._set_of_items: - queue.Queue._put(self, item) - self._set_of_items.add(item) - else: - # `put` increments `unfinished_tasks` even if we did not put - # anything into the queue here - self.unfinished_tasks -= 1 - - def _get(self): - item = queue.Queue._get(self) - self._set_of_items.remove(item) - return item - - -if sys.version_info >= (2, 6, 0): - KEY, PREV, NEXT = list(range(3)) - - class OrderedSet(collections.MutableSet): - - """ - Implementation based on a doubly-linked link and an internal dictionary. - This design gives :class:`OrderedSet` the same big-Oh running times as - regular sets including O(1) adds, removes, and lookups as well as - O(n) iteration. - - .. ADMONITION:: Implementation notes - - Runs on Python 2.6 or later (and runs on Python 3.0 or later - without any modifications). - - :author: python@rcn.com (Raymond Hettinger) - :url: http://code.activestate.com/recipes/576694/ - """ - - def __init__(self, iterable=None): - self.end = end = [] - end += [None, end, end] # sentinel node for doubly linked list - self.map = {} # key --> [key, prev, next] - if iterable is not None: - self |= iterable - - def __len__(self): - return len(self.map) - - def __contains__(self, key): - return key in self.map - - def add(self, key): - if key not in self.map: - end = self.end - curr = end[PREV] - curr[NEXT] = end[PREV] = self.map[key] = [key, curr, end] - - def discard(self, key): - if key in self.map: - key, prev, _next = self.map.pop(key) - prev[NEXT] = _next - _next[PREV] = prev - - def __iter__(self): - end = self.end - curr = end[NEXT] - while curr is not end: - yield curr[KEY] - curr = curr[NEXT] - - def __reversed__(self): - end = self.end - curr = end[PREV] - while curr is not end: - yield curr[KEY] - curr = curr[PREV] - - def pop(self, last=True): - if not self: - raise KeyError('set is empty') - key = next(reversed(self)) if last else next(iter(self)) - self.discard(key) - return key - - def __repr__(self): - if not self: - return '%s()' % (self.__class__.__name__,) - return '%s(%r)' % (self.__class__.__name__, list(self)) - - def __eq__(self, other): - if isinstance(other, OrderedSet): - return len(self) == len(other) and list(self) == list(other) - return set(self) == set(other) - - def __del__(self): - self.clear() # remove circular references diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/compat.py b/flask/venv/lib/python3.6/site-packages/watchdog/utils/compat.py deleted file mode 100644 index 0f6e794..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/utils/compat.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright 2014 Thomas Amland -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import sys - -__all__ = ['queue', 'Event'] - -try: - import queue -except ImportError: - import Queue as queue - - -if sys.version_info < (2, 7): - from watchdog.utils.event_backport import Event -else: - from threading import Event \ No newline at end of file diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/decorators.py b/flask/venv/lib/python3.6/site-packages/watchdog/utils/decorators.py deleted file mode 100644 index abb325c..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/utils/decorators.py +++ /dev/null @@ -1,198 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Most of this code was obtained from the Python documentation online. - -"""Decorator utility functions. - -decorators: -- synchronized -- propertyx -- accepts -- returns -- singleton -- attrs -- deprecated -""" - -import functools -import warnings -import threading -import sys - - -def synchronized(lock=None): - """Decorator that synchronizes a method or a function with a mutex lock. - - Example usage: - - @synchronized() - def operation(self, a, b): - ... - """ - if lock is None: - lock = threading.Lock() - - def wrapper(function): - def new_function(*args, **kwargs): - lock.acquire() - try: - return function(*args, **kwargs) - finally: - lock.release() - - return new_function - - return wrapper - - -def propertyx(function): - """Decorator to easily create properties in classes. - - Example: - - class Angle(object): - def __init__(self, rad): - self._rad = rad - - @property - def rad(): - def fget(self): - return self._rad - def fset(self, angle): - if isinstance(angle, Angle): - angle = angle.rad - self._rad = float(angle) - - Arguments: - - `function`: The function to be decorated. - """ - keys = ('fget', 'fset', 'fdel') - func_locals = {'doc': function.__doc__} - - def probe_func(frame, event, arg): - if event == 'return': - locals = frame.f_locals - func_locals.update(dict((k, locals.get(k)) for k in keys)) - sys.settrace(None) - return probe_func - - sys.settrace(probe_func) - function() - return property(**func_locals) - - -def accepts(*types): - """Decorator to ensure that the decorated function accepts the given types as arguments. - - Example: - @accepts(int, (int,float)) - @returns((int,float)) - def func(arg1, arg2): - return arg1 * arg2 - """ - - def check_accepts(f): - assert len(types) == f.__code__.co_argcount - - def new_f(*args, **kwds): - for (a, t) in zip(args, types): - assert isinstance(a, t),\ - "arg %r does not match %s" % (a, t) - return f(*args, **kwds) - - new_f.__name__ = f.__name__ - return new_f - - return check_accepts - - -def returns(rtype): - """Decorator to ensure that the decorated function returns the given - type as argument. - - Example: - @accepts(int, (int,float)) - @returns((int,float)) - def func(arg1, arg2): - return arg1 * arg2 - """ - - def check_returns(f): - def new_f(*args, **kwds): - result = f(*args, **kwds) - assert isinstance(result, rtype),\ - "return value %r does not match %s" % (result, rtype) - return result - - new_f.__name__ = f.__name__ - return new_f - - return check_returns - - -def singleton(cls): - """Decorator to ensures a class follows the singleton pattern. - - Example: - @singleton - class MyClass: - ... - """ - instances = {} - - def getinstance(): - if cls not in instances: - instances[cls] = cls() - return instances[cls] - - return getinstance - - -def attrs(**kwds): - """Decorator to add attributes to a function. - - Example: - - @attrs(versionadded="2.2", - author="Guido van Rossum") - def mymethod(f): - ... - """ - - def decorate(f): - for k in kwds: - setattr(f, k, kwds[k]) - return f - - return decorate - - -def deprecated(func): - """This is a decorator which can be used to mark functions - as deprecated. It will result in a warning being emitted - when the function is used. - - ## Usage examples ## - @deprecated - def my_func(): - pass - - @other_decorators_must_be_upper - @deprecated - def my_func(): - pass - """ - - @functools.wraps(func) - def new_func(*args, **kwargs): - warnings.warn_explicit( - "Call to deprecated function %(funcname)s." % { - 'funcname': func.__name__, - }, - category=DeprecationWarning, - filename=func.__code__.co_filename, - lineno=func.__code__.co_firstlineno + 1 - ) - return func(*args, **kwargs) - - return new_func diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/delayed_queue.py b/flask/venv/lib/python3.6/site-packages/watchdog/utils/delayed_queue.py deleted file mode 100644 index 6d98a50..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/utils/delayed_queue.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright 2014 Thomas Amland -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import time -import threading -from collections import deque - - -class DelayedQueue(object): - - def __init__(self, delay): - self.delay = delay - self._lock = threading.Lock() - self._not_empty = threading.Condition(self._lock) - self._queue = deque() - self._closed = False - - def put(self, element): - """Add element to queue.""" - self._lock.acquire() - self._queue.append((element, time.time())) - self._not_empty.notify() - self._lock.release() - - def close(self): - """Close queue, indicating no more items will be added.""" - self._closed = True - # Interrupt the blocking _not_empty.wait() call in get - self._not_empty.acquire() - self._not_empty.notify() - self._not_empty.release() - - def get(self): - """Remove and return an element from the queue, or this queue has been - closed raise the Closed exception. - """ - while True: - # wait for element to be added to queue - self._not_empty.acquire() - while len(self._queue) == 0 and not self._closed: - self._not_empty.wait() - - if self._closed: - self._not_empty.release() - return None - head, insert_time = self._queue[0] - self._not_empty.release() - - # wait for delay - time_left = insert_time + self.delay - time.time() - while time_left > 0: - time.sleep(time_left) - time_left = insert_time + self.delay - time.time() - - # return element if it's still in the queue - self._lock.acquire() - try: - if len(self._queue) > 0 and self._queue[0][0] is head: - self._queue.popleft() - return head - finally: - self._lock.release() - - def remove(self, predicate): - """Remove and return the first items for which predicate is True, - ignoring delay.""" - try: - self._lock.acquire() - for i, (elem, t) in enumerate(self._queue): - if predicate(elem): - del self._queue[i] - return elem - finally: - self._lock.release() - return None diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/dirsnapshot.py b/flask/venv/lib/python3.6/site-packages/watchdog/utils/dirsnapshot.py deleted file mode 100644 index af54c9a..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/utils/dirsnapshot.py +++ /dev/null @@ -1,293 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# Copyright 2014 Thomas Amland -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -:module: watchdog.utils.dirsnapshot -:synopsis: Directory snapshots and comparison. -:author: yesudeep@google.com (Yesudeep Mangalapilly) - -.. ADMONITION:: Where are the moved events? They "disappeared" - - This implementation does not take partition boundaries - into consideration. It will only work when the directory - tree is entirely on the same file system. More specifically, - any part of the code that depends on inode numbers can - break if partition boundaries are crossed. In these cases, - the snapshot diff will represent file/directory movement as - created and deleted events. - -Classes -------- -.. autoclass:: DirectorySnapshot - :members: - :show-inheritance: - -.. autoclass:: DirectorySnapshotDiff - :members: - :show-inheritance: - -""" - -import errno -import os -from stat import S_ISDIR -from watchdog.utils import stat as default_stat - - -class DirectorySnapshotDiff(object): - """ - Compares two directory snapshots and creates an object that represents - the difference between the two snapshots. - - :param ref: - The reference directory snapshot. - :type ref: - :class:`DirectorySnapshot` - :param snapshot: - The directory snapshot which will be compared - with the reference snapshot. - :type snapshot: - :class:`DirectorySnapshot` - """ - - def __init__(self, ref, snapshot): - created = snapshot.paths - ref.paths - deleted = ref.paths - snapshot.paths - - # check that all unchanged paths have the same inode - for path in ref.paths & snapshot.paths: - if ref.inode(path) != snapshot.inode(path): - created.add(path) - deleted.add(path) - - # find moved paths - moved = set() - for path in set(deleted): - inode = ref.inode(path) - new_path = snapshot.path(inode) - if new_path: - # file is not deleted but moved - deleted.remove(path) - moved.add((path, new_path)) - - for path in set(created): - inode = snapshot.inode(path) - old_path = ref.path(inode) - if old_path: - created.remove(path) - moved.add((old_path, path)) - - # find modified paths - # first check paths that have not moved - modified = set() - for path in ref.paths & snapshot.paths: - if ref.inode(path) == snapshot.inode(path): - if ref.mtime(path) != snapshot.mtime(path): - modified.add(path) - - for (old_path, new_path) in moved: - if ref.mtime(old_path) != snapshot.mtime(new_path): - modified.add(old_path) - - self._dirs_created = [path for path in created if snapshot.isdir(path)] - self._dirs_deleted = [path for path in deleted if ref.isdir(path)] - self._dirs_modified = [path for path in modified if ref.isdir(path)] - self._dirs_moved = [(frm, to) for (frm, to) in moved if ref.isdir(frm)] - - self._files_created = list(created - set(self._dirs_created)) - self._files_deleted = list(deleted - set(self._dirs_deleted)) - self._files_modified = list(modified - set(self._dirs_modified)) - self._files_moved = list(moved - set(self._dirs_moved)) - - @property - def files_created(self): - """List of files that were created.""" - return self._files_created - - @property - def files_deleted(self): - """List of files that were deleted.""" - return self._files_deleted - - @property - def files_modified(self): - """List of files that were modified.""" - return self._files_modified - - @property - def files_moved(self): - """ - List of files that were moved. - - Each event is a two-tuple the first item of which is the path - that has been renamed to the second item in the tuple. - """ - return self._files_moved - - @property - def dirs_modified(self): - """ - List of directories that were modified. - """ - return self._dirs_modified - - @property - def dirs_moved(self): - """ - List of directories that were moved. - - Each event is a two-tuple the first item of which is the path - that has been renamed to the second item in the tuple. - """ - return self._dirs_moved - - @property - def dirs_deleted(self): - """ - List of directories that were deleted. - """ - return self._dirs_deleted - - @property - def dirs_created(self): - """ - List of directories that were created. - """ - return self._dirs_created - -class DirectorySnapshot(object): - """ - A snapshot of stat information of files in a directory. - - :param path: - The directory path for which a snapshot should be taken. - :type path: - ``str`` - :param recursive: - ``True`` if the entire directory tree should be included in the - snapshot; ``False`` otherwise. - :type recursive: - ``bool`` - :param walker_callback: - .. deprecated:: 0.7.2 - :param stat: - Use custom stat function that returns a stat structure for path. - Currently only st_dev, st_ino, st_mode and st_mtime are needed. - - A function with the signature ``walker_callback(path, stat_info)`` - which will be called for every entry in the directory tree. - :param listdir: - Use custom listdir function. See ``os.listdir`` for details. - """ - - def __init__(self, path, recursive=True, - walker_callback=(lambda p, s: None), - stat=default_stat, - listdir=os.listdir): - self._stat_info = {} - self._inode_to_path = {} - - st = stat(path) - self._stat_info[path] = st - self._inode_to_path[(st.st_ino, st.st_dev)] = path - - def walk(root): - try: - paths = [os.path.join(root, name) for name in listdir(root)] - except OSError as e: - # Directory may have been deleted between finding it in the directory - # list of its parent and trying to delete its contents. If this - # happens we treat it as empty. - if e.errno == errno.ENOENT: - return - else: - raise - entries = [] - for p in paths: - try: - entries.append((p, stat(p))) - except OSError: - continue - for _ in entries: - yield _ - if recursive: - for path, st in entries: - if S_ISDIR(st.st_mode): - for _ in walk(path): - yield _ - - for p, st in walk(path): - i = (st.st_ino, st.st_dev) - self._inode_to_path[i] = p - self._stat_info[p] = st - walker_callback(p, st) - - @property - def paths(self): - """ - Set of file/directory paths in the snapshot. - """ - return set(self._stat_info.keys()) - - def path(self, id): - """ - Returns path for id. None if id is unknown to this snapshot. - """ - return self._inode_to_path.get(id) - - def inode(self, path): - """ Returns an id for path. """ - st = self._stat_info[path] - return (st.st_ino, st.st_dev) - - def isdir(self, path): - return S_ISDIR(self._stat_info[path].st_mode) - - def mtime(self, path): - return self._stat_info[path].st_mtime - - def stat_info(self, path): - """ - Returns a stat information object for the specified path from - the snapshot. - - Attached information is subject to change. Do not use unless - you specify `stat` in constructor. Use :func:`inode`, :func:`mtime`, - :func:`isdir` instead. - - :param path: - The path for which stat information should be obtained - from a snapshot. - """ - return self._stat_info[path] - - def __sub__(self, previous_dirsnap): - """Allow subtracting a DirectorySnapshot object instance from - another. - - :returns: - A :class:`DirectorySnapshotDiff` object. - """ - return DirectorySnapshotDiff(previous_dirsnap, self) - - def __str__(self): - return self.__repr__() - - def __repr__(self): - return str(self._stat_info) diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/echo.py b/flask/venv/lib/python3.6/site-packages/watchdog/utils/echo.py deleted file mode 100644 index 12803e0..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/utils/echo.py +++ /dev/null @@ -1,157 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# echo.py: Tracing function calls using Python decorators. -# -# Written by Thomas Guest -# Please see http://wordaligned.org/articles/echo -# -# Place into the public domain. - -""" Echo calls made to functions and methods in a module. - -"Echoing" a function call means printing out the name of the function -and the values of its arguments before making the call (which is more -commonly referred to as "tracing", but Python already has a trace module). - -Example: to echo calls made to functions in "my_module" do: - - import echo - import my_module - echo.echo_module(my_module) - -Example: to echo calls made to functions in "my_module.my_class" do: - - echo.echo_class(my_module.my_class) - -Alternatively, echo.echo can be used to decorate functions. Calls to the -decorated function will be echoed. - -Example: - - @echo.echo - def my_function(args): - pass -""" -import inspect -import sys - - -def name(item): - " Return an item's name. " - return item.__name__ - - -def is_classmethod(instancemethod, klass): - " Determine if an instancemethod is a classmethod. " - return inspect.ismethod(instancemethod) and instancemethod.__self__ is klass - -def is_static_method(method, klass): - """Returns True if method is an instance method of klass.""" - for c in klass.mro(): - if name(method) in c.__dict__: - return isinstance(c.__dict__[name(method)], staticmethod) - else: - return False - -def is_class_private_name(name): - " Determine if a name is a class private name. " - # Exclude system defined names such as __init__, __add__ etc - return name.startswith("__") and not name.endswith("__") - - -def method_name(method): - """ Return a method's name. - - This function returns the name the method is accessed by from - outside the class (i.e. it prefixes "private" methods appropriately). - """ - mname = name(method) - if is_class_private_name(mname): - mname = "_%s%s" % (name(method.__self__.__class__), mname) - return mname - - -def format_arg_value(arg_val): - """ Return a string representing a (name, value) pair. - - >>> format_arg_value(('x', (1, 2, 3))) - 'x=(1, 2, 3)' - """ - arg, val = arg_val - return "%s=%r" % (arg, val) - - -def echo(fn, write=sys.stdout.write): - """ Echo calls to a function. - - Returns a decorated version of the input function which "echoes" calls - made to it by writing out the function's name and the arguments it was - called with. - """ - import functools - # Unpack function's arg count, arg names, arg defaults - code = fn.__code__ - argcount = code.co_argcount - argnames = code.co_varnames[:argcount] - fn_defaults = fn.__defaults__ or list() - argdefs = dict(list(zip(argnames[-len(fn_defaults):], fn_defaults))) - - @functools.wraps(fn) - def wrapped(*v, **k): - # Collect function arguments by chaining together positional, - # defaulted, extra positional and keyword arguments. - positional = list(map(format_arg_value, list(zip(argnames, v)))) - defaulted = [format_arg_value((a, argdefs[a])) - for a in argnames[len(v):] if a not in k] - nameless = list(map(repr, v[argcount:])) - keyword = list(map(format_arg_value, list(k.items()))) - args = positional + defaulted + nameless + keyword - write("%s(%s)\n" % (name(fn), ", ".join(args))) - return fn(*v, **k) - - return wrapped - - -def echo_instancemethod(klass, method, write=sys.stdout.write): - """ Change an instancemethod so that calls to it are echoed. - - Replacing a classmethod is a little more tricky. - See: http://www.python.org/doc/current/ref/types.html - """ - mname = method_name(method) - never_echo = "__str__", "__repr__", # Avoid recursion printing method calls - if mname in never_echo: - pass - elif is_classmethod(method, klass): - setattr(klass, mname, classmethod(echo(method.__func__, write))) - else: - setattr(klass, mname, echo(method, write)) - -def echo_class(klass, write=sys.stdout.write): - """ Echo calls to class methods and static functions - """ - for _, method in inspect.getmembers(klass, inspect.ismethod): - #In python 3 only class methods are returned here, but in python2 instance methods are too. - echo_instancemethod(klass, method, write) - for _, fn in inspect.getmembers(klass, inspect.isfunction): - if is_static_method(fn, klass): - setattr(klass, name(fn), staticmethod(echo(fn, write))) - else: - #It's not a class or a static method, so it must be an instance method. - #This should only be called in python 3, because in python 3 instance methods are considered functions. - echo_instancemethod(klass, fn, write) - -def echo_module(mod, write=sys.stdout.write): - """ Echo calls to functions and methods in a module. - """ - for fname, fn in inspect.getmembers(mod, inspect.isfunction): - setattr(mod, fname, echo(fn, write)) - for _, klass in inspect.getmembers(mod, inspect.isclass): - echo_class(klass, write) - -if __name__ == "__main__": - import doctest - - optionflags = doctest.ELLIPSIS - doctest.testfile('echoexample.txt', optionflags=optionflags) - doctest.testmod(optionflags=optionflags) diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/event_backport.py b/flask/venv/lib/python3.6/site-packages/watchdog/utils/event_backport.py deleted file mode 100644 index 5c136e4..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/utils/event_backport.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Backport of Event from py2.7 (method wait in py2.6 returns None) - -from threading import Condition, Lock - - -class Event(object): - - def __init__(self,): - self.__cond = Condition(Lock()) - self.__flag = False - - def isSet(self): - return self.__flag - - is_set = isSet - - def set(self): - self.__cond.acquire() - try: - self.__flag = True - self.__cond.notify_all() - finally: - self.__cond.release() - - def clear(self): - self.__cond.acquire() - try: - self.__flag = False - finally: - self.__cond.release() - - def wait(self, timeout=None): - self.__cond.acquire() - try: - if not self.__flag: - self.__cond.wait(timeout) - return self.__flag - finally: - self.__cond.release() diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/importlib2.py b/flask/venv/lib/python3.6/site-packages/watchdog/utils/importlib2.py deleted file mode 100644 index 5ad3ec5..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/utils/importlib2.py +++ /dev/null @@ -1,40 +0,0 @@ -# The MIT License (MIT) - -# Copyright (c) 2013 Peter M. Elias - -# 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 - - -def import_module(target, relative_to=None): - target_parts = target.split('.') - target_depth = target_parts.count('') - target_path = target_parts[target_depth:] - target = target[target_depth:] - fromlist = [target] - if target_depth and relative_to: - relative_parts = relative_to.split('.') - relative_to = '.'.join(relative_parts[:-(target_depth - 1) or None]) - if len(target_path) > 1: - relative_to = '.'.join(filter(None, [relative_to]) + target_path[:-1]) - fromlist = target_path[-1:] - target = fromlist[0] - elif not relative_to: - fromlist = [] - mod = __import__(relative_to or target, globals(), locals(), fromlist) - return getattr(mod, target, mod) diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/platform.py b/flask/venv/lib/python3.6/site-packages/watchdog/utils/platform.py deleted file mode 100644 index 239c6a2..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/utils/platform.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import sys - -PLATFORM_WINDOWS = 'windows' -PLATFORM_LINUX = 'linux' -PLATFORM_BSD = 'bsd' -PLATFORM_DARWIN = 'darwin' -PLATFORM_UNKNOWN = 'unknown' - - -def get_platform_name(): - if sys.platform.startswith("win"): - return PLATFORM_WINDOWS - elif sys.platform.startswith('darwin'): - return PLATFORM_DARWIN - elif sys.platform.startswith('linux'): - return PLATFORM_LINUX - elif sys.platform.startswith(('dragonfly', 'freebsd', 'netbsd', 'openbsd', )): - return PLATFORM_BSD - else: - return PLATFORM_UNKNOWN - -__platform__ = get_platform_name() - - -def is_linux(): - return __platform__ == PLATFORM_LINUX - - -def is_bsd(): - return __platform__ == PLATFORM_BSD - - -def is_darwin(): - return __platform__ == PLATFORM_DARWIN - - -def is_windows(): - return __platform__ == PLATFORM_WINDOWS diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/unicode_paths.py b/flask/venv/lib/python3.6/site-packages/watchdog/utils/unicode_paths.py deleted file mode 100644 index 501a2f1..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/utils/unicode_paths.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2013 Will Bond -# -# 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. - - -import sys - -from watchdog.utils import platform - -try: - # Python 2 - str_cls = unicode - bytes_cls = str -except NameError: - # Python 3 - str_cls = str - bytes_cls = bytes - - -# This is used by Linux when the locale seems to be improperly set. UTF-8 tends -# to be the encoding used by all distros, so this is a good fallback. -fs_fallback_encoding = 'utf-8' -fs_encoding = sys.getfilesystemencoding() or fs_fallback_encoding - - -def encode(path): - if isinstance(path, str_cls): - try: - path = path.encode(fs_encoding, 'strict') - except UnicodeEncodeError: - if not platform.is_linux(): - raise - path = path.encode(fs_fallback_encoding, 'strict') - return path - - -def decode(path): - if isinstance(path, bytes_cls): - try: - path = path.decode(fs_encoding, 'strict') - except UnicodeDecodeError: - if not platform.is_linux(): - raise - path = path.decode(fs_fallback_encoding, 'strict') - return path diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/utils/win32stat.py b/flask/venv/lib/python3.6/site-packages/watchdog/utils/win32stat.py deleted file mode 100644 index c18d66f..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/utils/win32stat.py +++ /dev/null @@ -1,123 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright 2014 Thomas Amland -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -:module: watchdog.utils.win32stat -:synopsis: Implementation of stat with st_ino and st_dev support. - -Functions ---------- - -.. autofunction:: stat - -""" - -import ctypes -import ctypes.wintypes -import stat as stdstat -from collections import namedtuple - - -INVALID_HANDLE_VALUE = ctypes.c_void_p(-1).value -OPEN_EXISTING = 3 -FILE_READ_ATTRIBUTES = 0x80 -FILE_ATTRIBUTE_NORMAL = 0x80 -FILE_ATTRIBUTE_READONLY = 0x1 -FILE_ATTRIBUTE_DIRECTORY = 0x10 -FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 -FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000 - - -class FILETIME(ctypes.Structure): - _fields_ = [("dwLowDateTime", ctypes.wintypes.DWORD), - ("dwHighDateTime", ctypes.wintypes.DWORD)] - - -class BY_HANDLE_FILE_INFORMATION(ctypes.Structure): - _fields_ = [('dwFileAttributes', ctypes.wintypes.DWORD), - ('ftCreationTime', FILETIME), - ('ftLastAccessTime', FILETIME), - ('ftLastWriteTime', FILETIME), - ('dwVolumeSerialNumber', ctypes.wintypes.DWORD), - ('nFileSizeHigh', ctypes.wintypes.DWORD), - ('nFileSizeLow', ctypes.wintypes.DWORD), - ('nNumberOfLinks', ctypes.wintypes.DWORD), - ('nFileIndexHigh', ctypes.wintypes.DWORD), - ('nFileIndexLow', ctypes.wintypes.DWORD)] - - -CreateFile = ctypes.windll.kernel32.CreateFileW -CreateFile.restype = ctypes.wintypes.HANDLE -CreateFile.argtypes = ( - ctypes.c_wchar_p, - ctypes.wintypes.DWORD, - ctypes.wintypes.DWORD, - ctypes.c_void_p, - ctypes.wintypes.DWORD, - ctypes.wintypes.DWORD, - ctypes.wintypes.HANDLE, -) - -GetFileInformationByHandle = ctypes.windll.kernel32.GetFileInformationByHandle -GetFileInformationByHandle.restype = ctypes.wintypes.BOOL -GetFileInformationByHandle.argtypes = ( - ctypes.wintypes.HANDLE, - ctypes.wintypes.POINTER(BY_HANDLE_FILE_INFORMATION), -) - -CloseHandle = ctypes.windll.kernel32.CloseHandle -CloseHandle.restype = ctypes.wintypes.BOOL -CloseHandle.argtypes = (ctypes.wintypes.HANDLE,) - - -StatResult = namedtuple('StatResult', 'st_dev st_ino st_mode st_mtime') - -def _to_mode(attr): - m = 0 - if (attr & FILE_ATTRIBUTE_DIRECTORY): - m |= stdstat.S_IFDIR | 0o111 - else: - m |= stdstat.S_IFREG - if (attr & FILE_ATTRIBUTE_READONLY): - m |= 0o444 - else: - m |= 0o666 - return m - -def _to_unix_time(ft): - t = (ft.dwHighDateTime) << 32 | ft.dwLowDateTime - return (t / 10000000) - 11644473600 - -def stat(path): - hfile = CreateFile(path, - FILE_READ_ATTRIBUTES, - 0, - None, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, - None) - if hfile == INVALID_HANDLE_VALUE: - raise ctypes.WinError() - info = BY_HANDLE_FILE_INFORMATION() - r = GetFileInformationByHandle(hfile, info) - CloseHandle(hfile) - if not r: - raise ctypes.WinError() - return StatResult(st_dev=info.dwVolumeSerialNumber, - st_ino=(info.nFileIndexHigh << 32) + info.nFileIndexLow, - st_mode=_to_mode(info.dwFileAttributes), - st_mtime=_to_unix_time(info.ftLastWriteTime) - ) diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/version.py b/flask/venv/lib/python3.6/site-packages/watchdog/version.py deleted file mode 100644 index 295497c..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/version.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# When updating this version number, please update the -# ``docs/source/global.rst.inc`` file as well. -VERSION_MAJOR = 0 -VERSION_MINOR = 9 -VERSION_BUILD = 0 -VERSION_INFO = (VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD) -VERSION_STRING = "%d.%d.%d" % VERSION_INFO - -__version__ = VERSION_INFO diff --git a/flask/venv/lib/python3.6/site-packages/watchdog/watchmedo.py b/flask/venv/lib/python3.6/site-packages/watchdog/watchmedo.py deleted file mode 100644 index ce891f8..0000000 --- a/flask/venv/lib/python3.6/site-packages/watchdog/watchmedo.py +++ /dev/null @@ -1,577 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -:module: watchdog.watchmedo -:author: yesudeep@google.com (Yesudeep Mangalapilly) -:synopsis: ``watchmedo`` shell script utility. -""" - -import os.path -import sys -import yaml -import time -import logging - -try: - from cStringIO import StringIO -except ImportError: - try: - from StringIO import StringIO - except ImportError: - from io import StringIO - -from argh import arg, aliases, ArghParser, expects_obj -from watchdog.version import VERSION_STRING -from watchdog.utils import load_class - - -logging.basicConfig(level=logging.INFO) - -CONFIG_KEY_TRICKS = 'tricks' -CONFIG_KEY_PYTHON_PATH = 'python-path' - - -def path_split(pathname_spec, separator=os.path.sep): - """ - Splits a pathname specification separated by an OS-dependent separator. - - :param pathname_spec: - The pathname specification. - :param separator: - (OS Dependent) `:` on Unix and `;` on Windows or user-specified. - """ - return list(pathname_spec.split(separator)) - - -def add_to_sys_path(pathnames, index=0): - """ - Adds specified paths at specified index into the sys.path list. - - :param paths: - A list of paths to add to the sys.path - :param index: - (Default 0) The index in the sys.path list where the paths will be - added. - """ - for pathname in pathnames[::-1]: - sys.path.insert(index, pathname) - - -def load_config(tricks_file_pathname): - """ - Loads the YAML configuration from the specified file. - - :param tricks_file_path: - The path to the tricks configuration file. - :returns: - A dictionary of configuration information. - """ - f = open(tricks_file_pathname, 'rb') - content = f.read() - f.close() - config = yaml.load(content) - return config - - -def parse_patterns(patterns_spec, ignore_patterns_spec, separator=';'): - """ - Parses pattern argument specs and returns a two-tuple of - (patterns, ignore_patterns). - """ - patterns = patterns_spec.split(separator) - ignore_patterns = ignore_patterns_spec.split(separator) - if ignore_patterns == ['']: - ignore_patterns = [] - return (patterns, ignore_patterns) - - -def observe_with(observer, event_handler, pathnames, recursive): - """ - Single observer thread with a scheduled path and event handler. - - :param observer: - The observer thread. - :param event_handler: - Event handler which will be called in response to file system events. - :param pathnames: - A list of pathnames to monitor. - :param recursive: - ``True`` if recursive; ``False`` otherwise. - """ - for pathname in set(pathnames): - observer.schedule(event_handler, pathname, recursive) - observer.start() - try: - while True: - time.sleep(1) - except KeyboardInterrupt: - observer.stop() - observer.join() - - -def schedule_tricks(observer, tricks, pathname, recursive): - """ - Schedules tricks with the specified observer and for the given watch - path. - - :param observer: - The observer thread into which to schedule the trick and watch. - :param tricks: - A list of tricks. - :param pathname: - A path name which should be watched. - :param recursive: - ``True`` if recursive; ``False`` otherwise. - """ - for trick in tricks: - for name, value in list(trick.items()): - TrickClass = load_class(name) - handler = TrickClass(**value) - trick_pathname = getattr(handler, 'source_directory', None) or pathname - observer.schedule(handler, trick_pathname, recursive) - - -@aliases('tricks') -@arg('files', - nargs='*', - help='perform tricks from given file') -@arg('--python-path', - default='.', - help='paths separated by %s to add to the python path' % os.path.sep) -@arg('--interval', - '--timeout', - dest='timeout', - default=1.0, - help='use this as the polling interval/blocking timeout') -@arg('--recursive', - default=True, - help='recursively monitor paths') -@expects_obj -def tricks_from(args): - """ - Subcommand to execute tricks from a tricks configuration file. - - :param args: - Command line argument options. - """ - from watchdog.observers import Observer - - add_to_sys_path(path_split(args.python_path)) - observers = [] - for tricks_file in args.files: - observer = Observer(timeout=args.timeout) - - if not os.path.exists(tricks_file): - raise IOError("cannot find tricks file: %s" % tricks_file) - - config = load_config(tricks_file) - - try: - tricks = config[CONFIG_KEY_TRICKS] - except KeyError: - raise KeyError("No `%s' key specified in %s." % ( - CONFIG_KEY_TRICKS, tricks_file)) - - if CONFIG_KEY_PYTHON_PATH in config: - add_to_sys_path(config[CONFIG_KEY_PYTHON_PATH]) - - dir_path = os.path.dirname(tricks_file) - if not dir_path: - dir_path = os.path.relpath(os.getcwd()) - schedule_tricks(observer, tricks, dir_path, args.recursive) - observer.start() - observers.append(observer) - - try: - while True: - time.sleep(1) - except KeyboardInterrupt: - for o in observers: - o.unschedule_all() - o.stop() - for o in observers: - o.join() - - -@aliases('generate-tricks-yaml') -@arg('trick_paths', - nargs='*', - help='Dotted paths for all the tricks you want to generate') -@arg('--python-path', - default='.', - help='paths separated by %s to add to the python path' % os.path.sep) -@arg('--append-to-file', - default=None, - help='appends the generated tricks YAML to a file; \ -if not specified, prints to standard output') -@arg('-a', - '--append-only', - dest='append_only', - default=False, - help='if --append-to-file is not specified, produces output for \ -appending instead of a complete tricks yaml file.') -@expects_obj -def tricks_generate_yaml(args): - """ - Subcommand to generate Yaml configuration for tricks named on the command - line. - - :param args: - Command line argument options. - """ - python_paths = path_split(args.python_path) - add_to_sys_path(python_paths) - output = StringIO() - - for trick_path in args.trick_paths: - TrickClass = load_class(trick_path) - output.write(TrickClass.generate_yaml()) - - content = output.getvalue() - output.close() - - header = yaml.dump({CONFIG_KEY_PYTHON_PATH: python_paths}) - header += "%s:\n" % CONFIG_KEY_TRICKS - if args.append_to_file is None: - # Output to standard output. - if not args.append_only: - content = header + content - sys.stdout.write(content) - else: - if not os.path.exists(args.append_to_file): - content = header + content - output = open(args.append_to_file, 'ab') - output.write(content) - output.close() - - -@arg('directories', - nargs='*', - default='.', - help='directories to watch.') -@arg('-p', - '--pattern', - '--patterns', - dest='patterns', - default='*', - help='matches event paths with these patterns (separated by ;).') -@arg('-i', - '--ignore-pattern', - '--ignore-patterns', - dest='ignore_patterns', - default='', - help='ignores event paths with these patterns (separated by ;).') -@arg('-D', - '--ignore-directories', - dest='ignore_directories', - default=False, - help='ignores events for directories') -@arg('-R', - '--recursive', - dest='recursive', - default=False, - help='monitors the directories recursively') -@arg('--interval', - '--timeout', - dest='timeout', - default=1.0, - help='use this as the polling interval/blocking timeout') -@arg('--trace', - default=False, - help='dumps complete dispatching trace') -@arg('--debug-force-polling', - default=False, - help='[debug] forces polling') -@arg('--debug-force-kqueue', - default=False, - help='[debug] forces BSD kqueue(2)') -@arg('--debug-force-winapi', - default=False, - help='[debug] forces Windows API') -@arg('--debug-force-winapi-async', - default=False, - help='[debug] forces Windows API + I/O completion') -@arg('--debug-force-fsevents', - default=False, - help='[debug] forces Mac OS X FSEvents') -@arg('--debug-force-inotify', - default=False, - help='[debug] forces Linux inotify(7)') -@expects_obj -def log(args): - """ - Subcommand to log file system events to the console. - - :param args: - Command line argument options. - """ - from watchdog.utils import echo - from watchdog.tricks import LoggerTrick - - if args.trace: - echo.echo_class(LoggerTrick) - - patterns, ignore_patterns =\ - parse_patterns(args.patterns, args.ignore_patterns) - handler = LoggerTrick(patterns=patterns, - ignore_patterns=ignore_patterns, - ignore_directories=args.ignore_directories) - if args.debug_force_polling: - from watchdog.observers.polling import PollingObserver as Observer - elif args.debug_force_kqueue: - from watchdog.observers.kqueue import KqueueObserver as Observer - elif args.debug_force_winapi_async: - from watchdog.observers.read_directory_changes_async import\ - WindowsApiAsyncObserver as Observer - elif args.debug_force_winapi: - from watchdog.observers.read_directory_changes import\ - WindowsApiObserver as Observer - elif args.debug_force_inotify: - from watchdog.observers.inotify import InotifyObserver as Observer - elif args.debug_force_fsevents: - from watchdog.observers.fsevents import FSEventsObserver as Observer - else: - # Automatically picks the most appropriate observer for the platform - # on which it is running. - from watchdog.observers import Observer - observer = Observer(timeout=args.timeout) - observe_with(observer, handler, args.directories, args.recursive) - - -@arg('directories', - nargs='*', - default='.', - help='directories to watch') -@arg('-c', - '--command', - dest='command', - default=None, - help='''shell command executed in response to matching events. -These interpolation variables are available to your command string:: - - ${watch_src_path} - event source path; - ${watch_dest_path} - event destination path (for moved events); - ${watch_event_type} - event type; - ${watch_object} - ``file`` or ``directory`` - -Note:: - Please ensure you do not use double quotes (") to quote - your command string. That will force your shell to - interpolate before the command is processed by this - subcommand. - -Example option usage:: - - --command='echo "${watch_src_path}"' -''') -@arg('-p', - '--pattern', - '--patterns', - dest='patterns', - default='*', - help='matches event paths with these patterns (separated by ;).') -@arg('-i', - '--ignore-pattern', - '--ignore-patterns', - dest='ignore_patterns', - default='', - help='ignores event paths with these patterns (separated by ;).') -@arg('-D', - '--ignore-directories', - dest='ignore_directories', - default=False, - help='ignores events for directories') -@arg('-R', - '--recursive', - dest='recursive', - default=False, - help='monitors the directories recursively') -@arg('--interval', - '--timeout', - dest='timeout', - default=1.0, - help='use this as the polling interval/blocking timeout') -@arg('-w', '--wait', - dest='wait_for_process', - action='store_true', - default=False, - help="wait for process to finish to avoid multiple simultaneous instances") -@arg('-W', '--drop', - dest='drop_during_process', - action='store_true', - default=False, - help="Ignore events that occur while command is still being executed " \ - "to avoid multiple simultaneous instances") -@arg('--debug-force-polling', - default=False, - help='[debug] forces polling') -@expects_obj -def shell_command(args): - """ - Subcommand to execute shell commands in response to file system events. - - :param args: - Command line argument options. - """ - from watchdog.tricks import ShellCommandTrick - - if not args.command: - args.command = None - - if args.debug_force_polling: - from watchdog.observers.polling import PollingObserver as Observer - else: - from watchdog.observers import Observer - - patterns, ignore_patterns = parse_patterns(args.patterns, - args.ignore_patterns) - handler = ShellCommandTrick(shell_command=args.command, - patterns=patterns, - ignore_patterns=ignore_patterns, - ignore_directories=args.ignore_directories, - wait_for_process=args.wait_for_process, - drop_during_process=args.drop_during_process) - observer = Observer(timeout=args.timeout) - observe_with(observer, handler, args.directories, args.recursive) - - -@arg('command', - help='''Long-running command to run in a subprocess. -''') -@arg('command_args', - metavar='arg', - nargs='*', - help='''Command arguments. - -Note: Use -- before the command arguments, otherwise watchmedo will -try to interpret them. -''') -@arg('-d', - '--directory', - dest='directories', - metavar='directory', - action='append', - help='Directory to watch. Use another -d or --directory option ' - 'for each directory.') -@arg('-p', - '--pattern', - '--patterns', - dest='patterns', - default='*', - help='matches event paths with these patterns (separated by ;).') -@arg('-i', - '--ignore-pattern', - '--ignore-patterns', - dest='ignore_patterns', - default='', - help='ignores event paths with these patterns (separated by ;).') -@arg('-D', - '--ignore-directories', - dest='ignore_directories', - default=False, - help='ignores events for directories') -@arg('-R', - '--recursive', - dest='recursive', - default=False, - help='monitors the directories recursively') -@arg('--interval', - '--timeout', - dest='timeout', - default=1.0, - help='use this as the polling interval/blocking timeout') -@arg('--signal', - dest='signal', - default='SIGINT', - help='stop the subprocess with this signal (default SIGINT)') -@arg('--kill-after', - dest='kill_after', - default=10.0, - help='when stopping, kill the subprocess after the specified timeout ' - '(default 10)') -@expects_obj -def auto_restart(args): - """ - Subcommand to start a long-running subprocess and restart it - on matched events. - - :param args: - Command line argument options. - """ - from watchdog.observers import Observer - from watchdog.tricks import AutoRestartTrick - import signal - import re - - if not args.directories: - args.directories = ['.'] - - # Allow either signal name or number. - if re.match('^SIG[A-Z]+$', args.signal): - stop_signal = getattr(signal, args.signal) - else: - stop_signal = int(args.signal) - - # Handle SIGTERM in the same manner as SIGINT so that - # this program has a chance to stop the child process. - def handle_sigterm(_signum, _frame): - raise KeyboardInterrupt() - - signal.signal(signal.SIGTERM, handle_sigterm) - - patterns, ignore_patterns = parse_patterns(args.patterns, - args.ignore_patterns) - command = [args.command] - command.extend(args.command_args) - handler = AutoRestartTrick(command=command, - patterns=patterns, - ignore_patterns=ignore_patterns, - ignore_directories=args.ignore_directories, - stop_signal=stop_signal, - kill_after=args.kill_after) - handler.start() - observer = Observer(timeout=args.timeout) - observe_with(observer, handler, args.directories, args.recursive) - handler.stop() - - -epilog = """Copyright 2011 Yesudeep Mangalapilly . -Copyright 2012 Google, Inc. - -Licensed under the terms of the Apache license, version 2.0. Please see -LICENSE in the source code for more information.""" - -parser = ArghParser(epilog=epilog) -parser.add_commands([tricks_from, - tricks_generate_yaml, - log, - shell_command, - auto_restart]) -parser.add_argument('--version', - action='version', - version='%(prog)s ' + VERSION_STRING) - - -def main(): - """Entry-point function.""" - parser.dispatch() - - -if __name__ == '__main__': - main() diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__init__.py b/flask/venv/lib/python3.6/site-packages/werkzeug/__init__.py deleted file mode 100644 index 56404f4..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/__init__.py +++ /dev/null @@ -1,151 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug - ~~~~~~~~ - - Werkzeug is the Swiss Army knife of Python web development. - - It provides useful classes and functions for any WSGI application to make - the life of a python web developer much easier. All of the provided - classes are independent from each other so you can mix it with any other - library. - - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from types import ModuleType -import sys - -from werkzeug._compat import iteritems - -__version__ = '0.14.1' - - -# This import magic raises concerns quite often which is why the implementation -# and motivation is explained here in detail now. -# -# The majority of the functions and classes provided by Werkzeug work on the -# HTTP and WSGI layer. There is no useful grouping for those which is why -# they are all importable from "werkzeug" instead of the modules where they are -# implemented. The downside of that is, that now everything would be loaded at -# once, even if unused. -# -# The implementation of a lazy-loading module in this file replaces the -# werkzeug package when imported from within. Attribute access to the werkzeug -# module will then lazily import from the modules that implement the objects. - - -# import mapping to objects in other modules -all_by_module = { - 'werkzeug.debug': ['DebuggedApplication'], - 'werkzeug.local': ['Local', 'LocalManager', 'LocalProxy', 'LocalStack', - 'release_local'], - 'werkzeug.serving': ['run_simple'], - 'werkzeug.test': ['Client', 'EnvironBuilder', 'create_environ', - 'run_wsgi_app'], - 'werkzeug.testapp': ['test_app'], - 'werkzeug.exceptions': ['abort', 'Aborter'], - 'werkzeug.urls': ['url_decode', 'url_encode', 'url_quote', - 'url_quote_plus', 'url_unquote', 'url_unquote_plus', - 'url_fix', 'Href', 'iri_to_uri', 'uri_to_iri'], - 'werkzeug.formparser': ['parse_form_data'], - 'werkzeug.utils': ['escape', 'environ_property', 'append_slash_redirect', - 'redirect', 'cached_property', 'import_string', - 'dump_cookie', 'parse_cookie', 'unescape', - 'format_string', 'find_modules', 'header_property', - 'html', 'xhtml', 'HTMLBuilder', 'validate_arguments', - 'ArgumentValidationError', 'bind_arguments', - 'secure_filename'], - 'werkzeug.wsgi': ['get_current_url', 'get_host', 'pop_path_info', - 'peek_path_info', 'SharedDataMiddleware', - 'DispatcherMiddleware', 'ClosingIterator', 'FileWrapper', - 'make_line_iter', 'LimitedStream', 'responder', - 'wrap_file', 'extract_path_info'], - 'werkzeug.datastructures': ['MultiDict', 'CombinedMultiDict', 'Headers', - 'EnvironHeaders', 'ImmutableList', - 'ImmutableDict', 'ImmutableMultiDict', - 'TypeConversionDict', - 'ImmutableTypeConversionDict', 'Accept', - 'MIMEAccept', 'CharsetAccept', - 'LanguageAccept', 'RequestCacheControl', - 'ResponseCacheControl', 'ETags', 'HeaderSet', - 'WWWAuthenticate', 'Authorization', - 'FileMultiDict', 'CallbackDict', 'FileStorage', - 'OrderedMultiDict', 'ImmutableOrderedMultiDict' - ], - 'werkzeug.useragents': ['UserAgent'], - 'werkzeug.http': ['parse_etags', 'parse_date', 'http_date', 'cookie_date', - 'parse_cache_control_header', 'is_resource_modified', - 'parse_accept_header', 'parse_set_header', 'quote_etag', - 'unquote_etag', 'generate_etag', 'dump_header', - 'parse_list_header', 'parse_dict_header', - 'parse_authorization_header', - 'parse_www_authenticate_header', 'remove_entity_headers', - 'is_entity_header', 'remove_hop_by_hop_headers', - 'parse_options_header', 'dump_options_header', - 'is_hop_by_hop_header', 'unquote_header_value', - 'quote_header_value', 'HTTP_STATUS_CODES'], - 'werkzeug.wrappers': ['BaseResponse', 'BaseRequest', 'Request', 'Response', - 'AcceptMixin', 'ETagRequestMixin', - 'ETagResponseMixin', 'ResponseStreamMixin', - 'CommonResponseDescriptorsMixin', 'UserAgentMixin', - 'AuthorizationMixin', 'WWWAuthenticateMixin', - 'CommonRequestDescriptorsMixin'], - 'werkzeug.security': ['generate_password_hash', 'check_password_hash'], - # the undocumented easteregg ;-) - 'werkzeug._internal': ['_easteregg'] -} - -# modules that should be imported when accessed as attributes of werkzeug -attribute_modules = frozenset(['exceptions', 'routing']) - - -object_origins = {} -for module, items in iteritems(all_by_module): - for item in items: - object_origins[item] = module - - -class module(ModuleType): - - """Automatically import objects from the modules.""" - - def __getattr__(self, name): - if name in object_origins: - module = __import__(object_origins[name], None, None, [name]) - for extra_name in all_by_module[module.__name__]: - setattr(self, extra_name, getattr(module, extra_name)) - return getattr(module, name) - elif name in attribute_modules: - __import__('werkzeug.' + name) - return ModuleType.__getattribute__(self, name) - - def __dir__(self): - """Just show what we want to show.""" - result = list(new_module.__all__) - result.extend(('__file__', '__doc__', '__all__', - '__docformat__', '__name__', '__path__', - '__package__', '__version__')) - return result - -# keep a reference to this module so that it's not garbage collected -old_module = sys.modules['werkzeug'] - - -# setup the new module and patch it into the dict of loaded modules -new_module = sys.modules['werkzeug'] = module('werkzeug') -new_module.__dict__.update({ - '__file__': __file__, - '__package__': 'werkzeug', - '__path__': __path__, - '__doc__': __doc__, - '__version__': __version__, - '__all__': tuple(object_origins) + tuple(attribute_modules), - '__docformat__': 'restructuredtext en' -}) - - -# Due to bootstrapping issues we need to import exceptions here. -# Don't ask :-( -__import__('werkzeug.exceptions') diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/__init__.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index 6072b539644b188c50332d0da4554d77da7dec13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4698 zcmZt}+jbkbahG?lNQt^wijq3s+^saG<0Nfb*G(f!N~~0}T~m%)GzqfWftD*Rch>+` z6j?dFC`m6*ee6Sipuf{R$4~s%wk)uS1vV5SyH_9uTaAlRkrc5nMWtSulo3}Z6{rL@RG|iSa9}1V zLj&O^%)%VBf)dOlv;d1i0hZtrEW-*s1FP^XJO@93%Yg&WRd@s(1W3r>1p06a0~o^Z;0zw46kovaQPV#l=Rbba zB2`v{Kf!rWIJZeXw1{)sW@T1Aw>Pa%U;Ly%W=P|7nKclaB~3QN9M-&L{oQ^P?W^{) zed|LDzJ#y7wBRdNI4_bJRy>-8uU9QH$7bN`bGu}bmciY!SnFv1Xn`%l*KCPdtimoa z=iJ7&er~T=@MrkTH@LHHv1RzH>Y>=N*8b-G8;{y?@z-bkc*wFq17D1Oj)wL}Q*J0+ z*=2609}3~F^WMNcj>ALdCWr3*f$SzRayf8;ov$&Mu8#C_q zGQaCGPlSxOU3Wc-l!$8GNDR=7CNgm5hB2^|VG~RDkS9G{jVuye!(EZMgCui(FLrz3 zsT)eSAIh#4R1;`sQFy>TK0u8%c+*eP0S|+&yy;%`*W9<>yz!2EFwjCw?77Fh-W#r9 z%w2!Dcjw-Njy6CqL3w~lFN{RnFhe`ASg@P!?aroIu(Q3fb+@ziJqx~75xr*T&Tax( z#P$X$yNh5wl#Juo6T`}z?Hlj3Z;-`Jc8~=DgY^qblk!gDdl6~qZr6*wfN|nz=sr(Q z2cvOEdj2tKau%VP8IANJhi5SrVK0psscb|c8k5X!#U~+8;@epm0kWF)IrAi=%%Dj_ zt?7#(qCYg|Gl$X7OgiBIgSDg|e;}HesC&0{@#d=&<_(xeH8JV37X&PmM%qTdE z&17o|Fw<3qISfxp=?-Uy#0hywWkNF^stxoQQDiRlIBJNl*`we|FRw7+dnv=vGb&JY zs+4g#AeT^Z^dTzHxx17z2s!g*UYm^OeDo>?7b}`*EYyz*$-_7xGm!OC>LyR@edTadXf^U%zb9r99F_99X~)!odUz1^MhNi3XrQHUBb z>hT~`;VQ_=`e^vEnZwxI;yl4)J5ak^5Y7qaXB^EEMlAMvjLZd0Qbcj&gEoxvnnH9F zAxSe$Qkr_QOT+juA+srC$5Zf9r|Y4GHqo}bAwb0X2$H4EP~aLg7oWn;ZA6JcOKqb| zcoOBB`2Ypj=gROXq{G&B)HxGrf-%lXy^l+@@MNByO78h` zN}~F17Rhik^d*_!NP4I`g9}vkjyAEFxb_%sZufeb^bR7n6DqYQpysqN0WVlBsOa2C z;uFRNnp)F6H=%oaGOw)rK1(HWcDHx8M&srN+D|Y!0%v!;ILI(;NAThU_9(-s+EA{C zdr6)|Wa)u6g5!;1>@_1${#Z(3NRg_WR3xp(~^2u%2Y)p zBQqvO4DjqIY?QhfN?KoPqJk`i0>e@y8TXkAneZ@VKo-pkPn&j3+A>JA>lowcL_(D$ zq%le>25O?D${#VSsYw&XX3Kou@QKhPMvTTNK>r%^9trJD8+SZ+*>LFh`&7-3k77K1 ziL+jEq7teM}k8439Z4>TL8Kq%z@C9P*{H zJq$;RsU>4%!C34G-29!rz5BGYx4!qVLpSbiZgoiGHkOdFLy{Q-X`jujBj?R)7xTui zcf->#CN1T$BN~I5Hy9P@f*BM>fB{V&Fv#aIuzN{7p4!CZ%EJ_$RhaqNi3=Kd;R(k# zxTWtzhrwPRbJi+6#dvw*EGb@r`UwZx#d1Lw(O-R)7pIX9#qx@&j0M43YdAZ;q_sg+ z?kQN;-(hPqkKuEIX>!<{U{qn9B2XYE&EevNfSsz$qOM_6t1yv^DH>IIw5#x`y)%gy zm8mtVm=9Mbd@({%1)lj5>%}xPya}qzfMsWDu?p(p{A968)0o-C6iOE!^z`AvgbM2l z+9>v-+_}(#RC$7;#euIbMB`rp2k+x2Tx^&{Y<%Ywz{Yn?0g7K*qy!}>V_${}-jAz! z#T3?I8;?K1s*71LiUzJJ+ir4jgasb&t?I_8?w6x7-1gNz>Q}{Wbc0rr7?UV2*SpEUwgOyEHni`=1fbOE7x6BSc= z!KjeeC{=Zx(!7c}(36tqRjlZGFt6J1Aj5<=QkW}!^A@Ee5;IBHN_k1J=rAuSUVI6O z2p$pETh08R7Qce1|Gj%%_R{NVm|jDnB+7B^-M7SPbb7?E?~mRd*T-sHN0H-DQrb=j z`OIWPN;z^8Eo>~iW-r+-d)any)UbyOM#%OQv5(Il{Zn$+@zdw?3=X6v?IV1#Jw}Tj z6#-vQHd+&X!5LopC==2Z-K6jKyB@v*nA`X8y?~Dsg={OEsr!(!8Ksc;W}xhf=GB?zBB~Tgv20>EASnW)3jw8THU1)!@|RTevTD>TT`%Xas?lqzxr&XlwW>0? z6SMy4T=WXOu%1f1maY}}Wu(h17>0Pi(WWeAdH7 z6m^_BK%yEhi`S~gB3f~60&N>*f(rvp<*bX0u(qPb%F7aOUBb9*Q4FwFjyG)Mg#iitWVlSL`@b_d`yrG)~ZXP>8#vAb|k0 zfGmk4wbRfu@hQ_|XL{+a(^F@9>9wc+5qs^)_nvaU}xAcV(nV%biEmgR2*x=@}=~i)9TiU~|9&?Ae%}Y-VcSKbG z$mE8oyLGYG-6!^oy-m{{6$iu^#y5CbzctQ>^mve0^mvF@^>~=q^ms(P=^hntxyQuY zd{2)-ieWwi>JG2-y%>-4eSAO06MU2(!1xXy<8NR*32Dc}iS{Y?RQt4hx;^PmGDA$c zXE1*-Jlj6&p4BTl7*6AQ2G3^PS$>Eg#<%DA5&kB|^ZY1(3*!Yb;$Gx8xxeTlydYPb32eC1cNm4n6waT}}tkYCML zeTTpI+^XMyZq?VaRrmG4KWJL~I==xqKjduQn7aFnAUgL9m^75N8bl376Zp|c?Jink zquVg>KAZa+I>pu`P3i8tE9cU7=UgY~%mh)A`e8V8^ZY%-w6@G=Bja|5pvG!CF8v*?}zV4IBN^(B0` zWPW2b8MnCoq>@^gvwQ3#qsMxzX^xXIl;*nSiDYsjnd+L;PC=G1TSB`;WKW>mFdiNG z(%fX5@b4SuQ(*Y8K_otdfqi9aJ2bnciR8wFoYQ~;n$6kssuVsl z3~?m(ch&1H5s9^qym^LL(aLSsz0?fWymX}#3QvlToV^~#4L?k7&U*UZ^R{M+@25(t z>UoXOPZG~l70-+Ow!oFW6bF&2ifE;cO-Y3s^0Y9?lqpGT%4&p}p-nM8p{;-j5Nppn zO>$Mx8LZ4|_;;P}lMaN)fTm1k#S2UNdWVsz`XG%{#Do-Luu8eiVkhGRK^tmqizrPz!nvQu@;u(_b7wY_4(@m7 zK8`1S?inz517%;}d7@j-Kj|3&B!CCdnRDIJO4^)x4^r>(ypv1LDMXjS^1j*uVVRc$>6>rO;|8ax)cN&w?zB}}(8lYarlREby`$6=!C zD;*Bw@QR0W0u&|TQgega^aN=`jqS$Z8c9H*#9+gwoWfYBs*i`e^vX*CyZ~W<1Arom zqppy#=e=OV_HNrS`sxaJdJz!AUkOL9rWFxqlSWJ5CZZPbmui(?mrlik>u1e z(lXL4SHR0vFW|73AYG>$DVjn8r(y>@)mYnK7G9{0D(oxrXCxNwy20cn^aK0|I-1`k zF4El7Zy1?_mM2qk-0=PVnfc7v?e5xKEZcqO-Vw9T z$8i|O$ckFdC+q1VrZ3i<{3lmJkxV-)otE@DXyN1B79C#-hcp~Cf^@d{ppc$cL`ou4 z)Zj;a*hjG6U@7aFc~r)k?i5eEijBn@jBGspF)p2^r_gAy`TgA2*m{(WN2Z;1sPvixXWm9#KGhlPusxESAE z^f@A<0c(%4Q6|ZL3fT#Xl$&XEkQ-R9K(`3o^H6)rP(dBdDk#cmKL>Kit9F~8%5~br zMl57Q00{lv>_a4WGRt*>rqhX&Bv=T6kO%3akgG^nri+aZh5r};NF6`v6WKxm1)D1L zmC;hezs~&kJt15sg%EM=xY*NH0s?BQdHpg(?a zsqKY3q64ZVfwGt~N;^P7wlGl=f?S|3?Z}Uj02KA9xYMCrXJt0U17&9g-YZmIo1jD< z>vb7P@+YeN8YRo`eiWw?*7b^o-tT`LqgSu?{_tZMxwY3U`M&ORdq&<`SqnjH0Hr2o zwOLZ3i_!~q({fdgQDFvO0Yls98=D5oi07pePH(|)EF%S~uLkMj)(n+XX-Adx{^D|B zrw4)0)Me#2Bvpo4DpsV6dqlMJ7}U@m@<{g|WF}e;ktRkL3P95;3d^F(v#_XoiZnL0 z;1(dMow)(ZjpYTRTK6(SUXi?Cq-SIsSx3_7DbnSs3cHC~*ShM~foQnkd^5(6^9zHkA~SFqWD7+ZO)1XYcw^6sJx*SflqHKgxY1 z(xw*5Ow?A+WD75#tez@s%gmHUX}{E(qr6brRAEA)@8iZDLh3-i!W{|{k8&iW7P7Td zjg%$)1ugTFb_HIthVV(=asYe-8%Y%#`S#2^=`dx^$uB_$$RHmoKcwsL2~zSSy!3ap zgph5#fS-d$1#rf)(1@)h-)P}fA`6mz?%T2S>T*z+`v+P9rP`n@1(fK;|4TfS1X@*V zi*_v69|vMp{sI%3YH6pT+LuQg3UU8L+a>(%zOAIK*NJ?YK>0SmTo#IQ{~}q)ZVjZS zHv70iCQ3gV3v3Y>pVx2COpd{9VTeeLkWC;Pncc9^vQ!DDP+O@|4uE?gl-Y%r(B7df zcNBITuTo7YygaenX&6^P;@@bQ22DyJYDgf4DQ?pC8&fnX??Bj?Q7^UUWF{T9ob{yzJ$fm-bMuJ|oUDF=dN2(a@(* z(xLB8Qb#qtuB(+k>D31Za)u^nsXK>GmDi*nwS-&KgO((VJ=Mm1UUJLd;6=ASrw=KL z$xB3n0HrGdx32T^mPj*!wC~9>;89HCh}FlLMn7NH8KTb4)Nos%$mKXK3@In=K&^ov zDhsCoIut64P6Eo=L4Yc0DU}(-@)5BnplkycfjvJByxxvEs^y!6{p3&RDgc-MnL_v^+vLK7H zO%ux^f7{A7{mrnqId?2$cB?X6q*{*H26{_v?-eqFJ( z?%;XjbwR%Iy3l%4eigaDB;S-@lW)o2k#GN&qx{w=q%0_}$ge*Y0q@9fJheTw#f4Aa zEPq#iQ~B;~s`X1KdrMhTzWY>sEcE_$K~Tij_vE+G*7tb|`DLH{z4F`qi}LQuzF)VM z-$@Db+w$Gd1^KS>?o)gDo^lVPdry8xe)n^sd|$pNzlZnx@_qSzyqD!=`2)N^K&=(| z0ct(qwN~VZ@+$Hl$bLD1_d_`-hwxsN!}1#5etBKqz&jvs$`QPS@?&{Re)PFm4#~E> zu>8^Fe|mlR4Hed&DE-E2Mb#~Z>5|5?fBeUOUY>v4R83#Uko%hA>oQ}Y%8Kc`tf`HC zeN&NrO-1V}%=AgR?5i2NX-T?euFe~HR5Q9`rZ$?^Bj5YAWnU-|T=P}OKC7wt3KwJX z9V=4jfzMPFU-aa7=P;M|)eVMjnc|ZbOHwtoMuUH(sWnA6l}Enqe0*LZy&Fqp@`;~Q z;W_bUW?7uQT2Q3+zA}!hHA^*giH(_OnWHota&FFL#-QwwvG5m`HoRV2nRg>C33#_kQBsRmQjdJeJUuVmXuV_dQIQ)>q zyBwZ9_aXoJFB1@eGI5^W3xtiCOOq^B51Ox{;Oy*&frsHw05<2qbRzeMXJ?Xt&!%U~XYZeVe0F~JqqC1bF+WEg zzOe6qoPFF@#!r6u=|>-ava)=U_vp<0;3GWzlh&Wm29oyVDuXibzW?!~AAWjvcK4I% z+1cvy2X}qbZSo;OMr=Bee6ITo7#&`Yad*QAD7!+@@SM7JN{G2a4E1PC%= zF2u0C?6O^U;O&r|*j%oer*fd0rm8n;L|yvPo1PdRz810wOj~B+(G4Fa(O3SafPNjO zqSe{=fyBYr5x>>x`nziPp-LM`(;jYy%#k)~G5_Uu@n7y?|J5E|?T#^o3RAkQQh7{0 z(%=Pg^6KTdRxeBc!~vqA&U`L>M9U)cp{W-`WN+hh=B4)Jeod)VKF0TDf3JP3zj=9P z*-3-br4Ep(;#{5}y;!OA`jR#;VRxyUcfZ{iCk%DSz6bCK52vNa=CSjftJ%@7%VH26-~p03lBnkv^5&s(^3m{$ND~trm3p<`e zJf;Re-#`gxXvgHew9z1yU~rj!sT-~ojZZTgkcq1q zM!TWxxn$nu>oa#{UN&>n8=GggfN7&S;LjY)FszxU38kVz>dl;*GElUcD|2|9PaMxY zCNO!9V>gpLoL$db3|eGojz05BvV4(d%jkFJVy4B^?y`$Lq)&H8F-=I@nL}a?bLMIf z>CHmC?4r+?7sWxtO#{Qc0U+2tqDS=FZ(~XD7FiT|SM0cek3~YlW0D-0v*S}6yD=47 z;<;eiT6SW?b18b7s^eE}ZwP0ObNiR} zFKx8E-OuX6xx;c#vB+Nv4dF|1)UrJE1rz4eGuyfI++{6HU6vOu|2gZLjD`KFIKDA; zOr6h!JHi{nxw|0f-*X7oV%y7pU&MgH3NG0t+v@gnPf5@hi}dZDy6O9w*t$OD?9v+* z1Z(M;hXc4${(=8J0BnN7*^_4Te) zYx}HzSL44zS=`xw0RTHYqVTn12lwl8y>p~!j68+5@?Db=FftlZ*dF}OYM4!7C6o-a2&vSc0p!0n{X^n zP~AJVqfKCo0?2MF0`_hb@uyzhP|Pg5XA6qn?24{WOWrwc|Bp}6{8ZcKUE6VQ;6VkmobWmw^x%zdF& zW=^0pX=YdD(ab@@zkCf+wIVBZsjpcx_eG+7gX2}YhN*JHOXOtfyX_D|1Lp$@eR~fyx!FCdKuUmZQ-?QRpjK*9t*OlH;A610 zPE2gE7$JF)b-~s%yQb)jL_Pa}iX571Vv5Jm7M#W`MMX&}a&pFAUYI$Er`ZYR*^xK% zzMvHB+c`B&mZ6HI99Wju#(1R;C(W{h9Z`OcK%T%c0Zy&mCO6fvX`L?eP8FPX)_!N0{2-@7eD_ zv`yWz;}$gA>%zHb>XDsDJCRKA7x=E}OnOGdkR|RJum3iK@Q7RhzpnnddZbMtb4-9Rg&jEido|XLh7# zi@?3=ml37NFf}9#n?<)6i9Wa_hQVYNo*Qf_-bn@D%hzUhu+q#iRlK z4J`g0@hxtgEQ)M|{2CQr{>Vr80UndU3p*M%v<>$2k_;OfZmLs$1^UK~l#A;Rq3o8u z@-^7l9(hr|j`xCW$0FUBeWya6T(nk$3O87m88E1<@nmyb!ss>0#2R3sKD)4{BNfwC_#9 zmKBI%K;+DYr|TP=Z2@a1b3Ha&ko%qPMG}^ZTp_0pCQwB-YL&{edv0Z4?Nc^E_lyJ< zn*v}djoQnr0;5{hRjX3@Jz$ti0D{dW&i@{~C*S+Il!7ZTuT~?TqaUphaV4L(h6HR9 zQWuL;%n6$k->^h5f2byV+YMU<8xlX?S zb^3cfktJtif6R;q zbs=FZm45+jlXjfIxt-$Jcr(3N@luv0djA=Ung; z^v0>PY=1$5nUi~xFEa+_4fD8C`2*B3$+i(NUoujm$$sHXd5tTJh_=DiOy9!?MlXDO zrZgwa46~9Uqu~$yi8EuLqapSa0y_kV+m~%Grt|VV;48|CraZzOZ9%7w zR_9(aY~H))&Z*OKV%tBGZQy4JKX`_)gCPpJhuHJM3bnDE#Vt!XF)kUckoJY{Chyvj zIZm?I(H9w(6jy_32F3Im>^P&XDu@9X2r)G(9jVKTKx2CZXr#c=l!l~TVj@IGt{{)i z!S5EUGkdjPFE1cYGDj?vPf3Dg=B#x4W^?ACD&HU)H*T(9wnsfH{}mlwNCy|J7|2f> zEElB6x^W=IeiIm16eQP<#>OdF26vII@)Q(o3*_8!8wIgxvQcDv+inIBhj7m=boyp% z7dSTA!>x8fb|6B*+n_bTYS`feKtzuIx9pgT4lr+9G_T!_U8$O05%kv zsq9Mv#6;N2Mh#Ik#Hz^hkyx#XEWYZL}`_oS(kWJe|6b2cQ44aow;NmDE&)y1xH{a%6Kj z>^8t9?lszY%R z{T&RB{SLs)g#Z>#r`X@d$2Td=NDH&SPv9RAND%nD1b!C){`Nnl^zRYiZuvi=)JvSW z2%G1Ml8=azcYsB%7FnyHqSFf+&f^wu+Sorq*%d8;{leBEDG3?C4SBN7E_4jHe-KN0 z0LnpYfp+klVZ?)%rULRK#HE&P9wg*8oh!q6>Cs#aQy-iZe3|o#MY`K}f6gfPx$h-i z3IyzU3FmqYKDCeab)7JI+yqwd`^xCi{G(}@*79Y{-RyU}2D5Oih*LtGk9D;%)v7XM zh=$BnU&-kEO!%!D4j!d};xi5S=}q3U+Q!k~{a|QwHGqHcMe8_59IWz=sjvGaiN^4J zee?x)QN`&d9bO^?sr$O%d~05OF>-{qF?gzU|D|@Q5`sVm=4gGJ1TSI2XeXwhbH%S9 zg<}=Y3okAHYfvq1SX?jFFK!)qwd!bkhx!jONBKxPvy;^V8hv zoxO$Cg_}**0Ah&vih-9{(p2-(70fh1X&1kxZS51UeW&SxT4u?Zmi8W2;W#R*PV?q_>28BbjJQUftP6NsZQoU znFvV=lnCh&CvR00$;4T&(rCO0=UpPtMDNw4$OfT$d{RCn8rWE$+~Ki%+E$pz9T5AL z@VfAuwjTMkw&w>x`&#s2oyjD@VUKM!FcU{F4eo32V+!=q?4C4fc=N8{x&NG@y+AeJ zffedi_QpwV(m&jbw-0jJz{V)o8h7>^@x565C~s|-jw9Q##{OF4cvwFQ)oV#JB!!Zb zLAkxs9B8%NAh#C}u0@pkjS?v?*3M3*8H%t; zL@u{hdTVT~pC*%8Su3qgb|RbM%zjK6vG~EpWHic+JClib?Pzy2*mN)RERtUWM+0(cJ|l8(ZfQ% z!_F+mgIP(9`UE;?Od`E*ggzbw^y=?eal;2-T?ZrlxK5m}w4>nTCSYkVP zco?p4l?u__M0Hrp6$bu|T()Z_CWr0fN$wyM-rNghjaa^WXid()%R(OyO? zW%Gt#Jw6&XB(+(M=8iX$wXxC(S;zTUZJ3Ffk@bVa!|t9{Y!>56Ah9`Vl=s@TQQ=r( z{z;-G@1DlmUbQ%mY$gjEt#v6?#!ZR%wh=9d2YN?qkJfr?or6wHPFwm;d%KuCh~<=? z)y${bM=J;MVmck`7Khtrz*;ePn`V61YqhqwBL~A?>8P6?H_Gc9EVr}M9j+WkPsgc- zl*;WC#-XEnQJJiikB*Lyx7(duQ9kuYx6;F%jbf_YO+?El5oWG+6W(BMEqN3^8CsFt ze!|Mt0{$3_W=;&n3@0WB8--FWIX2s=@&+!v>=hJ!JD%Tc1~TFb8Y_B)mo+B|JdN^&l+c3Ruq-%(0y19Kx73+UDHFxjc)i>20N zdq-9iEhgnRv#C_5wX<{F-NUBHc=xms3wKZY$$_?ANbjW*;Z!Xe^an?ybZw`j9j>IK z#cGokrDo8IZ%k~R4Cqw71!04l8)`S*0ttoa+@7=R@nH^vSLvs**%fV&4uDT9GqbiPq$_*6e#*N6ljGwB0(D8`;p|*49zJ*_8*yf{`D#yX*af;kadmTWTTJ zE2Q$OBxR!$quI(zdhs+}JqV8ia>i`$nNlnU(3K^mHuv1E|tsG3EBWXij*%<8}wawvSFLk&Q9&Kf$axvmPVC9^Y zEO*n&>2YayE9sY8rHy#}^wbQm1@v;NGi34JaZFWv@pY}=3Lj2}-Of==J!(Qc8^e=Q zA{thMg+gkWUh}46R^B*VD^_>2No7BE5)2o!?Rb5CS5`aeZgilA+Nbf;qw3`FP+HrM z77vnISM@hfBgu_j?5k1;+Ao~#XZDZ7syA0^mU~wFsNBnMhmJade9CG?hnuMf3Y;ap-}D+B_G zy_VD)cKw5JVtag$@1B-RW@2}5Et-{fI;U0_3!t2?$D-*&D{~T^9B-?`NHCRd!~(tk zcv9b}c{5s}txxupn7OxJ?{`DFH8~P1r81kFo&NejKMbDqs`Z3c-b!rLavPKCP79~` zTiQ4nsTW&iBdf$)+5SW;RFlKJ7krRyH+3sHXxD<_UUe(5wU$n=XIM0x+3khdmXgtp z?p9o#6b^f_M0K3oPVOB;haFqtSSn~lq_rJoP-+H>>Ymrk1)`^?JN;Du;BdEI?H~CM z_qW@rTx=t=x7Ob@tJz|tn)2)GP-=%q8~&1iyBOXb=CtFyRJF?8QhGbGu9d8IyV3D> zgT3N@INlF+bhf^mDRz$io00w9U`P)J6UpuN9t2WgxHnEKTL*(|<|I`z>np*{Ku40s zIb$5sPI9T8=&sbwcaOYnmWcN=#$IeEqm@g|{qA76)-k)Mg;CE~3$E*tT6`mv*;+}| zcUW}LJJNSEdEALp+MBsj=!6X-`pDE%Qn{XEey`pvR`)hK{;?KJPf9(r7B5G)j&{u`jw+`V0#d5u5GUe{P|RA0>*2{l*9CHxLS)^-cBo2_9qX5 zgQG$tKGx0LFf(8UeQyWn_1!k>Mpg!g!B$36tDTi>vscV!2jM_z7%y+MqFp6CJZUA5 zjB2AfC~S4ToAuBn-A-i&k!o-&Sd06^19R&r5)Mxy)>SzB(lmYzwwOtgA=&!{F0*h0 zdEwmljLth2*eYBi1nm&ab0AQ+`V1jr1o7#l1MZM~tpRr)VQ$Ye1dZW3;efqCj`w2b zTjv90f%9%CbO1}2Hz?wi9*x1rd`gE{j?CAK#fMpnUnug!ZCu_eT-=33IQ-wB9{aZd zupN{1vLkkd`$c`6&&^M-%$Y|S)o_YaH*ke)iAS*z&oXgQ5H8D$pvE0lr|T8)jVj;9 z`86^%X`l!bi<9WjGd8d6Pep!V9RH&BW{XEBiCn3YKhEuDQn;im)f(d}h1;ZdyFYP- z0s-IQ{@05*Ud2TL>meO$f6eb!`kPiqll~9J<9+;g{4jQ0$|ii2_r&}7@`ZyEd|9fc zDNmwR1764_wI2KDx!%X7HHH&Mm#aRyOLsQ?HPgIH7X_<^JofzvZmEtNsKNE_$d^(K z)=(w7Kg!hlhdx4oC~0u%ANg>-6b`|MzH`)+P_1TY27BatCmar6Ad>Haa276fJ;EI^ zU76!HgBN`~G}Q^5&~TtT`q0>1!W$6jp2%>8D30>344{<@z7iFC> zd_lF2Ydm#dc5F4_ArF-*Iopb6bm?lw>SKSGsxjrsJ=5#OP$-Gl#ZdV2KVffiZqI=E z|2*uUe2IPLCs*}tT;IM06@>Dje!uANR9Snu}Nf3@SDQu0iK)u0AD4My4 zxXO%mV>~KOLha&C09{$ey#UQ*be3Db0l{){&6`|H$>OIejDmoS;^vGFF&NQ?Uov1p zq{`PTN~dd$Au8x59V<|2n}7x|vm?a8{syJ4^NYqfZ?VuR?#{_-Lq%+mhra$a;r|*y z*;Y|!Zt5Jt74{b>`!7-U?Vod?L!o&0X(G3Mm`||34y>7LelLt)@nr8%fdm=Y31gt<#{~6h5CeuVCDemq=)`=!*bE)bMTWO zq#^PVsR#EUib;Qu?M?AbJCAFMj)g`04Ufx?bGBDJanFq#0ne+RcRjD+|GMYZ{|6wg B3uFKQ diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/_reloader.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/_reloader.cpython-36.pyc deleted file mode 100644 index 4695eacc96015ce08f6017c263d38c8a673ccb09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8851 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 S)f?azn_r%>P%sh<^M3&FghVL- diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/datastructures.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/datastructures.cpython-36.pyc deleted file mode 100644 index 5c3a15a3958d5be508b51bf634defd025b9b2ff6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100038 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 Cb=oHY diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/exceptions.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/exceptions.cpython-36.pyc deleted file mode 100644 index fb773806226d4596e1bf270c81356e463265e454..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22932 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 bVh!%+(u3Lj=wLdN9e+B1U=Xh^7)k#h`%<8! diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/filesystem.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/filesystem.cpython-36.pyc deleted file mode 100644 index 11ed599de0d06c8e830307c1dd026c73175d16c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2209 zcmZuyTW{Mo6qYR6QJf39Zf&tWvFJlLgmcl5Y(jslsmPwDK z;y7!!hxE_vFX?H+p86N|v~wssHnu7uCEm{E<99ya-`J>rjP~FB9(ms1-qKTs?+AA+Sw!)$h9*cOy zS1-bLm95e>R%L6jy3R^1ueN^vSCzms;d*$^vtGR`Qf{Wk@{ybW?f*~JE&NQiP?;f_ z6{)a-8`4#p*ghwzN@z+JcIw4}Mxw@3EqZ<1Aa{})xwmuoThf`jBPTQOC34liQG7S)^%o5RcDPL}YWt!NGrs1G zBzN?5Z95uokHvUPNMj-4t?%xcv-E7Bx90@d zp7U^fi9h3Mel->*cHZN;)oXZV>(F_X$PfLJf5qSQHC|?dlk*2}_z5&~1v>6Q33*sP z?ZDAL$ZtH=YRKimCGAhBmVowoas*tS6axatF(m6ePGS`?q9=jqlysbhWyX^ek)}jR zxY7=H@H+!aCY+1`a-B&lM!enxETcF^^x`q8EXD8jIQ|7VFdokKqEkDV=auC(jg- z%3>Ua?^Bv)oX{RcGLpjIZLA4_C$92@WeDhVIAt!}G<(tO^ac5%}to{PG kqm!k8QHnJRM;<*c!41xl=vjsO4v diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/formparser.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/formparser.cpython-36.pyc deleted file mode 100644 index 9acd2b6fe9033e847ce8a1069ce77d80d6c17d05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16155 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/http.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/http.cpython-36.pyc deleted file mode 100644 index bfb205842fc7d0ca16948274fdb3d3320e08362e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33461 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/local.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/local.cpython-36.pyc deleted file mode 100644 index 2bf44dcf111f56c2221989f0a94fc184806c6a8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18678 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 DlMtxm diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/posixemulation.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/posixemulation.cpython-36.pyc deleted file mode 100644 index 0608c3d9d77d18a864704858f034944ae6d15038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2770 zcmah~&2JmW6`!45eu$!ISyJr8P3mb27iD2fvQspM(7K6LDpp}jg2|Nbq5!?(45g*^ zgPs{mq(J5n_Rv%RhMo%K+&`fILeb+Qw_d8=dMygHzZsH};sodp_RYt8Z|2SKy?O7$ zrKQqEar?J_St8``ptjI3RGr+dr4JsZ92zc-V*<9}y1df)$mSNsyc!Iz=4)FjE8N5pqeO7gD`G3_@b zp|1$P$ydO?n;4t!`gg4kt&{3%@MlU$iQzjF^5k6fkJfvs3I`(YM}ZF0#PUA>_OE1_ z2Qobkxlk-%2mAHiSL{-kbyCSx8VlADf$mGl=;J`MKnf;BBu;}wGo8+kKV(6#7lmzm ztXgNRaV%IIgbC~QC5#d*gnr6Y7(=WxWUAlmrBa(y>=tUMw1^ef+s7%C!H0$!B$y~> zZXN*2LqKfggzRA7b$i&ZW^s6QtZ^U^5x6$MP8cFUNOmfu!VLjNhc)LxGDT~vo%V*( zXl}6|wX5vW=EI+`LxY{T6lDz&#P^vJf_?H?rauI<%p-=c7VcS`my9MGzhm2}$bCt*9~0<+tIwq>B521H9FU;wk7j3&B` zc(D*H?0e|GGO`Y!+cy8i21XB5r$e6y_Y?6@+Gz)tTX)xZo;GjqU`SM?XdvSR1 z3u&;g7Nv_$8Vj>ZYxG*dLy+_dJg~559T5HlSfAgRhbgj(Nnh3vJF*OeFMV_IUwqYK zw$j>0TGFB+gG2>3$7QRRUYV~7E^k0vE`u1AG>$_(XCi6Hn})k$xaHP%ge3k9=_nG_ z+%=C-WW!Y>w`Ry&v29@e7{B^H2yxb|3+T)tC5Kw~z%A6c#iP>5U;4$w)@}SY`u~K1 ziGCa96@$)jSv%cX+&cut^9zq?7sd0B4x-p0=ZO2Rr@e0O#FbCJfJYJgCfcbkb{8hJ zLvI0jyN5G!C(yXQ->`yN3G492v@q*M?EQ!9g}I3WZG1hZpQB9MQf<8E?wuFzsR#Eq z9}leis%0B+8BJA|pZYEep-w2^HRHcG*?W1{?HEG6-DSnfF WO0>9K!kTFwEw5FaJT0x{o&N!9A-+Ta diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/routing.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/routing.cpython-36.pyc deleted file mode 100644 index 31ff9e7ece44efea7d8e185347d2e0f40d0527de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60152 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/script.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/script.cpython-36.pyc deleted file mode 100644 index 036f08b40fa84d8b908aa30212ee14a9afaa2dea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10068 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/security.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/security.cpython-36.pyc deleted file mode 100644 index 8986ec11f52098ffd2d83256c9ce121784af23eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8520 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/test.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/test.cpython-36.pyc deleted file mode 100644 index 12965093d6da48c29a9049c86f089e12d824f28b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31038 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 K@;IvIcm5v=hgH!4 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/testapp.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/testapp.cpython-36.pyc deleted file mode 100644 index 22ffcd5f1c7a85d87f165e61f71f02e0dbd59308..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9427 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/useragents.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/useragents.cpython-36.pyc deleted file mode 100644 index a556748b0d69ac98143f18601953e2e83009c06f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6044 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 LqA_i(S6=)-fL6^| diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/wrappers.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/wrappers.cpython-36.pyc deleted file mode 100644 index 20b86ac03f6fa96a8c32387fc8a986e96ffda167..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76412 zcmeFadvqLEdLP&?G#ZTu!KWxnqFU60ghWD=Mk8r3l12~+ijYW<1A;@TrBQdIt3Wo1 z?uM!wBGCrNoG4E;ca?WFC(Dz~-R0fQJ>@;kz2&{ledT@4{pJ15 z1LXtFd&>7T50(!$?=9ckJXAi^ysvy;^ZxSv%?HX4G!K^#Hyy0CV%d8~Y_IaQu&K3;yj`9%2%`F>>Wc=JU0M02`4 z-F&kAWb)=Q_ZK#Ps{JcwNEvlDL>QvbotZGXUoqvpDRDte7^jA^E2hoG-t{) z&CixU+kBz?Li5G)i_MqHFEu|`{#^6r^2^QH@@(^!@+;ED=-OQKRQZ&gkFCu&PnSqq4JEnGk9J%;PYVH~q3-xm_r);FnK%&)}D5{I~p-+qrTb-+bD87T-MUf5Cs-f5)%-wcEpG&wK7- zYU=q~Bb!PUOZa!g53YCpjVsePg4+7JAB6Jlm-_z|HTKzhE$QDeK z(+Z>6RtZ392OSQ?^U=?>QUgQ9Am#49q2Q-_-~#|&=|-b-Rc^U_@zn+Cj^BE(5nxD! z>x~BbQmX^VVd-k)%GDEVfZ1AUJ!s$D1PFaJ!nZ^NG84d;8@S`?joMm?&6hCQYmK@< z%yj&0R=wS1o17*2vb0_c!f1l*B-lR7U{`!;%k$ZkhpqtLwN}ZtZRV=6T3T<1 zVPge&NI2oT(J3`+*Zr`BsS14zPuiKOx7RlVK&~@WI#!=5J$>@2XDouaF)sVH=5ajd zmu4?5pEqRW`7&i-++i$!d_7?_}1R|6~E;N><@qI?Q4V; zOhbDksQZ;>+iR>ge6KgQ(Rz2IZSN_@&L_30(C_a>ZKHFw9W=UvTecSu=-oGN+^Fz( zEFmJFZ-3q&_|5iv=n1~>Y?^Pw-adV*z0QRl+MD-!8_o4f-A;01?m(66{PWT z_v6_Hx?eoEaBhB9mPK!T?kWM=F_#l((ZdZ)i@DynWO&pZ7Yv%^dg<+5QZAPGa%>JP zfW%&2ImUYdIT>+pvH?g{njCEfr_B&6cdSAXnYo!7=@l^RE1MlZ?2Tbg0bQAh5X;@a zsgu$h2VwKCpe0UG*xP#}ywXs_;q6|nRrh-n@+F(r#)?EHrLkzLU1?#lz32CaU*W43 z&eutB_%DqQgwxck_=Nj#5D_)iOxGZyb~0P3?@B=&$acf!t6&qW8?Cyq(7<0`tJOh3 z8=cT!TP33dvD*L^zBS=sFUerz4UDe{9g70iu*ahaj4rmbA>up$)!7KJQUo+cun(a1l?_ax4{0fyR`WLDzu=ypbP`mxW`!LiO4YHzj+1-xM1(Z7&sVH9K}$+4 zk>`lmEwb(v|7z{MMjKCTK!UJ+p0@2m6l`2+nUP8N2EcCmBO)^JrHCo6Ul-|T5tOmm z0MWu%SSGl`EzTx#06S zOW*=KAh@sxCtIm&sbHd$CKh}p?QtDt7Q6mzDZB~{Y~K*n=OV$f2M7Rjkm7Ko=|@5k zC8Jf5dO_{iC_jntD?%|B8s&;kscIUmvW?RlLZAoE7+m1xFcAmC>*X*# z&Hm1glb{BmqayloBEkX=sdN$lO=N;Mah{kOc2}n6S)6Qv%v~=8V_xPW&$Bo`$OY<_ z@8cwWx6}A0>kYZ-%P%hXhJ?PJ?&VtTmfyW^q4i#Et>HoL7I8}igs_C~HvFkvG`Qdt z-r6gEf#2JC7*9OYKfryJ`WjZAmE*Kwjw+nMA(bwqbMgTqrh|9z4d=oA8^+no_=F`) zm!B#F{mL0HUCw%$a?Z<^hrC=lkI%4QD3AEX@~A&n9``58yYStlH&ov3)x2S^@P4|y z#~bmA(3SW4`@B(a?0rC`yx%{d8aB@F!MSMJI6vsEh^Cz`-;29N*T%PpjJAEB>e}V| zRmUzrpt^PWuGpEZ( z@vUgf`1TmiMN`K46wXCU#`)to7Y!NbPvBg1Vw@kxxoE>UKY{b-yys=4(>VW(HzVgy z;{3DT3vzxE=P!CM$@x<_|D5--oIj28S??7&{}j&Wyi;=i48}3f`6cfQa{gJ| zbJ=@C?s);{Z%SKb`RzsA_m=mzoWF$gFM99D`R8z6@v3tEvaltuH~LB~^o@8^`#*s_ zUx1be9X4##9hp*f%93)g4ek$0L0xvuZ$joN)x7seWIfR7jn&oC8q`H$R`?AvdkH#( zD0LvZC8$hwidLeiL$(T~SyFzr6Ij(PsrxGH!&Acdj0~l(hHTOZKuf{(K|$FWrxANl z`J9wOzR|Be+ZL+TqgDu*HXS)yty)2)(K$MxH`Vp_`oV6p&MX4ai1v^g zM!Z3bNPD%^Y}^E6D%IYD1wdH5$WAr%7oP^@Ea>7^&^@hta-p*pQrE z4JdW64a`V&Nda3`V~ez7jVzeQYHa$e0y;dV;)km9Dhg0Iuf?^H(bc z-@Fla+Rc(}pF<_sXQW3niFZjyI8_{VvjH|w8-S5AWymETCIg5!?=@-`U_c%ZA|osv z4)=_ig7&I21Ou!9{>_@0o~WLO8!#~0{`ld{j7|%0Uk%VzH| z29D=Abx|VP`EMOOSKBd9JF6J6 zC;}gavxe2eTu;R$BnBpDXfbGV0q-#ytGszon*ac19*b~Pd(;2~RIYAxR!=-%6^I#D zkD*)uV-zWI70pBBsS>-a(Fan)IwXVA3+9XI&dttC)rvE^NL$8IQ>v}BA>k^%HoAlZ zo3g^_Cm6&E2H;VUMR(Z5jwHrmngNB#Y~jW_?Sb;7=dWyBxx%i5n;`@rmE(;R=(Sr% zJ4OhM#J}w%h(HngQ?=`LH6|qzu*<=Qk9VW1aWaZu8ZA&Bth_D;Lq$PlRe_oz%C(@q zVdQ@EEaqgMX2B9o53&@|GOU?5+8b+F)C7gxR3s(I`9?Dyr{DGZ-__dUXS& zmWI5B=dJk=`|(CaY1*aZaF4`vz8TLnr5RCGpzc7Z13_$cxLPgr99zS?$TIDO-4R{P z%uP?1j72GeZI(?*#oIeKqVd<2KB^j4|@VLv#ul^sjrC`yl)ej&A$ z#V=0jne0b<>L&(yf+aKrH7!R&LQum+dC~&NGF7>!UqUWaDn!;w<=5C9mHzW0|9AJr zNbt11&8Y*_V8-x~VXWfhO6pd6^Y~W!8q|Ugh6J4@buD{4b0Bp)oyH*XJ-^B6_2pFS za4yvux?T+6YT|!#N0#@#nQCR;fUb|b^Vf#Gp=$+dKdWd7`c8han>+ewc(j{)>(TIw z-2=xOMtO*fGgIB+7ak2ukA^ROGhKpxC{LZd<*5RZr9p0#_Cc#0<(oc?sa|hn{-#+Q zy^#u32h4J%(gTQEwWg1=oEj8^6%036;DM^09z@s0t(ftkQuz&hA5wo!<#Opv`e1rr zdLliU$v^?@hpRr|;7V%4QL?@nuJ4(uY06SJtbWi37FOMm z&GMo|cm<}vmJ_ecQo^{Q|Xk^$VvkvP)V_m#=Xq!Z` z<)bNZ9=QBOBE|qLzn2$)fMc4K%5cU`wS^c`rs&Z4WZp^21l|qrT-X68hzqum4DsSs zKnIpa&p7Q|4-JHlSvhk~e0tR>MK}?Q1hI^qDrQ+&<~z2R;c?fLWytJ{dH_IHJ9R^n z*?BdWiPA43Qz^tc1OF301Q{p5>6)`W`jR7q9NhH0+P7cXXsp3UGZ>i%5`EVJ1F{y3 zNoq`p^~GvJTxhN*c=BU*rc`>xuh%#^BEDmO;v+&kRfAwvDs>n#DW>S~q|JldR*#seJG%mR-=op_c`_kgt2AG=LkV>kZZ6 zuAoaJTVD%>=JoQ|!P&2b@|ZkP9$r!C_mjg>qHIN%%I|TNi`8ZC7-(SuJSLMaW|Cwg zc7MV|hV?8wGkgpumQ4IHEcvgdzMB4OW;N?&z1;f+7|k+UnXhGT!y*MTPyr=61-B-> zZ&*iGBO+p{aTEw+@H&QrcDdm$(S{u?EiTyQP2+AT3OZ-CG{g31s;=cKgm!s1(4QvY z_{_VmV6LgWaLuC$`)VsA4%Elv?eslh{JB`um@`P88_*yjNfMJbm+{ ze(ISLeXme64c}EQEYWc+gbjF;sZhKALBz#spf?|+QXx)xj23E9^;S!(Fb9C}#fZ&} ztgzDRjDT9C1p-EG1~3L2L~-wMOG{Zu;sJM)U0>rIhLaxZz*6}~S?^wa?!hO#iNn_* z7T4+oNN=Z8WQpB< zTiI*0wC3b_-0>!#!*5^8z9Ayh7F!zfQf!GXr_ZOB$P`s<3eMvFAN~Fx{J|dt@8K*u zOr^_Xy5u#a1SVIJZI*FYFGuM1(ljV<@Tq`brdMM!&u9#RPC{}qrqwZsI+^sL^klk} z?jDcJ0s_hnaPnP&53oVPNxR{@h|V6!zY}?0XA(29+1a#Uit$H8JXILAWCyUAVop|5F`d3 z4mgxW7~^_|WB{FdeXU*dVu+}+0n9sA=D>rz^Mu$I)CwX&Dxf7b@7PrJcuCHH&pxgk z?$P2?MGVDtd};VT`3qD=P?eQ7qFinSubi$qr#a3Rj{J~I&Rrl$<+u>}1Y ziggW|sf@?C)H-dr09{|OAnCD%J%rwBc7VY%N?u!~PoF&b`YRxtmKio_Q!(*8A!C!Q z*@e`^2x53~U!#;GEL1^AsIKu+I%4m29WosO`2$NuG>QAckO6thx$X6Cr3{Jo?0~?& zG1YvZYlwZ_@t-KNP|n#wOQaE;BVKyTKaz6!j!p3gz!RQzxGy?JJcOwPO+(al-7(`b zFcUAgj;9H)6@A{;f~fcitmSNOd!AoX+tFw3)!=7KrE{=5pexlyxN#ts*fI3=B@SIP zFIF6qJ{Unz;K8A8govM7Q#-9~a=>3P0vM?sy-+zTiaoQ4Wf98tZa`D~O2lXBLo^U* z)cXcuN^dL<=U&0WsW)N2*KtBsIs)o3HKZET7S4lPJba0VZ|5PYMfD~nvVrZH=#F@#V4b{=p}cfUu~QPnKik63sf9QzC6T8GIHDh(I5 z8?RB-`+6RzZ32D>#xjO&C{0d%h|{_|!*Xi4cVKYC!Iv>ARR(s6#Tb%Q1=>eDK(JV| zc2gnQL@-&fSqWj~?Cs&VN!;(<VMtD zYz=(Q%@$2sWalzlU&o2Zc}iW+2NQH$(^4h&DcGxmckoO08eF?x4pxVBhcgI^6x515 zEl_V~Ze?MMNL?Ggow_vyt3v_jBe!X$%WUOt=WgX&`|wQ>pHX}($JOkuJkC zXSZO@f)!&}jC;dg{sjnwz>neD28MY~j8L?r((eGa1#$L=(G~@C*eU7c<+~ z7GkR80B$AWv}6O&Qt9(gp|>aA(%of2fll4Oee!@G>|pd~Y0+QWHal zI&Ie!22~dZNVFH@tnia~%tyrV@4N_lIYMYL_zqx358)Hq%ifRxYif+fKSBg{J;rSW z@AFXO;WiIX@UWMMKaN9hNa#xM9wEuv5)oR+4dy5KfOq~e9Ht7&5QGTLh!Z=x3d}P9&#tCW8HHn(KmA+Ym zStPxFU=@@Ou|<=hW1wVECbPF;LV5QPB8hYYe}}QD;6SiQwCiL>l4l^X%A&aoT}cuS zBg{IOi0J_>(8LIOQ-Zq%t{@oxoENEop{wcAiOH@dLzw8{GJFo8)ffrQb&!eeGZnD^ znEbmZJz_%+r=PkYLb$_!rB;sNJ^zq*B=k$q&iRn9# z?(U9Hp1{OS74D1-{G7KfG4C%*vpeuccq5=)AyljKU+_gDv!uKG<1cY{)Y&Hg@h@K{ zI6)RloZyVxxUqD6n7sm2ZBZL~BRrF#_A;H7zTuK0`Zwt@`k`1?`g}!tLt@D6v-D&S zPDoD3b=6NKvS_;YT-GGZP#TA?R$0illm>d|DEb>$w&F&ubR9NRn&&|epzOE_76Jpp zK)r%e2vB;XrG9^$iiRe?IK3T03|#4Af(E9ZLzty&%Mc5O0RqR^Vhwr+6-*btL1Z>` zPRUUWRp~%*ZPC^*RF1dNB3UC@qQ#2Z5Xh%m5=6_js<<0V8?-Wp;wCD=yf+?7PUmzq zJe+A@JERJ#lj3Tpy#SqY9YgjIyyMmZD-s9|2Q*VESC4COhR37NP6^_5Q4(_v zVdRirGPf!GJLL>P8SUSe{;~G<<79IXBlB@Jgg6(WP z1!-5a7F?f-VcaX5&d6p`#CX?s7ZTAQQ?P;jF<4!vUE;+#o9PkR{s2&=3cxv$hh#Zf zw}Q|R+(H-=J2mEk$O*inKhPnLfvOv9Qd0x@U=W-Y(6IhNT5aP^BEM@0uW9*|^k^qE zCc-u-4A5OExvT?O;OLl3-HTATH}?5U^Gk0c4Qpv(@zvlz$K)ZtA+K7e*n6jjgTut{ zS1gh%zoy?g_|JF{$$GGJng;D(AmR&;9^FF$Ych`d^k^l}2+Txc+Tb4vvDVBbw!Z^O z`CfqMmmFk=^XWn%30XetWD;uPq&;)^gmg&66bpFyp;#1xXST9I2{2CIhO9zZQ%;56 zoyIR%x)sC%1ZTE#YG1+c!x|w#6{Pmh(6~@<(iEMC6@<}3y&$tUvV=g(tQxEi%~}Pk zYLiI0DUc9#%aUVDSXP=WE>TI;wFf3@1K!N4bM0(jeWhxh>Wr)|8%q`Or%P)697IgF z>BQuF5`4#G7a|oXRrKPdP2Pm|Qqr*5B@$UC`6phxi_{~o)uw-?CPQa@DSpo>wBxx6f*QAyh-CIOPBYvSnqMrtk(bd*CNeHeKV;pV-P>rrHqCJE>_iiP2 zjK#!l7$+W&2nrkEmu`Uwc%@G=)h>pbWH7 z+PAcHQYA1DEnh|oroNFYk}Qy{#0*9xY}c5O$vy~xsFF*HrNmN=7$oJ@fmN|wOMC^# zZ3(sE&S11?o|1D!r~yVZH8-xdp{)tHV(}^hNDmp^l3b3*rEPT>F(kx*$#g_!4GdqM z+4`*Ol{5_$l6#{^O-D^MDh3?&w#EQLq9oReV7F_FFE++T>!2}ezlQ4yU0v}pg}6^` zV|b$jZqyFA+k0&!p7=MfB1(gt5gbwy!4$`1$h?5y&stbvWNlTH2~0kQ6N>?jPb;W7 zG+@r3IF=!4yO-J+TbFdY3^{0+XJ2bz=UpsjiGV=u3Huwu9s zj%fT22;v~U=?$Cy2Y-bRW`g(nRJ-7>;`@I^TFxBC)V(xBFh2&?Bsg<(aOEar*R0Vc z!8h@^Qg_CBfI5rDNoo%IoUWaM8n_%o8zW)?Rbv$P{}+-(U5yDz4tdNvx$gVx6d;i8 z&&37`E5;Ue?IGrt$fr6o)ZO(GJ%vakguTm%&8|Ho&>AsNjGnL-TM1wwawfGV*Ai)~ zRcg2}oI-eV+IoeA-H3X_#S1|xMr5&8OBc>xTu!t{ul0pX%OIE{W1FG?d=t!SvIPDF zkZcFRgg=b{-Bj0^>=*b*-yPy+ajz3gn4rjD)|)4ZzC_*C49sRFjV|gSATd1Ffytka z0R*i=9HA-W-948P&Z-tsID8tjPQZ7u45W22`F>m0Hh2f8()fuZBfOa%il}PJx6?)2 z{xqVvBwT~z)m*s~Jo9;&#sRwF3eV-H@8emY%P}vED7>Gr5>E?4R`+1h7hpb4>W6xx zgBq9motOLH24L^1=S1p_txI9h1LWAD0}YA^&ovqMJjhxJhB+<;3lnv67*<73w$+a! zL8e-LLG@UwGcO(?)*mVH))$W)d8t~p4a;Z;HeGYwa#()XQJ%(IE~*<0KA062ZHX zd?o0F2oFY5vFel+6=Q*!Bp}CyVvw55F3+7|)R=SzbIuiy>D4a7oMghs*j3x+)mp@- ztBB34D~7lz*C*M=3HIiQ;0dP9GJ2KL5Oo887E&!@b9)hGPWY0$qDX8ZJn4XR*Qa8W zgOI~^T{8DHe+0dC?Zk_#n3NrMO2jn*ucJ(nVri)?E#Ny)S^jj?QQ3WenU2lyG={<0F-S)D;E%fU zF7u2Qgx((U^?e*~^{{#COB}lx6_CxIOLzCijSA+T#Q1T)%14ap(DAGNyZi1k=0mHC zK)Yc^9XlRRYoOZW(oo#Y-W5Ykh_opI5{uKp{4(eK4i>}Su<6igj+1>)4JF5Des^Q! zJ&u*q9;su5#RSg6^-0MAVO)QXu0%xmr>_lp@Uh=RCrGaQcbAmaLx)(eA+`Ynwkc@F zEUQtsFucP8?~?HX{|chz19`^5h1H};zWbplnW_|qWa%2aG>ijl8_4~sL7}L5q6i@U z<7z}w;eJQSDb>Dc{|nko+XWRB|7P46TOI-FIa66!JbhlwSl>)P2_8KQP{cgP5zgh; zs0pkaM`5oJ)Na6G+_~D%rgQxA9H&9hEk6m*Zqm}i8{9mQF}r!-TB9)I0nTa=#T5h@ zfqJIISlqaqq=-E{W=HtEiCcenv15bH6#?@owi(Mpi&IW8=jFTp8ekW^!tPzst*I66=ei5f12ocrnW z=*79Eg$v7-#o2T7GL^wk;JtU8OgNvT$qfDmVbdpWjp~al?9kh8IP#=}n&GJ}n;tN4lG{3?kLAqZhtoJt}$C^0@4tz$if^kV~G zVRQW;ixFnK@0?{8t`QpWcvW;8YYcOEs)*?N|FH+UJe4W$mU*lQMr%7d!jCuPUIEga z&&p5Nqj7^bCfua7_LffwjEk=^j+!&h(aT~+P8I4J0;j)KJm>U}u(=9l&`&l} zc?@IOaw8q;AE~`1F;YjVcUaTaJ79EhNlEo7@QdlGYK%1ACGK{Vubw>7K+RBH&C;iyHK?xk<`6XU`QYqjQz zS9|HZITk#QEQ>g8vOjlcI0maGsOm9YI(8a*hAokR!WZb%(JHjNpo9x5Be}mvG`j5vP?o-wRR>FC}wBNbZ=^guH`ODGk^47>>xm#nWYiOk^$$t zw_vG6LP1-?>OlKdKtnfCzKsT4r3{dBa82tfMd-#lGw5oQ9uoN6H8CID zQIZ!>64M&}l|__F<$Y32@r}yq^Gla!mrl)};@LOT$G1V@A^;$U#w!p_zBtCXGEUl` z%DfAotjrUqPRKAEftl%(!O!D~z6tzh@db_pCX@A-{v4-}FwUp?5>7-!0|i1xdz5h! zJ=hyvnm>1bdA>4x>eLdL8u=OCjI{SoZx5SKdPS|ImLtge`qLXzc~D>WJ?xQ~RECPM zp6-KDWly?$FpgmH+Z~9A%N&T{GoR;VYc!W|_=gl3oAj@kd9!X-ovZ2KzsFPPD2F0$ z(!s2`H_D2TsJp^e{-T9nDx1uZiQQASphA7QrS10LYM!DpA5q ze%z_#MgWVs8{kpuz%Jr@hJ!gnq*(i%XB9dtVq-z#`AS~UoZ-3>dmXU97EA=iDhC;y+g43Asn7 zz+iSZ**;QwtS#LOrF zzlYp<8`cP;5>F%VgXR*yeTZZJ&jf{893PIsF#X>w|+;pa~m`JP*!sW-5MtANs|ySDCfCUb_L;yxJgPQ8n*`=ej#CJz>pG zMg(?$&GrA|_rjSkZvv`R6-hZOMM#lt_~;b|Uz zjE9GK_)Z?E)CS++q0U1Shh71ofH>LN6bnahRB~EWA`CjbOEOZw%(M4-_~Sf$KM#!a zmXO=v2YB|EczBqH4|sS4hw@lFdQ)9C46qT;Y#<(f6EJ;^A-e@Za$8Gd#S)!+*uYRUZB!55I^**@^*VrpSR11uFQ*{AC1-Ul&|?0;jQM zQQl>*4Q`Z2@r6ak*y5ID{yN`P!GVAb37Eq1To(V0%74STLN1pZ%jI*KV!kjrHZpeq z*u$tpd1!2;FkX1DFjg2XWDD7`{kfrhW^C8kp5h~8d&fq{?inkL4UZMahH%79cn;UB zvcl>DdHh$%jE#*A<+6ngKVt}agijk(PCi-JBlJiA74YX}e8OdLpAt2>s*w6Y_sL84wED?36;FYm(Dt6JL;SCeKRh25sI;~synzuVu# z`i>uD%lqEi{nj2+<8i;K@pu4tuxjK3a>qSy?SJclcg8#HJ%~3SMD*-Ks4#gi?m6h+ z>m8AM4(ZMb<@-=2k#!%_s2eFYA5k|__DDe8$k(LCV;YqsUzZAxY1EF~>*_l`gmYWp z@rYJ;EI+K39m|hsRmbw9TG0_zB&C{T`KVTMEFbfvieq_7D>#-P_l6O zwbAiZieG>ynk@}vMG1kS5CB!fdBQcfNDGeDq6gF`CR9u45hIQ?6xAArg{sELK3bRR zd+|bDA}Ap^N=ge#W6+LVr@+lYSP;L9cu-^WhD*KeZK8ZE5)(F<9|`+03!Lb#2SQo# z6NCWuw85W2wn^1y#Qh@$B&4{sS)?@N zn*3Ts&?7|7gvo#cOXFtq0{cQ`k4Wq`nxEl;hWKAa8D_*a^%YxFQQRivqG6OT1}lc# z25&93O{Mm(;)CgdeI-ol2-}fy)2c4LIs*|HOh{|yScQArNL4hGEeWKGCTeBctY>M( zzQNYqi4VHaMK9LId=4dbv_)Oq8fAb$)hrOE9F82(x+bJ zPsuupyvM$&^r9V4;&El zBr9NQK~5V!02+Y0>JkqLGY5Ksb!;8hSc9els4II3p$8(4smy6Go4FdH6l8KK9&|gR z$ZE`Ys%u5YGkalyZ-G}nh#;tBDa7d8(v++M2&&N9qcWPZ%AtOn0*caFqO%}Xvuf{k zHJdEBVgq)zKWMzthV=^C`7lLGCDKu{sIblqtz*x@`C(JGP*89$vmQN!Imm!o1BKcf zZ?=(}VpAeTu^m#7ahzz6>s-4+>1d`ZElGxvEmsi}BF+1Ooq*v{tad7|Y+9(Y4P(%N z&=~O08T)R#ss*47kFaIF>FRg#EBb^=rA(VvqO55{lBa^aRjY4qFS%*fzKOn2&*6XS zH8<_l3;C5;(#;ZJ3K^f7m8K#-NQC+~$P)Rz)TGs~lSNNp5npsA6I5=$gN(i$Q=i0{FoLx*%~EC%lwmSS4!3#YjVRU5T8 zsb@%dYN={N=}jIq7c#Qx6ccAkpivBT29EGPNpa8>bjRnkv_Cl+6J2SqLiDUlWJPw! zDhyfLj@V+3GH~>$yn?HU(My0fpR&CJS(ZXj0?pXFLCq8%?ndE_Zf#WA@{=eM!^RMt z$8zsz%T^P^T=NIJN@O+-7PDoki-=hTe@EIRIt4~eLT9tRstIVt+BIf7<30xgLnGjf zDjLOd>+bAL1 zXe~GXRv;ZG_|vRJRw=ZwSq1)%Y@q~3rAR+dWfau|_|Bh_tFhJ*^g7)c?@V-dts)>L z_$O#-l2Nqj6rN^p$0S`DMnzk5=L898*KQJYVi{LcyEXFlNq|92BE3md)~aF`OF)~v z)-;*0zv+q&UdAuIQN2JB6VGQE2vP{fgRw+r-c z6k)vBL&FBbe>6B>O|~fafPxSC91R?ZCCS)u8Wmik`n?&phJXCa&m2Bd9SDGDB#D52 zOQZGgg$-oZgOV64o@f+7o7w9~o|Rd-exQGc$V*y_*<&>kLwSTXj1!1tV;(cN`$-L4 z+&*eFKZhS;9wPe|iC6)Z*BWJf*8L){C$lj86vDT$*~i*3!Uv>I;aZxdA^UM9Jr1U7 zw6M4SYPgx;e*)|z(Av2K*^9o3?2VIhIiy+Pl;-eYs(|>dLvd5cbmB&5Z|5wzh5j-w zI8(u4R$1o$NVtMGiK(pz5VYQ!!1YjY%*(XkKt_Ze7cid#?!5Bo^W4`X%XcTD=oi-GRidYg$&Tc-1M?Ylka7lwe?;WDdD}b zI8E0(O}oK0^jXZcg8K$mvJdlVW^EEobS|WT>jyIvV$MV9D^v5pVYR8A zjJxF@{}Q-!_{hQ$@{(rAK1da}tHGX9bg_Sh&_nbgg7-5hw+QHLrIA@kywBGDDVmr! znvcO96NqUSJnbU2NXjq*m65efw3TBZq*q|ZE>>K$2csalsNgsvfF(xtf2f-x@6ELq zHn6>*bnk5QFGl`EX6Jr|82QaH8VvhB6VBC z+~^&?v~({JNVcw5R-}9=vIY*&P5PRmYC!K@+~^lgym{ULlbVIhow=3(X6;ez5oLzF zx9?TaJ&WBlV0@6Z9TE>liM|F16U{S@)(RZZi=eT=|A<3xgff_XQIR<>MB z*S;Uzv#%7qHfU{UV)(_lV#e1J0)*iU*DOR}IoFQ?dKuGLD;&EXaRyM)@ zKDq%cwaQp&6ymb@HKC;;+JUE{j@#{m;qgUrP0J;!Qp%NuUM)p)-O?99jsdE((JE+8 z%winn>X`A!PI-{hgc`Qjq^ew9_Y)?`@I4sK>CQ!O;`O8P^eapt)SdKnFAwqwz7oZq zBy7h3&UKA!NCiPr1FJR_Kb9nI%teOm!yO^n`j84^3)QR!%#f<7+mIGxQSY%)a5;|t zCB%MiTSU==rP>w77a=E$5A&aC!1j5jPm|@NMns79Ss%s2A7eEl4B`xs79sRpDCI21 zCkv%qu~R6rVYK!c*)7H9OS4hUUr5LJ&N1Ept1?Ek5vl z)@%-vL+$IAbaN1-jX=ERZ)S544gosh5X9I=!)_6OE-k*kc>eMt2-E+97X%z?@ZaKq zNC548ukgCRDOAdd>s0pofjkKjml1z%6hFc77SR$#QI@nuT4dk2`=00?UIw;FW%G;D zju?$-9&2qhR~U*a5osT5j)H%W7w<4NqcMR0t=O!X2tz9*Gf!K`lbDdbXjmrXyKu5O zLDDJafi%E>e-8WB0{o9F_;nZ7ucQ_DoA<*o09_H8JBazY4LySe$uT*3Joz%79LAF^ zGjZI)2Ad@EewjeF!PX17=WC{QIMXSS$EFs$yxe1Vh19M?veQlJJ|ad--SuwnBqx9W zyeW{t8FRNyjRZtA0blS#Jo|Sz^slvb9gH7dRGpv3-OB;E`EAD4OfUEyhjzC?qgpov!66r}NW+gD+>P3Cr(oeMF^>ILB>*%BHMsbUEPGI=%kqj>>P6xadt zF8o>sR~?H_2sp$|3JKPQ;+Bh%7mvx7Uc@$IKD=9Oa8$daJ29s|rxRzTKK|kqcD({@ z)ol0$o=KD%4TvHz_mZ-g5FVhexUIDQ9?UN&Gx~4%07JkGM;k=9f?vn)9})>f!XDwy zzBCd-!cL+Ai4@VG`@If8vly#}X#>8Zo<7NduVX6|So7XnOJo<$EY$QRdAMpD@ zvW4jlL_>6W8W3RCV7+4sl~JH?B#$Myr4uHe$KW={ER_WR*$3W|25%`D{sW878{lP( z!bUO$F&FzQoBHRu?h8vX6QY5zEhz(0H}a}u{95I{6s34Cx-QuT6QVc57Ld^}fdbOP zQf0el*vTQWq!+=-Icb=$zlT4A;$Xiy@&Yx6o9n?#zsFf)+qqQt`Gll}X{hUtsY$em zr8n3{AYXoyue!*?zvh8NWCw}j;7$$yZ|sUt5imM#-~;q|^ka2tFjcvLK5*88W2o!( zh~}iSv<5c7dqixSu+f2{z-GtIrLX0JXFEe`x5HIFJcTPbGrod*SdE+f5#Y^re@R$H z%$@{HBg&H9V0S;Mux%{VveQ-##6j(uz}DElU)APDhjt@zP9f z5)DhkTyt&-f&SnnwuFNgY7nD&jK4+B(Lsjh#qJkTla2KSFbd1k+>4AVA2M*3F}8`` zsF8riN->(qcCRt_D%{>40;#`~GJ_j|d4{|m&JV4gAkHy>gESHlji9DgW%y3lF(9O2 zv9Rn!b?5-!IZOn!T2y(rKtDDm))@w2Tv}{HEVKb5aoRLf7_leVcaFQC%XZDCc1%8z*KDmAYzmFLw7Cy}obNGa$Ma1dw z8O3K?Fx%Pa1*1**>}PPNl#2oGQhLkQ<{-Vzsd14g8k-X9o8&C2lNr!_#W5n>j2Sio z(+=^H%niiM&ZuB|sd^`1675|>R?sp@Ic9O;jiltsx0t0yvaY)lXs9&uPF!nJHWImi zsF4As-39@oPqK2QIEk`ptQ!+6h~YQywyi<5OQA$qb8j=jCaIS7AtomH10FReD#*=P2MKjWg-2NuZlU2r4H)D@BNdH~|lU>O+4fig44xCW-gt z1+^S*UVtc_oNOylOH2aMK)#@#tWP3|SR;hi1ir+VJ&W0a(T3ZtzxoJ0Xl`<}hqk24|#Z#2N7-u zCzEpqALHb3*`o`5AZMi=sG_qaf124tiYKD3xn?P1n+i! zYj}&BJBWg{HG;(R(c2j;RHmQjYHz@{U?f?s@G%YKjc>srz7K-e7Qx55<)z+Ts-8ob zfxi}IS=ss0y9|$TJVSH0u+a|9Z&-22X5^NURtTm5hNanV#~8{iKpnJ*GnhtMYv3Fv zMGxC`SWGhgF)=$_jlLJHR5Ovfvq$@S17sV|BGAaP8S|V7a44RK)e7DK@h{d9V?;xZ zCNVc%F)PmlL=KC!3(+w)eWqbaf|b}VVD(y?F>y+^H3jo%1jwirJu^FBp)c4N z0o9=0OU)1<`+@T!J}EwgD&|?N#5UZGBe=A<@P=5Cfh^7SZ4EKdcLu@+_6#vyYjYmS z#bK6~bT-~{yaW~BYBg5Qah*!^9&Q&!Qd2Jy`wKR<55SYJCHyBIh>6+7d+R|v3{U7S zW<`MdpT=mm+Mv>cu0|=GJK>{-P3->JX-RGeia<#F$uLQ%o15d`GE}Q){|Y zt=_nCBi?wm8f7r`HBm)CYdd+bME{pc=h31Rfr7u%u6bD`iQKBb=CE{j=#=PP931yG zuumCO(bSw7F9LP9Qau=ZINpdSoDyq5 zd*G>z7K7#6ATu$SvhAe%iwH$XP!v(oNc40h7gJ(@>rb;k?-&ebQdd==r-Welk=qU% z1U0}}4pMM7S^;4l$yb9uC|eo-P7_rUV0K_G;f^F2kFko0GZ}6&$TjYpc>b#c zhCMk#?r?%VJQDT2TfFFZPRz;t!Ad|oWN+BeH0<`RltB`{Q0`Nf8G@B0A+lGn)2C5R z1wJL4GZpwEzK6zfS_^tv=otZ}6TNj;AC1S0SNP+f<3UWJS%@kDhhZK@ zczBIB%i(pL^@_k)i07m?pCY^F+fs*_mX-VuNvHj;zUaw>tB(P1bNEP8WZRIW@gJEs z7&N+M*faOyIOVS)SH~?s5*T1VOhJguYjG=ka6|GURsiOH2NKEtt@ABUUKbN-%<@zM zY&fsswz`}hb25*LY$TLgkt#BFS#*)VO0KzrcqV21fPtVL;9=MvlGPptYznA|BJ?=6 z`2J8GDH)PUr2v%H&`*{Xyig}fe`qiZ{s!4kPQhFBT~_+U^Ff zVr^_yMGZ=_33}veI|GMti4_YCW0Qib=#ODrQ|Ot(;YNt)T6C88#4(s4?!dNS;xpK` zg$?Mj+Hhk9WRXjpQ}gMEn1AsNiI-@wT`c&wxak_Ptca6Tkv<;=VfOiX7#?SEAc1RC zRRq@z&P4fOBNh8Ios37vBNW)Y`jlJr@Q* z*cj{_gt_pu7Q$5N6vC)Cm{@{kl%Bn|(2VlPiRMeJr*4%W@6qs%Pon`bgbEF}CKipVu^DSLEosUbk`Pb#iHvl>;pIEL0_2A1jh;kkyxoabh}rZ$mAO8L7~C9o)F<+Cm$|&FMSJp4Bf*1;K-A} zguGL$>_eDqhdBJp@A+kiCK4qWxdRGeBCj{i}E;2b9ftBltD%?LoD%-|7^# z!a3eG`rYZ^8vc&S-ysH6%URyrdwrN^-uPBN2Wosh{oU#IBi_XIR4bPOsU1u4*Uf{S zajAwttJ{RS;cg8<;5q<-YuEK6?!jL7{12fZ6L8y2ZXqxPz1hu76WHGN)vjZrtQaxS z_Kbo_vL}~F6GUUTgn(2a#{o=_5xzt1w1IjyXUlC4M-hSzsG%eld#MY@J{L*qP%SsD zYH3@O@WMnllrLz3BV-I3bE>he#`=cU>Ne_#G27GVmCb->yK8M@k2Th~V`NttGZyX? z<%nx-(F>e4nROW5_*wVLEa2q$X35>yJj4gm04JiNpYfYJS2t(HoP+Xj1C!tqI zL^i{9$puY;gu!+}X>F9Rs7uD%P+e`@tQdH!C)!S->lw&RVh$pMD{`xl z^;;^*fRT-YVC|FB&mL!qRB@VF@Wz{>vBJRRg#FzRM}P-o*A1G)q5<)JZ8J7~=!w3H zm`E8`CPrSF%nx8B4P1T{)ht0a?~HfFY7VkhDrQ^kJ9uQZafSX#*fUt$7Iqg}0Fh>6 z83b+xK;kWlHUZqRP8SHW=$^nJ0XmT(X*uISO(J-_9qYazkocgxAFs3mXAB!CJx8@jfufOtFq`-skGQD*ct9l_Ro3O?)H8{ zrvY_Q%e%tbD)zZ{K2Ur$!X+nFEqjHtX0>)F=PYwI-+Xiu?Bt^#;Nc&F%Y5YF5d3o- zoa8|{cL<-5pZjq@kik9%88Cp-lMEmeYCvCjrZ-dz>y5@D#5-YxFX9QD?-X_r{73x$ z+hm1&4{S0g6G9kcgcz@G7utY8gMJ2$m+i%Hf_*sPd_T|m1(Nk#o?gJj#o&M7Aqt3j z5SP9CNN4KpK=SYG9GJIj+2InOqWd=ZzjzRLpD_OqaoHQY)M_xiQ^V3J8BC3-WueBq zX$A{+qc=S}t=J1$DQWQS{O#9xa0akm4yjR_y|MP1=kCLvzFJn9b$O-u4DYh+)gj2MwYpz)DaC03c8eT-ryt!D9PYqc+@yMSleJ5 zBaacW1?zv+$Vw~J!)9}4e)bd`HY!NOy9H_}N?TBCU5V&0$^n6@a)c5*EEzLaLXbhz zFSNbG%!|@7xY5PQu2M&OT;0!+d>)TDaXyzqJ)TV6sqwce=p&HL|P#j5)%^njK!-z#pkKiS_@*0U&u1%vg==HqU&=n$Dc|pEoXsv1TW*#lE_GP`9llje%tsKk-Ag^R_RDi z*SM)dd~v{pi%fLMQgFCPi>laLRAaK+o1@T1Ut*NpMTw8-GiaI7l0^S3n3J+*gO6A} zZsK_d6jN+A!?V6}1|mGf1Zs;{e5r1*9yJstdktLNOkqNEabXs+2j6Lyw(F5yOuF#5 zWpLotsI^QiI$A|YuQXr+HfjEH&0wADA}6g7uPyJjQaZnkuTE=ZGlKO0>kFraK^?Qm zX{#q4x80rMNYw^s!Y#G>Fn2pziT z#CQ?hr+av?U|?^rb0zQ}q9h`_++keURq=NA7K#i&P0paa0Mt&f5Lpl1-@9O{Op0y9 zHaIAFB{m};hgL;o$J~v{j^#+H*y-L!y+QNy z4_cM(M%Y6iCW*^OQc8Iu+0WpJonDn+l9nv)%+9V?Dv!DuD@=06`b}DT*HnIy|4vI( zDvt7hL1JbW7iFi5#nY!LKK=yeZgJ`fP2v70xCnlUhkwe0#4Y~{&w4ySbx#Ecc@UXw zlxKDR@Gp5_Vt4S*c=#o>CmDN@fe=2(r%<_ZD{NQE{?RDBe@pT^OfT zqxg7nbZm00h(eX9Wr@0$mkWmqyX9Skk^9F5^fEpn5Ahn5J~qf@7&EFz4&fZ7q~$!1 z^Sn1K=fgNJcq4LN@QPqFqrK5t2^l)qxY=lRe_<9Chj5|_Iunl}QHT->1T`T)UrMZS zqlrPaw)+AK&O*xssc`zD2rL?#Wa$(ZuH0#J$9L4nw0}0R1qBu%FxiA%6FLZL9r*24 z#N2be)iH1KkADfSIedhHt2GwINx*X%PfSgy+dc~#NG;M910j4YftS6l)W*aROZgiE?t}-0Gvl>dCh=q(Ut}MyO!ucOXl&qR5;oci*?tfkN>e*AqP(mC2$M}gQKBhL zB;1++oJE3Pq6Q`81ft!QZe!iZLAI~39w8?e-ZsQeV9B}0%-T%CAhtb^*?B>ct}?$k zcm5PMQilkg#J;;Ap6lX*L%jSz#B(}7mH4~IVtHv?xYdZWVGMsSWA z%W_`C`GmJi&PTmT5d7V}$@%5ll_ffg!;Z4O4`)$g6G{iFekQ$FWjJBJ z85n7e3&uzcUS!V5C1w5xlw*i8g|MoVY*czNZMmo@QQ$o`$W3$+BWOak2d8F$9g@q@ zOIl3HVQGsu=6LBc4UsHGs_IK0OC+-(QJf>p8FfXmTQ?7Zv5@v2I4N&a;Ldh$M4K$` z$eaxr=lEtCE%9QzzT9H4Iv(ujZR|;W#eg>1&sg+Dd5`ddx!Jih^Od>ti_1&r&n^Q0 zYv`_QR}#?Q96XN$-(Xn{l`w2~b}t*2G}C zwF6K1(k#l-%ciYj`G-@3qqMeioh!&x)G4bAt0&H}IEi(b#;DK?%EqrFAn~sBj9m|- z0P)_qz-!@jQ`GaVt(&7u-Lmk5kzi(GKeg~hW1Ae z7K26r%i{UP`A-I$ag4f!PAP!iivegm-Xw1QL{R$7GB5)5&Y0{dhyj6Nwc&dwF4EOx zF@zef4ez!ti1Gn957Rt6$pc+^!P7iE z!^0r)357LM@9@=RIE5jIPu#kqfQ>AM#-!}V4noxZxP2!f%FBVN5A`N4!3H&pupcA( z`~pNDNEW3kLd62+#L@0Vh&oezFC{oqJgJw z*D5^c{q4a zA5&Cuh9LN0qgzmn*@h#_EW7d|f*yv;34u!FX;l;Nu{6?ZciVA+`D_S2z{a(RUn33PB^g-Ja!(6=xe}r zYh}~C3gWSaE|@W%0N>xRQ06vETlY}|w}18_wXNxHqC`f=k`3mO^<*#cXpFegS86Iu zTw^g2qi0zgq?X0iVF;S+x z%WO(CX*MO=?dSYSf4A9`XwO@dZ|(jn^w08M(BOxAyOpD=M^4e`Z(@u>W{?yXM1_TG z+?azHQ3Ey^51v6MYL`^8BBfoZj6_+*Py~nxtRx?^UUKuiTDKX)#;W#Ugf>`AnsGRb zIcHA1+Z@Ad)Xf(2QjL|{Lm+>si6lC>^R@EmU8&a@#Oq?S1DNULU06O*LL_LBDTl66 zrgm2h0YW0k4ziFa_(~HC(|~e?J1oUFRx(Mi(v$g&5ge4pVQ^1AaFEASEYZ7tK>KrKTriO-G_s2+i#e{&|HZ@*oT=Lop zoeV^*`D-96vS+BI)oJiURQFaB%4J^`S)b=FU0h}We0#;;1VKU~C)IJP_#`7upLV`R z*yQSEaxNqh87u8?M%H;U8uwL5IXX=KzD?}i%b}jcVGEJ00jkzvklcy)5dV7V7gMc0 zTdCkU*bWj49q{&kir>mWu-nX+ZBPR;cmdm?(Y)qYoMEx!G8fi2DvB_4r#+kyee8W!BfD7UXFx%u{+M}_!HI! z0M9aZ3%t@of>*^Vpuwkz$pBykZcWPtN<(tyHM)aJ+C;SIEI4uK7un51;qLTPQ3Q8K) z;|(D|o#i6nbsS5D&mv%scg*k()<{F8#5{9BWD5oU@&+OwFxRMGG;|G{B;c1k&W7b| z7=ib=C*0Z^mR8<(_rl40FT?UtF7sdtDFubC48r;Uo|LN4fc{}D7Px)D*-p@UE&lG!z43=1D`s zfk%-18`!;>QdhEN!ALh*$4fV)QiKSG`gBw-fyOYYI<}%@9hAF-erT&)iSks0(2=|V zG7v@M%lk<$5P}`E$k=$R`07b^wGKx(_zJeef^dnXn&Vh$S|<=HDLNym{jnBjq`(Hs zHEfp#Vg+stMe;p)*eiY=5e75_7u;=)WW4(o(yDdLRzaR z9WCDjrX~~^yDjODI@d7flP=qDl_3WF%H;;5 zlVrcg1`rxUo05&6b`*x3fKt9tn4iE2xd7+@H(%ji$`cSTepKtGVq=!aJIG-qUm&GH zJtv_^n-!8j_y_0#_)6X@fcoU*_u;J^u183Xf-SE|deO>z zqx_3|NAONo(*s`$eiVO;2?NM7PK zn8b`&M&q_J^x7(OMoyK2+KwIB!rEAUBJ4}?Fq73z4IuFjlXxHvLZyd*T;W5}LNc!~ zYZ;~&ktwY}E7XipP=>EDNkU#KS|Z;>G0Sx=qHmIs=DuHM5D7~Na9N7jiDj$(RPiGj zyl9}naA4yN1nYH;VUGuGgFe4k=a+dK;~Ha><}|))ucK5rAPcGns9-X#AEBR zwOAP=9W4azJ_0_ozG+EgqdmQFp3z0D4tZW2YAgWC@N6OWu5U&&ioBAt)wRfBy1No= zD=2?~t*tPNDCb}mH-MiNI80Y!utTb&ohiJqiOsNNrkJ;AZI}*&qrFROEE~#HbeS60 zJI=A`p^dqV>a6Q~h_Wn49PehVJC+T}-mH>q1@)7BW$TL&M38w)(K5;in$y>I%`cds}dB5wZTQ*IY9B&JdPo33%JFKUWrzQ zWmg0K+BGN1tck@N8;BdhfClVWwH+$6(^tN37z?uO$%PyN$Jagzit`1efdvZ)a! zs3Cz5kk~|IOiGKfNCEqX{=Znx0yyTzxkTk9^}^Zrnxw_M0HS0n4wInq$qm$vaV?&e z${bZJ7m(b(QTBJqUiTp)SOlmv2x~i#%xy$AN{|QS%e(eW24t04YH1=6fwjh9{hyrl z$;6J}@9=OKB3&;>R@%#*!ZDb`7yZg%a2#JYnE2M9->g5Wu3s31hUnUcNcsZbBQ}fu zJY%?Sa0bn&UP-xBLnTD-mzZRR51S3y%6qnxL6tIJWfL{rSsrSHPoI1?nB^CJ0_0>r zSv~-PE`&6m-SBJI`@vMO(%CY>qlObC+8^33Gus;n z51fu2F_mC|B8aA4Ve#iLnwkadp(={(RDdmOh07yt4@n;wpNMA|D1}RWG2P3t7YuTr z;IKGUGb|Z?u(*BNgR}VVO%8|SWyi?z%GC`@P$sKgD zaJDGrf$ksEp}~AX7=!t%N{&11yg6#ZA<3gggi!8>xkW2v7spFHvI+M{Z~=qD$j8w& zT~4=gW{rJ)cwbYAM%qfga=&*i&f>IeQlHsq#JO&@POomW&hT%DQVS-h%AQ)g=!wzErZ>z0Z z2-guA6B)K}`UudBayt)L_l6L44h(&P2*%U|WBDo%n??ZpYn%*$y;xg$SDg^Y2Uad_ z{@6XZeG#cMp-;K*{*LSVGH_}qL8mm2I_y9l?!7A*#8REu>X?=XY#hy61(ED0>O*s5 ztQEN z%vKvii>_HriZm%Mf)Xyauy3Jr3vf5afi3~Hf1D6q4K4w5Df}LoAPntAVnw=_4O&+c z3sI1P2Kfz#475^Yy3cJ#2H7A6@^)lw8SDv&cLy(H>p;{)7*0eD0s_raM{x-J2!AJn z+WxU?y*=As+F?&==}mzxA~+Mfluo9*CM+w?0=GZ9jd;wVm5`CqWP$*%`d?T=9s~q6 zOdb(qIvC&!s38K=E69o5h3m*86CZCs_?6>nKKe^|PaqSaVW@*PSipcu?-NkI%>ftj za7qkF%-W`9}A!`Eg0EYH9PPQS?S6T-5a-Q zD@LnuesfJ*aG|i&ap6;K_b@SlLNkltyi74WZPU;84UCKVWzNDA zz{!9{!a(efBILc!OOjJz%E9M(Mlu;Z$|uBLxXjB-Jek)6VT?Rc`8LZ>&6# zSo4&!WX)4-;@Ymzah9r}^LK!4} zPjd8w_ethtN*7+i35iKC(Lvb+v;PDn7RFtCkd{&inQIwXW$~N2f`13G7?5ky*cXf6 zqtn=b_x^<^&%>67us7YC2@XtFpu-+Ym^~B{32^^5Lp-)fc!QYyHoBqXlQc-5m%=jI zJo`5|SRnj)ejy@+9E3g(iLCyYBa+O_MV7b+N#5574!PA$2jSpgaX&6@9@t8w#MOk@ zqEVuWqkb2=fJK{~yovr=MInoA9|Eq2{vH+OHIU5w@UKO)110I+LEVx268zVp2q~^0 zhxQ<|NJtW7mO&*!A>{&ojBjKMsqMqxUfRyRiV03hR518>=c&cSxG5amsov1)8kW&d zM1TOA_RovlG8hH}Iwrc{U2u-e=x#mBH&{P#^KY_i_yA%=o$mg=S<<@_z2kb56-2Bd z*eDfYMM%9oxt97hSR2?PXDEi-{~GrPzsZB3_25EoIohFrIszClXK!Dhct@f~Knm>< zqaL(J`gWxzci4iUSFpKnKf_lF>SVSN5_`|$)Wjg3*2}?O>uYW_*GTXd50bL{HqXAu z!#h0uG6!GbS%kc9F$b6N!=Gk1s2wxl4=KpG0z$`-V4MTf%E=vd{OJC11;32X#|aYc z1EVm9?k~z8F(+6aq6x!dJg&x4cflTHZ(}jTGQO$>brm*G7E=*&Purr2U=nj)!d$NT z#Wu808BTu?s)^`RH%bk~JHcg67}FvQP7<``oKPkf$}%F=$`V-NmN&72I=ay7boU7g zV}T1dLCf@p(9;onqhX0y)|{2Wt2_7r4gYVhA5b6VlE=jHuz= zKX2E9gn;s!1P0(&#ehG9leloA5rj~5GDtAbt9XKBb0(ETM3L_cI3GbG9`9iq9z+#6 zXBr;F6@L`M3KXUC7_KLAJr0qD*AphPaF;(RQH6kPc{k1xS11C_9=z|Mcdwl9^(L?u z5A`0H6HRYPeHEwNR%D^#;jhM1+3${trWqq{P<=Pqwavy&TmTU@{0(-O9dI!cszSm3 z8dOo%;eZ24u$egsE_Onr4z2q~_Akfnc5fu3y$+I#H7zyx4$MvW-%GnC{38NdWq{i) zn`Fkm@HwNSt8Jp`dkq+qc(dss8=~k1*E^yuPl!CnN`Vmfj7U~*tT!aAKY;SC1}Ga@ z#Rut-bX`)5jFy#&y-Vx@YBP{j<`o~xzP#lscYu_IB$UE6BzM&4^qj`3Noegr-IQCD zMO>)i%q+{_ibF+h^>%DVmoZ_53AnH*zVZ3FF2o^%af|r@9@rg$V9Zgbrj9n~8tVt~ z$A$=8Yk*Z0!$OF-R>7d3006`+y#sM!n8Uwt#AUd9{EiC%DrCjWgf$W0_CNMz0WCK)$N1aPeh)|?=Qf>UrOQX95L%aKGAZNO;j zChrF0vSB2)(FLaet~r~IAEBL8Tv6YD-=wIOxN{XgT4~mUgFI1cEEYj(O<1-yAV@m^ z_vUcgD^lW;tw*DAJqr9)*k|FRmjG4Xlvu-YB)yA0>oeua#Ppmy_37Hz<1>?>5cqY_ ztYFae&FfYH7zM(rN>4ri>@xs2rm5w+UE=dz;|lkQHQHKyfl%+~Sk^ZJRK}LIq2Z*Zd1K7l^~4&wB%wK!v`uYgN$YU%gVv2zP^Qv+TCgn+RcyLUvLs+DjrdwQka zhN6T{cyRS%KPkSoUWc(C*-F@9PSO}nRaEVL)JA+5q;D|5VP_28(+DloON*i4DdTm9 zftg##w&}{}o*&o4>8U##9zRna(_FOq)ALL7OSNo#l9mCrCBcc{t*}x5qV>Zk$vAA@ z?HfwNO^Fg9nu&*wyv}wOkbVST2jUb~ux;cj2gA9+GJ(8;S}K>8794!>jfQ+mH9N`i za-iWuhDDyhGwLD{M0z6uaS&0>mT}v*MyV(fQYev~jO_xUmDyL>a zT)IEv?j=Cz8icIZf>6~L4(`kk3JiJ@CGZ3xFgSq=_-Z4zbv^rN(M%jXNJB$KH3T%G zbQW??fF`^}HsuO^SgH^`f@y^(2sfT!dw_}o;ckOu;&&M?Tkw?IiprgB`vg(=^9as9>p44nw^`M5uU%mjH8RV8*oOe zKmgetL`D#8+kkd&Vs|~p3SB|}Z`3xUfFj%q5HX$vn8Lovv!;8N<71;yisdV9#8ZMv z6O*PB60y_Vju__4y87W^4bWE02kV@}AOkB0q_*5*Z(qfP=UM(j0x$B66qka2w+m|` zpv7F6nP&X+t%KQGZ?87!Oss5g2my4)j04m6Q+H-`1D;O|(n%OhD5Nq-ybWx>-T3((Yq-o)z1n!Bb)F z81bo)Y53vg_+VndCT~O3&$k3N4t+4#PnzP@+60+2 zs)j>km#1S%Xn%eVOJ^hSQM(#T2kOrhVu++fpSmsMUGdiU8vc!SR77`T4G1X93}fz1 zz8|VBBHYh)D%=dY`)KLh?3>apSh|(2y0+ok#F7kAVGOI%(exMyqUB`jf?fE(+q;(L zxQ;43nuj#j!yXhna{Q2GV+Sd*MkcnwNg%Os90G*}*fOqMQJC?}$eKd0>KR$+hLD99 zXp?2aj=#Z%1yv~)siF#&)GXPvg(_gd_np(-x9`=ABDp9kRK+g!+_`tUZ$D3;^PNZE zo&WZod8LH~a|~mXkikAvWKdgumNSFIDp!s#?msUy!%T05%0<5OeI|k>P;5xzAUou$ zJK|{ETH|_DcALM3pZE@m!QYWD8s*_(c86)}To=fSq*~QSzW`kqCLw zU=v_Qv&0yA9~PoAz6}D*I3i#Mq6-1c;PpszSip=?z!%4GrxYE<9k@u!(_^?E2ed)A z$LHkfIPSnzQl37CYdTA^oa49#s3F%UaD587o^MXTb&_SC#GNzt&RMzh0`5%OJLlxi zDL84KhYsj;<3i)h_&kFepKhLMT*T8tbha_uxYT$Nj+>Ls$;MY2)3}?D&f$8d@seCm z;rivqWw}1TG`UnjwT+pD?vone-6B^`=V78KSfdIQzm~v0($=l zAKiSt6U=#0yo`x<+Y#(Ju4N)|(23KBz{~2r$D*3b>{T*sPyv6p@FyqFgUpLFnb=6> z8?=#9Jy|?@%WAzB!FE6=!!FSHozxxKdiPXtkBNfYRs5PKLITsF}@)0rtYUSBZ3LWzO5%-E-Z^^&OmlQ z#*Gy96^$Y79B%jq=i|5cUoq)Xvio^2lZ(`h(sPQ1TPP}9EZV%Mtm3Pzmbxj5S%%b8 zW|ph0%&p_8>0w{|^o*#&>K11bW^=RixO7UIOc1b7`>sVjQ5GhlO3KGkU|Lk|u zR0*F$&dpb}KQ7CTFyojN@u&XRY?eFO0bGJE;Isf3Fi~)(6n(iB$Fgh?Bs~UybofOF z8WVCHip7QkI`&*}9?l}zK`2(f^L4|I1Q_ur&G3gcIVZ!R0oAB5|G2qO<3SBRAKQex zeVT*8f70AhsT|NQurS~cK#Sm-0uem}y42PnT`I>#xm{0LLA!j}67ZFP9|ADafl#=~ z86ptAItmZaHxV)|^HOGqlx{`V1d?H$tr;0@(O@?=yWWIs3}zH?QC)mz1cQQG{$;$- z`pF77z}f{-)$Li))imXd|K=;jJ_?CyFUT!`FInvXC(ra!h)f+CleaiQ0uE)~byx&i zuy|=_*8aLSk)0*32mV|5yI}5as1m5-`?nTvFJj30_KhDF;(F-ntlq-)kvt4^0B+Po z8FTB%Tbof1kPlxPM`xo z535O6I4wbqVz7U2*c+zMcC_K=m`F2Is)v{yoYY!1*v!^E`+H zG^oy4t$Y`}rq*gZqM1Pe38-U03K327NqpRpYVmG5o|G8_zQSDAkVCv!1O< zG>)XHS*?RF%r`B~jG%UiEART_NzJsNX%KY^gJL*cXd{8yDZ_cFjuyvh!Bp(fPg07b zfci9NV3W?XmgJaG2(LK&d|(1ky?J3_As#`un4Q@ghX6L@Lzb0+0il;Hx>O_Z{t9G8k?GgVjJ=`Kz5Fttn1F{J6p!4M-kO)*DrpzV zab)ZnbArjgk?h|Ylyrk;JY{FlWHpCw;5l9lBrwbag+8-GG9^jKbU*31aR$}(Jak&z z2>ssG5M}E6m8(!d_ZpbYG!lGa^oa#)oQwQ7p`6g7a0Rw>a@`#N9{NO_dyADtThnaYnjb9BQBhZ3$2&-L89Sb=W`alj>@O}*m zwVT@=upy!Fxtq&`gpzx9_QAq2<>3(xE5k#O1;_Rk>2srDFcLFA!VtgajG|py4wkwS z_36%MEiKL@Al%Ttb#@XIVi}HE$u}Pm3MhkM(VjxM`OcR^mhb4tBUC`Fsk=oM^f7D2 zLCFmqEyb@rdyV`Er-tWiDA+lANU!d3^w`bO(L>ifS2@26^}%HVWJ~p0#NlRRu!uL1Y}YVpj?_Vzzkogb4@RRmZ}G;qZOLDp|O& zJQ|qx^n(k-%u(@2HM5f@B*F{wwhg^zy#&3n4Yxj&L1Esm;1r4BZXd`I43~qAnFbjK z5#XB;)UZ8bA7?QR5+U7yds=&i524rwdtkS0JnZc0deDmjOBhsog4) zXln|q@-6TQu9itT4wMQ}g+MTIXGX;TO0tl;I_}v$@5v&lDIj8&NabK;um$6Vq#SqF z!gSl)UJ!I(_zi@FXu!m-E}or|+e>RIj6r`%!BLw;m>I2#4;_vZ_; zo+eH<^hlJlYpm{Fwe6(ENmXWKU{k~<`=Y#232bAb|Ej+onirxnXE7& z-BPASlypVhizFVKj|Xq4zc6hiUFCz6e>2;>Qv}Dl6D6mjBBlb*Xo*UgVc-vCPf8L2 z$y>-bP5QKmSJUJehUW!%Mv?1*3cJW)N&JL95580KSwxgJJ{#sU>i7ood7hS49vLi^ z^TXr(t^DB|{HyqeItusy$eG>5-$9Jnk3V?ufZ=wzyy(HI*28biYglX>Id*${`ys5) z{f|OJ^BzG-6YiZgaew0cA21{mClXd92!;t227F2_KT(Y57BTsLii*vKHS-RBGQ9x0 zh({2nc=9@QM56LY_>aSdq^zK|vteuFO13H)9;NL12V0bI05Sz+^vNE4!qHFhCO3L@ zdexQUhN1@>67Q)T7!%Kvm@lFIDSgPRc)i;^6W)Y{q{j32e*Y}c1vS2Op!)SQ!I$Ow zo_lk!D5OVXJop{oN4}^Gmkh%@srifVI)5o5r1jP`%;*kT!dT-{eH(l0)N+%X3}~0# zjjfI~34P@3+m<)DQ27mp?Fiofnu6oA-c?k?zR4;;)FL2<8cD|mtKqamZXtO|CiN{A zyX_#SxW7x}6cN|K#OuK{xJ5_%Od0oq)&rlnf$8<#*xy|!dF+s8gT@>*-^gU;DoF<` z*X%2u&L)E_t@sGinT(Dhm6~T2+*(Fm3~Zd?zT_wC_%n=5_K2i}@Fnw~2-_by+If!l zh~f7`jrHgcRuO*I4tTsYpB-Vx$B3N^3|wW;v!evWW3%?Ch2Y6B1Kh`{K(%;>Y1aE_ zM%Op1WcdA1%_`runy?xTK(cdK+16*D#Cv?*bu14zAzcmcNvLx>ugOdyYKrA%WPy-V z@NvSOK-FiW_2$R5b_9cHN=%DV@XGDFX>B4dka9W6TI)rcv;fH%5N<3KSJ6Yy+h1Z- z{^|#K*zo(pOjFMF>>gQ09N5mr#%kMeS_?)b*ig3&Q&OIO)HW2uqcMMQ0+*tpgrX5Dp5-o9p`x4@+=WVgGr@%6>NVP=ge9OP7cfUj zHEzHq{AOef#O(r*)%rp5GlUq#QVse|wJ4}Aa zvMt za>3^5X==Cp4OsDStv27___u$IqzEgS3c@I?96659lliIqTiC`gm&!+QY|0QA$KlEc qIsL!kuU0CTD{oeg%Kr~?3zceRtnx0No~Tq9w{viG90%m)2mS+6P%FOx diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/wsgi.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/__pycache__/wsgi.cpython-36.pyc deleted file mode 100644 index e022538d9abd21ad68db4f1d7c9aa2648c0c68b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44667 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/_compat.py b/flask/venv/lib/python3.6/site-packages/werkzeug/_compat.py deleted file mode 100644 index fda038b..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/_compat.py +++ /dev/null @@ -1,206 +0,0 @@ -# flake8: noqa -# This whole file is full of lint errors -import codecs -import sys -import operator -import functools -import warnings - -try: - import builtins -except ImportError: - import __builtin__ as builtins - - -PY2 = sys.version_info[0] == 2 -WIN = sys.platform.startswith('win') - -_identity = lambda x: x - -if PY2: - unichr = unichr - text_type = unicode - string_types = (str, unicode) - integer_types = (int, long) - - iterkeys = lambda d, *args, **kwargs: d.iterkeys(*args, **kwargs) - itervalues = lambda d, *args, **kwargs: d.itervalues(*args, **kwargs) - iteritems = lambda d, *args, **kwargs: d.iteritems(*args, **kwargs) - - iterlists = lambda d, *args, **kwargs: d.iterlists(*args, **kwargs) - iterlistvalues = lambda d, *args, **kwargs: d.iterlistvalues(*args, **kwargs) - - int_to_byte = chr - iter_bytes = iter - - exec('def reraise(tp, value, tb=None):\n raise tp, value, tb') - - def fix_tuple_repr(obj): - def __repr__(self): - cls = self.__class__ - return '%s(%s)' % (cls.__name__, ', '.join( - '%s=%r' % (field, self[index]) - for index, field in enumerate(cls._fields) - )) - obj.__repr__ = __repr__ - return obj - - def implements_iterator(cls): - cls.next = cls.__next__ - del cls.__next__ - return cls - - def implements_to_string(cls): - cls.__unicode__ = cls.__str__ - cls.__str__ = lambda x: x.__unicode__().encode('utf-8') - return cls - - def native_string_result(func): - def wrapper(*args, **kwargs): - return func(*args, **kwargs).encode('utf-8') - return functools.update_wrapper(wrapper, func) - - def implements_bool(cls): - cls.__nonzero__ = cls.__bool__ - del cls.__bool__ - return cls - - from itertools import imap, izip, ifilter - range_type = xrange - - from StringIO import StringIO - from cStringIO import StringIO as BytesIO - NativeStringIO = BytesIO - - def make_literal_wrapper(reference): - return _identity - - def normalize_string_tuple(tup): - """Normalizes a string tuple to a common type. Following Python 2 - rules, upgrades to unicode are implicit. - """ - if any(isinstance(x, text_type) for x in tup): - return tuple(to_unicode(x) for x in tup) - return tup - - def try_coerce_native(s): - """Try to coerce a unicode string to native if possible. Otherwise, - leave it as unicode. - """ - try: - return to_native(s) - except UnicodeError: - return s - - wsgi_get_bytes = _identity - - def wsgi_decoding_dance(s, charset='utf-8', errors='replace'): - return s.decode(charset, errors) - - def wsgi_encoding_dance(s, charset='utf-8', errors='replace'): - if isinstance(s, bytes): - return s - return s.encode(charset, errors) - - def to_bytes(x, charset=sys.getdefaultencoding(), errors='strict'): - if x is None: - return None - if isinstance(x, (bytes, bytearray, buffer)): - return bytes(x) - if isinstance(x, unicode): - return x.encode(charset, errors) - raise TypeError('Expected bytes') - - def to_native(x, charset=sys.getdefaultencoding(), errors='strict'): - if x is None or isinstance(x, str): - return x - return x.encode(charset, errors) - -else: - unichr = chr - text_type = str - string_types = (str, ) - integer_types = (int, ) - - iterkeys = lambda d, *args, **kwargs: iter(d.keys(*args, **kwargs)) - itervalues = lambda d, *args, **kwargs: iter(d.values(*args, **kwargs)) - iteritems = lambda d, *args, **kwargs: iter(d.items(*args, **kwargs)) - - iterlists = lambda d, *args, **kwargs: iter(d.lists(*args, **kwargs)) - iterlistvalues = lambda d, *args, **kwargs: iter(d.listvalues(*args, **kwargs)) - - int_to_byte = operator.methodcaller('to_bytes', 1, 'big') - iter_bytes = functools.partial(map, int_to_byte) - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - fix_tuple_repr = _identity - implements_iterator = _identity - implements_to_string = _identity - implements_bool = _identity - native_string_result = _identity - imap = map - izip = zip - ifilter = filter - range_type = range - - from io import StringIO, BytesIO - NativeStringIO = StringIO - - _latin1_encode = operator.methodcaller('encode', 'latin1') - - def make_literal_wrapper(reference): - if isinstance(reference, text_type): - return _identity - return _latin1_encode - - def normalize_string_tuple(tup): - """Ensures that all types in the tuple are either strings - or bytes. - """ - tupiter = iter(tup) - is_text = isinstance(next(tupiter, None), text_type) - for arg in tupiter: - if isinstance(arg, text_type) != is_text: - raise TypeError('Cannot mix str and bytes arguments (got %s)' - % repr(tup)) - return tup - - try_coerce_native = _identity - wsgi_get_bytes = _latin1_encode - - def wsgi_decoding_dance(s, charset='utf-8', errors='replace'): - return s.encode('latin1').decode(charset, errors) - - def wsgi_encoding_dance(s, charset='utf-8', errors='replace'): - if isinstance(s, text_type): - s = s.encode(charset) - return s.decode('latin1', errors) - - def to_bytes(x, charset=sys.getdefaultencoding(), errors='strict'): - if x is None: - return None - if isinstance(x, (bytes, bytearray, memoryview)): # noqa - return bytes(x) - if isinstance(x, str): - return x.encode(charset, errors) - raise TypeError('Expected bytes') - - def to_native(x, charset=sys.getdefaultencoding(), errors='strict'): - if x is None or isinstance(x, str): - return x - return x.decode(charset, errors) - - -def to_unicode(x, charset=sys.getdefaultencoding(), errors='strict', - allow_none_charset=False): - if x is None: - return None - if not isinstance(x, bytes): - return text_type(x) - if charset is None and allow_none_charset: - return x - return x.decode(charset, errors) diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/_internal.py b/flask/venv/lib/python3.6/site-packages/werkzeug/_internal.py deleted file mode 100644 index 28bfd9f..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/_internal.py +++ /dev/null @@ -1,419 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug._internal - ~~~~~~~~~~~~~~~~~~ - - This module provides internally used helpers and constants. - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import re -import string -import inspect -from weakref import WeakKeyDictionary -from datetime import datetime, date -from itertools import chain - -from werkzeug._compat import iter_bytes, text_type, BytesIO, int_to_byte, \ - range_type, integer_types - - -_logger = None -_empty_stream = BytesIO() -_signature_cache = WeakKeyDictionary() -_epoch_ord = date(1970, 1, 1).toordinal() -_cookie_params = set((b'expires', b'path', b'comment', - b'max-age', b'secure', b'httponly', - b'version')) -_legal_cookie_chars = (string.ascii_letters + - string.digits + - u"/=!#$%&'*+-.^_`|~:").encode('ascii') - -_cookie_quoting_map = { - b',': b'\\054', - b';': b'\\073', - b'"': b'\\"', - b'\\': b'\\\\', -} -for _i in chain(range_type(32), range_type(127, 256)): - _cookie_quoting_map[int_to_byte(_i)] = ('\\%03o' % _i).encode('latin1') - - -_octal_re = re.compile(br'\\[0-3][0-7][0-7]') -_quote_re = re.compile(br'[\\].') -_legal_cookie_chars_re = br'[\w\d!#%&\'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=]' -_cookie_re = re.compile(br""" - (?P[^=;]+) - (?:\s*=\s* - (?P - "(?:[^\\"]|\\.)*" | - (?:.*?) - ) - )? - \s*; -""", flags=re.VERBOSE) - - -class _Missing(object): - - def __repr__(self): - return 'no value' - - def __reduce__(self): - return '_missing' - -_missing = _Missing() - - -def _get_environ(obj): - env = getattr(obj, 'environ', obj) - assert isinstance(env, dict), \ - '%r is not a WSGI environment (has to be a dict)' % type(obj).__name__ - return env - - -def _log(type, message, *args, **kwargs): - """Log into the internal werkzeug logger.""" - global _logger - if _logger is None: - import logging - _logger = logging.getLogger('werkzeug') - # Only set up a default log handler if the - # end-user application didn't set anything up. - if not logging.root.handlers and _logger.level == logging.NOTSET: - _logger.setLevel(logging.INFO) - handler = logging.StreamHandler() - _logger.addHandler(handler) - getattr(_logger, type)(message.rstrip(), *args, **kwargs) - - -def _parse_signature(func): - """Return a signature object for the function.""" - if hasattr(func, 'im_func'): - func = func.im_func - - # if we have a cached validator for this function, return it - parse = _signature_cache.get(func) - if parse is not None: - return parse - - # inspect the function signature and collect all the information - if hasattr(inspect, 'getfullargspec'): - tup = inspect.getfullargspec(func) - else: - tup = inspect.getargspec(func) - positional, vararg_var, kwarg_var, defaults = tup[:4] - defaults = defaults or () - arg_count = len(positional) - arguments = [] - for idx, name in enumerate(positional): - if isinstance(name, list): - raise TypeError('cannot parse functions that unpack tuples ' - 'in the function signature') - try: - default = defaults[idx - arg_count] - except IndexError: - param = (name, False, None) - else: - param = (name, True, default) - arguments.append(param) - arguments = tuple(arguments) - - def parse(args, kwargs): - new_args = [] - missing = [] - extra = {} - - # consume as many arguments as positional as possible - for idx, (name, has_default, default) in enumerate(arguments): - try: - new_args.append(args[idx]) - except IndexError: - try: - new_args.append(kwargs.pop(name)) - except KeyError: - if has_default: - new_args.append(default) - else: - missing.append(name) - else: - if name in kwargs: - extra[name] = kwargs.pop(name) - - # handle extra arguments - extra_positional = args[arg_count:] - if vararg_var is not None: - new_args.extend(extra_positional) - extra_positional = () - if kwargs and kwarg_var is None: - extra.update(kwargs) - kwargs = {} - - return new_args, kwargs, missing, extra, extra_positional, \ - arguments, vararg_var, kwarg_var - _signature_cache[func] = parse - return parse - - -def _date_to_unix(arg): - """Converts a timetuple, integer or datetime object into the seconds from - epoch in utc. - """ - if isinstance(arg, datetime): - arg = arg.utctimetuple() - elif isinstance(arg, integer_types + (float,)): - return int(arg) - year, month, day, hour, minute, second = arg[:6] - days = date(year, month, 1).toordinal() - _epoch_ord + day - 1 - hours = days * 24 + hour - minutes = hours * 60 + minute - seconds = minutes * 60 + second - return seconds - - -class _DictAccessorProperty(object): - - """Baseclass for `environ_property` and `header_property`.""" - read_only = False - - def __init__(self, name, default=None, load_func=None, dump_func=None, - read_only=None, doc=None): - self.name = name - self.default = default - self.load_func = load_func - self.dump_func = dump_func - if read_only is not None: - self.read_only = read_only - self.__doc__ = doc - - def __get__(self, obj, type=None): - if obj is None: - return self - storage = self.lookup(obj) - if self.name not in storage: - return self.default - rv = storage[self.name] - if self.load_func is not None: - try: - rv = self.load_func(rv) - except (ValueError, TypeError): - rv = self.default - return rv - - def __set__(self, obj, value): - if self.read_only: - raise AttributeError('read only property') - if self.dump_func is not None: - value = self.dump_func(value) - self.lookup(obj)[self.name] = value - - def __delete__(self, obj): - if self.read_only: - raise AttributeError('read only property') - self.lookup(obj).pop(self.name, None) - - def __repr__(self): - return '<%s %s>' % ( - self.__class__.__name__, - self.name - ) - - -def _cookie_quote(b): - buf = bytearray() - all_legal = True - _lookup = _cookie_quoting_map.get - _push = buf.extend - - for char in iter_bytes(b): - if char not in _legal_cookie_chars: - all_legal = False - char = _lookup(char, char) - _push(char) - - if all_legal: - return bytes(buf) - return bytes(b'"' + buf + b'"') - - -def _cookie_unquote(b): - if len(b) < 2: - return b - if b[:1] != b'"' or b[-1:] != b'"': - return b - - b = b[1:-1] - - i = 0 - n = len(b) - rv = bytearray() - _push = rv.extend - - while 0 <= i < n: - o_match = _octal_re.search(b, i) - q_match = _quote_re.search(b, i) - if not o_match and not q_match: - rv.extend(b[i:]) - break - j = k = -1 - if o_match: - j = o_match.start(0) - if q_match: - k = q_match.start(0) - if q_match and (not o_match or k < j): - _push(b[i:k]) - _push(b[k + 1:k + 2]) - i = k + 2 - else: - _push(b[i:j]) - rv.append(int(b[j + 1:j + 4], 8)) - i = j + 4 - - return bytes(rv) - - -def _cookie_parse_impl(b): - """Lowlevel cookie parsing facility that operates on bytes.""" - i = 0 - n = len(b) - - while i < n: - match = _cookie_re.search(b + b';', i) - if not match: - break - - key = match.group('key').strip() - value = match.group('val') or b'' - i = match.end(0) - - # Ignore parameters. We have no interest in them. - if key.lower() not in _cookie_params: - yield _cookie_unquote(key), _cookie_unquote(value) - - -def _encode_idna(domain): - # If we're given bytes, make sure they fit into ASCII - if not isinstance(domain, text_type): - domain.decode('ascii') - return domain - - # Otherwise check if it's already ascii, then return - try: - return domain.encode('ascii') - except UnicodeError: - pass - - # Otherwise encode each part separately - parts = domain.split('.') - for idx, part in enumerate(parts): - parts[idx] = part.encode('idna') - return b'.'.join(parts) - - -def _decode_idna(domain): - # If the input is a string try to encode it to ascii to - # do the idna decoding. if that fails because of an - # unicode error, then we already have a decoded idna domain - if isinstance(domain, text_type): - try: - domain = domain.encode('ascii') - except UnicodeError: - return domain - - # Decode each part separately. If a part fails, try to - # decode it with ascii and silently ignore errors. This makes - # most sense because the idna codec does not have error handling - parts = domain.split(b'.') - for idx, part in enumerate(parts): - try: - parts[idx] = part.decode('idna') - except UnicodeError: - parts[idx] = part.decode('ascii', 'ignore') - - return '.'.join(parts) - - -def _make_cookie_domain(domain): - if domain is None: - return None - domain = _encode_idna(domain) - if b':' in domain: - domain = domain.split(b':', 1)[0] - if b'.' in domain: - return domain - raise ValueError( - 'Setting \'domain\' for a cookie on a server running locally (ex: ' - 'localhost) is not supported by complying browsers. You should ' - 'have something like: \'127.0.0.1 localhost dev.localhost\' on ' - 'your hosts file and then point your server to run on ' - '\'dev.localhost\' and also set \'domain\' for \'dev.localhost\'' - ) - - -def _easteregg(app=None): - """Like the name says. But who knows how it works?""" - def bzzzzzzz(gyver): - import base64 - import zlib - return zlib.decompress(base64.b64decode(gyver)).decode('ascii') - gyver = u'\n'.join([x + (77 - len(x)) * u' ' for x in bzzzzzzz(b''' -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 -7f2zLkGNv8b191cD/3vs9Q833z8t''').splitlines()]) - - def easteregged(environ, start_response): - def injecting_start_response(status, headers, exc_info=None): - headers.append(('X-Powered-By', 'Werkzeug')) - return start_response(status, headers, exc_info) - if app is not None and environ.get('QUERY_STRING') != 'macgybarchakku': - return app(environ, injecting_start_response) - injecting_start_response('200 OK', [('Content-Type', 'text/html')]) - return [(u''' - - - -About Werkzeug - - - -

Werkzeug

-

the Swiss Army knife of Python web development.

-
%s\n\n\n
- -''' % gyver).encode('latin1')] - return easteregged diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/_reloader.py b/flask/venv/lib/python3.6/site-packages/werkzeug/_reloader.py deleted file mode 100644 index 0d23dba..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/_reloader.py +++ /dev/null @@ -1,277 +0,0 @@ -import os -import sys -import time -import subprocess -import threading -from itertools import chain - -from werkzeug._internal import _log -from werkzeug._compat import PY2, iteritems, text_type - - -def _iter_module_files(): - """This iterates over all relevant Python files. It goes through all - loaded files from modules, all files in folders of already loaded modules - as well as all files reachable through a package. - """ - # The list call is necessary on Python 3 in case the module - # dictionary modifies during iteration. - for module in list(sys.modules.values()): - if module is None: - continue - filename = getattr(module, '__file__', None) - if filename: - if os.path.isdir(filename) and \ - os.path.exists(os.path.join(filename, "__init__.py")): - filename = os.path.join(filename, "__init__.py") - - old = None - while not os.path.isfile(filename): - old = filename - filename = os.path.dirname(filename) - if filename == old: - break - else: - if filename[-4:] in ('.pyc', '.pyo'): - filename = filename[:-1] - yield filename - - -def _find_observable_paths(extra_files=None): - """Finds all paths that should be observed.""" - rv = set(os.path.dirname(os.path.abspath(x)) - if os.path.isfile(x) else os.path.abspath(x) - for x in sys.path) - - for filename in extra_files or (): - rv.add(os.path.dirname(os.path.abspath(filename))) - - for module in list(sys.modules.values()): - fn = getattr(module, '__file__', None) - if fn is None: - continue - fn = os.path.abspath(fn) - rv.add(os.path.dirname(fn)) - - return _find_common_roots(rv) - - -def _get_args_for_reloading(): - """Returns the executable. This contains a workaround for windows - if the executable is incorrectly reported to not have the .exe - extension which can cause bugs on reloading. - """ - rv = [sys.executable] - py_script = sys.argv[0] - if os.name == 'nt' and not os.path.exists(py_script) and \ - os.path.exists(py_script + '.exe'): - py_script += '.exe' - if os.path.splitext(rv[0])[1] == '.exe' and os.path.splitext(py_script)[1] == '.exe': - rv.pop(0) - rv.append(py_script) - rv.extend(sys.argv[1:]) - return rv - - -def _find_common_roots(paths): - """Out of some paths it finds the common roots that need monitoring.""" - paths = [x.split(os.path.sep) for x in paths] - root = {} - for chunks in sorted(paths, key=len, reverse=True): - node = root - for chunk in chunks: - node = node.setdefault(chunk, {}) - node.clear() - - rv = set() - - def _walk(node, path): - for prefix, child in iteritems(node): - _walk(child, path + (prefix,)) - if not node: - rv.add('/'.join(path)) - _walk(root, ()) - return rv - - -class ReloaderLoop(object): - name = None - - # monkeypatched by testsuite. wrapping with `staticmethod` is required in - # case time.sleep has been replaced by a non-c function (e.g. by - # `eventlet.monkey_patch`) before we get here - _sleep = staticmethod(time.sleep) - - def __init__(self, extra_files=None, interval=1): - self.extra_files = set(os.path.abspath(x) - for x in extra_files or ()) - self.interval = interval - - def run(self): - pass - - def restart_with_reloader(self): - """Spawn a new Python interpreter with the same arguments as this one, - but running the reloader thread. - """ - while 1: - _log('info', ' * Restarting with %s' % self.name) - args = _get_args_for_reloading() - new_environ = os.environ.copy() - new_environ['WERKZEUG_RUN_MAIN'] = 'true' - - # a weird bug on windows. sometimes unicode strings end up in the - # environment and subprocess.call does not like this, encode them - # to latin1 and continue. - if os.name == 'nt' and PY2: - for key, value in iteritems(new_environ): - if isinstance(value, text_type): - new_environ[key] = value.encode('iso-8859-1') - - exit_code = subprocess.call(args, env=new_environ, - close_fds=False) - if exit_code != 3: - return exit_code - - def trigger_reload(self, filename): - self.log_reload(filename) - sys.exit(3) - - def log_reload(self, filename): - filename = os.path.abspath(filename) - _log('info', ' * Detected change in %r, reloading' % filename) - - -class StatReloaderLoop(ReloaderLoop): - name = 'stat' - - def run(self): - mtimes = {} - while 1: - for filename in chain(_iter_module_files(), - self.extra_files): - try: - mtime = os.stat(filename).st_mtime - except OSError: - continue - - old_time = mtimes.get(filename) - if old_time is None: - mtimes[filename] = mtime - continue - elif mtime > old_time: - self.trigger_reload(filename) - self._sleep(self.interval) - - -class WatchdogReloaderLoop(ReloaderLoop): - - def __init__(self, *args, **kwargs): - ReloaderLoop.__init__(self, *args, **kwargs) - from watchdog.observers import Observer - from watchdog.events import FileSystemEventHandler - self.observable_paths = set() - - def _check_modification(filename): - if filename in self.extra_files: - self.trigger_reload(filename) - dirname = os.path.dirname(filename) - if dirname.startswith(tuple(self.observable_paths)): - if filename.endswith(('.pyc', '.pyo', '.py')): - self.trigger_reload(filename) - - class _CustomHandler(FileSystemEventHandler): - - def on_created(self, event): - _check_modification(event.src_path) - - def on_modified(self, event): - _check_modification(event.src_path) - - def on_moved(self, event): - _check_modification(event.src_path) - _check_modification(event.dest_path) - - def on_deleted(self, event): - _check_modification(event.src_path) - - reloader_name = Observer.__name__.lower() - if reloader_name.endswith('observer'): - reloader_name = reloader_name[:-8] - reloader_name += ' reloader' - - self.name = reloader_name - - self.observer_class = Observer - self.event_handler = _CustomHandler() - self.should_reload = False - - def trigger_reload(self, filename): - # This is called inside an event handler, which means throwing - # SystemExit has no effect. - # https://github.com/gorakhargosh/watchdog/issues/294 - self.should_reload = True - self.log_reload(filename) - - def run(self): - watches = {} - observer = self.observer_class() - observer.start() - - try: - while not self.should_reload: - to_delete = set(watches) - paths = _find_observable_paths(self.extra_files) - for path in paths: - if path not in watches: - try: - watches[path] = observer.schedule( - self.event_handler, path, recursive=True) - except OSError: - # Clear this path from list of watches We don't want - # the same error message showing again in the next - # iteration. - watches[path] = None - to_delete.discard(path) - for path in to_delete: - watch = watches.pop(path, None) - if watch is not None: - observer.unschedule(watch) - self.observable_paths = paths - self._sleep(self.interval) - finally: - observer.stop() - observer.join() - - sys.exit(3) - - -reloader_loops = { - 'stat': StatReloaderLoop, - 'watchdog': WatchdogReloaderLoop, -} - -try: - __import__('watchdog.observers') -except ImportError: - reloader_loops['auto'] = reloader_loops['stat'] -else: - reloader_loops['auto'] = reloader_loops['watchdog'] - - -def run_with_reloader(main_func, extra_files=None, interval=1, - reloader_type='auto'): - """Run the given function in an independent python interpreter.""" - import signal - reloader = reloader_loops[reloader_type](extra_files, interval) - signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) - try: - if os.environ.get('WERKZEUG_RUN_MAIN') == 'true': - t = threading.Thread(target=main_func, args=()) - t.setDaemon(True) - t.start() - reloader.run() - else: - sys.exit(reloader.restart_with_reloader()) - except KeyboardInterrupt: - pass diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__init__.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__init__.py deleted file mode 100644 index 3e572eb..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.contrib - ~~~~~~~~~~~~~~~~ - - Contains user-submitted code that other users may find useful, but which - is not part of the Werkzeug core. Anyone can write code for inclusion in - the `contrib` package. All modules in this package are distributed as an - add-on library and thus are not part of Werkzeug itself. - - This file itself is mostly for informational purposes and to tell the - Python interpreter that `contrib` is a package. - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/__init__.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index f73640147c419c0e70329e7d1e1d6991e4656f4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 753 zcmZuvUuzUG5Z~*I$3dYVVIDo`?b<2`hp6=|C`c{di6Fu@o6O$EW|NRVT-OJ`k6)>; zKKT`VayGkXix|j|%w&G^`%UKY;oCV*v*(rQXa_%u=>K!-WNneL26;7r5L$v~&RP;DGY%~kZ$ zXgVddKK*J`a7Cc}nr#z=QqUR^6?%F~RjBM31?CWh^u6fV%U~YZfX0Ma5Vn$)W3D5w zpv*{N%D7MZFJT!xsyZLqwCRh~QXvd(plfSq&NQ_BM zQgzvdCTR@ltV6OCqBh?tC1|!6G?rg-V>>6eO<2N1K8MpsCr_a2deFNLZ;-Xe;1S{M zs&rM`ne`efzv#9*l;N9}P5uhy@Jgm-UO=NIeq|0G<@C$|sEQW##AKQc!X zHkjWpiqP7^O1q%x2~4TQ(^G$=Zoax=-@;-)hsF4dMOjKMLs{mwyPZB8KJoccKgzVT EKmOkH2mk;8 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/atom.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/atom.cpython-36.pyc deleted file mode 100644 index 49ab1dc949eca11e7a556df3588fafda79f593dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14065 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 Dg%B>p diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/cache.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/cache.cpython-36.pyc deleted file mode 100644 index 8571f8bc1ef5fc10355b01a4bf12551fe9920091..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32378 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/iterio.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/iterio.cpython-36.pyc deleted file mode 100644 index 724f06778613e6f76c9f2ae51888387e44fec8a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10952 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 YCKQTJim&$?PSdT=)vF-AVCmZb0hR3+7XSbN diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/jsrouting.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/jsrouting.cpython-36.pyc deleted file mode 100644 index 3ba729dbb9f1e6c995c81e3ef09686acf53f3db8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8261 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/limiter.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/limiter.cpython-36.pyc deleted file mode 100644 index c912c4e041875822c90f5f9eb52f752546cbf06f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1724 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 bAT7Y(sew}X7wW}&v0AF1uP@eX_3!*Im^*O1 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/profiler.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/profiler.cpython-36.pyc deleted file mode 100644 index 461eab11f821fe975606e6282d2c9b0f1a188c29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5250 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/securecookie.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/securecookie.cpython-36.pyc deleted file mode 100644 index b219a75334a304e5722545d6c0be3e562f76ef9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10302 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/sessions.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/sessions.cpython-36.pyc deleted file mode 100644 index 9d2ca6a7e80427d9576f60d41fde60bb040db055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12890 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/wrappers.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/wrappers.cpython-36.pyc deleted file mode 100644 index f7d64ee25db67444e096931557d2c20c39c82d16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10381 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 SLUpBfsrGj5om##2qdx+Pv`9Sw diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/atom.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/atom.py deleted file mode 100644 index 51d1a4e..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/atom.py +++ /dev/null @@ -1,355 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.contrib.atom - ~~~~~~~~~~~~~~~~~~~~~ - - This module provides a class called :class:`AtomFeed` which can be - used to generate feeds in the Atom syndication format (see :rfc:`4287`). - - Example:: - - def atom_feed(request): - feed = AtomFeed("My Blog", feed_url=request.url, - url=request.host_url, - subtitle="My example blog for a feed test.") - for post in Post.query.limit(10).all(): - feed.add(post.title, post.body, content_type='html', - author=post.author, url=post.url, id=post.uid, - updated=post.last_update, published=post.pub_date) - return feed.get_response() - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from datetime import datetime - -from werkzeug.utils import escape -from werkzeug.wrappers import BaseResponse -from werkzeug._compat import implements_to_string, string_types - - -XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml' - - -def _make_text_block(name, content, content_type=None): - """Helper function for the builder that creates an XML text block.""" - if content_type == 'xhtml': - return u'<%s type="xhtml">
%s
\n' % \ - (name, XHTML_NAMESPACE, content, name) - if not content_type: - return u'<%s>%s\n' % (name, escape(content), name) - return u'<%s type="%s">%s\n' % (name, content_type, - escape(content), name) - - -def format_iso8601(obj): - """Format a datetime object for iso8601""" - iso8601 = obj.isoformat() - if obj.tzinfo: - return iso8601 - return iso8601 + 'Z' - - -@implements_to_string -class AtomFeed(object): - - """A helper class that creates Atom feeds. - - :param title: the title of the feed. Required. - :param title_type: the type attribute for the title element. One of - ``'html'``, ``'text'`` or ``'xhtml'``. - :param url: the url for the feed (not the url *of* the feed) - :param id: a globally unique id for the feed. Must be an URI. If - not present the `feed_url` is used, but one of both is - required. - :param updated: the time the feed was modified the last time. Must - be a :class:`datetime.datetime` object. If not - present the latest entry's `updated` is used. - Treated as UTC if naive datetime. - :param feed_url: the URL to the feed. Should be the URL that was - requested. - :param author: the author of the feed. Must be either a string (the - name) or a dict with name (required) and uri or - email (both optional). Can be a list of (may be - mixed, too) strings and dicts, too, if there are - multiple authors. Required if not every entry has an - author element. - :param icon: an icon for the feed. - :param logo: a logo for the feed. - :param rights: copyright information for the feed. - :param rights_type: the type attribute for the rights element. One of - ``'html'``, ``'text'`` or ``'xhtml'``. Default is - ``'text'``. - :param subtitle: a short description of the feed. - :param subtitle_type: the type attribute for the subtitle element. - One of ``'text'``, ``'html'``, ``'text'`` - or ``'xhtml'``. Default is ``'text'``. - :param links: additional links. Must be a list of dictionaries with - href (required) and rel, type, hreflang, title, length - (all optional) - :param generator: the software that generated this feed. This must be - a tuple in the form ``(name, url, version)``. If - you don't want to specify one of them, set the item - to `None`. - :param entries: a list with the entries for the feed. Entries can also - be added later with :meth:`add`. - - For more information on the elements see - http://www.atomenabled.org/developers/syndication/ - - Everywhere where a list is demanded, any iterable can be used. - """ - - default_generator = ('Werkzeug', None, None) - - def __init__(self, title=None, entries=None, **kwargs): - self.title = title - self.title_type = kwargs.get('title_type', 'text') - self.url = kwargs.get('url') - self.feed_url = kwargs.get('feed_url', self.url) - self.id = kwargs.get('id', self.feed_url) - self.updated = kwargs.get('updated') - self.author = kwargs.get('author', ()) - self.icon = kwargs.get('icon') - self.logo = kwargs.get('logo') - self.rights = kwargs.get('rights') - self.rights_type = kwargs.get('rights_type') - self.subtitle = kwargs.get('subtitle') - self.subtitle_type = kwargs.get('subtitle_type', 'text') - self.generator = kwargs.get('generator') - if self.generator is None: - self.generator = self.default_generator - self.links = kwargs.get('links', []) - self.entries = entries and list(entries) or [] - - if not hasattr(self.author, '__iter__') \ - or isinstance(self.author, string_types + (dict,)): - self.author = [self.author] - for i, author in enumerate(self.author): - if not isinstance(author, dict): - self.author[i] = {'name': author} - - if not self.title: - raise ValueError('title is required') - if not self.id: - raise ValueError('id is required') - for author in self.author: - if 'name' not in author: - raise TypeError('author must contain at least a name') - - def add(self, *args, **kwargs): - """Add a new entry to the feed. This function can either be called - with a :class:`FeedEntry` or some keyword and positional arguments - that are forwarded to the :class:`FeedEntry` constructor. - """ - if len(args) == 1 and not kwargs and isinstance(args[0], FeedEntry): - self.entries.append(args[0]) - else: - kwargs['feed_url'] = self.feed_url - self.entries.append(FeedEntry(*args, **kwargs)) - - def __repr__(self): - return '<%s %r (%d entries)>' % ( - self.__class__.__name__, - self.title, - len(self.entries) - ) - - def generate(self): - """Return a generator that yields pieces of XML.""" - # atom demands either an author element in every entry or a global one - if not self.author: - if any(not e.author for e in self.entries): - self.author = ({'name': 'Unknown author'},) - - if not self.updated: - dates = sorted([entry.updated for entry in self.entries]) - self.updated = dates and dates[-1] or datetime.utcnow() - - yield u'\n' - yield u'\n' - yield ' ' + _make_text_block('title', self.title, self.title_type) - yield u' %s\n' % escape(self.id) - yield u' %s\n' % format_iso8601(self.updated) - if self.url: - yield u' \n' % escape(self.url) - if self.feed_url: - yield u' \n' % \ - escape(self.feed_url) - for link in self.links: - yield u' \n' % ''.join('%s="%s" ' % - (k, escape(link[k])) for k in link) - for author in self.author: - yield u' \n' - yield u' %s\n' % escape(author['name']) - if 'uri' in author: - yield u' %s\n' % escape(author['uri']) - if 'email' in author: - yield ' %s\n' % escape(author['email']) - yield ' \n' - if self.subtitle: - yield ' ' + _make_text_block('subtitle', self.subtitle, - self.subtitle_type) - if self.icon: - yield u' %s\n' % escape(self.icon) - if self.logo: - yield u' %s\n' % escape(self.logo) - if self.rights: - yield ' ' + _make_text_block('rights', self.rights, - self.rights_type) - generator_name, generator_url, generator_version = self.generator - if generator_name or generator_url or generator_version: - tmp = [u' %s\n' % escape(generator_name)) - yield u''.join(tmp) - for entry in self.entries: - for line in entry.generate(): - yield u' ' + line - yield u'\n' - - def to_string(self): - """Convert the feed into a string.""" - return u''.join(self.generate()) - - def get_response(self): - """Return a response object for the feed.""" - return BaseResponse(self.to_string(), mimetype='application/atom+xml') - - def __call__(self, environ, start_response): - """Use the class as WSGI response object.""" - return self.get_response()(environ, start_response) - - def __str__(self): - return self.to_string() - - -@implements_to_string -class FeedEntry(object): - - """Represents a single entry in a feed. - - :param title: the title of the entry. Required. - :param title_type: the type attribute for the title element. One of - ``'html'``, ``'text'`` or ``'xhtml'``. - :param content: the content of the entry. - :param content_type: the type attribute for the content element. One - of ``'html'``, ``'text'`` or ``'xhtml'``. - :param summary: a summary of the entry's content. - :param summary_type: the type attribute for the summary element. One - of ``'html'``, ``'text'`` or ``'xhtml'``. - :param url: the url for the entry. - :param id: a globally unique id for the entry. Must be an URI. If - not present the URL is used, but one of both is required. - :param updated: the time the entry was modified the last time. Must - be a :class:`datetime.datetime` object. Treated as - UTC if naive datetime. Required. - :param author: the author of the entry. Must be either a string (the - name) or a dict with name (required) and uri or - email (both optional). Can be a list of (may be - mixed, too) strings and dicts, too, if there are - multiple authors. Required if the feed does not have an - author element. - :param published: the time the entry was initially published. Must - be a :class:`datetime.datetime` object. Treated as - UTC if naive datetime. - :param rights: copyright information for the entry. - :param rights_type: the type attribute for the rights element. One of - ``'html'``, ``'text'`` or ``'xhtml'``. Default is - ``'text'``. - :param links: additional links. Must be a list of dictionaries with - href (required) and rel, type, hreflang, title, length - (all optional) - :param categories: categories for the entry. Must be a list of dictionaries - with term (required), scheme and label (all optional) - :param xml_base: The xml base (url) for this feed item. If not provided - it will default to the item url. - - For more information on the elements see - http://www.atomenabled.org/developers/syndication/ - - Everywhere where a list is demanded, any iterable can be used. - """ - - def __init__(self, title=None, content=None, feed_url=None, **kwargs): - self.title = title - self.title_type = kwargs.get('title_type', 'text') - self.content = content - self.content_type = kwargs.get('content_type', 'html') - self.url = kwargs.get('url') - self.id = kwargs.get('id', self.url) - self.updated = kwargs.get('updated') - self.summary = kwargs.get('summary') - self.summary_type = kwargs.get('summary_type', 'html') - self.author = kwargs.get('author', ()) - self.published = kwargs.get('published') - self.rights = kwargs.get('rights') - self.links = kwargs.get('links', []) - self.categories = kwargs.get('categories', []) - self.xml_base = kwargs.get('xml_base', feed_url) - - if not hasattr(self.author, '__iter__') \ - or isinstance(self.author, string_types + (dict,)): - self.author = [self.author] - for i, author in enumerate(self.author): - if not isinstance(author, dict): - self.author[i] = {'name': author} - - if not self.title: - raise ValueError('title is required') - if not self.id: - raise ValueError('id is required') - if not self.updated: - raise ValueError('updated is required') - - def __repr__(self): - return '<%s %r>' % ( - self.__class__.__name__, - self.title - ) - - def generate(self): - """Yields pieces of ATOM XML.""" - base = '' - if self.xml_base: - base = ' xml:base="%s"' % escape(self.xml_base) - yield u'\n' % base - yield u' ' + _make_text_block('title', self.title, self.title_type) - yield u' %s\n' % escape(self.id) - yield u' %s\n' % format_iso8601(self.updated) - if self.published: - yield u' %s\n' % \ - format_iso8601(self.published) - if self.url: - yield u' \n' % escape(self.url) - for author in self.author: - yield u' \n' - yield u' %s\n' % escape(author['name']) - if 'uri' in author: - yield u' %s\n' % escape(author['uri']) - if 'email' in author: - yield u' %s\n' % escape(author['email']) - yield u' \n' - for link in self.links: - yield u' \n' % ''.join('%s="%s" ' % - (k, escape(link[k])) for k in link) - for category in self.categories: - yield u' \n' % ''.join('%s="%s" ' % - (k, escape(category[k])) for k in category) - if self.summary: - yield u' ' + _make_text_block('summary', self.summary, - self.summary_type) - if self.content: - yield u' ' + _make_text_block('content', self.content, - self.content_type) - yield u'\n' - - def to_string(self): - """Convert the feed item into a unicode object.""" - return u''.join(self.generate()) - - def __str__(self): - return self.to_string() diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/cache.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/cache.py deleted file mode 100644 index 179ba24..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/cache.py +++ /dev/null @@ -1,913 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.contrib.cache - ~~~~~~~~~~~~~~~~~~~~~~ - - The main problem with dynamic Web sites is, well, they're dynamic. Each - time a user requests a page, the webserver executes a lot of code, queries - the database, renders templates until the visitor gets the page he sees. - - This is a lot more expensive than just loading a file from the file system - and sending it to the visitor. - - For most Web applications, this overhead isn't a big deal but once it - becomes, you will be glad to have a cache system in place. - - How Caching Works - ================= - - Caching is pretty simple. Basically you have a cache object lurking around - somewhere that is connected to a remote cache or the file system or - something else. When the request comes in you check if the current page - is already in the cache and if so, you're returning it from the cache. - Otherwise you generate the page and put it into the cache. (Or a fragment - of the page, you don't have to cache the full thing) - - Here is a simple example of how to cache a sidebar for 5 minutes:: - - def get_sidebar(user): - identifier = 'sidebar_for/user%d' % user.id - value = cache.get(identifier) - if value is not None: - return value - value = generate_sidebar_for(user=user) - cache.set(identifier, value, timeout=60 * 5) - return value - - Creating a Cache Object - ======================= - - To create a cache object you just import the cache system of your choice - from the cache module and instantiate it. Then you can start working - with that object: - - >>> from werkzeug.contrib.cache import SimpleCache - >>> c = SimpleCache() - >>> c.set("foo", "value") - >>> c.get("foo") - 'value' - >>> c.get("missing") is None - True - - Please keep in mind that you have to create the cache and put it somewhere - you have access to it (either as a module global you can import or you just - put it into your WSGI application). - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import os -import re -import errno -import tempfile -import platform -from hashlib import md5 -from time import time -try: - import cPickle as pickle -except ImportError: # pragma: no cover - import pickle - -from werkzeug._compat import iteritems, string_types, text_type, \ - integer_types, to_native -from werkzeug.posixemulation import rename - - -def _items(mappingorseq): - """Wrapper for efficient iteration over mappings represented by dicts - or sequences:: - - >>> for k, v in _items((i, i*i) for i in xrange(5)): - ... assert k*k == v - - >>> for k, v in _items(dict((i, i*i) for i in xrange(5))): - ... assert k*k == v - - """ - if hasattr(mappingorseq, 'items'): - return iteritems(mappingorseq) - return mappingorseq - - -class BaseCache(object): - - """Baseclass for the cache systems. All the cache systems implement this - API or a superset of it. - - :param default_timeout: the default timeout (in seconds) that is used if - no timeout is specified on :meth:`set`. A timeout - of 0 indicates that the cache never expires. - """ - - def __init__(self, default_timeout=300): - self.default_timeout = default_timeout - - def _normalize_timeout(self, timeout): - if timeout is None: - timeout = self.default_timeout - return timeout - - def get(self, key): - """Look up key in the cache and return the value for it. - - :param key: the key to be looked up. - :returns: The value if it exists and is readable, else ``None``. - """ - return None - - def delete(self, key): - """Delete `key` from the cache. - - :param key: the key to delete. - :returns: Whether the key existed and has been deleted. - :rtype: boolean - """ - return True - - def get_many(self, *keys): - """Returns a list of values for the given keys. - For each key an item in the list is created:: - - foo, bar = cache.get_many("foo", "bar") - - Has the same error handling as :meth:`get`. - - :param keys: The function accepts multiple keys as positional - arguments. - """ - return [self.get(k) for k in keys] - - def get_dict(self, *keys): - """Like :meth:`get_many` but return a dict:: - - d = cache.get_dict("foo", "bar") - foo = d["foo"] - bar = d["bar"] - - :param keys: The function accepts multiple keys as positional - arguments. - """ - return dict(zip(keys, self.get_many(*keys))) - - def set(self, key, value, timeout=None): - """Add a new key/value to the cache (overwrites value, if key already - exists in the cache). - - :param key: the key to set - :param value: the value for the key - :param timeout: the cache timeout for the key in seconds (if not - specified, it uses the default timeout). A timeout of - 0 idicates that the cache never expires. - :returns: ``True`` if key has been updated, ``False`` for backend - errors. Pickling errors, however, will raise a subclass of - ``pickle.PickleError``. - :rtype: boolean - """ - return True - - def add(self, key, value, timeout=None): - """Works like :meth:`set` but does not overwrite the values of already - existing keys. - - :param key: the key to set - :param value: the value for the key - :param timeout: the cache timeout for the key in seconds (if not - specified, it uses the default timeout). A timeout of - 0 idicates that the cache never expires. - :returns: Same as :meth:`set`, but also ``False`` for already - existing keys. - :rtype: boolean - """ - return True - - def set_many(self, mapping, timeout=None): - """Sets multiple keys and values from a mapping. - - :param mapping: a mapping with the keys/values to set. - :param timeout: the cache timeout for the key in seconds (if not - specified, it uses the default timeout). A timeout of - 0 idicates that the cache never expires. - :returns: Whether all given keys have been set. - :rtype: boolean - """ - rv = True - for key, value in _items(mapping): - if not self.set(key, value, timeout): - rv = False - return rv - - def delete_many(self, *keys): - """Deletes multiple keys at once. - - :param keys: The function accepts multiple keys as positional - arguments. - :returns: Whether all given keys have been deleted. - :rtype: boolean - """ - return all(self.delete(key) for key in keys) - - def has(self, key): - """Checks if a key exists in the cache without returning it. This is a - cheap operation that bypasses loading the actual data on the backend. - - This method is optional and may not be implemented on all caches. - - :param key: the key to check - """ - raise NotImplementedError( - '%s doesn\'t have an efficient implementation of `has`. That ' - 'means it is impossible to check whether a key exists without ' - 'fully loading the key\'s data. Consider using `self.get` ' - 'explicitly if you don\'t care about performance.' - ) - - def clear(self): - """Clears the cache. Keep in mind that not all caches support - completely clearing the cache. - - :returns: Whether the cache has been cleared. - :rtype: boolean - """ - return True - - def inc(self, key, delta=1): - """Increments the value of a key by `delta`. If the key does - not yet exist it is initialized with `delta`. - - For supporting caches this is an atomic operation. - - :param key: the key to increment. - :param delta: the delta to add. - :returns: The new value or ``None`` for backend errors. - """ - value = (self.get(key) or 0) + delta - return value if self.set(key, value) else None - - def dec(self, key, delta=1): - """Decrements the value of a key by `delta`. If the key does - not yet exist it is initialized with `-delta`. - - For supporting caches this is an atomic operation. - - :param key: the key to increment. - :param delta: the delta to subtract. - :returns: The new value or `None` for backend errors. - """ - value = (self.get(key) or 0) - delta - return value if self.set(key, value) else None - - -class NullCache(BaseCache): - - """A cache that doesn't cache. This can be useful for unit testing. - - :param default_timeout: a dummy parameter that is ignored but exists - for API compatibility with other caches. - """ - - def has(self, key): - return False - - -class SimpleCache(BaseCache): - - """Simple memory cache for single process environments. This class exists - mainly for the development server and is not 100% thread safe. It tries - to use as many atomic operations as possible and no locks for simplicity - but it could happen under heavy load that keys are added multiple times. - - :param threshold: the maximum number of items the cache stores before - it starts deleting some. - :param default_timeout: the default timeout that is used if no timeout is - specified on :meth:`~BaseCache.set`. A timeout of - 0 indicates that the cache never expires. - """ - - def __init__(self, threshold=500, default_timeout=300): - BaseCache.__init__(self, default_timeout) - self._cache = {} - self.clear = self._cache.clear - self._threshold = threshold - - def _prune(self): - if len(self._cache) > self._threshold: - now = time() - toremove = [] - for idx, (key, (expires, _)) in enumerate(self._cache.items()): - if (expires != 0 and expires <= now) or idx % 3 == 0: - toremove.append(key) - for key in toremove: - self._cache.pop(key, None) - - def _normalize_timeout(self, timeout): - timeout = BaseCache._normalize_timeout(self, timeout) - if timeout > 0: - timeout = time() + timeout - return timeout - - def get(self, key): - try: - expires, value = self._cache[key] - if expires == 0 or expires > time(): - return pickle.loads(value) - except (KeyError, pickle.PickleError): - return None - - def set(self, key, value, timeout=None): - expires = self._normalize_timeout(timeout) - self._prune() - self._cache[key] = (expires, pickle.dumps(value, - pickle.HIGHEST_PROTOCOL)) - return True - - def add(self, key, value, timeout=None): - expires = self._normalize_timeout(timeout) - self._prune() - item = (expires, pickle.dumps(value, - pickle.HIGHEST_PROTOCOL)) - if key in self._cache: - return False - self._cache.setdefault(key, item) - return True - - def delete(self, key): - return self._cache.pop(key, None) is not None - - def has(self, key): - try: - expires, value = self._cache[key] - return expires == 0 or expires > time() - except KeyError: - return False - -_test_memcached_key = re.compile(r'[^\x00-\x21\xff]{1,250}$').match - - -class MemcachedCache(BaseCache): - - """A cache that uses memcached as backend. - - The first argument can either be an object that resembles the API of a - :class:`memcache.Client` or a tuple/list of server addresses. In the - event that a tuple/list is passed, Werkzeug tries to import the best - available memcache library. - - This cache looks into the following packages/modules to find bindings for - memcached: - - - ``pylibmc`` - - ``google.appengine.api.memcached`` - - ``memcached`` - - ``libmc`` - - Implementation notes: This cache backend works around some limitations in - memcached to simplify the interface. For example unicode keys are encoded - to utf-8 on the fly. Methods such as :meth:`~BaseCache.get_dict` return - the keys in the same format as passed. Furthermore all get methods - silently ignore key errors to not cause problems when untrusted user data - is passed to the get methods which is often the case in web applications. - - :param servers: a list or tuple of server addresses or alternatively - a :class:`memcache.Client` or a compatible client. - :param default_timeout: the default timeout that is used if no timeout is - specified on :meth:`~BaseCache.set`. A timeout of - 0 indicates that the cache never expires. - :param key_prefix: a prefix that is added before all keys. This makes it - possible to use the same memcached server for different - applications. Keep in mind that - :meth:`~BaseCache.clear` will also clear keys with a - different prefix. - """ - - def __init__(self, servers=None, default_timeout=300, key_prefix=None): - BaseCache.__init__(self, default_timeout) - if servers is None or isinstance(servers, (list, tuple)): - if servers is None: - servers = ['127.0.0.1:11211'] - self._client = self.import_preferred_memcache_lib(servers) - if self._client is None: - raise RuntimeError('no memcache module found') - else: - # NOTE: servers is actually an already initialized memcache - # client. - self._client = servers - - self.key_prefix = to_native(key_prefix) - - def _normalize_key(self, key): - key = to_native(key, 'utf-8') - if self.key_prefix: - key = self.key_prefix + key - return key - - def _normalize_timeout(self, timeout): - timeout = BaseCache._normalize_timeout(self, timeout) - if timeout > 0: - timeout = int(time()) + timeout - return timeout - - def get(self, key): - key = self._normalize_key(key) - # memcached doesn't support keys longer than that. Because often - # checks for so long keys can occur because it's tested from user - # submitted data etc we fail silently for getting. - if _test_memcached_key(key): - return self._client.get(key) - - def get_dict(self, *keys): - key_mapping = {} - have_encoded_keys = False - for key in keys: - encoded_key = self._normalize_key(key) - if not isinstance(key, str): - have_encoded_keys = True - if _test_memcached_key(key): - key_mapping[encoded_key] = key - _keys = list(key_mapping) - d = rv = self._client.get_multi(_keys) - if have_encoded_keys or self.key_prefix: - rv = {} - for key, value in iteritems(d): - rv[key_mapping[key]] = value - if len(rv) < len(keys): - for key in keys: - if key not in rv: - rv[key] = None - return rv - - def add(self, key, value, timeout=None): - key = self._normalize_key(key) - timeout = self._normalize_timeout(timeout) - return self._client.add(key, value, timeout) - - def set(self, key, value, timeout=None): - key = self._normalize_key(key) - timeout = self._normalize_timeout(timeout) - return self._client.set(key, value, timeout) - - def get_many(self, *keys): - d = self.get_dict(*keys) - return [d[key] for key in keys] - - def set_many(self, mapping, timeout=None): - new_mapping = {} - for key, value in _items(mapping): - key = self._normalize_key(key) - new_mapping[key] = value - - timeout = self._normalize_timeout(timeout) - failed_keys = self._client.set_multi(new_mapping, timeout) - return not failed_keys - - def delete(self, key): - key = self._normalize_key(key) - if _test_memcached_key(key): - return self._client.delete(key) - - def delete_many(self, *keys): - new_keys = [] - for key in keys: - key = self._normalize_key(key) - if _test_memcached_key(key): - new_keys.append(key) - return self._client.delete_multi(new_keys) - - def has(self, key): - key = self._normalize_key(key) - if _test_memcached_key(key): - return self._client.append(key, '') - return False - - def clear(self): - return self._client.flush_all() - - def inc(self, key, delta=1): - key = self._normalize_key(key) - return self._client.incr(key, delta) - - def dec(self, key, delta=1): - key = self._normalize_key(key) - return self._client.decr(key, delta) - - def import_preferred_memcache_lib(self, servers): - """Returns an initialized memcache client. Used by the constructor.""" - try: - import pylibmc - except ImportError: - pass - else: - return pylibmc.Client(servers) - - try: - from google.appengine.api import memcache - except ImportError: - pass - else: - return memcache.Client() - - try: - import memcache - except ImportError: - pass - else: - return memcache.Client(servers) - - try: - import libmc - except ImportError: - pass - else: - return libmc.Client(servers) - - -# backwards compatibility -GAEMemcachedCache = MemcachedCache - - -class RedisCache(BaseCache): - - """Uses the Redis key-value store as a cache backend. - - The first argument can be either a string denoting address of the Redis - server or an object resembling an instance of a redis.Redis class. - - Note: Python Redis API already takes care of encoding unicode strings on - the fly. - - .. versionadded:: 0.7 - - .. versionadded:: 0.8 - `key_prefix` was added. - - .. versionchanged:: 0.8 - This cache backend now properly serializes objects. - - .. versionchanged:: 0.8.3 - This cache backend now supports password authentication. - - .. versionchanged:: 0.10 - ``**kwargs`` is now passed to the redis object. - - :param host: address of the Redis server or an object which API is - compatible with the official Python Redis client (redis-py). - :param port: port number on which Redis server listens for connections. - :param password: password authentication for the Redis server. - :param db: db (zero-based numeric index) on Redis Server to connect. - :param default_timeout: the default timeout that is used if no timeout is - specified on :meth:`~BaseCache.set`. A timeout of - 0 indicates that the cache never expires. - :param key_prefix: A prefix that should be added to all keys. - - Any additional keyword arguments will be passed to ``redis.Redis``. - """ - - def __init__(self, host='localhost', port=6379, password=None, - db=0, default_timeout=300, key_prefix=None, **kwargs): - BaseCache.__init__(self, default_timeout) - if host is None: - raise ValueError('RedisCache host parameter may not be None') - if isinstance(host, string_types): - try: - import redis - except ImportError: - raise RuntimeError('no redis module found') - if kwargs.get('decode_responses', None): - raise ValueError('decode_responses is not supported by ' - 'RedisCache.') - self._client = redis.Redis(host=host, port=port, password=password, - db=db, **kwargs) - else: - self._client = host - self.key_prefix = key_prefix or '' - - def _normalize_timeout(self, timeout): - timeout = BaseCache._normalize_timeout(self, timeout) - if timeout == 0: - timeout = -1 - return timeout - - def dump_object(self, value): - """Dumps an object into a string for redis. By default it serializes - integers as regular string and pickle dumps everything else. - """ - t = type(value) - if t in integer_types: - return str(value).encode('ascii') - return b'!' + pickle.dumps(value) - - def load_object(self, value): - """The reversal of :meth:`dump_object`. This might be called with - None. - """ - if value is None: - return None - if value.startswith(b'!'): - try: - return pickle.loads(value[1:]) - except pickle.PickleError: - return None - try: - return int(value) - except ValueError: - # before 0.8 we did not have serialization. Still support that. - return value - - def get(self, key): - return self.load_object(self._client.get(self.key_prefix + key)) - - def get_many(self, *keys): - if self.key_prefix: - keys = [self.key_prefix + key for key in keys] - return [self.load_object(x) for x in self._client.mget(keys)] - - def set(self, key, value, timeout=None): - timeout = self._normalize_timeout(timeout) - dump = self.dump_object(value) - if timeout == -1: - result = self._client.set(name=self.key_prefix + key, - value=dump) - else: - result = self._client.setex(name=self.key_prefix + key, - value=dump, time=timeout) - return result - - def add(self, key, value, timeout=None): - timeout = self._normalize_timeout(timeout) - dump = self.dump_object(value) - return ( - self._client.setnx(name=self.key_prefix + key, value=dump) and - self._client.expire(name=self.key_prefix + key, time=timeout) - ) - - def set_many(self, mapping, timeout=None): - timeout = self._normalize_timeout(timeout) - # Use transaction=False to batch without calling redis MULTI - # which is not supported by twemproxy - pipe = self._client.pipeline(transaction=False) - - for key, value in _items(mapping): - dump = self.dump_object(value) - if timeout == -1: - pipe.set(name=self.key_prefix + key, value=dump) - else: - pipe.setex(name=self.key_prefix + key, value=dump, - time=timeout) - return pipe.execute() - - def delete(self, key): - return self._client.delete(self.key_prefix + key) - - def delete_many(self, *keys): - if not keys: - return - if self.key_prefix: - keys = [self.key_prefix + key for key in keys] - return self._client.delete(*keys) - - def has(self, key): - return self._client.exists(self.key_prefix + key) - - def clear(self): - status = False - if self.key_prefix: - keys = self._client.keys(self.key_prefix + '*') - if keys: - status = self._client.delete(*keys) - else: - status = self._client.flushdb() - return status - - def inc(self, key, delta=1): - return self._client.incr(name=self.key_prefix + key, amount=delta) - - def dec(self, key, delta=1): - return self._client.decr(name=self.key_prefix + key, amount=delta) - - -class FileSystemCache(BaseCache): - - """A cache that stores the items on the file system. This cache depends - on being the only user of the `cache_dir`. Make absolutely sure that - nobody but this cache stores files there or otherwise the cache will - randomly delete files therein. - - :param cache_dir: the directory where cache files are stored. - :param threshold: the maximum number of items the cache stores before - it starts deleting some. A threshold value of 0 - indicates no threshold. - :param default_timeout: the default timeout that is used if no timeout is - specified on :meth:`~BaseCache.set`. A timeout of - 0 indicates that the cache never expires. - :param mode: the file mode wanted for the cache files, default 0600 - """ - - #: used for temporary files by the FileSystemCache - _fs_transaction_suffix = '.__wz_cache' - #: keep amount of files in a cache element - _fs_count_file = '__wz_cache_count' - - def __init__(self, cache_dir, threshold=500, default_timeout=300, - mode=0o600): - BaseCache.__init__(self, default_timeout) - self._path = cache_dir - self._threshold = threshold - self._mode = mode - - try: - os.makedirs(self._path) - except OSError as ex: - if ex.errno != errno.EEXIST: - raise - - self._update_count(value=len(self._list_dir())) - - @property - def _file_count(self): - return self.get(self._fs_count_file) or 0 - - def _update_count(self, delta=None, value=None): - # If we have no threshold, don't count files - if self._threshold == 0: - return - - if delta: - new_count = self._file_count + delta - else: - new_count = value or 0 - self.set(self._fs_count_file, new_count, mgmt_element=True) - - def _normalize_timeout(self, timeout): - timeout = BaseCache._normalize_timeout(self, timeout) - if timeout != 0: - timeout = time() + timeout - return int(timeout) - - def _list_dir(self): - """return a list of (fully qualified) cache filenames - """ - mgmt_files = [self._get_filename(name).split('/')[-1] - for name in (self._fs_count_file,)] - return [os.path.join(self._path, fn) for fn in os.listdir(self._path) - if not fn.endswith(self._fs_transaction_suffix) - and fn not in mgmt_files] - - def _prune(self): - if self._threshold == 0 or not self._file_count > self._threshold: - return - - entries = self._list_dir() - now = time() - for idx, fname in enumerate(entries): - try: - remove = False - with open(fname, 'rb') as f: - expires = pickle.load(f) - remove = (expires != 0 and expires <= now) or idx % 3 == 0 - - if remove: - os.remove(fname) - except (IOError, OSError): - pass - self._update_count(value=len(self._list_dir())) - - def clear(self): - for fname in self._list_dir(): - try: - os.remove(fname) - except (IOError, OSError): - self._update_count(value=len(self._list_dir())) - return False - self._update_count(value=0) - return True - - def _get_filename(self, key): - if isinstance(key, text_type): - key = key.encode('utf-8') # XXX unicode review - hash = md5(key).hexdigest() - return os.path.join(self._path, hash) - - def get(self, key): - filename = self._get_filename(key) - try: - with open(filename, 'rb') as f: - pickle_time = pickle.load(f) - if pickle_time == 0 or pickle_time >= time(): - return pickle.load(f) - else: - os.remove(filename) - return None - except (IOError, OSError, pickle.PickleError): - return None - - def add(self, key, value, timeout=None): - filename = self._get_filename(key) - if not os.path.exists(filename): - return self.set(key, value, timeout) - return False - - def set(self, key, value, timeout=None, mgmt_element=False): - # Management elements have no timeout - if mgmt_element: - timeout = 0 - - # Don't prune on management element update, to avoid loop - else: - self._prune() - - timeout = self._normalize_timeout(timeout) - filename = self._get_filename(key) - try: - fd, tmp = tempfile.mkstemp(suffix=self._fs_transaction_suffix, - dir=self._path) - with os.fdopen(fd, 'wb') as f: - pickle.dump(timeout, f, 1) - pickle.dump(value, f, pickle.HIGHEST_PROTOCOL) - rename(tmp, filename) - os.chmod(filename, self._mode) - except (IOError, OSError): - return False - else: - # Management elements should not count towards threshold - if not mgmt_element: - self._update_count(delta=1) - return True - - def delete(self, key, mgmt_element=False): - try: - os.remove(self._get_filename(key)) - except (IOError, OSError): - return False - else: - # Management elements should not count towards threshold - if not mgmt_element: - self._update_count(delta=-1) - return True - - def has(self, key): - filename = self._get_filename(key) - try: - with open(filename, 'rb') as f: - pickle_time = pickle.load(f) - if pickle_time == 0 or pickle_time >= time(): - return True - else: - os.remove(filename) - return False - except (IOError, OSError, pickle.PickleError): - return False - - -class UWSGICache(BaseCache): - """ Implements the cache using uWSGI's caching framework. - - .. note:: - This class cannot be used when running under PyPy, because the uWSGI - API implementation for PyPy is lacking the needed functionality. - - :param default_timeout: The default timeout in seconds. - :param cache: The name of the caching instance to connect to, for - example: mycache@localhost:3031, defaults to an empty string, which - means uWSGI will cache in the local instance. If the cache is in the - same instance as the werkzeug app, you only have to provide the name of - the cache. - """ - def __init__(self, default_timeout=300, cache=''): - BaseCache.__init__(self, default_timeout) - - if platform.python_implementation() == 'PyPy': - raise RuntimeError("uWSGI caching does not work under PyPy, see " - "the docs for more details.") - - try: - import uwsgi - self._uwsgi = uwsgi - except ImportError: - raise RuntimeError("uWSGI could not be imported, are you " - "running under uWSGI?") - - self.cache = cache - - def get(self, key): - rv = self._uwsgi.cache_get(key, self.cache) - if rv is None: - return - return pickle.loads(rv) - - def delete(self, key): - return self._uwsgi.cache_del(key, self.cache) - - def set(self, key, value, timeout=None): - return self._uwsgi.cache_update(key, pickle.dumps(value), - self._normalize_timeout(timeout), - self.cache) - - def add(self, key, value, timeout=None): - return self._uwsgi.cache_set(key, pickle.dumps(value), - self._normalize_timeout(timeout), - self.cache) - - def clear(self): - return self._uwsgi.cache_clear(self.cache) - - def has(self, key): - return self._uwsgi.cache_exists(key, self.cache) is not None diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/fixers.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/fixers.py deleted file mode 100644 index b88a861..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/fixers.py +++ /dev/null @@ -1,254 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.contrib.fixers - ~~~~~~~~~~~~~~~~~~~~~~~ - - .. versionadded:: 0.5 - - This module includes various helpers that fix bugs in web servers. They may - be necessary for some versions of a buggy web server but not others. We try - to stay updated with the status of the bugs as good as possible but you have - to make sure whether they fix the problem you encounter. - - If you notice bugs in webservers not fixed in this module consider - contributing a patch. - - :copyright: Copyright 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -try: - from urllib import unquote -except ImportError: - from urllib.parse import unquote - -from werkzeug.http import parse_options_header, parse_cache_control_header, \ - parse_set_header -from werkzeug.useragents import UserAgent -from werkzeug.datastructures import Headers, ResponseCacheControl - - -class CGIRootFix(object): - - """Wrap the application in this middleware if you are using FastCGI or CGI - and you have problems with your app root being set to the cgi script's path - instead of the path users are going to visit - - .. versionchanged:: 0.9 - Added `app_root` parameter and renamed from `LighttpdCGIRootFix`. - - :param app: the WSGI application - :param app_root: Defaulting to ``'/'``, you can set this to something else - if your app is mounted somewhere else. - """ - - def __init__(self, app, app_root='/'): - self.app = app - self.app_root = app_root - - def __call__(self, environ, start_response): - # only set PATH_INFO for older versions of Lighty or if no - # server software is provided. That's because the test was - # added in newer Werkzeug versions and we don't want to break - # people's code if they are using this fixer in a test that - # does not set the SERVER_SOFTWARE key. - if 'SERVER_SOFTWARE' not in environ or \ - environ['SERVER_SOFTWARE'] < 'lighttpd/1.4.28': - environ['PATH_INFO'] = environ.get('SCRIPT_NAME', '') + \ - environ.get('PATH_INFO', '') - environ['SCRIPT_NAME'] = self.app_root.strip('/') - return self.app(environ, start_response) - -# backwards compatibility -LighttpdCGIRootFix = CGIRootFix - - -class PathInfoFromRequestUriFix(object): - - """On windows environment variables are limited to the system charset - which makes it impossible to store the `PATH_INFO` variable in the - environment without loss of information on some systems. - - This is for example a problem for CGI scripts on a Windows Apache. - - This fixer works by recreating the `PATH_INFO` from `REQUEST_URI`, - `REQUEST_URL`, or `UNENCODED_URL` (whatever is available). Thus the - fix can only be applied if the webserver supports either of these - variables. - - :param app: the WSGI application - """ - - def __init__(self, app): - self.app = app - - def __call__(self, environ, start_response): - for key in 'REQUEST_URL', 'REQUEST_URI', 'UNENCODED_URL': - if key not in environ: - continue - request_uri = unquote(environ[key]) - script_name = unquote(environ.get('SCRIPT_NAME', '')) - if request_uri.startswith(script_name): - environ['PATH_INFO'] = request_uri[len(script_name):] \ - .split('?', 1)[0] - break - return self.app(environ, start_response) - - -class ProxyFix(object): - - """This middleware can be applied to add HTTP proxy support to an - application that was not designed with HTTP proxies in mind. It - sets `REMOTE_ADDR`, `HTTP_HOST` from `X-Forwarded` headers. While - Werkzeug-based applications already can use - :py:func:`werkzeug.wsgi.get_host` to retrieve the current host even if - behind proxy setups, this middleware can be used for applications which - access the WSGI environment directly. - - If you have more than one proxy server in front of your app, set - `num_proxies` accordingly. - - Do not use this middleware in non-proxy setups for security reasons. - - The original values of `REMOTE_ADDR` and `HTTP_HOST` are stored in - the WSGI environment as `werkzeug.proxy_fix.orig_remote_addr` and - `werkzeug.proxy_fix.orig_http_host`. - - :param app: the WSGI application - :param num_proxies: the number of proxy servers in front of the app. - """ - - def __init__(self, app, num_proxies=1): - self.app = app - self.num_proxies = num_proxies - - def get_remote_addr(self, forwarded_for): - """Selects the new remote addr from the given list of ips in - X-Forwarded-For. By default it picks the one that the `num_proxies` - proxy server provides. Before 0.9 it would always pick the first. - - .. versionadded:: 0.8 - """ - if len(forwarded_for) >= self.num_proxies: - return forwarded_for[-self.num_proxies] - - def __call__(self, environ, start_response): - getter = environ.get - forwarded_proto = getter('HTTP_X_FORWARDED_PROTO', '') - forwarded_for = getter('HTTP_X_FORWARDED_FOR', '').split(',') - forwarded_host = getter('HTTP_X_FORWARDED_HOST', '') - environ.update({ - 'werkzeug.proxy_fix.orig_wsgi_url_scheme': getter('wsgi.url_scheme'), - 'werkzeug.proxy_fix.orig_remote_addr': getter('REMOTE_ADDR'), - 'werkzeug.proxy_fix.orig_http_host': getter('HTTP_HOST') - }) - forwarded_for = [x for x in [x.strip() for x in forwarded_for] if x] - remote_addr = self.get_remote_addr(forwarded_for) - if remote_addr is not None: - environ['REMOTE_ADDR'] = remote_addr - if forwarded_host: - environ['HTTP_HOST'] = forwarded_host - if forwarded_proto: - environ['wsgi.url_scheme'] = forwarded_proto - return self.app(environ, start_response) - - -class HeaderRewriterFix(object): - - """This middleware can remove response headers and add others. This - is for example useful to remove the `Date` header from responses if you - are using a server that adds that header, no matter if it's present or - not or to add `X-Powered-By` headers:: - - app = HeaderRewriterFix(app, remove_headers=['Date'], - add_headers=[('X-Powered-By', 'WSGI')]) - - :param app: the WSGI application - :param remove_headers: a sequence of header keys that should be - removed. - :param add_headers: a sequence of ``(key, value)`` tuples that should - be added. - """ - - def __init__(self, app, remove_headers=None, add_headers=None): - self.app = app - self.remove_headers = set(x.lower() for x in (remove_headers or ())) - self.add_headers = list(add_headers or ()) - - def __call__(self, environ, start_response): - def rewriting_start_response(status, headers, exc_info=None): - new_headers = [] - for key, value in headers: - if key.lower() not in self.remove_headers: - new_headers.append((key, value)) - new_headers += self.add_headers - return start_response(status, new_headers, exc_info) - return self.app(environ, rewriting_start_response) - - -class InternetExplorerFix(object): - - """This middleware fixes a couple of bugs with Microsoft Internet - Explorer. Currently the following fixes are applied: - - - removing of `Vary` headers for unsupported mimetypes which - causes troubles with caching. Can be disabled by passing - ``fix_vary=False`` to the constructor. - see: http://support.microsoft.com/kb/824847/en-us - - - removes offending headers to work around caching bugs in - Internet Explorer if `Content-Disposition` is set. Can be - disabled by passing ``fix_attach=False`` to the constructor. - - If it does not detect affected Internet Explorer versions it won't touch - the request / response. - """ - - # This code was inspired by Django fixers for the same bugs. The - # fix_vary and fix_attach fixers were originally implemented in Django - # by Michael Axiak and is available as part of the Django project: - # http://code.djangoproject.com/ticket/4148 - - def __init__(self, app, fix_vary=True, fix_attach=True): - self.app = app - self.fix_vary = fix_vary - self.fix_attach = fix_attach - - def fix_headers(self, environ, headers, status=None): - if self.fix_vary: - header = headers.get('content-type', '') - mimetype, options = parse_options_header(header) - if mimetype not in ('text/html', 'text/plain', 'text/sgml'): - headers.pop('vary', None) - - if self.fix_attach and 'content-disposition' in headers: - pragma = parse_set_header(headers.get('pragma', '')) - pragma.discard('no-cache') - header = pragma.to_header() - if not header: - headers.pop('pragma', '') - else: - headers['Pragma'] = header - header = headers.get('cache-control', '') - if header: - cc = parse_cache_control_header(header, - cls=ResponseCacheControl) - cc.no_cache = None - cc.no_store = False - header = cc.to_header() - if not header: - headers.pop('cache-control', '') - else: - headers['Cache-Control'] = header - - def run_fixed(self, environ, start_response): - def fixing_start_response(status, headers, exc_info=None): - headers = Headers(headers) - self.fix_headers(environ, headers, status) - return start_response(status, headers.to_wsgi_list(), exc_info) - return self.app(environ, fixing_start_response) - - def __call__(self, environ, start_response): - ua = UserAgent(environ) - if ua.browser != 'msie': - return self.app(environ, start_response) - return self.run_fixed(environ, start_response) diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/iterio.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/iterio.py deleted file mode 100644 index c0ced37..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/iterio.py +++ /dev/null @@ -1,352 +0,0 @@ -# -*- coding: utf-8 -*- -r""" - werkzeug.contrib.iterio - ~~~~~~~~~~~~~~~~~~~~~~~ - - This module implements a :class:`IterIO` that converts an iterator into - a stream object and the other way round. Converting streams into - iterators requires the `greenlet`_ module. - - To convert an iterator into a stream all you have to do is to pass it - directly to the :class:`IterIO` constructor. In this example we pass it - a newly created generator:: - - def foo(): - yield "something\n" - yield "otherthings" - stream = IterIO(foo()) - print stream.read() # read the whole iterator - - The other way round works a bit different because we have to ensure that - the code execution doesn't take place yet. An :class:`IterIO` call with a - callable as first argument does two things. The function itself is passed - an :class:`IterIO` stream it can feed. The object returned by the - :class:`IterIO` constructor on the other hand is not an stream object but - an iterator:: - - def foo(stream): - stream.write("some") - stream.write("thing") - stream.flush() - stream.write("otherthing") - iterator = IterIO(foo) - print iterator.next() # prints something - print iterator.next() # prints otherthing - iterator.next() # raises StopIteration - - .. _greenlet: https://github.com/python-greenlet/greenlet - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -try: - import greenlet -except ImportError: - greenlet = None - -from werkzeug._compat import implements_iterator - - -def _mixed_join(iterable, sentinel): - """concatenate any string type in an intelligent way.""" - iterator = iter(iterable) - first_item = next(iterator, sentinel) - if isinstance(first_item, bytes): - return first_item + b''.join(iterator) - return first_item + u''.join(iterator) - - -def _newline(reference_string): - if isinstance(reference_string, bytes): - return b'\n' - return u'\n' - - -@implements_iterator -class IterIO(object): - - """Instances of this object implement an interface compatible with the - standard Python :class:`file` object. Streams are either read-only or - write-only depending on how the object is created. - - If the first argument is an iterable a file like object is returned that - returns the contents of the iterable. In case the iterable is empty - read operations will return the sentinel value. - - If the first argument is a callable then the stream object will be - created and passed to that function. The caller itself however will - not receive a stream but an iterable. The function will be be executed - step by step as something iterates over the returned iterable. Each - call to :meth:`flush` will create an item for the iterable. If - :meth:`flush` is called without any writes in-between the sentinel - value will be yielded. - - Note for Python 3: due to the incompatible interface of bytes and - streams you should set the sentinel value explicitly to an empty - bytestring (``b''``) if you are expecting to deal with bytes as - otherwise the end of the stream is marked with the wrong sentinel - value. - - .. versionadded:: 0.9 - `sentinel` parameter was added. - """ - - def __new__(cls, obj, sentinel=''): - try: - iterator = iter(obj) - except TypeError: - return IterI(obj, sentinel) - return IterO(iterator, sentinel) - - def __iter__(self): - return self - - def tell(self): - if self.closed: - raise ValueError('I/O operation on closed file') - return self.pos - - def isatty(self): - if self.closed: - raise ValueError('I/O operation on closed file') - return False - - def seek(self, pos, mode=0): - if self.closed: - raise ValueError('I/O operation on closed file') - raise IOError(9, 'Bad file descriptor') - - def truncate(self, size=None): - if self.closed: - raise ValueError('I/O operation on closed file') - raise IOError(9, 'Bad file descriptor') - - def write(self, s): - if self.closed: - raise ValueError('I/O operation on closed file') - raise IOError(9, 'Bad file descriptor') - - def writelines(self, list): - if self.closed: - raise ValueError('I/O operation on closed file') - raise IOError(9, 'Bad file descriptor') - - def read(self, n=-1): - if self.closed: - raise ValueError('I/O operation on closed file') - raise IOError(9, 'Bad file descriptor') - - def readlines(self, sizehint=0): - if self.closed: - raise ValueError('I/O operation on closed file') - raise IOError(9, 'Bad file descriptor') - - def readline(self, length=None): - if self.closed: - raise ValueError('I/O operation on closed file') - raise IOError(9, 'Bad file descriptor') - - def flush(self): - if self.closed: - raise ValueError('I/O operation on closed file') - raise IOError(9, 'Bad file descriptor') - - def __next__(self): - if self.closed: - raise StopIteration() - line = self.readline() - if not line: - raise StopIteration() - return line - - -class IterI(IterIO): - - """Convert an stream into an iterator.""" - - def __new__(cls, func, sentinel=''): - if greenlet is None: - raise RuntimeError('IterI requires greenlet support') - stream = object.__new__(cls) - stream._parent = greenlet.getcurrent() - stream._buffer = [] - stream.closed = False - stream.sentinel = sentinel - stream.pos = 0 - - def run(): - func(stream) - stream.close() - - g = greenlet.greenlet(run, stream._parent) - while 1: - rv = g.switch() - if not rv: - return - yield rv[0] - - def close(self): - if not self.closed: - self.closed = True - self._flush_impl() - - def write(self, s): - if self.closed: - raise ValueError('I/O operation on closed file') - if s: - self.pos += len(s) - self._buffer.append(s) - - def writelines(self, list): - for item in list: - self.write(item) - - def flush(self): - if self.closed: - raise ValueError('I/O operation on closed file') - self._flush_impl() - - def _flush_impl(self): - data = _mixed_join(self._buffer, self.sentinel) - self._buffer = [] - if not data and self.closed: - self._parent.switch() - else: - self._parent.switch((data,)) - - -class IterO(IterIO): - - """Iter output. Wrap an iterator and give it a stream like interface.""" - - def __new__(cls, gen, sentinel=''): - self = object.__new__(cls) - self._gen = gen - self._buf = None - self.sentinel = sentinel - self.closed = False - self.pos = 0 - return self - - def __iter__(self): - return self - - def _buf_append(self, string): - '''Replace string directly without appending to an empty string, - avoiding type issues.''' - if not self._buf: - self._buf = string - else: - self._buf += string - - def close(self): - if not self.closed: - self.closed = True - if hasattr(self._gen, 'close'): - self._gen.close() - - def seek(self, pos, mode=0): - if self.closed: - raise ValueError('I/O operation on closed file') - if mode == 1: - pos += self.pos - elif mode == 2: - self.read() - self.pos = min(self.pos, self.pos + pos) - return - elif mode != 0: - raise IOError('Invalid argument') - buf = [] - try: - tmp_end_pos = len(self._buf) - while pos > tmp_end_pos: - item = next(self._gen) - tmp_end_pos += len(item) - buf.append(item) - except StopIteration: - pass - if buf: - self._buf_append(_mixed_join(buf, self.sentinel)) - self.pos = max(0, pos) - - def read(self, n=-1): - if self.closed: - raise ValueError('I/O operation on closed file') - if n < 0: - self._buf_append(_mixed_join(self._gen, self.sentinel)) - result = self._buf[self.pos:] - self.pos += len(result) - return result - new_pos = self.pos + n - buf = [] - try: - tmp_end_pos = 0 if self._buf is None else len(self._buf) - while new_pos > tmp_end_pos or (self._buf is None and not buf): - item = next(self._gen) - tmp_end_pos += len(item) - buf.append(item) - except StopIteration: - pass - if buf: - self._buf_append(_mixed_join(buf, self.sentinel)) - - if self._buf is None: - return self.sentinel - - new_pos = max(0, new_pos) - try: - return self._buf[self.pos:new_pos] - finally: - self.pos = min(new_pos, len(self._buf)) - - def readline(self, length=None): - if self.closed: - raise ValueError('I/O operation on closed file') - - nl_pos = -1 - if self._buf: - nl_pos = self._buf.find(_newline(self._buf), self.pos) - buf = [] - try: - if self._buf is None: - pos = self.pos - else: - pos = len(self._buf) - while nl_pos < 0: - item = next(self._gen) - local_pos = item.find(_newline(item)) - buf.append(item) - if local_pos >= 0: - nl_pos = pos + local_pos - break - pos += len(item) - except StopIteration: - pass - if buf: - self._buf_append(_mixed_join(buf, self.sentinel)) - - if self._buf is None: - return self.sentinel - - if nl_pos < 0: - new_pos = len(self._buf) - else: - new_pos = nl_pos + 1 - if length is not None and self.pos + length < new_pos: - new_pos = self.pos + length - try: - return self._buf[self.pos:new_pos] - finally: - self.pos = min(new_pos, len(self._buf)) - - def readlines(self, sizehint=0): - total = 0 - lines = [] - line = self.readline() - while line: - lines.append(line) - total += len(line) - if 0 < sizehint <= total: - break - line = self.readline() - return lines diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/jsrouting.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/jsrouting.py deleted file mode 100644 index d815892..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/jsrouting.py +++ /dev/null @@ -1,264 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.contrib.jsrouting - ~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Addon module that allows to create a JavaScript function from a map - that generates rules. - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -try: - from simplejson import dumps -except ImportError: - try: - from json import dumps - except ImportError: - def dumps(*args): - raise RuntimeError('simplejson required for jsrouting') - -from inspect import getmro -from werkzeug.routing import NumberConverter -from werkzeug._compat import iteritems - - -def render_template(name_parts, rules, converters): - result = u'' - if name_parts: - for idx in range(0, len(name_parts) - 1): - name = u'.'.join(name_parts[:idx + 1]) - result += u"if (typeof %s === 'undefined') %s = {}\n" % (name, name) - result += '%s = ' % '.'.join(name_parts) - result += """(function (server_name, script_name, subdomain, url_scheme) { - var converters = [%(converters)s]; - var rules = %(rules)s; - function in_array(array, value) { - if (array.indexOf != undefined) { - return array.indexOf(value) != -1; - } - for (var i = 0; i < array.length; i++) { - if (array[i] == value) { - return true; - } - } - return false; - } - function array_diff(array1, array2) { - array1 = array1.slice(); - for (var i = array1.length-1; i >= 0; i--) { - if (in_array(array2, array1[i])) { - array1.splice(i, 1); - } - } - return array1; - } - function split_obj(obj) { - var names = []; - var values = []; - for (var name in obj) { - if (typeof(obj[name]) != 'function') { - names.push(name); - values.push(obj[name]); - } - } - return {names: names, values: values, original: obj}; - } - function suitable(rule, args) { - var default_args = split_obj(rule.defaults || {}); - var diff_arg_names = array_diff(rule.arguments, default_args.names); - - for (var i = 0; i < diff_arg_names.length; i++) { - if (!in_array(args.names, diff_arg_names[i])) { - return false; - } - } - - if (array_diff(rule.arguments, args.names).length == 0) { - if (rule.defaults == null) { - return true; - } - for (var i = 0; i < default_args.names.length; i++) { - var key = default_args.names[i]; - var value = default_args.values[i]; - if (value != args.original[key]) { - return false; - } - } - } - - return true; - } - function build(rule, args) { - var tmp = []; - var processed = rule.arguments.slice(); - for (var i = 0; i < rule.trace.length; i++) { - var part = rule.trace[i]; - if (part.is_dynamic) { - var converter = converters[rule.converters[part.data]]; - var data = converter(args.original[part.data]); - if (data == null) { - return null; - } - tmp.push(data); - processed.push(part.name); - } else { - tmp.push(part.data); - } - } - tmp = tmp.join(''); - var pipe = tmp.indexOf('|'); - var subdomain = tmp.substring(0, pipe); - var url = tmp.substring(pipe+1); - - var unprocessed = array_diff(args.names, processed); - var first_query_var = true; - for (var i = 0; i < unprocessed.length; i++) { - if (first_query_var) { - url += '?'; - } else { - url += '&'; - } - first_query_var = false; - url += encodeURIComponent(unprocessed[i]); - url += '='; - url += encodeURIComponent(args.original[unprocessed[i]]); - } - return {subdomain: subdomain, path: url}; - } - function lstrip(s, c) { - while (s && s.substring(0, 1) == c) { - s = s.substring(1); - } - return s; - } - function rstrip(s, c) { - while (s && s.substring(s.length-1, s.length) == c) { - s = s.substring(0, s.length-1); - } - return s; - } - return function(endpoint, args, force_external) { - args = split_obj(args); - var rv = null; - for (var i = 0; i < rules.length; i++) { - var rule = rules[i]; - if (rule.endpoint != endpoint) continue; - if (suitable(rule, args)) { - rv = build(rule, args); - if (rv != null) { - break; - } - } - } - if (rv == null) { - return null; - } - if (!force_external && rv.subdomain == subdomain) { - return rstrip(script_name, '/') + '/' + lstrip(rv.path, '/'); - } else { - return url_scheme + '://' - + (rv.subdomain ? rv.subdomain + '.' : '') - + server_name + rstrip(script_name, '/') - + '/' + lstrip(rv.path, '/'); - } - }; -})""" % {'converters': u', '.join(converters), - 'rules': rules} - - return result - - -def generate_map(map, name='url_map'): - """ - Generates a JavaScript function containing the rules defined in - this map, to be used with a MapAdapter's generate_javascript - method. If you don't pass a name the returned JavaScript code is - an expression that returns a function. Otherwise it's a standalone - script that assigns the function with that name. Dotted names are - resolved (so you an use a name like 'obj.url_for') - - In order to use JavaScript generation, simplejson must be installed. - - Note that using this feature will expose the rules - defined in your map to users. If your rules contain sensitive - information, don't use JavaScript generation! - """ - from warnings import warn - warn(DeprecationWarning('This module is deprecated')) - map.update() - rules = [] - converters = [] - for rule in map.iter_rules(): - trace = [{ - 'is_dynamic': is_dynamic, - 'data': data - } for is_dynamic, data in rule._trace] - rule_converters = {} - for key, converter in iteritems(rule._converters): - js_func = js_to_url_function(converter) - try: - index = converters.index(js_func) - except ValueError: - converters.append(js_func) - index = len(converters) - 1 - rule_converters[key] = index - rules.append({ - u'endpoint': rule.endpoint, - u'arguments': list(rule.arguments), - u'converters': rule_converters, - u'trace': trace, - u'defaults': rule.defaults - }) - - return render_template(name_parts=name and name.split('.') or [], - rules=dumps(rules), - converters=converters) - - -def generate_adapter(adapter, name='url_for', map_name='url_map'): - """Generates the url building function for a map.""" - values = { - u'server_name': dumps(adapter.server_name), - u'script_name': dumps(adapter.script_name), - u'subdomain': dumps(adapter.subdomain), - u'url_scheme': dumps(adapter.url_scheme), - u'name': name, - u'map_name': map_name - } - return u'''\ -var %(name)s = %(map_name)s( - %(server_name)s, - %(script_name)s, - %(subdomain)s, - %(url_scheme)s -);''' % values - - -def js_to_url_function(converter): - """Get the JavaScript converter function from a rule.""" - if hasattr(converter, 'js_to_url_function'): - data = converter.js_to_url_function() - else: - for cls in getmro(type(converter)): - if cls in js_to_url_functions: - data = js_to_url_functions[cls](converter) - break - else: - return 'encodeURIComponent' - return '(function(value) { %s })' % data - - -def NumberConverter_js_to_url(conv): - if conv.fixed_digits: - return u'''\ -var result = value.toString(); -while (result.length < %s) - result = '0' + result; -return result;''' % conv.fixed_digits - return u'return value.toString();' - - -js_to_url_functions = { - NumberConverter: NumberConverter_js_to_url -} diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/limiter.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/limiter.py deleted file mode 100644 index 6bc9d39..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/limiter.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.contrib.limiter - ~~~~~~~~~~~~~~~~~~~~~~~~ - - A middleware that limits incoming data. This works around problems with - Trac_ or Django_ because those directly stream into the memory. - - .. _Trac: http://trac.edgewall.org/ - .. _Django: http://www.djangoproject.com/ - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from warnings import warn - -from werkzeug.wsgi import LimitedStream - - -class StreamLimitMiddleware(object): - - """Limits the input stream to a given number of bytes. This is useful if - you have a WSGI application that reads form data into memory (django for - example) and you don't want users to harm the server by uploading tons of - data. - - Default is 10MB - - .. versionchanged:: 0.9 - Deprecated middleware. - """ - - def __init__(self, app, maximum_size=1024 * 1024 * 10): - warn(DeprecationWarning('This middleware is deprecated')) - self.app = app - self.maximum_size = maximum_size - - def __call__(self, environ, start_response): - limit = min(self.maximum_size, int(environ.get('CONTENT_LENGTH') or 0)) - environ['wsgi.input'] = LimitedStream(environ['wsgi.input'], limit) - return self.app(environ, start_response) diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/lint.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/lint.py deleted file mode 100644 index 969c687..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/lint.py +++ /dev/null @@ -1,343 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.contrib.lint - ~~~~~~~~~~~~~~~~~~~~~ - - .. versionadded:: 0.5 - - This module provides a middleware that performs sanity checks of the WSGI - application. It checks that :pep:`333` is properly implemented and warns - on some common HTTP errors such as non-empty responses for 304 status - codes. - - This module provides a middleware, the :class:`LintMiddleware`. Wrap your - application with it and it will warn about common problems with WSGI and - HTTP while your application is running. - - It's strongly recommended to use it during development. - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -try: - from urllib.parse import urlparse -except ImportError: - from urlparse import urlparse - -from warnings import warn - -from werkzeug.datastructures import Headers -from werkzeug.http import is_entity_header -from werkzeug.wsgi import FileWrapper -from werkzeug._compat import string_types - - -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(WSGIWarning('%s requires bytestrings, got %s' % - (context, obj.__class__.__name__))) - - -class InputStream(object): - - def __init__(self, stream): - self._stream = stream - - def read(self, *args): - if len(args) == 0: - warn(WSGIWarning('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.'), - stacklevel=2) - elif len(args) != 1: - warn(WSGIWarning('too many parameters passed to wsgi.input.read()'), - stacklevel=2) - return self._stream.read(*args) - - def readline(self, *args): - if len(args) == 0: - warn(WSGIWarning('Calls to wsgi.input.readline() without arguments' - ' are unsafe. Use wsgi.input.read() instead.'), - stacklevel=2) - elif len(args) == 1: - warn(WSGIWarning('wsgi.input.readline() was called with a size hint. ' - 'WSGI does not support this, although it\'s available ' - 'on all major servers.'), - 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(WSGIWarning('wsgi.input is not iterable.'), stacklevel=2) - return iter(()) - - def close(self): - warn(WSGIWarning('application closed the input stream!'), - 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(seq) - - def close(self): - warn(WSGIWarning('application closed the error stream!'), - 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)) - - -class GuardedIterator(object): - - def __init__(self, iterator, headers_set, chunks): - self._iterator = iterator - 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(WSGIWarning('iterated over closed app_iter'), - stacklevel=2) - rv = self._next() - if not self.headers_set: - warn(WSGIWarning('Application returned before it ' - 'started the response'), 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(HTTPWarning('entity header %r found in 304 ' - 'response' % key)) - if bytes_sent: - warn(HTTPWarning('304 responses must not have a body')) - elif 100 <= status_code < 200 or status_code == 204: - if content_length != 0: - warn(HTTPWarning('%r responses must have an empty ' - 'content length' % status_code)) - if bytes_sent: - warn(HTTPWarning('%r responses must not have a body' % - status_code)) - elif content_length is not None and content_length != bytes_sent: - warn(WSGIWarning('Content-Length and the number of bytes ' - 'sent to the client do not match.')) - - def __del__(self): - if not self.closed: - try: - warn(WSGIWarning('Iterator was garbage collected before ' - 'it was closed.')) - except Exception: - pass - - -class LintMiddleware(object): - - """This middleware wraps an application and warns on common errors. - Among other thing it currently checks for the following problems: - - - 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 - - Detected errors are emitted using the standard Python :mod:`warnings` - system and usually end up on :data:`stderr`. - - :: - - from werkzeug.contrib.lint import LintMiddleware - app = LintMiddleware(app) - - :param app: the application to wrap - """ - - def __init__(self, app): - self.app = app - - def check_environ(self, environ): - if type(environ) is not dict: - warn(WSGIWarning('WSGI environment is not a standard python dict.'), - 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(WSGIWarning('required environment key %r not found' - % key), stacklevel=3) - if environ['wsgi.version'] != (1, 0): - warn(WSGIWarning('environ is not a WSGI 1.0 environ'), - stacklevel=3) - - script_name = environ.get('SCRIPT_NAME', '') - if script_name and script_name[:1] != '/': - warn(WSGIWarning('SCRIPT_NAME does not start with a slash: %r' - % script_name), stacklevel=3) - path_info = environ.get('PATH_INFO', '') - if path_info[:1] != '/': - warn(WSGIWarning('PATH_INFO does not start with a slash: %r' - % path_info), 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(WSGIWarning('application returned string. Response will ' - 'send character for character to the client ' - 'which will kill the performance. Return a ' - 'list or iterable instead.'), stacklevel=3) - - def __call__(self, *args, **kwargs): - if len(args) != 2: - warn(WSGIWarning('Two arguments to WSGI app required'), stacklevel=2) - if kwargs: - warn(WSGIWarning('No keyword arguments to WSGI app allowed'), - 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(WSGIWarning('Invalid number of arguments: %s, expected ' - '2 or 3' % len(args), stacklevel=2)) - if kwargs: - warn(WSGIWarning('no keyword arguments allowed.')) - - 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/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/profiler.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/profiler.py deleted file mode 100644 index be860af..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/profiler.py +++ /dev/null @@ -1,147 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.contrib.profiler - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - This module provides a simple WSGI profiler middleware for finding - bottlenecks in web application. It uses the :mod:`profile` or - :mod:`cProfile` module to do the profiling and writes the stats to the - stream provided (defaults to stderr). - - Example usage:: - - from werkzeug.contrib.profiler import ProfilerMiddleware - app = ProfilerMiddleware(app) - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import sys -import time -import os.path -try: - try: - from cProfile import Profile - except ImportError: - from profile import Profile - from pstats import Stats - available = True -except ImportError: - available = False - - -class MergeStream(object): - - """An object that redirects `write` calls to multiple streams. - Use this to log to both `sys.stdout` and a file:: - - f = open('profiler.log', 'w') - stream = MergeStream(sys.stdout, f) - profiler = ProfilerMiddleware(app, stream) - """ - - def __init__(self, *streams): - if not streams: - raise TypeError('at least one stream must be given') - self.streams = streams - - def write(self, data): - for stream in self.streams: - stream.write(data) - - -class ProfilerMiddleware(object): - - """Simple profiler middleware. Wraps a WSGI application and profiles - a request. This intentionally buffers the response so that timings are - more exact. - - By giving the `profile_dir` argument, pstat.Stats files are saved to that - directory, one file per request. Without it, a summary is printed to - `stream` instead. - - For the exact meaning of `sort_by` and `restrictions` consult the - :mod:`profile` documentation. - - .. versionadded:: 0.9 - Added support for `restrictions` and `profile_dir`. - - :param app: the WSGI application to profile. - :param stream: the stream for the profiled stats. defaults to stderr. - :param sort_by: a tuple of columns to sort the result by. - :param restrictions: a tuple of profiling strictions, not used if dumping - to `profile_dir`. - :param profile_dir: directory name to save pstat files - """ - - def __init__(self, app, stream=None, - sort_by=('time', 'calls'), restrictions=(), profile_dir=None): - if not available: - raise RuntimeError('the profiler is not available because ' - 'profile or pstat is not installed.') - self._app = app - self._stream = stream or sys.stdout - self._sort_by = sort_by - self._restrictions = restrictions - self._profile_dir = profile_dir - - 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(): - appiter = self._app(environ, catching_start_response) - response_body.extend(appiter) - if hasattr(appiter, 'close'): - appiter.close() - - p = Profile() - start = time.time() - p.runcall(runapp) - body = b''.join(response_body) - elapsed = time.time() - start - - if self._profile_dir is not None: - prof_filename = os.path.join(self._profile_dir, - '%s.%s.%06dms.%d.prof' % ( - environ['REQUEST_METHOD'], - environ.get('PATH_INFO').strip( - '/').replace('/', '.') or 'root', - elapsed * 1000.0, - time.time() - )) - p.dump_stats(prof_filename) - - else: - stats = Stats(p, stream=self._stream) - stats.sort_stats(*self._sort_by) - - self._stream.write('-' * 80) - self._stream.write('\nPATH: %r\n' % environ.get('PATH_INFO')) - stats.print_stats(*self._restrictions) - self._stream.write('-' * 80 + '\n\n') - - return [body] - - -def make_action(app_factory, hostname='localhost', port=5000, - threaded=False, processes=1, stream=None, - sort_by=('time', 'calls'), restrictions=()): - """Return a new callback for :mod:`werkzeug.script` that starts a local - server with the profiler enabled. - - :: - - from werkzeug.contrib import profiler - action_profile = profiler.make_action(make_app) - """ - def action(hostname=('h', hostname), port=('p', port), - threaded=threaded, processes=processes): - """Start a new development server.""" - from werkzeug.serving import run_simple - app = ProfilerMiddleware(app_factory(), stream, sort_by, restrictions) - run_simple(hostname, port, app, False, None, threaded, processes) - return action diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/securecookie.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/securecookie.py deleted file mode 100644 index 5927e2b..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/securecookie.py +++ /dev/null @@ -1,323 +0,0 @@ -# -*- coding: utf-8 -*- -r""" - werkzeug.contrib.securecookie - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - This module implements a cookie that is not alterable from the client - because it adds a checksum the server checks for. You can use it as - session replacement if all you have is a user id or something to mark - a logged in user. - - Keep in mind that the data is still readable from the client as a - normal cookie is. However you don't have to store and flush the - sessions you have at the server. - - Example usage: - - >>> from werkzeug.contrib.securecookie import SecureCookie - >>> x = SecureCookie({"foo": 42, "baz": (1, 2, 3)}, "deadbeef") - - Dumping into a string so that one can store it in a cookie: - - >>> value = x.serialize() - - Loading from that string again: - - >>> x = SecureCookie.unserialize(value, "deadbeef") - >>> x["baz"] - (1, 2, 3) - - If someone modifies the cookie and the checksum is wrong the unserialize - method will fail silently and return a new empty `SecureCookie` object. - - Keep in mind that the values will be visible in the cookie so do not - store data in a cookie you don't want the user to see. - - Application Integration - ======================= - - If you are using the werkzeug request objects you could integrate the - secure cookie into your application like this:: - - from werkzeug.utils import cached_property - from werkzeug.wrappers import BaseRequest - from werkzeug.contrib.securecookie import SecureCookie - - # don't use this key but a different one; you could just use - # os.urandom(20) to get something random - SECRET_KEY = '\xfa\xdd\xb8z\xae\xe0}4\x8b\xea' - - class Request(BaseRequest): - - @cached_property - def client_session(self): - data = self.cookies.get('session_data') - if not data: - return SecureCookie(secret_key=SECRET_KEY) - return SecureCookie.unserialize(data, SECRET_KEY) - - def application(environ, start_response): - request = Request(environ) - - # get a response object here - response = ... - - if request.client_session.should_save: - session_data = request.client_session.serialize() - response.set_cookie('session_data', session_data, - httponly=True) - return response(environ, start_response) - - A less verbose integration can be achieved by using shorthand methods:: - - class Request(BaseRequest): - - @cached_property - def client_session(self): - return SecureCookie.load_cookie(self, secret_key=COOKIE_SECRET) - - def application(environ, start_response): - request = Request(environ) - - # get a response object here - response = ... - - request.client_session.save_cookie(response) - return response(environ, start_response) - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import pickle -import base64 -from hmac import new as hmac -from time import time -from hashlib import sha1 as _default_hash - -from werkzeug._compat import iteritems, text_type, to_bytes -from werkzeug.urls import url_quote_plus, url_unquote_plus -from werkzeug._internal import _date_to_unix -from werkzeug.contrib.sessions import ModificationTrackingDict -from werkzeug.security import safe_str_cmp -from werkzeug._compat import to_native - - -class UnquoteError(Exception): - - """Internal exception used to signal failures on quoting.""" - - -class SecureCookie(ModificationTrackingDict): - - """Represents a secure cookie. You can subclass this class and provide - an alternative mac method. The import thing is that the mac method - is a function with a similar interface to the hashlib. Required - methods are update() and digest(). - - Example usage: - - >>> x = SecureCookie({"foo": 42, "baz": (1, 2, 3)}, "deadbeef") - >>> x["foo"] - 42 - >>> x["baz"] - (1, 2, 3) - >>> x["blafasel"] = 23 - >>> x.should_save - True - - :param data: the initial data. Either a dict, list of tuples or `None`. - :param secret_key: the secret key. If not set `None` or not specified - it has to be set before :meth:`serialize` is called. - :param new: The initial value of the `new` flag. - """ - - #: The hash method to use. This has to be a module with a new function - #: or a function that creates a hashlib object. Such as `hashlib.md5` - #: Subclasses can override this attribute. The default hash is sha1. - #: Make sure to wrap this in staticmethod() if you store an arbitrary - #: function there such as hashlib.sha1 which might be implemented - #: as a function. - hash_method = staticmethod(_default_hash) - - #: the module used for serialization. Unless overriden by subclasses - #: the standard pickle module is used. - serialization_method = pickle - - #: if the contents should be base64 quoted. This can be disabled if the - #: serialization process returns cookie safe strings only. - quote_base64 = True - - def __init__(self, data=None, secret_key=None, new=True): - ModificationTrackingDict.__init__(self, data or ()) - # explicitly convert it into a bytestring because python 2.6 - # no longer performs an implicit string conversion on hmac - if secret_key is not None: - secret_key = to_bytes(secret_key, 'utf-8') - self.secret_key = secret_key - self.new = new - - def __repr__(self): - return '<%s %s%s>' % ( - self.__class__.__name__, - dict.__repr__(self), - self.should_save and '*' or '' - ) - - @property - def should_save(self): - """True if the session should be saved. By default this is only true - for :attr:`modified` cookies, not :attr:`new`. - """ - return self.modified - - @classmethod - def quote(cls, value): - """Quote the value for the cookie. This can be any object supported - by :attr:`serialization_method`. - - :param value: the value to quote. - """ - if cls.serialization_method is not None: - value = cls.serialization_method.dumps(value) - if cls.quote_base64: - value = b''.join(base64.b64encode(value).splitlines()).strip() - return value - - @classmethod - def unquote(cls, value): - """Unquote the value for the cookie. If unquoting does not work a - :exc:`UnquoteError` is raised. - - :param value: the value to unquote. - """ - try: - if cls.quote_base64: - value = base64.b64decode(value) - if cls.serialization_method is not None: - value = cls.serialization_method.loads(value) - return value - except Exception: - # unfortunately pickle and other serialization modules can - # cause pretty every error here. if we get one we catch it - # and convert it into an UnquoteError - raise UnquoteError() - - def serialize(self, expires=None): - """Serialize the secure cookie into a string. - - If expires is provided, the session will be automatically invalidated - after expiration when you unseralize it. This provides better - protection against session cookie theft. - - :param expires: an optional expiration date for the cookie (a - :class:`datetime.datetime` object) - """ - if self.secret_key is None: - raise RuntimeError('no secret key defined') - if expires: - self['_expires'] = _date_to_unix(expires) - result = [] - mac = hmac(self.secret_key, None, self.hash_method) - for key, value in sorted(self.items()): - result.append(('%s=%s' % ( - url_quote_plus(key), - self.quote(value).decode('ascii') - )).encode('ascii')) - mac.update(b'|' + result[-1]) - return b'?'.join([ - base64.b64encode(mac.digest()).strip(), - b'&'.join(result) - ]) - - @classmethod - def unserialize(cls, string, secret_key): - """Load the secure cookie from a serialized string. - - :param string: the cookie value to unserialize. - :param secret_key: the secret key used to serialize the cookie. - :return: a new :class:`SecureCookie`. - """ - if isinstance(string, text_type): - string = string.encode('utf-8', 'replace') - if isinstance(secret_key, text_type): - secret_key = secret_key.encode('utf-8', 'replace') - try: - base64_hash, data = string.split(b'?', 1) - except (ValueError, IndexError): - items = () - else: - items = {} - mac = hmac(secret_key, None, cls.hash_method) - for item in data.split(b'&'): - mac.update(b'|' + item) - if b'=' not in item: - items = None - break - key, value = item.split(b'=', 1) - # try to make the key a string - key = url_unquote_plus(key.decode('ascii')) - try: - key = to_native(key) - except UnicodeError: - pass - items[key] = value - - # no parsing error and the mac looks okay, we can now - # sercurely unpickle our cookie. - try: - client_hash = base64.b64decode(base64_hash) - except TypeError: - items = client_hash = None - if items is not None and safe_str_cmp(client_hash, mac.digest()): - try: - for key, value in iteritems(items): - items[key] = cls.unquote(value) - except UnquoteError: - items = () - else: - if '_expires' in items: - if time() > items['_expires']: - items = () - else: - del items['_expires'] - else: - items = () - return cls(items, secret_key, False) - - @classmethod - def load_cookie(cls, request, key='session', secret_key=None): - """Loads a :class:`SecureCookie` from a cookie in request. If the - cookie is not set, a new :class:`SecureCookie` instanced is - returned. - - :param request: a request object that has a `cookies` attribute - which is a dict of all cookie values. - :param key: the name of the cookie. - :param secret_key: the secret key used to unquote the cookie. - Always provide the value even though it has - no default! - """ - data = request.cookies.get(key) - if not data: - return cls(secret_key=secret_key) - return cls.unserialize(data, secret_key) - - def save_cookie(self, response, key='session', expires=None, - session_expires=None, max_age=None, path='/', domain=None, - secure=None, httponly=False, force=False): - """Saves the SecureCookie in a cookie on response object. All - parameters that are not described here are forwarded directly - to :meth:`~BaseResponse.set_cookie`. - - :param response: a response object that has a - :meth:`~BaseResponse.set_cookie` method. - :param key: the name of the cookie. - :param session_expires: the expiration date of the secure cookie - stored information. If this is not provided - the cookie `expires` date is used instead. - """ - if force or self.should_save: - data = self.serialize(session_expires or expires) - response.set_cookie(key, data, expires=expires, max_age=max_age, - path=path, domain=domain, secure=secure, - httponly=httponly) diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/sessions.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/sessions.py deleted file mode 100644 index a9c3aa7..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/sessions.py +++ /dev/null @@ -1,352 +0,0 @@ -# -*- coding: utf-8 -*- -r""" - werkzeug.contrib.sessions - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - This module contains some helper classes that help one to add session - support to a python WSGI application. For full client-side session - storage see :mod:`~werkzeug.contrib.securecookie` which implements a - secure, client-side session storage. - - - Application Integration - ======================= - - :: - - from werkzeug.contrib.sessions import SessionMiddleware, \ - FilesystemSessionStore - - app = SessionMiddleware(app, FilesystemSessionStore()) - - The current session will then appear in the WSGI environment as - `werkzeug.session`. However it's recommended to not use the middleware - but the stores directly in the application. However for very simple - scripts a middleware for sessions could be sufficient. - - This module does not implement methods or ways to check if a session is - expired. That should be done by a cronjob and storage specific. For - example to prune unused filesystem sessions one could check the modified - time of the files. If sessions are stored in the database the new() - method should add an expiration timestamp for the session. - - For better flexibility it's recommended to not use the middleware but the - store and session object directly in the application dispatching:: - - session_store = FilesystemSessionStore() - - def application(environ, start_response): - request = Request(environ) - sid = request.cookies.get('cookie_name') - if sid is None: - request.session = session_store.new() - else: - request.session = session_store.get(sid) - response = get_the_response_object(request) - if request.session.should_save: - session_store.save(request.session) - response.set_cookie('cookie_name', request.session.sid) - return response(environ, start_response) - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import re -import os -import tempfile -from os import path -from time import time -from random import random -from hashlib import sha1 -from pickle import dump, load, HIGHEST_PROTOCOL - -from werkzeug.datastructures import CallbackDict -from werkzeug.utils import dump_cookie, parse_cookie -from werkzeug.wsgi import ClosingIterator -from werkzeug.posixemulation import rename -from werkzeug._compat import PY2, text_type -from werkzeug.filesystem import get_filesystem_encoding - - -_sha1_re = re.compile(r'^[a-f0-9]{40}$') - - -def _urandom(): - if hasattr(os, 'urandom'): - return os.urandom(30) - return text_type(random()).encode('ascii') - - -def generate_key(salt=None): - if salt is None: - salt = repr(salt).encode('ascii') - return sha1(b''.join([ - salt, - str(time()).encode('ascii'), - _urandom() - ])).hexdigest() - - -class ModificationTrackingDict(CallbackDict): - __slots__ = ('modified',) - - def __init__(self, *args, **kwargs): - def on_update(self): - self.modified = True - self.modified = False - CallbackDict.__init__(self, on_update=on_update) - dict.update(self, *args, **kwargs) - - def copy(self): - """Create a flat copy of the dict.""" - missing = object() - result = object.__new__(self.__class__) - for name in self.__slots__: - val = getattr(self, name, missing) - if val is not missing: - setattr(result, name, val) - return result - - def __copy__(self): - return self.copy() - - -class Session(ModificationTrackingDict): - - """Subclass of a dict that keeps track of direct object changes. Changes - in mutable structures are not tracked, for those you have to set - `modified` to `True` by hand. - """ - __slots__ = ModificationTrackingDict.__slots__ + ('sid', 'new') - - def __init__(self, data, sid, new=False): - ModificationTrackingDict.__init__(self, data) - self.sid = sid - self.new = new - - def __repr__(self): - return '<%s %s%s>' % ( - self.__class__.__name__, - dict.__repr__(self), - self.should_save and '*' or '' - ) - - @property - def should_save(self): - """True if the session should be saved. - - .. versionchanged:: 0.6 - By default the session is now only saved if the session is - modified, not if it is new like it was before. - """ - return self.modified - - -class SessionStore(object): - - """Baseclass for all session stores. The Werkzeug contrib module does not - implement any useful stores besides the filesystem store, application - developers are encouraged to create their own stores. - - :param session_class: The session class to use. Defaults to - :class:`Session`. - """ - - def __init__(self, session_class=None): - if session_class is None: - session_class = Session - self.session_class = session_class - - def is_valid_key(self, key): - """Check if a key has the correct format.""" - return _sha1_re.match(key) is not None - - def generate_key(self, salt=None): - """Simple function that generates a new session key.""" - return generate_key(salt) - - def new(self): - """Generate a new session.""" - return self.session_class({}, self.generate_key(), True) - - def save(self, session): - """Save a session.""" - - def save_if_modified(self, session): - """Save if a session class wants an update.""" - if session.should_save: - self.save(session) - - def delete(self, session): - """Delete a session.""" - - def get(self, sid): - """Get a session for this sid or a new session object. This method - has to check if the session key is valid and create a new session if - that wasn't the case. - """ - return self.session_class({}, sid, True) - - -#: used for temporary files by the filesystem session store -_fs_transaction_suffix = '.__wz_sess' - - -class FilesystemSessionStore(SessionStore): - - """Simple example session store that saves sessions on the filesystem. - This store works best on POSIX systems and Windows Vista / Windows - Server 2008 and newer. - - .. versionchanged:: 0.6 - `renew_missing` was added. Previously this was considered `True`, - now the default changed to `False` and it can be explicitly - deactivated. - - :param path: the path to the folder used for storing the sessions. - If not provided the default temporary directory is used. - :param filename_template: a string template used to give the session - a filename. ``%s`` is replaced with the - session id. - :param session_class: The session class to use. Defaults to - :class:`Session`. - :param renew_missing: set to `True` if you want the store to - give the user a new sid if the session was - not yet saved. - """ - - def __init__(self, path=None, filename_template='werkzeug_%s.sess', - session_class=None, renew_missing=False, mode=0o644): - SessionStore.__init__(self, session_class) - if path is None: - path = tempfile.gettempdir() - self.path = path - if isinstance(filename_template, text_type) and PY2: - filename_template = filename_template.encode( - get_filesystem_encoding()) - assert not filename_template.endswith(_fs_transaction_suffix), \ - 'filename templates may not end with %s' % _fs_transaction_suffix - self.filename_template = filename_template - self.renew_missing = renew_missing - self.mode = mode - - def get_session_filename(self, sid): - # out of the box, this should be a strict ASCII subset but - # you might reconfigure the session object to have a more - # arbitrary string. - if isinstance(sid, text_type) and PY2: - sid = sid.encode(get_filesystem_encoding()) - return path.join(self.path, self.filename_template % sid) - - def save(self, session): - fn = self.get_session_filename(session.sid) - fd, tmp = tempfile.mkstemp(suffix=_fs_transaction_suffix, - dir=self.path) - f = os.fdopen(fd, 'wb') - try: - dump(dict(session), f, HIGHEST_PROTOCOL) - finally: - f.close() - try: - rename(tmp, fn) - os.chmod(fn, self.mode) - except (IOError, OSError): - pass - - def delete(self, session): - fn = self.get_session_filename(session.sid) - try: - os.unlink(fn) - except OSError: - pass - - def get(self, sid): - if not self.is_valid_key(sid): - return self.new() - try: - f = open(self.get_session_filename(sid), 'rb') - except IOError: - if self.renew_missing: - return self.new() - data = {} - else: - try: - try: - data = load(f) - except Exception: - data = {} - finally: - f.close() - return self.session_class(data, sid, False) - - def list(self): - """Lists all sessions in the store. - - .. versionadded:: 0.6 - """ - before, after = self.filename_template.split('%s', 1) - filename_re = re.compile(r'%s(.{5,})%s$' % (re.escape(before), - re.escape(after))) - result = [] - for filename in os.listdir(self.path): - #: this is a session that is still being saved. - if filename.endswith(_fs_transaction_suffix): - continue - match = filename_re.match(filename) - if match is not None: - result.append(match.group(1)) - return result - - -class SessionMiddleware(object): - - """A simple middleware that puts the session object of a store provided - into the WSGI environ. It automatically sets cookies and restores - sessions. - - However a middleware is not the preferred solution because it won't be as - fast as sessions managed by the application itself and will put a key into - the WSGI environment only relevant for the application which is against - the concept of WSGI. - - The cookie parameters are the same as for the :func:`~dump_cookie` - function just prefixed with ``cookie_``. Additionally `max_age` is - called `cookie_age` and not `cookie_max_age` because of backwards - compatibility. - """ - - def __init__(self, app, store, cookie_name='session_id', - cookie_age=None, cookie_expires=None, cookie_path='/', - cookie_domain=None, cookie_secure=None, - cookie_httponly=False, environ_key='werkzeug.session'): - self.app = app - self.store = store - self.cookie_name = cookie_name - self.cookie_age = cookie_age - self.cookie_expires = cookie_expires - self.cookie_path = cookie_path - self.cookie_domain = cookie_domain - self.cookie_secure = cookie_secure - self.cookie_httponly = cookie_httponly - self.environ_key = environ_key - - def __call__(self, environ, start_response): - cookie = parse_cookie(environ.get('HTTP_COOKIE', '')) - sid = cookie.get(self.cookie_name, None) - if sid is None: - session = self.store.new() - else: - session = self.store.get(sid) - environ[self.environ_key] = session - - def injecting_start_response(status, headers, exc_info=None): - if session.should_save: - self.store.save(session) - headers.append(('Set-Cookie', dump_cookie(self.cookie_name, - session.sid, self.cookie_age, - self.cookie_expires, self.cookie_path, - self.cookie_domain, self.cookie_secure, - self.cookie_httponly))) - return start_response(status, headers, exc_info) - return ClosingIterator(self.app(environ, injecting_start_response), - lambda: self.store.save_if_modified(session)) diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/testtools.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/testtools.py deleted file mode 100644 index 3dab6db..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/testtools.py +++ /dev/null @@ -1,73 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.contrib.testtools - ~~~~~~~~~~~~~~~~~~~~~~~~~~ - - This module implements extended wrappers for simplified testing. - - `TestResponse` - A response wrapper which adds various cached attributes for - simplified assertions on various content types. - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from werkzeug.utils import cached_property, import_string -from werkzeug.wrappers import Response - -from warnings import warn -warn(DeprecationWarning('werkzeug.contrib.testtools is deprecated and ' - 'will be removed with Werkzeug 1.0')) - - -class ContentAccessors(object): - - """ - A mixin class for response objects that provides a couple of useful - accessors for unittesting. - """ - - def xml(self): - """Get an etree if possible.""" - if 'xml' not in self.mimetype: - raise AttributeError( - 'Not a XML response (Content-Type: %s)' - % self.mimetype) - for module in ['xml.etree.ElementTree', 'ElementTree', - 'elementtree.ElementTree']: - etree = import_string(module, silent=True) - if etree is not None: - return etree.XML(self.body) - raise RuntimeError('You must have ElementTree installed ' - 'to use TestResponse.xml') - xml = cached_property(xml) - - def lxml(self): - """Get an lxml etree if possible.""" - if ('html' not in self.mimetype and 'xml' not in self.mimetype): - raise AttributeError('Not an HTML/XML response') - from lxml import etree - try: - from lxml.html import fromstring - except ImportError: - fromstring = etree.HTML - if self.mimetype == 'text/html': - return fromstring(self.data) - return etree.XML(self.data) - lxml = cached_property(lxml) - - def json(self): - """Get the result of simplejson.loads if possible.""" - if 'json' not in self.mimetype: - raise AttributeError('Not a JSON response') - try: - from simplejson import loads - except ImportError: - from json import loads - return loads(self.data) - json = cached_property(json) - - -class TestResponse(Response, ContentAccessors): - - """Pass this to `werkzeug.test.Client` for easier unittesting.""" diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/wrappers.py b/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/wrappers.py deleted file mode 100644 index 6c86452..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/contrib/wrappers.py +++ /dev/null @@ -1,284 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.contrib.wrappers - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - Extra wrappers or mixins contributed by the community. These wrappers can - be mixed in into request objects to add extra functionality. - - Example:: - - from werkzeug.wrappers import Request as RequestBase - from werkzeug.contrib.wrappers import JSONRequestMixin - - class Request(RequestBase, JSONRequestMixin): - pass - - Afterwards this request object provides the extra functionality of the - :class:`JSONRequestMixin`. - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import codecs -try: - from simplejson import loads -except ImportError: - from json import loads - -from werkzeug.exceptions import BadRequest -from werkzeug.utils import cached_property -from werkzeug.http import dump_options_header, parse_options_header -from werkzeug._compat import wsgi_decoding_dance - - -def is_known_charset(charset): - """Checks if the given charset is known to Python.""" - try: - codecs.lookup(charset) - except LookupError: - return False - return True - - -class JSONRequestMixin(object): - - """Add json method to a request object. This will parse the input data - through simplejson if possible. - - :exc:`~werkzeug.exceptions.BadRequest` will be raised if the content-type - is not json or if the data itself cannot be parsed as json. - """ - - @cached_property - def json(self): - """Get the result of simplejson.loads if possible.""" - if 'json' not in self.environ.get('CONTENT_TYPE', ''): - raise BadRequest('Not a JSON request') - try: - return loads(self.data.decode(self.charset, self.encoding_errors)) - except Exception: - raise BadRequest('Unable to read JSON request') - - -class ProtobufRequestMixin(object): - - """Add protobuf parsing method to a request object. This will parse the - input data through `protobuf`_ if possible. - - :exc:`~werkzeug.exceptions.BadRequest` will be raised if the content-type - is not protobuf or if the data itself cannot be parsed property. - - .. _protobuf: http://code.google.com/p/protobuf/ - """ - - #: by default the :class:`ProtobufRequestMixin` will raise a - #: :exc:`~werkzeug.exceptions.BadRequest` if the object is not - #: initialized. You can bypass that check by setting this - #: attribute to `False`. - protobuf_check_initialization = True - - def parse_protobuf(self, proto_type): - """Parse the data into an instance of proto_type.""" - if 'protobuf' not in self.environ.get('CONTENT_TYPE', ''): - raise BadRequest('Not a Protobuf request') - - obj = proto_type() - try: - obj.ParseFromString(self.data) - except Exception: - raise BadRequest("Unable to parse Protobuf request") - - # Fail if not all required fields are set - if self.protobuf_check_initialization and not obj.IsInitialized(): - raise BadRequest("Partial Protobuf request") - - return obj - - -class RoutingArgsRequestMixin(object): - - """This request mixin adds support for the wsgiorg routing args - `specification`_. - - .. _specification: https://wsgi.readthedocs.io/en/latest/specifications/routing_args.html - """ - - def _get_routing_args(self): - return self.environ.get('wsgiorg.routing_args', (()))[0] - - def _set_routing_args(self, value): - if self.shallow: - raise RuntimeError('A shallow request tried to modify the WSGI ' - 'environment. If you really want to do that, ' - 'set `shallow` to False.') - self.environ['wsgiorg.routing_args'] = (value, self.routing_vars) - - routing_args = property(_get_routing_args, _set_routing_args, doc=''' - The positional URL arguments as `tuple`.''') - del _get_routing_args, _set_routing_args - - def _get_routing_vars(self): - rv = self.environ.get('wsgiorg.routing_args') - if rv is not None: - return rv[1] - rv = {} - if not self.shallow: - self.routing_vars = rv - return rv - - def _set_routing_vars(self, value): - if self.shallow: - raise RuntimeError('A shallow request tried to modify the WSGI ' - 'environment. If you really want to do that, ' - 'set `shallow` to False.') - self.environ['wsgiorg.routing_args'] = (self.routing_args, value) - - routing_vars = property(_get_routing_vars, _set_routing_vars, doc=''' - The keyword URL arguments as `dict`.''') - del _get_routing_vars, _set_routing_vars - - -class ReverseSlashBehaviorRequestMixin(object): - - """This mixin reverses the trailing slash behavior of :attr:`script_root` - and :attr:`path`. This makes it possible to use :func:`~urlparse.urljoin` - directly on the paths. - - Because it changes the behavior or :class:`Request` this class has to be - mixed in *before* the actual request class:: - - class MyRequest(ReverseSlashBehaviorRequestMixin, Request): - pass - - This example shows the differences (for an application mounted on - `/application` and the request going to `/application/foo/bar`): - - +---------------+-------------------+---------------------+ - | | normal behavior | reverse behavior | - +===============+===================+=====================+ - | `script_root` | ``/application`` | ``/application/`` | - +---------------+-------------------+---------------------+ - | `path` | ``/foo/bar`` | ``foo/bar`` | - +---------------+-------------------+---------------------+ - """ - - @cached_property - def path(self): - """Requested path as unicode. This works a bit like the regular path - info in the WSGI environment but will not include a leading slash. - """ - path = wsgi_decoding_dance(self.environ.get('PATH_INFO') or '', - self.charset, self.encoding_errors) - return path.lstrip('/') - - @cached_property - def script_root(self): - """The root path of the script includling a trailing slash.""" - path = wsgi_decoding_dance(self.environ.get('SCRIPT_NAME') or '', - self.charset, self.encoding_errors) - return path.rstrip('/') + '/' - - -class DynamicCharsetRequestMixin(object): - - """"If this mixin is mixed into a request class it will provide - a dynamic `charset` attribute. This means that if the charset is - transmitted in the content type headers it's used from there. - - Because it changes the behavior or :class:`Request` this class has - to be mixed in *before* the actual request class:: - - class MyRequest(DynamicCharsetRequestMixin, Request): - pass - - By default the request object assumes that the URL charset is the - same as the data charset. If the charset varies on each request - based on the transmitted data it's not a good idea to let the URLs - change based on that. Most browsers assume either utf-8 or latin1 - for the URLs if they have troubles figuring out. It's strongly - recommended to set the URL charset to utf-8:: - - class MyRequest(DynamicCharsetRequestMixin, Request): - url_charset = 'utf-8' - - .. versionadded:: 0.6 - """ - - #: the default charset that is assumed if the content type header - #: is missing or does not contain a charset parameter. The default - #: is latin1 which is what HTTP specifies as default charset. - #: You may however want to set this to utf-8 to better support - #: browsers that do not transmit a charset for incoming data. - default_charset = 'latin1' - - def unknown_charset(self, charset): - """Called if a charset was provided but is not supported by - the Python codecs module. By default latin1 is assumed then - to not lose any information, you may override this method to - change the behavior. - - :param charset: the charset that was not found. - :return: the replacement charset. - """ - return 'latin1' - - @cached_property - def charset(self): - """The charset from the content type.""" - header = self.environ.get('CONTENT_TYPE') - if header: - ct, options = parse_options_header(header) - charset = options.get('charset') - if charset: - if is_known_charset(charset): - return charset - return self.unknown_charset(charset) - return self.default_charset - - -class DynamicCharsetResponseMixin(object): - - """If this mixin is mixed into a response class it will provide - a dynamic `charset` attribute. This means that if the charset is - looked up and stored in the `Content-Type` header and updates - itself automatically. This also means a small performance hit but - can be useful if you're working with different charsets on - responses. - - Because the charset attribute is no a property at class-level, the - default value is stored in `default_charset`. - - Because it changes the behavior or :class:`Response` this class has - to be mixed in *before* the actual response class:: - - class MyResponse(DynamicCharsetResponseMixin, Response): - pass - - .. versionadded:: 0.6 - """ - - #: the default charset. - default_charset = 'utf-8' - - def _get_charset(self): - header = self.headers.get('content-type') - if header: - charset = parse_options_header(header)[1].get('charset') - if charset: - return charset - return self.default_charset - - def _set_charset(self, charset): - header = self.headers.get('content-type') - ct, options = parse_options_header(header) - if not ct: - raise TypeError('Cannot set charset if Content-Type ' - 'header is missing.') - options['charset'] = charset - self.headers['Content-Type'] = dump_options_header(ct, options) - - charset = property(_get_charset, _set_charset, doc=""" - The charset for the response. It's stored inside the - Content-Type header as a parameter.""") - del _get_charset, _set_charset diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/datastructures.py b/flask/venv/lib/python3.6/site-packages/werkzeug/datastructures.py deleted file mode 100644 index 9624599..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/datastructures.py +++ /dev/null @@ -1,2762 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.datastructures - ~~~~~~~~~~~~~~~~~~~~~~~ - - This module provides mixins and classes with an immutable interface. - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import re -import codecs -import mimetypes -from copy import deepcopy -from itertools import repeat -from collections import Container, Iterable, MutableSet - -from werkzeug._internal import _missing, _empty_stream -from werkzeug._compat import iterkeys, itervalues, iteritems, iterlists, \ - PY2, text_type, integer_types, string_types, make_literal_wrapper, \ - to_native -from werkzeug.filesystem import get_filesystem_encoding - - -_locale_delim_re = re.compile(r'[_-]') - - -def is_immutable(self): - raise TypeError('%r objects are immutable' % self.__class__.__name__) - - -def iter_multi_items(mapping): - """Iterates over the items of a mapping yielding keys and values - without dropping any from more complex structures. - """ - if isinstance(mapping, MultiDict): - for item in iteritems(mapping, multi=True): - yield item - elif isinstance(mapping, dict): - for key, value in iteritems(mapping): - if isinstance(value, (tuple, list)): - for value in value: - yield key, value - else: - yield key, value - else: - for item in mapping: - yield item - - -def native_itermethods(names): - if not PY2: - return lambda x: x - - def setviewmethod(cls, name): - viewmethod_name = 'view%s' % name - viewmethod = lambda self, *a, **kw: ViewItems(self, name, 'view_%s' % name, *a, **kw) - viewmethod.__doc__ = \ - '"""`%s()` object providing a view on %s"""' % (viewmethod_name, name) - setattr(cls, viewmethod_name, viewmethod) - - def setitermethod(cls, name): - itermethod = getattr(cls, name) - setattr(cls, 'iter%s' % name, itermethod) - listmethod = lambda self, *a, **kw: list(itermethod(self, *a, **kw)) - listmethod.__doc__ = \ - 'Like :py:meth:`iter%s`, but returns a list.' % name - setattr(cls, name, listmethod) - - def wrap(cls): - for name in names: - setitermethod(cls, name) - setviewmethod(cls, name) - return cls - return wrap - - -class ImmutableListMixin(object): - - """Makes a :class:`list` immutable. - - .. versionadded:: 0.5 - - :private: - """ - - _hash_cache = None - - def __hash__(self): - if self._hash_cache is not None: - return self._hash_cache - rv = self._hash_cache = hash(tuple(self)) - return rv - - def __reduce_ex__(self, protocol): - return type(self), (list(self),) - - def __delitem__(self, key): - is_immutable(self) - - def __iadd__(self, other): - is_immutable(self) - __imul__ = __iadd__ - - def __setitem__(self, key, value): - is_immutable(self) - - def append(self, item): - is_immutable(self) - remove = append - - def extend(self, iterable): - is_immutable(self) - - def insert(self, pos, value): - is_immutable(self) - - def pop(self, index=-1): - is_immutable(self) - - def reverse(self): - is_immutable(self) - - def sort(self, cmp=None, key=None, reverse=None): - is_immutable(self) - - -class ImmutableList(ImmutableListMixin, list): - - """An immutable :class:`list`. - - .. versionadded:: 0.5 - - :private: - """ - - def __repr__(self): - return '%s(%s)' % ( - self.__class__.__name__, - list.__repr__(self), - ) - - -class ImmutableDictMixin(object): - - """Makes a :class:`dict` immutable. - - .. versionadded:: 0.5 - - :private: - """ - _hash_cache = None - - @classmethod - def fromkeys(cls, keys, value=None): - instance = super(cls, cls).__new__(cls) - instance.__init__(zip(keys, repeat(value))) - return instance - - def __reduce_ex__(self, protocol): - return type(self), (dict(self),) - - def _iter_hashitems(self): - return iteritems(self) - - def __hash__(self): - if self._hash_cache is not None: - return self._hash_cache - rv = self._hash_cache = hash(frozenset(self._iter_hashitems())) - return rv - - def setdefault(self, key, default=None): - is_immutable(self) - - def update(self, *args, **kwargs): - is_immutable(self) - - def pop(self, key, default=None): - is_immutable(self) - - def popitem(self): - is_immutable(self) - - def __setitem__(self, key, value): - is_immutable(self) - - def __delitem__(self, key): - is_immutable(self) - - def clear(self): - is_immutable(self) - - -class ImmutableMultiDictMixin(ImmutableDictMixin): - - """Makes a :class:`MultiDict` immutable. - - .. versionadded:: 0.5 - - :private: - """ - - def __reduce_ex__(self, protocol): - return type(self), (list(iteritems(self, multi=True)),) - - def _iter_hashitems(self): - return iteritems(self, multi=True) - - def add(self, key, value): - is_immutable(self) - - def popitemlist(self): - is_immutable(self) - - def poplist(self, key): - is_immutable(self) - - def setlist(self, key, new_list): - is_immutable(self) - - def setlistdefault(self, key, default_list=None): - is_immutable(self) - - -class UpdateDictMixin(object): - - """Makes dicts call `self.on_update` on modifications. - - .. versionadded:: 0.5 - - :private: - """ - - on_update = None - - def calls_update(name): - def oncall(self, *args, **kw): - rv = getattr(super(UpdateDictMixin, self), name)(*args, **kw) - if self.on_update is not None: - self.on_update(self) - return rv - oncall.__name__ = name - return oncall - - def setdefault(self, key, default=None): - modified = key not in self - rv = super(UpdateDictMixin, self).setdefault(key, default) - if modified and self.on_update is not None: - self.on_update(self) - return rv - - def pop(self, key, default=_missing): - modified = key in self - if default is _missing: - rv = super(UpdateDictMixin, self).pop(key) - else: - rv = super(UpdateDictMixin, self).pop(key, default) - if modified and self.on_update is not None: - self.on_update(self) - return rv - - __setitem__ = calls_update('__setitem__') - __delitem__ = calls_update('__delitem__') - clear = calls_update('clear') - popitem = calls_update('popitem') - update = calls_update('update') - del calls_update - - -class TypeConversionDict(dict): - - """Works like a regular dict but the :meth:`get` method can perform - type conversions. :class:`MultiDict` and :class:`CombinedMultiDict` - are subclasses of this class and provide the same feature. - - .. versionadded:: 0.5 - """ - - def get(self, key, default=None, type=None): - """Return the default value if the requested data doesn't exist. - If `type` is provided and is a callable it should convert the value, - return it or raise a :exc:`ValueError` if that is not possible. In - this case the function will return the default as if the value was not - found: - - >>> d = TypeConversionDict(foo='42', bar='blub') - >>> d.get('foo', type=int) - 42 - >>> d.get('bar', -1, type=int) - -1 - - :param key: The key to be looked up. - :param default: The default value to be returned if the key can't - be looked up. If not further specified `None` is - returned. - :param type: A callable that is used to cast the value in the - :class:`MultiDict`. If a :exc:`ValueError` is raised - by this callable the default value is returned. - """ - try: - rv = self[key] - except KeyError: - return default - if type is not None: - try: - rv = type(rv) - except ValueError: - rv = default - return rv - - -class ImmutableTypeConversionDict(ImmutableDictMixin, TypeConversionDict): - - """Works like a :class:`TypeConversionDict` but does not support - modifications. - - .. versionadded:: 0.5 - """ - - def copy(self): - """Return a shallow mutable copy of this object. Keep in mind that - the standard library's :func:`copy` function is a no-op for this class - like for any other python immutable type (eg: :class:`tuple`). - """ - return TypeConversionDict(self) - - def __copy__(self): - return self - - -class ViewItems(object): - - def __init__(self, multi_dict, method, repr_name, *a, **kw): - self.__multi_dict = multi_dict - self.__method = method - self.__repr_name = repr_name - self.__a = a - self.__kw = kw - - def __get_items(self): - return getattr(self.__multi_dict, self.__method)(*self.__a, **self.__kw) - - def __repr__(self): - return '%s(%r)' % (self.__repr_name, list(self.__get_items())) - - def __iter__(self): - return iter(self.__get_items()) - - -@native_itermethods(['keys', 'values', 'items', 'lists', 'listvalues']) -class MultiDict(TypeConversionDict): - - """A :class:`MultiDict` is a dictionary subclass customized to deal with - multiple values for the same key which is for example used by the parsing - functions in the wrappers. This is necessary because some HTML form - elements pass multiple values for the same key. - - :class:`MultiDict` implements all standard dictionary methods. - Internally, it saves all values for a key as a list, but the standard dict - access methods will only return the first value for a key. If you want to - gain access to the other values, too, you have to use the `list` methods as - explained below. - - Basic Usage: - - >>> d = MultiDict([('a', 'b'), ('a', 'c')]) - >>> d - MultiDict([('a', 'b'), ('a', 'c')]) - >>> d['a'] - 'b' - >>> d.getlist('a') - ['b', 'c'] - >>> 'a' in d - True - - It behaves like a normal dict thus all dict functions will only return the - first value when multiple values for one key are found. - - From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a - subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will - render a page for a ``400 BAD REQUEST`` if caught in a catch-all for HTTP - exceptions. - - A :class:`MultiDict` can be constructed from an iterable of - ``(key, value)`` tuples, a dict, a :class:`MultiDict` or from Werkzeug 0.2 - onwards some keyword parameters. - - :param mapping: the initial value for the :class:`MultiDict`. Either a - regular dict, an iterable of ``(key, value)`` tuples - or `None`. - """ - - def __init__(self, mapping=None): - if isinstance(mapping, MultiDict): - dict.__init__(self, ((k, l[:]) for k, l in iterlists(mapping))) - elif isinstance(mapping, dict): - tmp = {} - for key, value in iteritems(mapping): - if isinstance(value, (tuple, list)): - if len(value) == 0: - continue - value = list(value) - else: - value = [value] - tmp[key] = value - dict.__init__(self, tmp) - else: - tmp = {} - for key, value in mapping or (): - tmp.setdefault(key, []).append(value) - dict.__init__(self, tmp) - - def __getstate__(self): - return dict(self.lists()) - - def __setstate__(self, value): - dict.clear(self) - dict.update(self, value) - - def __getitem__(self, key): - """Return the first data value for this key; - raises KeyError if not found. - - :param key: The key to be looked up. - :raise KeyError: if the key does not exist. - """ - if key in self: - lst = dict.__getitem__(self, key) - if len(lst) > 0: - return lst[0] - raise exceptions.BadRequestKeyError(key) - - def __setitem__(self, key, value): - """Like :meth:`add` but removes an existing key first. - - :param key: the key for the value. - :param value: the value to set. - """ - dict.__setitem__(self, key, [value]) - - def add(self, key, value): - """Adds a new value for the key. - - .. versionadded:: 0.6 - - :param key: the key for the value. - :param value: the value to add. - """ - dict.setdefault(self, key, []).append(value) - - def getlist(self, key, type=None): - """Return the list of items for a given key. If that key is not in the - `MultiDict`, the return value will be an empty list. Just as `get` - `getlist` accepts a `type` parameter. All items will be converted - with the callable defined there. - - :param key: The key to be looked up. - :param type: A callable that is used to cast the value in the - :class:`MultiDict`. If a :exc:`ValueError` is raised - by this callable the value will be removed from the list. - :return: a :class:`list` of all the values for the key. - """ - try: - rv = dict.__getitem__(self, key) - except KeyError: - return [] - if type is None: - return list(rv) - result = [] - for item in rv: - try: - result.append(type(item)) - except ValueError: - pass - return result - - def setlist(self, key, new_list): - """Remove the old values for a key and add new ones. Note that the list - you pass the values in will be shallow-copied before it is inserted in - the dictionary. - - >>> d = MultiDict() - >>> d.setlist('foo', ['1', '2']) - >>> d['foo'] - '1' - >>> d.getlist('foo') - ['1', '2'] - - :param key: The key for which the values are set. - :param new_list: An iterable with the new values for the key. Old values - are removed first. - """ - dict.__setitem__(self, key, list(new_list)) - - def setdefault(self, key, default=None): - """Returns the value for the key if it is in the dict, otherwise it - returns `default` and sets that value for `key`. - - :param key: The key to be looked up. - :param default: The default value to be returned if the key is not - in the dict. If not further specified it's `None`. - """ - if key not in self: - self[key] = default - else: - default = self[key] - return default - - def setlistdefault(self, key, default_list=None): - """Like `setdefault` but sets multiple values. The list returned - is not a copy, but the list that is actually used internally. This - means that you can put new values into the dict by appending items - to the list: - - >>> d = MultiDict({"foo": 1}) - >>> d.setlistdefault("foo").extend([2, 3]) - >>> d.getlist("foo") - [1, 2, 3] - - :param key: The key to be looked up. - :param default_list: An iterable of default values. It is either copied - (in case it was a list) or converted into a list - before returned. - :return: a :class:`list` - """ - if key not in self: - default_list = list(default_list or ()) - dict.__setitem__(self, key, default_list) - else: - default_list = dict.__getitem__(self, key) - return default_list - - def items(self, multi=False): - """Return an iterator of ``(key, value)`` pairs. - - :param multi: If set to `True` the iterator returned will have a pair - for each value of each key. Otherwise it will only - contain pairs for the first value of each key. - """ - - for key, values in iteritems(dict, self): - if multi: - for value in values: - yield key, value - else: - yield key, values[0] - - def lists(self): - """Return a list of ``(key, values)`` pairs, where values is the list - of all values associated with the key.""" - - for key, values in iteritems(dict, self): - yield key, list(values) - - def keys(self): - return iterkeys(dict, self) - - __iter__ = keys - - def values(self): - """Returns an iterator of the first value on every key's value list.""" - for values in itervalues(dict, self): - yield values[0] - - def listvalues(self): - """Return an iterator of all values associated with a key. Zipping - :meth:`keys` and this is the same as calling :meth:`lists`: - - >>> d = MultiDict({"foo": [1, 2, 3]}) - >>> zip(d.keys(), d.listvalues()) == d.lists() - True - """ - - return itervalues(dict, self) - - def copy(self): - """Return a shallow copy of this object.""" - return self.__class__(self) - - def deepcopy(self, memo=None): - """Return a deep copy of this object.""" - return self.__class__(deepcopy(self.to_dict(flat=False), memo)) - - def to_dict(self, flat=True): - """Return the contents as regular dict. If `flat` is `True` the - returned dict will only have the first item present, if `flat` is - `False` all values will be returned as lists. - - :param flat: If set to `False` the dict returned will have lists - with all the values in it. Otherwise it will only - contain the first value for each key. - :return: a :class:`dict` - """ - if flat: - return dict(iteritems(self)) - return dict(self.lists()) - - def update(self, other_dict): - """update() extends rather than replaces existing key lists: - - >>> a = MultiDict({'x': 1}) - >>> b = MultiDict({'x': 2, 'y': 3}) - >>> a.update(b) - >>> a - MultiDict([('y', 3), ('x', 1), ('x', 2)]) - - If the value list for a key in ``other_dict`` is empty, no new values - will be added to the dict and the key will not be created: - - >>> x = {'empty_list': []} - >>> y = MultiDict() - >>> y.update(x) - >>> y - MultiDict([]) - """ - for key, value in iter_multi_items(other_dict): - MultiDict.add(self, key, value) - - def pop(self, key, default=_missing): - """Pop the first item for a list on the dict. Afterwards the - key is removed from the dict, so additional values are discarded: - - >>> d = MultiDict({"foo": [1, 2, 3]}) - >>> d.pop("foo") - 1 - >>> "foo" in d - False - - :param key: the key to pop. - :param default: if provided the value to return if the key was - not in the dictionary. - """ - try: - lst = dict.pop(self, key) - - if len(lst) == 0: - raise exceptions.BadRequestKeyError() - - return lst[0] - except KeyError as e: - if default is not _missing: - return default - raise exceptions.BadRequestKeyError(str(e)) - - def popitem(self): - """Pop an item from the dict.""" - try: - item = dict.popitem(self) - - if len(item[1]) == 0: - raise exceptions.BadRequestKeyError() - - return (item[0], item[1][0]) - except KeyError as e: - raise exceptions.BadRequestKeyError(str(e)) - - def poplist(self, key): - """Pop the list for a key from the dict. If the key is not in the dict - an empty list is returned. - - .. versionchanged:: 0.5 - If the key does no longer exist a list is returned instead of - raising an error. - """ - return dict.pop(self, key, []) - - def popitemlist(self): - """Pop a ``(key, list)`` tuple from the dict.""" - try: - return dict.popitem(self) - except KeyError as e: - raise exceptions.BadRequestKeyError(str(e)) - - def __copy__(self): - return self.copy() - - def __deepcopy__(self, memo): - return self.deepcopy(memo=memo) - - def __repr__(self): - return '%s(%r)' % (self.__class__.__name__, list(iteritems(self, multi=True))) - - -class _omd_bucket(object): - - """Wraps values in the :class:`OrderedMultiDict`. This makes it - possible to keep an order over multiple different keys. It requires - a lot of extra memory and slows down access a lot, but makes it - possible to access elements in O(1) and iterate in O(n). - """ - __slots__ = ('prev', 'key', 'value', 'next') - - def __init__(self, omd, key, value): - self.prev = omd._last_bucket - self.key = key - self.value = value - self.next = None - - if omd._first_bucket is None: - omd._first_bucket = self - if omd._last_bucket is not None: - omd._last_bucket.next = self - omd._last_bucket = self - - def unlink(self, omd): - if self.prev: - self.prev.next = self.next - if self.next: - self.next.prev = self.prev - if omd._first_bucket is self: - omd._first_bucket = self.next - if omd._last_bucket is self: - omd._last_bucket = self.prev - - -@native_itermethods(['keys', 'values', 'items', 'lists', 'listvalues']) -class OrderedMultiDict(MultiDict): - - """Works like a regular :class:`MultiDict` but preserves the - order of the fields. To convert the ordered multi dict into a - list you can use the :meth:`items` method and pass it ``multi=True``. - - In general an :class:`OrderedMultiDict` is an order of magnitude - slower than a :class:`MultiDict`. - - .. admonition:: note - - Due to a limitation in Python you cannot convert an ordered - multi dict into a regular dict by using ``dict(multidict)``. - Instead you have to use the :meth:`to_dict` method, otherwise - the internal bucket objects are exposed. - """ - - def __init__(self, mapping=None): - dict.__init__(self) - self._first_bucket = self._last_bucket = None - if mapping is not None: - OrderedMultiDict.update(self, mapping) - - def __eq__(self, other): - if not isinstance(other, MultiDict): - return NotImplemented - if isinstance(other, OrderedMultiDict): - iter1 = iteritems(self, multi=True) - iter2 = iteritems(other, multi=True) - try: - for k1, v1 in iter1: - k2, v2 = next(iter2) - if k1 != k2 or v1 != v2: - return False - except StopIteration: - return False - try: - next(iter2) - except StopIteration: - return True - return False - if len(self) != len(other): - return False - for key, values in iterlists(self): - if other.getlist(key) != values: - return False - return True - - __hash__ = None - - def __ne__(self, other): - return not self.__eq__(other) - - def __reduce_ex__(self, protocol): - return type(self), (list(iteritems(self, multi=True)),) - - def __getstate__(self): - return list(iteritems(self, multi=True)) - - def __setstate__(self, values): - dict.clear(self) - for key, value in values: - self.add(key, value) - - def __getitem__(self, key): - if key in self: - return dict.__getitem__(self, key)[0].value - raise exceptions.BadRequestKeyError(key) - - def __setitem__(self, key, value): - self.poplist(key) - self.add(key, value) - - def __delitem__(self, key): - self.pop(key) - - def keys(self): - return (key for key, value in iteritems(self)) - - __iter__ = keys - - def values(self): - return (value for key, value in iteritems(self)) - - def items(self, multi=False): - ptr = self._first_bucket - if multi: - while ptr is not None: - yield ptr.key, ptr.value - ptr = ptr.next - else: - returned_keys = set() - while ptr is not None: - if ptr.key not in returned_keys: - returned_keys.add(ptr.key) - yield ptr.key, ptr.value - ptr = ptr.next - - def lists(self): - returned_keys = set() - ptr = self._first_bucket - while ptr is not None: - if ptr.key not in returned_keys: - yield ptr.key, self.getlist(ptr.key) - returned_keys.add(ptr.key) - ptr = ptr.next - - def listvalues(self): - for key, values in iterlists(self): - yield values - - def add(self, key, value): - dict.setdefault(self, key, []).append(_omd_bucket(self, key, value)) - - def getlist(self, key, type=None): - try: - rv = dict.__getitem__(self, key) - except KeyError: - return [] - if type is None: - return [x.value for x in rv] - result = [] - for item in rv: - try: - result.append(type(item.value)) - except ValueError: - pass - return result - - def setlist(self, key, new_list): - self.poplist(key) - for value in new_list: - self.add(key, value) - - def setlistdefault(self, key, default_list=None): - raise TypeError('setlistdefault is unsupported for ' - 'ordered multi dicts') - - def update(self, mapping): - for key, value in iter_multi_items(mapping): - OrderedMultiDict.add(self, key, value) - - def poplist(self, key): - buckets = dict.pop(self, key, ()) - for bucket in buckets: - bucket.unlink(self) - return [x.value for x in buckets] - - def pop(self, key, default=_missing): - try: - buckets = dict.pop(self, key) - except KeyError as e: - if default is not _missing: - return default - raise exceptions.BadRequestKeyError(str(e)) - for bucket in buckets: - bucket.unlink(self) - return buckets[0].value - - def popitem(self): - try: - key, buckets = dict.popitem(self) - except KeyError as e: - raise exceptions.BadRequestKeyError(str(e)) - for bucket in buckets: - bucket.unlink(self) - return key, buckets[0].value - - def popitemlist(self): - try: - key, buckets = dict.popitem(self) - except KeyError as e: - raise exceptions.BadRequestKeyError(str(e)) - for bucket in buckets: - bucket.unlink(self) - return key, [x.value for x in buckets] - - -def _options_header_vkw(value, kw): - return dump_options_header(value, dict((k.replace('_', '-'), v) - for k, v in kw.items())) - - -def _unicodify_header_value(value): - if isinstance(value, bytes): - value = value.decode('latin-1') - if not isinstance(value, text_type): - value = text_type(value) - return value - - -@native_itermethods(['keys', 'values', 'items']) -class Headers(object): - - """An object that stores some headers. It has a dict-like interface - but is ordered and can store the same keys multiple times. - - This data structure is useful if you want a nicer way to handle WSGI - headers which are stored as tuples in a list. - - From Werkzeug 0.3 onwards, the :exc:`KeyError` raised by this class is - also a subclass of the :class:`~exceptions.BadRequest` HTTP exception - and will render a page for a ``400 BAD REQUEST`` if caught in a - catch-all for HTTP exceptions. - - Headers is mostly compatible with the Python :class:`wsgiref.headers.Headers` - class, with the exception of `__getitem__`. :mod:`wsgiref` will return - `None` for ``headers['missing']``, whereas :class:`Headers` will raise - a :class:`KeyError`. - - To create a new :class:`Headers` object pass it a list or dict of headers - which are used as default values. This does not reuse the list passed - to the constructor for internal usage. - - :param defaults: The list of default values for the :class:`Headers`. - - .. versionchanged:: 0.9 - This data structure now stores unicode values similar to how the - multi dicts do it. The main difference is that bytes can be set as - well which will automatically be latin1 decoded. - - .. versionchanged:: 0.9 - The :meth:`linked` function was removed without replacement as it - was an API that does not support the changes to the encoding model. - """ - - def __init__(self, defaults=None): - self._list = [] - if defaults is not None: - if isinstance(defaults, (list, Headers)): - self._list.extend(defaults) - else: - self.extend(defaults) - - def __getitem__(self, key, _get_mode=False): - if not _get_mode: - if isinstance(key, integer_types): - return self._list[key] - elif isinstance(key, slice): - return self.__class__(self._list[key]) - if not isinstance(key, string_types): - raise exceptions.BadRequestKeyError(key) - ikey = key.lower() - for k, v in self._list: - if k.lower() == ikey: - return v - # micro optimization: if we are in get mode we will catch that - # exception one stack level down so we can raise a standard - # key error instead of our special one. - if _get_mode: - raise KeyError() - raise exceptions.BadRequestKeyError(key) - - def __eq__(self, other): - return other.__class__ is self.__class__ and \ - set(other._list) == set(self._list) - - __hash__ = None - - def __ne__(self, other): - return not self.__eq__(other) - - def get(self, key, default=None, type=None, as_bytes=False): - """Return the default value if the requested data doesn't exist. - If `type` is provided and is a callable it should convert the value, - return it or raise a :exc:`ValueError` if that is not possible. In - this case the function will return the default as if the value was not - found: - - >>> d = Headers([('Content-Length', '42')]) - >>> d.get('Content-Length', type=int) - 42 - - If a headers object is bound you must not add unicode strings - because no encoding takes place. - - .. versionadded:: 0.9 - Added support for `as_bytes`. - - :param key: The key to be looked up. - :param default: The default value to be returned if the key can't - be looked up. If not further specified `None` is - returned. - :param type: A callable that is used to cast the value in the - :class:`Headers`. If a :exc:`ValueError` is raised - by this callable the default value is returned. - :param as_bytes: return bytes instead of unicode strings. - """ - try: - rv = self.__getitem__(key, _get_mode=True) - except KeyError: - return default - if as_bytes: - rv = rv.encode('latin1') - if type is None: - return rv - try: - return type(rv) - except ValueError: - return default - - def getlist(self, key, type=None, as_bytes=False): - """Return the list of items for a given key. If that key is not in the - :class:`Headers`, the return value will be an empty list. Just as - :meth:`get` :meth:`getlist` accepts a `type` parameter. All items will - be converted with the callable defined there. - - .. versionadded:: 0.9 - Added support for `as_bytes`. - - :param key: The key to be looked up. - :param type: A callable that is used to cast the value in the - :class:`Headers`. If a :exc:`ValueError` is raised - by this callable the value will be removed from the list. - :return: a :class:`list` of all the values for the key. - :param as_bytes: return bytes instead of unicode strings. - """ - ikey = key.lower() - result = [] - for k, v in self: - if k.lower() == ikey: - if as_bytes: - v = v.encode('latin1') - if type is not None: - try: - v = type(v) - except ValueError: - continue - result.append(v) - return result - - def get_all(self, name): - """Return a list of all the values for the named field. - - This method is compatible with the :mod:`wsgiref` - :meth:`~wsgiref.headers.Headers.get_all` method. - """ - return self.getlist(name) - - def items(self, lower=False): - for key, value in self: - if lower: - key = key.lower() - yield key, value - - def keys(self, lower=False): - for key, _ in iteritems(self, lower): - yield key - - def values(self): - for _, value in iteritems(self): - yield value - - def extend(self, iterable): - """Extend the headers with a dict or an iterable yielding keys and - values. - """ - if isinstance(iterable, dict): - for key, value in iteritems(iterable): - if isinstance(value, (tuple, list)): - for v in value: - self.add(key, v) - else: - self.add(key, value) - else: - for key, value in iterable: - self.add(key, value) - - def __delitem__(self, key, _index_operation=True): - if _index_operation and isinstance(key, (integer_types, slice)): - del self._list[key] - return - key = key.lower() - new = [] - for k, v in self._list: - if k.lower() != key: - new.append((k, v)) - self._list[:] = new - - def remove(self, key): - """Remove a key. - - :param key: The key to be removed. - """ - return self.__delitem__(key, _index_operation=False) - - def pop(self, key=None, default=_missing): - """Removes and returns a key or index. - - :param key: The key to be popped. If this is an integer the item at - that position is removed, if it's a string the value for - that key is. If the key is omitted or `None` the last - item is removed. - :return: an item. - """ - if key is None: - return self._list.pop() - if isinstance(key, integer_types): - return self._list.pop(key) - try: - rv = self[key] - self.remove(key) - except KeyError: - if default is not _missing: - return default - raise - return rv - - def popitem(self): - """Removes a key or index and returns a (key, value) item.""" - return self.pop() - - def __contains__(self, key): - """Check if a key is present.""" - try: - self.__getitem__(key, _get_mode=True) - except KeyError: - return False - return True - - has_key = __contains__ - - def __iter__(self): - """Yield ``(key, value)`` tuples.""" - return iter(self._list) - - def __len__(self): - return len(self._list) - - def add(self, _key, _value, **kw): - """Add a new header tuple to the list. - - Keyword arguments can specify additional parameters for the header - value, with underscores converted to dashes:: - - >>> d = Headers() - >>> d.add('Content-Type', 'text/plain') - >>> d.add('Content-Disposition', 'attachment', filename='foo.png') - - The keyword argument dumping uses :func:`dump_options_header` - behind the scenes. - - .. versionadded:: 0.4.1 - keyword arguments were added for :mod:`wsgiref` compatibility. - """ - if kw: - _value = _options_header_vkw(_value, kw) - _value = _unicodify_header_value(_value) - self._validate_value(_value) - self._list.append((_key, _value)) - - def _validate_value(self, value): - if not isinstance(value, text_type): - raise TypeError('Value should be unicode.') - if u'\n' in value or u'\r' in value: - raise ValueError('Detected newline in header value. This is ' - 'a potential security problem') - - def add_header(self, _key, _value, **_kw): - """Add a new header tuple to the list. - - An alias for :meth:`add` for compatibility with the :mod:`wsgiref` - :meth:`~wsgiref.headers.Headers.add_header` method. - """ - self.add(_key, _value, **_kw) - - def clear(self): - """Clears all headers.""" - del self._list[:] - - def set(self, _key, _value, **kw): - """Remove all header tuples for `key` and add a new one. The newly - added key either appears at the end of the list if there was no - entry or replaces the first one. - - Keyword arguments can specify additional parameters for the header - value, with underscores converted to dashes. See :meth:`add` for - more information. - - .. versionchanged:: 0.6.1 - :meth:`set` now accepts the same arguments as :meth:`add`. - - :param key: The key to be inserted. - :param value: The value to be inserted. - """ - if kw: - _value = _options_header_vkw(_value, kw) - _value = _unicodify_header_value(_value) - self._validate_value(_value) - if not self._list: - self._list.append((_key, _value)) - return - listiter = iter(self._list) - ikey = _key.lower() - for idx, (old_key, old_value) in enumerate(listiter): - if old_key.lower() == ikey: - # replace first ocurrence - self._list[idx] = (_key, _value) - break - else: - self._list.append((_key, _value)) - return - self._list[idx + 1:] = [t for t in listiter if t[0].lower() != ikey] - - def setdefault(self, key, default): - """Returns the value for the key if it is in the dict, otherwise it - returns `default` and sets that value for `key`. - - :param key: The key to be looked up. - :param default: The default value to be returned if the key is not - in the dict. If not further specified it's `None`. - """ - if key in self: - return self[key] - self.set(key, default) - return default - - def __setitem__(self, key, value): - """Like :meth:`set` but also supports index/slice based setting.""" - if isinstance(key, (slice, integer_types)): - if isinstance(key, integer_types): - value = [value] - value = [(k, _unicodify_header_value(v)) for (k, v) in value] - [self._validate_value(v) for (k, v) in value] - if isinstance(key, integer_types): - self._list[key] = value[0] - else: - self._list[key] = value - else: - self.set(key, value) - - def to_list(self, charset='iso-8859-1'): - """Convert the headers into a list suitable for WSGI.""" - from warnings import warn - warn(DeprecationWarning('Method removed, use to_wsgi_list instead'), - stacklevel=2) - return self.to_wsgi_list() - - def to_wsgi_list(self): - """Convert the headers into a list suitable for WSGI. - - The values are byte strings in Python 2 converted to latin1 and unicode - strings in Python 3 for the WSGI server to encode. - - :return: list - """ - if PY2: - return [(to_native(k), v.encode('latin1')) for k, v in self] - return list(self) - - def copy(self): - return self.__class__(self._list) - - def __copy__(self): - return self.copy() - - def __str__(self): - """Returns formatted headers suitable for HTTP transmission.""" - strs = [] - for key, value in self.to_wsgi_list(): - strs.append('%s: %s' % (key, value)) - strs.append('\r\n') - return '\r\n'.join(strs) - - def __repr__(self): - return '%s(%r)' % ( - self.__class__.__name__, - list(self) - ) - - -class ImmutableHeadersMixin(object): - - """Makes a :class:`Headers` immutable. We do not mark them as - hashable though since the only usecase for this datastructure - in Werkzeug is a view on a mutable structure. - - .. versionadded:: 0.5 - - :private: - """ - - def __delitem__(self, key): - is_immutable(self) - - def __setitem__(self, key, value): - is_immutable(self) - set = __setitem__ - - def add(self, item): - is_immutable(self) - remove = add_header = add - - def extend(self, iterable): - is_immutable(self) - - def insert(self, pos, value): - is_immutable(self) - - def pop(self, index=-1): - is_immutable(self) - - def popitem(self): - is_immutable(self) - - def setdefault(self, key, default): - is_immutable(self) - - -class EnvironHeaders(ImmutableHeadersMixin, Headers): - - """Read only version of the headers from a WSGI environment. This - provides the same interface as `Headers` and is constructed from - a WSGI environment. - - From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a - subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will - render a page for a ``400 BAD REQUEST`` if caught in a catch-all for - HTTP exceptions. - """ - - def __init__(self, environ): - self.environ = environ - - def __eq__(self, other): - return self.environ is other.environ - - __hash__ = None - - def __getitem__(self, key, _get_mode=False): - # _get_mode is a no-op for this class as there is no index but - # used because get() calls it. - if not isinstance(key, string_types): - raise KeyError(key) - key = key.upper().replace('-', '_') - if key in ('CONTENT_TYPE', 'CONTENT_LENGTH'): - return _unicodify_header_value(self.environ[key]) - return _unicodify_header_value(self.environ['HTTP_' + key]) - - def __len__(self): - # the iter is necessary because otherwise list calls our - # len which would call list again and so forth. - return len(list(iter(self))) - - def __iter__(self): - for key, value in iteritems(self.environ): - if key.startswith('HTTP_') and key not in \ - ('HTTP_CONTENT_TYPE', 'HTTP_CONTENT_LENGTH'): - yield (key[5:].replace('_', '-').title(), - _unicodify_header_value(value)) - elif key in ('CONTENT_TYPE', 'CONTENT_LENGTH') and value: - yield (key.replace('_', '-').title(), - _unicodify_header_value(value)) - - def copy(self): - raise TypeError('cannot create %r copies' % self.__class__.__name__) - - -@native_itermethods(['keys', 'values', 'items', 'lists', 'listvalues']) -class CombinedMultiDict(ImmutableMultiDictMixin, MultiDict): - - """A read only :class:`MultiDict` that you can pass multiple :class:`MultiDict` - instances as sequence and it will combine the return values of all wrapped - dicts: - - >>> from werkzeug.datastructures import CombinedMultiDict, MultiDict - >>> post = MultiDict([('foo', 'bar')]) - >>> get = MultiDict([('blub', 'blah')]) - >>> combined = CombinedMultiDict([get, post]) - >>> combined['foo'] - 'bar' - >>> combined['blub'] - 'blah' - - This works for all read operations and will raise a `TypeError` for - methods that usually change data which isn't possible. - - From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a - subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will - render a page for a ``400 BAD REQUEST`` if caught in a catch-all for HTTP - exceptions. - """ - - def __reduce_ex__(self, protocol): - return type(self), (self.dicts,) - - def __init__(self, dicts=None): - self.dicts = dicts or [] - - @classmethod - def fromkeys(cls): - raise TypeError('cannot create %r instances by fromkeys' % - cls.__name__) - - def __getitem__(self, key): - for d in self.dicts: - if key in d: - return d[key] - raise exceptions.BadRequestKeyError(key) - - def get(self, key, default=None, type=None): - for d in self.dicts: - if key in d: - if type is not None: - try: - return type(d[key]) - except ValueError: - continue - return d[key] - return default - - def getlist(self, key, type=None): - rv = [] - for d in self.dicts: - rv.extend(d.getlist(key, type)) - return rv - - def _keys_impl(self): - """This function exists so __len__ can be implemented more efficiently, - saving one list creation from an iterator. - - Using this for Python 2's ``dict.keys`` behavior would be useless since - `dict.keys` in Python 2 returns a list, while we have a set here. - """ - rv = set() - for d in self.dicts: - rv.update(iterkeys(d)) - return rv - - def keys(self): - return iter(self._keys_impl()) - - __iter__ = keys - - def items(self, multi=False): - found = set() - for d in self.dicts: - for key, value in iteritems(d, multi): - if multi: - yield key, value - elif key not in found: - found.add(key) - yield key, value - - def values(self): - for key, value in iteritems(self): - yield value - - def lists(self): - rv = {} - for d in self.dicts: - for key, values in iterlists(d): - rv.setdefault(key, []).extend(values) - return iteritems(rv) - - def listvalues(self): - return (x[1] for x in self.lists()) - - def copy(self): - """Return a shallow copy of this object.""" - return self.__class__(self.dicts[:]) - - def to_dict(self, flat=True): - """Return the contents as regular dict. If `flat` is `True` the - returned dict will only have the first item present, if `flat` is - `False` all values will be returned as lists. - - :param flat: If set to `False` the dict returned will have lists - with all the values in it. Otherwise it will only - contain the first item for each key. - :return: a :class:`dict` - """ - rv = {} - for d in reversed(self.dicts): - rv.update(d.to_dict(flat)) - return rv - - def __len__(self): - return len(self._keys_impl()) - - def __contains__(self, key): - for d in self.dicts: - if key in d: - return True - return False - - has_key = __contains__ - - def __repr__(self): - return '%s(%r)' % (self.__class__.__name__, self.dicts) - - -class FileMultiDict(MultiDict): - - """A special :class:`MultiDict` that has convenience methods to add - files to it. This is used for :class:`EnvironBuilder` and generally - useful for unittesting. - - .. versionadded:: 0.5 - """ - - def add_file(self, name, file, filename=None, content_type=None): - """Adds a new file to the dict. `file` can be a file name or - a :class:`file`-like or a :class:`FileStorage` object. - - :param name: the name of the field. - :param file: a filename or :class:`file`-like object - :param filename: an optional filename - :param content_type: an optional content type - """ - if isinstance(file, FileStorage): - value = file - else: - if isinstance(file, string_types): - if filename is None: - filename = file - file = open(file, 'rb') - if filename and content_type is None: - content_type = mimetypes.guess_type(filename)[0] or \ - 'application/octet-stream' - value = FileStorage(file, filename, name, content_type) - - self.add(name, value) - - -class ImmutableDict(ImmutableDictMixin, dict): - - """An immutable :class:`dict`. - - .. versionadded:: 0.5 - """ - - def __repr__(self): - return '%s(%s)' % ( - self.__class__.__name__, - dict.__repr__(self), - ) - - def copy(self): - """Return a shallow mutable copy of this object. Keep in mind that - the standard library's :func:`copy` function is a no-op for this class - like for any other python immutable type (eg: :class:`tuple`). - """ - return dict(self) - - def __copy__(self): - return self - - -class ImmutableMultiDict(ImmutableMultiDictMixin, MultiDict): - - """An immutable :class:`MultiDict`. - - .. versionadded:: 0.5 - """ - - def copy(self): - """Return a shallow mutable copy of this object. Keep in mind that - the standard library's :func:`copy` function is a no-op for this class - like for any other python immutable type (eg: :class:`tuple`). - """ - return MultiDict(self) - - def __copy__(self): - return self - - -class ImmutableOrderedMultiDict(ImmutableMultiDictMixin, OrderedMultiDict): - - """An immutable :class:`OrderedMultiDict`. - - .. versionadded:: 0.6 - """ - - def _iter_hashitems(self): - return enumerate(iteritems(self, multi=True)) - - def copy(self): - """Return a shallow mutable copy of this object. Keep in mind that - the standard library's :func:`copy` function is a no-op for this class - like for any other python immutable type (eg: :class:`tuple`). - """ - return OrderedMultiDict(self) - - def __copy__(self): - return self - - -@native_itermethods(['values']) -class Accept(ImmutableList): - - """An :class:`Accept` object is just a list subclass for lists of - ``(value, quality)`` tuples. It is automatically sorted by specificity - and quality. - - All :class:`Accept` objects work similar to a list but provide extra - functionality for working with the data. Containment checks are - normalized to the rules of that header: - - >>> a = CharsetAccept([('ISO-8859-1', 1), ('utf-8', 0.7)]) - >>> a.best - 'ISO-8859-1' - >>> 'iso-8859-1' in a - True - >>> 'UTF8' in a - True - >>> 'utf7' in a - False - - To get the quality for an item you can use normal item lookup: - - >>> print a['utf-8'] - 0.7 - >>> a['utf7'] - 0 - - .. versionchanged:: 0.5 - :class:`Accept` objects are forced immutable now. - """ - - def __init__(self, values=()): - if values is None: - list.__init__(self) - self.provided = False - elif isinstance(values, Accept): - self.provided = values.provided - list.__init__(self, values) - else: - self.provided = True - values = sorted(values, key=lambda x: (self._specificity(x[0]), x[1], x[0]), - reverse=True) - list.__init__(self, values) - - def _specificity(self, value): - """Returns a tuple describing the value's specificity.""" - return value != '*', - - def _value_matches(self, value, item): - """Check if a value matches a given accept item.""" - return item == '*' or item.lower() == value.lower() - - def __getitem__(self, key): - """Besides index lookup (getting item n) you can also pass it a string - to get the quality for the item. If the item is not in the list, the - returned quality is ``0``. - """ - if isinstance(key, string_types): - return self.quality(key) - return list.__getitem__(self, key) - - def quality(self, key): - """Returns the quality of the key. - - .. versionadded:: 0.6 - In previous versions you had to use the item-lookup syntax - (eg: ``obj[key]`` instead of ``obj.quality(key)``) - """ - for item, quality in self: - if self._value_matches(key, item): - return quality - return 0 - - def __contains__(self, value): - for item, quality in self: - if self._value_matches(value, item): - return True - return False - - def __repr__(self): - return '%s([%s])' % ( - self.__class__.__name__, - ', '.join('(%r, %s)' % (x, y) for x, y in self) - ) - - def index(self, key): - """Get the position of an entry or raise :exc:`ValueError`. - - :param key: The key to be looked up. - - .. versionchanged:: 0.5 - This used to raise :exc:`IndexError`, which was inconsistent - with the list API. - """ - if isinstance(key, string_types): - for idx, (item, quality) in enumerate(self): - if self._value_matches(key, item): - return idx - raise ValueError(key) - return list.index(self, key) - - def find(self, key): - """Get the position of an entry or return -1. - - :param key: The key to be looked up. - """ - try: - return self.index(key) - except ValueError: - return -1 - - def values(self): - """Iterate over all values.""" - for item in self: - yield item[0] - - def to_header(self): - """Convert the header set into an HTTP header string.""" - result = [] - for value, quality in self: - if quality != 1: - value = '%s;q=%s' % (value, quality) - result.append(value) - return ','.join(result) - - def __str__(self): - return self.to_header() - - def _best_single_match(self, match): - for client_item, quality in self: - if self._value_matches(match, client_item): - # self is sorted by specificity descending, we can exit - return client_item, quality - - def best_match(self, matches, default=None): - """Returns the best match from a list of possible matches based - on the specificity and quality of the client. If two items have the - same quality and specificity, the one is returned that comes first. - - :param matches: a list of matches to check for - :param default: the value that is returned if none match - """ - result = default - best_quality = -1 - best_specificity = (-1,) - for server_item in matches: - match = self._best_single_match(server_item) - if not match: - continue - client_item, quality = match - specificity = self._specificity(client_item) - if quality <= 0 or quality < best_quality: - continue - # better quality or same quality but more specific => better match - if quality > best_quality or specificity > best_specificity: - result = server_item - best_quality = quality - best_specificity = specificity - return result - - @property - def best(self): - """The best match as value.""" - if self: - return self[0][0] - - -class MIMEAccept(Accept): - - """Like :class:`Accept` but with special methods and behavior for - mimetypes. - """ - - def _specificity(self, value): - return tuple(x != '*' for x in value.split('/', 1)) - - def _value_matches(self, value, item): - def _normalize(x): - x = x.lower() - return x == '*' and ('*', '*') or x.split('/', 1) - - # this is from the application which is trusted. to avoid developer - # frustration we actually check these for valid values - if '/' not in value: - raise ValueError('invalid mimetype %r' % value) - value_type, value_subtype = _normalize(value) - if value_type == '*' and value_subtype != '*': - raise ValueError('invalid mimetype %r' % value) - - if '/' not in item: - return False - item_type, item_subtype = _normalize(item) - if item_type == '*' and item_subtype != '*': - return False - return ( - (item_type == item_subtype == '*' or - value_type == value_subtype == '*') or - (item_type == value_type and (item_subtype == '*' or - value_subtype == '*' or - item_subtype == value_subtype)) - ) - - @property - def accept_html(self): - """True if this object accepts HTML.""" - return ( - 'text/html' in self or - 'application/xhtml+xml' in self or - self.accept_xhtml - ) - - @property - def accept_xhtml(self): - """True if this object accepts XHTML.""" - return ( - 'application/xhtml+xml' in self or - 'application/xml' in self - ) - - @property - def accept_json(self): - """True if this object accepts JSON.""" - return 'application/json' in self - - -class LanguageAccept(Accept): - - """Like :class:`Accept` but with normalization for languages.""" - - def _value_matches(self, value, item): - def _normalize(language): - return _locale_delim_re.split(language.lower()) - return item == '*' or _normalize(value) == _normalize(item) - - -class CharsetAccept(Accept): - - """Like :class:`Accept` but with normalization for charsets.""" - - def _value_matches(self, value, item): - def _normalize(name): - try: - return codecs.lookup(name).name - except LookupError: - return name.lower() - return item == '*' or _normalize(value) == _normalize(item) - - -def cache_property(key, empty, type): - """Return a new property object for a cache header. Useful if you - want to add support for a cache extension in a subclass.""" - return property(lambda x: x._get_cache_value(key, empty, type), - lambda x, v: x._set_cache_value(key, v, type), - lambda x: x._del_cache_value(key), - 'accessor for %r' % key) - - -class _CacheControl(UpdateDictMixin, dict): - - """Subclass of a dict that stores values for a Cache-Control header. It - has accessors for all the cache-control directives specified in RFC 2616. - The class does not differentiate between request and response directives. - - Because the cache-control directives in the HTTP header use dashes the - python descriptors use underscores for that. - - To get a header of the :class:`CacheControl` object again you can convert - the object into a string or call the :meth:`to_header` method. If you plan - to subclass it and add your own items have a look at the sourcecode for - that class. - - .. versionchanged:: 0.4 - - Setting `no_cache` or `private` to boolean `True` will set the implicit - none-value which is ``*``: - - >>> cc = ResponseCacheControl() - >>> cc.no_cache = True - >>> cc - - >>> cc.no_cache - '*' - >>> cc.no_cache = None - >>> cc - - - In versions before 0.5 the behavior documented here affected the now - no longer existing `CacheControl` class. - """ - - no_cache = cache_property('no-cache', '*', None) - no_store = cache_property('no-store', None, bool) - max_age = cache_property('max-age', -1, int) - no_transform = cache_property('no-transform', None, None) - - def __init__(self, values=(), on_update=None): - dict.__init__(self, values or ()) - self.on_update = on_update - self.provided = values is not None - - def _get_cache_value(self, key, empty, type): - """Used internally by the accessor properties.""" - if type is bool: - return key in self - if key in self: - value = self[key] - if value is None: - return empty - elif type is not None: - try: - value = type(value) - except ValueError: - pass - return value - - def _set_cache_value(self, key, value, type): - """Used internally by the accessor properties.""" - if type is bool: - if value: - self[key] = None - else: - self.pop(key, None) - else: - if value is None: - self.pop(key) - elif value is True: - self[key] = None - else: - self[key] = value - - def _del_cache_value(self, key): - """Used internally by the accessor properties.""" - if key in self: - del self[key] - - def to_header(self): - """Convert the stored values into a cache control header.""" - return dump_header(self) - - def __str__(self): - return self.to_header() - - def __repr__(self): - return '<%s %s>' % ( - self.__class__.__name__, - " ".join( - "%s=%r" % (k, v) for k, v in sorted(self.items()) - ), - ) - - -class RequestCacheControl(ImmutableDictMixin, _CacheControl): - - """A cache control for requests. This is immutable and gives access - to all the request-relevant cache control headers. - - To get a header of the :class:`RequestCacheControl` object again you can - convert the object into a string or call the :meth:`to_header` method. If - you plan to subclass it and add your own items have a look at the sourcecode - for that class. - - .. versionadded:: 0.5 - In previous versions a `CacheControl` class existed that was used - both for request and response. - """ - - max_stale = cache_property('max-stale', '*', int) - min_fresh = cache_property('min-fresh', '*', int) - no_transform = cache_property('no-transform', None, None) - only_if_cached = cache_property('only-if-cached', None, bool) - - -class ResponseCacheControl(_CacheControl): - - """A cache control for responses. Unlike :class:`RequestCacheControl` - this is mutable and gives access to response-relevant cache control - headers. - - To get a header of the :class:`ResponseCacheControl` object again you can - convert the object into a string or call the :meth:`to_header` method. If - you plan to subclass it and add your own items have a look at the sourcecode - for that class. - - .. versionadded:: 0.5 - In previous versions a `CacheControl` class existed that was used - both for request and response. - """ - - public = cache_property('public', None, bool) - private = cache_property('private', '*', None) - must_revalidate = cache_property('must-revalidate', None, bool) - proxy_revalidate = cache_property('proxy-revalidate', None, bool) - s_maxage = cache_property('s-maxage', None, None) - - -# attach cache_property to the _CacheControl as staticmethod -# so that others can reuse it. -_CacheControl.cache_property = staticmethod(cache_property) - - -class CallbackDict(UpdateDictMixin, dict): - - """A dict that calls a function passed every time something is changed. - The function is passed the dict instance. - """ - - def __init__(self, initial=None, on_update=None): - dict.__init__(self, initial or ()) - self.on_update = on_update - - def __repr__(self): - return '<%s %s>' % ( - self.__class__.__name__, - dict.__repr__(self) - ) - - -class HeaderSet(MutableSet): - - """Similar to the :class:`ETags` class this implements a set-like structure. - Unlike :class:`ETags` this is case insensitive and used for vary, allow, and - content-language headers. - - If not constructed using the :func:`parse_set_header` function the - instantiation works like this: - - >>> hs = HeaderSet(['foo', 'bar', 'baz']) - >>> hs - HeaderSet(['foo', 'bar', 'baz']) - """ - - def __init__(self, headers=None, on_update=None): - self._headers = list(headers or ()) - self._set = set([x.lower() for x in self._headers]) - self.on_update = on_update - - def add(self, header): - """Add a new header to the set.""" - self.update((header,)) - - def remove(self, header): - """Remove a header from the set. This raises an :exc:`KeyError` if the - header is not in the set. - - .. versionchanged:: 0.5 - In older versions a :exc:`IndexError` was raised instead of a - :exc:`KeyError` if the object was missing. - - :param header: the header to be removed. - """ - key = header.lower() - if key not in self._set: - raise KeyError(header) - self._set.remove(key) - for idx, key in enumerate(self._headers): - if key.lower() == header: - del self._headers[idx] - break - if self.on_update is not None: - self.on_update(self) - - def update(self, iterable): - """Add all the headers from the iterable to the set. - - :param iterable: updates the set with the items from the iterable. - """ - inserted_any = False - for header in iterable: - key = header.lower() - if key not in self._set: - self._headers.append(header) - self._set.add(key) - inserted_any = True - if inserted_any and self.on_update is not None: - self.on_update(self) - - def discard(self, header): - """Like :meth:`remove` but ignores errors. - - :param header: the header to be discarded. - """ - try: - return self.remove(header) - except KeyError: - pass - - def find(self, header): - """Return the index of the header in the set or return -1 if not found. - - :param header: the header to be looked up. - """ - header = header.lower() - for idx, item in enumerate(self._headers): - if item.lower() == header: - return idx - return -1 - - def index(self, header): - """Return the index of the header in the set or raise an - :exc:`IndexError`. - - :param header: the header to be looked up. - """ - rv = self.find(header) - if rv < 0: - raise IndexError(header) - return rv - - def clear(self): - """Clear the set.""" - self._set.clear() - del self._headers[:] - if self.on_update is not None: - self.on_update(self) - - def as_set(self, preserve_casing=False): - """Return the set as real python set type. When calling this, all - the items are converted to lowercase and the ordering is lost. - - :param preserve_casing: if set to `True` the items in the set returned - will have the original case like in the - :class:`HeaderSet`, otherwise they will - be lowercase. - """ - if preserve_casing: - return set(self._headers) - return set(self._set) - - def to_header(self): - """Convert the header set into an HTTP header string.""" - return ', '.join(map(quote_header_value, self._headers)) - - def __getitem__(self, idx): - return self._headers[idx] - - def __delitem__(self, idx): - rv = self._headers.pop(idx) - self._set.remove(rv.lower()) - if self.on_update is not None: - self.on_update(self) - - def __setitem__(self, idx, value): - old = self._headers[idx] - self._set.remove(old.lower()) - self._headers[idx] = value - self._set.add(value.lower()) - if self.on_update is not None: - self.on_update(self) - - def __contains__(self, header): - return header.lower() in self._set - - def __len__(self): - return len(self._set) - - def __iter__(self): - return iter(self._headers) - - def __nonzero__(self): - return bool(self._set) - - def __str__(self): - return self.to_header() - - def __repr__(self): - return '%s(%r)' % ( - self.__class__.__name__, - self._headers - ) - - -class ETags(Container, Iterable): - - """A set that can be used to check if one etag is present in a collection - of etags. - """ - - def __init__(self, strong_etags=None, weak_etags=None, star_tag=False): - self._strong = frozenset(not star_tag and strong_etags or ()) - self._weak = frozenset(weak_etags or ()) - self.star_tag = star_tag - - def as_set(self, include_weak=False): - """Convert the `ETags` object into a python set. Per default all the - weak etags are not part of this set.""" - rv = set(self._strong) - if include_weak: - rv.update(self._weak) - return rv - - def is_weak(self, etag): - """Check if an etag is weak.""" - return etag in self._weak - - def is_strong(self, etag): - """Check if an etag is strong.""" - return etag in self._strong - - def contains_weak(self, etag): - """Check if an etag is part of the set including weak and strong tags.""" - return self.is_weak(etag) or self.contains(etag) - - def contains(self, etag): - """Check if an etag is part of the set ignoring weak tags. - It is also possible to use the ``in`` operator. - """ - if self.star_tag: - return True - return self.is_strong(etag) - - def contains_raw(self, etag): - """When passed a quoted tag it will check if this tag is part of the - set. If the tag is weak it is checked against weak and strong tags, - otherwise strong only.""" - etag, weak = unquote_etag(etag) - if weak: - return self.contains_weak(etag) - return self.contains(etag) - - def to_header(self): - """Convert the etags set into a HTTP header string.""" - if self.star_tag: - return '*' - return ', '.join( - ['"%s"' % x for x in self._strong] + - ['W/"%s"' % x for x in self._weak] - ) - - def __call__(self, etag=None, data=None, include_weak=False): - if [etag, data].count(None) != 1: - raise TypeError('either tag or data required, but at least one') - if etag is None: - etag = generate_etag(data) - if include_weak: - if etag in self._weak: - return True - return etag in self._strong - - def __bool__(self): - return bool(self.star_tag or self._strong or self._weak) - - __nonzero__ = __bool__ - - def __str__(self): - return self.to_header() - - def __iter__(self): - return iter(self._strong) - - def __contains__(self, etag): - return self.contains(etag) - - def __repr__(self): - return '<%s %r>' % (self.__class__.__name__, str(self)) - - -class IfRange(object): - - """Very simple object that represents the `If-Range` header in parsed - form. It will either have neither a etag or date or one of either but - never both. - - .. versionadded:: 0.7 - """ - - def __init__(self, etag=None, date=None): - #: The etag parsed and unquoted. Ranges always operate on strong - #: etags so the weakness information is not necessary. - self.etag = etag - #: The date in parsed format or `None`. - self.date = date - - def to_header(self): - """Converts the object back into an HTTP header.""" - if self.date is not None: - return http_date(self.date) - if self.etag is not None: - return quote_etag(self.etag) - return '' - - def __str__(self): - return self.to_header() - - def __repr__(self): - return '<%s %r>' % (self.__class__.__name__, str(self)) - - -class Range(object): - - """Represents a range header. All the methods are only supporting bytes - as unit. It does store multiple ranges but :meth:`range_for_length` will - only work if only one range is provided. - - .. versionadded:: 0.7 - """ - - def __init__(self, units, ranges): - #: The units of this range. Usually "bytes". - self.units = units - #: A list of ``(begin, end)`` tuples for the range header provided. - #: The ranges are non-inclusive. - self.ranges = ranges - - def range_for_length(self, length): - """If the range is for bytes, the length is not None and there is - exactly one range and it is satisfiable it returns a ``(start, stop)`` - tuple, otherwise `None`. - """ - if self.units != 'bytes' or length is None or len(self.ranges) != 1: - return None - start, end = self.ranges[0] - if end is None: - end = length - if start < 0: - start += length - if is_byte_range_valid(start, end, length): - return start, min(end, length) - - def make_content_range(self, length): - """Creates a :class:`~werkzeug.datastructures.ContentRange` object - from the current range and given content length. - """ - rng = self.range_for_length(length) - if rng is not None: - return ContentRange(self.units, rng[0], rng[1], length) - - def to_header(self): - """Converts the object back into an HTTP header.""" - ranges = [] - for begin, end in self.ranges: - if end is None: - ranges.append(begin >= 0 and '%s-' % begin or str(begin)) - else: - ranges.append('%s-%s' % (begin, end - 1)) - return '%s=%s' % (self.units, ','.join(ranges)) - - def to_content_range_header(self, length): - """Converts the object into `Content-Range` HTTP header, - based on given length - """ - range_for_length = self.range_for_length(length) - if range_for_length is not None: - return '%s %d-%d/%d' % (self.units, - range_for_length[0], - range_for_length[1] - 1, length) - return None - - def __str__(self): - return self.to_header() - - def __repr__(self): - return '<%s %r>' % (self.__class__.__name__, str(self)) - - -class ContentRange(object): - - """Represents the content range header. - - .. versionadded:: 0.7 - """ - - def __init__(self, units, start, stop, length=None, on_update=None): - assert is_byte_range_valid(start, stop, length), \ - 'Bad range provided' - self.on_update = on_update - self.set(start, stop, length, units) - - def _callback_property(name): - def fget(self): - return getattr(self, name) - - def fset(self, value): - setattr(self, name, value) - if self.on_update is not None: - self.on_update(self) - return property(fget, fset) - - #: The units to use, usually "bytes" - units = _callback_property('_units') - #: The start point of the range or `None`. - start = _callback_property('_start') - #: The stop point of the range (non-inclusive) or `None`. Can only be - #: `None` if also start is `None`. - stop = _callback_property('_stop') - #: The length of the range or `None`. - length = _callback_property('_length') - - def set(self, start, stop, length=None, units='bytes'): - """Simple method to update the ranges.""" - assert is_byte_range_valid(start, stop, length), \ - 'Bad range provided' - self._units = units - self._start = start - self._stop = stop - self._length = length - if self.on_update is not None: - self.on_update(self) - - def unset(self): - """Sets the units to `None` which indicates that the header should - no longer be used. - """ - self.set(None, None, units=None) - - def to_header(self): - if self.units is None: - return '' - if self.length is None: - length = '*' - else: - length = self.length - if self.start is None: - return '%s */%s' % (self.units, length) - return '%s %s-%s/%s' % ( - self.units, - self.start, - self.stop - 1, - length - ) - - def __nonzero__(self): - return self.units is not None - - __bool__ = __nonzero__ - - def __str__(self): - return self.to_header() - - def __repr__(self): - return '<%s %r>' % (self.__class__.__name__, str(self)) - - -class Authorization(ImmutableDictMixin, dict): - - """Represents an `Authorization` header sent by the client. You should - not create this kind of object yourself but use it when it's returned by - the `parse_authorization_header` function. - - This object is a dict subclass and can be altered by setting dict items - but it should be considered immutable as it's returned by the client and - not meant for modifications. - - .. versionchanged:: 0.5 - This object became immutable. - """ - - def __init__(self, auth_type, data=None): - dict.__init__(self, data or {}) - self.type = auth_type - - username = property(lambda x: x.get('username'), doc=''' - The username transmitted. This is set for both basic and digest - auth all the time.''') - password = property(lambda x: x.get('password'), doc=''' - When the authentication type is basic this is the password - transmitted by the client, else `None`.''') - realm = property(lambda x: x.get('realm'), doc=''' - This is the server realm sent back for HTTP digest auth.''') - nonce = property(lambda x: x.get('nonce'), doc=''' - The nonce the server sent for digest auth, sent back by the client. - A nonce should be unique for every 401 response for HTTP digest - auth.''') - uri = property(lambda x: x.get('uri'), doc=''' - The URI from Request-URI of the Request-Line; duplicated because - proxies are allowed to change the Request-Line in transit. HTTP - digest auth only.''') - nc = property(lambda x: x.get('nc'), doc=''' - The nonce count value transmitted by clients if a qop-header is - also transmitted. HTTP digest auth only.''') - cnonce = property(lambda x: x.get('cnonce'), doc=''' - If the server sent a qop-header in the ``WWW-Authenticate`` - header, the client has to provide this value for HTTP digest auth. - See the RFC for more details.''') - response = property(lambda x: x.get('response'), doc=''' - A string of 32 hex digits computed as defined in RFC 2617, which - proves that the user knows a password. Digest auth only.''') - opaque = property(lambda x: x.get('opaque'), doc=''' - The opaque header from the server returned unchanged by the client. - It is recommended that this string be base64 or hexadecimal data. - Digest auth only.''') - qop = property(lambda x: x.get('qop'), doc=''' - Indicates what "quality of protection" the client has applied to - the message for HTTP digest auth. Note that this is a single token, - not a quoted list of alternatives as in WWW-Authenticate.''') - - -class WWWAuthenticate(UpdateDictMixin, dict): - - """Provides simple access to `WWW-Authenticate` headers.""" - - #: list of keys that require quoting in the generated header - _require_quoting = frozenset(['domain', 'nonce', 'opaque', 'realm', 'qop']) - - def __init__(self, auth_type=None, values=None, on_update=None): - dict.__init__(self, values or ()) - if auth_type: - self['__auth_type__'] = auth_type - self.on_update = on_update - - def set_basic(self, realm='authentication required'): - """Clear the auth info and enable basic auth.""" - dict.clear(self) - dict.update(self, {'__auth_type__': 'basic', 'realm': realm}) - if self.on_update: - self.on_update(self) - - def set_digest(self, realm, nonce, qop=('auth',), opaque=None, - algorithm=None, stale=False): - """Clear the auth info and enable digest auth.""" - d = { - '__auth_type__': 'digest', - 'realm': realm, - 'nonce': nonce, - 'qop': dump_header(qop) - } - if stale: - d['stale'] = 'TRUE' - if opaque is not None: - d['opaque'] = opaque - if algorithm is not None: - d['algorithm'] = algorithm - dict.clear(self) - dict.update(self, d) - if self.on_update: - self.on_update(self) - - def to_header(self): - """Convert the stored values into a WWW-Authenticate header.""" - d = dict(self) - auth_type = d.pop('__auth_type__', None) or 'basic' - return '%s %s' % (auth_type.title(), ', '.join([ - '%s=%s' % (key, quote_header_value(value, - allow_token=key not in self._require_quoting)) - for key, value in iteritems(d) - ])) - - def __str__(self): - return self.to_header() - - def __repr__(self): - return '<%s %r>' % ( - self.__class__.__name__, - self.to_header() - ) - - def auth_property(name, doc=None): - """A static helper function for subclasses to add extra authentication - system properties onto a class:: - - class FooAuthenticate(WWWAuthenticate): - special_realm = auth_property('special_realm') - - For more information have a look at the sourcecode to see how the - regular properties (:attr:`realm` etc.) are implemented. - """ - - def _set_value(self, value): - if value is None: - self.pop(name, None) - else: - self[name] = str(value) - return property(lambda x: x.get(name), _set_value, doc=doc) - - def _set_property(name, doc=None): - def fget(self): - def on_update(header_set): - if not header_set and name in self: - del self[name] - elif header_set: - self[name] = header_set.to_header() - return parse_set_header(self.get(name), on_update) - return property(fget, doc=doc) - - type = auth_property('__auth_type__', doc=''' - The type of the auth mechanism. HTTP currently specifies - `Basic` and `Digest`.''') - realm = auth_property('realm', doc=''' - A string to be displayed to users so they know which username and - password to use. This string should contain at least the name of - the host performing the authentication and might additionally - indicate the collection of users who might have access.''') - domain = _set_property('domain', doc=''' - A list of URIs that define the protection space. If a URI is an - absolute path, it is relative to the canonical root URL of the - server being accessed.''') - nonce = auth_property('nonce', doc=''' - A server-specified data string which should be uniquely generated - each time a 401 response is made. It is recommended that this - string be base64 or hexadecimal data.''') - opaque = auth_property('opaque', doc=''' - A string of data, specified by the server, which should be returned - by the client unchanged in the Authorization header of subsequent - requests with URIs in the same protection space. It is recommended - that this string be base64 or hexadecimal data.''') - algorithm = auth_property('algorithm', doc=''' - A string indicating a pair of algorithms used to produce the digest - and a checksum. If this is not present it is assumed to be "MD5". - If the algorithm is not understood, the challenge should be ignored - (and a different one used, if there is more than one).''') - qop = _set_property('qop', doc=''' - A set of quality-of-privacy directives such as auth and auth-int.''') - - def _get_stale(self): - val = self.get('stale') - if val is not None: - return val.lower() == 'true' - - def _set_stale(self, value): - if value is None: - self.pop('stale', None) - else: - self['stale'] = value and 'TRUE' or 'FALSE' - stale = property(_get_stale, _set_stale, doc=''' - A flag, indicating that the previous request from the client was - rejected because the nonce value was stale.''') - del _get_stale, _set_stale - - # make auth_property a staticmethod so that subclasses of - # `WWWAuthenticate` can use it for new properties. - auth_property = staticmethod(auth_property) - del _set_property - - -class FileStorage(object): - - """The :class:`FileStorage` class is a thin wrapper over incoming files. - It is used by the request object to represent uploaded files. All the - attributes of the wrapper stream are proxied by the file storage so - it's possible to do ``storage.read()`` instead of the long form - ``storage.stream.read()``. - """ - - def __init__(self, stream=None, filename=None, name=None, - content_type=None, content_length=None, - headers=None): - self.name = name - self.stream = stream or _empty_stream - - # if no filename is provided we can attempt to get the filename - # from the stream object passed. There we have to be careful to - # skip things like , etc. Python marks these - # special filenames with angular brackets. - if filename is None: - filename = getattr(stream, 'name', None) - s = make_literal_wrapper(filename) - if filename and filename[0] == s('<') and filename[-1] == s('>'): - filename = None - - # On Python 3 we want to make sure the filename is always unicode. - # This might not be if the name attribute is bytes due to the - # file being opened from the bytes API. - if not PY2 and isinstance(filename, bytes): - filename = filename.decode(get_filesystem_encoding(), - 'replace') - - self.filename = filename - if headers is None: - headers = Headers() - self.headers = headers - if content_type is not None: - headers['Content-Type'] = content_type - if content_length is not None: - headers['Content-Length'] = str(content_length) - - def _parse_content_type(self): - if not hasattr(self, '_parsed_content_type'): - self._parsed_content_type = \ - parse_options_header(self.content_type) - - @property - def content_type(self): - """The content-type sent in the header. Usually not available""" - return self.headers.get('content-type') - - @property - def content_length(self): - """The content-length sent in the header. Usually not available""" - return int(self.headers.get('content-length') or 0) - - @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'``. - - .. versionadded:: 0.7 - """ - 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'}``. - - .. versionadded:: 0.7 - """ - self._parse_content_type() - return self._parsed_content_type[1] - - def save(self, dst, buffer_size=16384): - """Save the file to a destination path or file object. If the - destination is a file object you have to close it yourself after the - call. The buffer size is the number of bytes held in memory during - the copy process. It defaults to 16KB. - - For secure file saving also have a look at :func:`secure_filename`. - - :param dst: a filename or open file object the uploaded file - is saved to. - :param buffer_size: the size of the buffer. This works the same as - the `length` parameter of - :func:`shutil.copyfileobj`. - """ - from shutil import copyfileobj - close_dst = False - if isinstance(dst, string_types): - dst = open(dst, 'wb') - close_dst = True - try: - copyfileobj(self.stream, dst, buffer_size) - finally: - if close_dst: - dst.close() - - def close(self): - """Close the underlying file if possible.""" - try: - self.stream.close() - except Exception: - pass - - def __nonzero__(self): - return bool(self.filename) - __bool__ = __nonzero__ - - def __getattr__(self, name): - return getattr(self.stream, name) - - def __iter__(self): - return iter(self.stream) - - def __repr__(self): - return '<%s: %r (%r)>' % ( - self.__class__.__name__, - self.filename, - self.content_type - ) - - -# circular dependencies -from werkzeug.http import dump_options_header, dump_header, generate_etag, \ - quote_header_value, parse_set_header, unquote_etag, quote_etag, \ - parse_options_header, http_date, is_byte_range_valid -from werkzeug import exceptions diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/__init__.py b/flask/venv/lib/python3.6/site-packages/werkzeug/debug/__init__.py deleted file mode 100644 index 14fe193..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/__init__.py +++ /dev/null @@ -1,470 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.debug - ~~~~~~~~~~~~~~ - - WSGI application traceback debugger. - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import os -import re -import sys -import uuid -import json -import time -import getpass -import hashlib -import mimetypes -from itertools import chain -from os.path import join, dirname, basename, isfile -from werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response -from werkzeug.http import parse_cookie -from werkzeug.debug.tbtools import get_current_traceback, render_console_html -from werkzeug.debug.console import Console -from werkzeug.security import gen_salt -from werkzeug._internal import _log -from werkzeug._compat import text_type - - -# DEPRECATED -#: import this here because it once was documented as being available -#: from this module. In case there are users left ... -from werkzeug.debug.repr import debug_repr # noqa - - -# A week -PIN_TIME = 60 * 60 * 24 * 7 - - -def hash_pin(pin): - if isinstance(pin, text_type): - pin = pin.encode('utf-8', 'replace') - return hashlib.md5(pin + b'shittysalt').hexdigest()[:12] - - -_machine_id = None - - -def get_machine_id(): - global _machine_id - rv = _machine_id - if rv is not None: - return rv - - def _generate(): - # Potential sources of secret information on linux. The machine-id - # is stable across boots, the boot id is not - for filename in '/etc/machine-id', '/proc/sys/kernel/random/boot_id': - try: - with open(filename, 'rb') as f: - return f.readline().strip() - except IOError: - continue - - # On OS X we can use the computer's serial number assuming that - # ioreg exists and can spit out that information. - try: - # Also catch import errors: subprocess may not be available, e.g. - # Google App Engine - # See https://github.com/pallets/werkzeug/issues/925 - from subprocess import Popen, PIPE - dump = Popen(['ioreg', '-c', 'IOPlatformExpertDevice', '-d', '2'], - stdout=PIPE).communicate()[0] - match = re.search(b'"serial-number" = <([^>]+)', dump) - if match is not None: - return match.group(1) - except (OSError, ImportError): - pass - - # On Windows we can use winreg to get the machine guid - wr = None - try: - import winreg as wr - except ImportError: - try: - import _winreg as wr - except ImportError: - pass - if wr is not None: - try: - with wr.OpenKey(wr.HKEY_LOCAL_MACHINE, - 'SOFTWARE\\Microsoft\\Cryptography', 0, - wr.KEY_READ | wr.KEY_WOW64_64KEY) as rk: - machineGuid, wrType = wr.QueryValueEx(rk, 'MachineGuid') - if (wrType == wr.REG_SZ): - return machineGuid.encode('utf-8') - else: - return machineGuid - except WindowsError: - pass - - _machine_id = rv = _generate() - return rv - - -class _ConsoleFrame(object): - - """Helper class so that we can reuse the frame console code for the - standalone console. - """ - - def __init__(self, namespace): - self.console = Console(namespace) - self.id = 0 - - -def get_pin_and_cookie_name(app): - """Given an application object this returns a semi-stable 9 digit pin - code and a random key. The hope is that this is stable between - restarts to not make debugging particularly frustrating. If the pin - was forcefully disabled this returns `None`. - - Second item in the resulting tuple is the cookie name for remembering. - """ - pin = os.environ.get('WERKZEUG_DEBUG_PIN') - rv = None - num = None - - # Pin was explicitly disabled - if pin == 'off': - return None, None - - # Pin was provided explicitly - if pin is not None and pin.replace('-', '').isdigit(): - # If there are separators in the pin, return it directly - if '-' in pin: - rv = pin - else: - num = pin - - modname = getattr(app, '__module__', - getattr(app.__class__, '__module__')) - - try: - # `getpass.getuser()` imports the `pwd` module, - # which does not exist in the Google App Engine sandbox. - username = getpass.getuser() - except ImportError: - username = None - - mod = sys.modules.get(modname) - - # This information only exists to make the cookie unique on the - # computer, not as a security feature. - probably_public_bits = [ - username, - modname, - getattr(app, '__name__', getattr(app.__class__, '__name__')), - getattr(mod, '__file__', None), - ] - - # This information is here to make it harder for an attacker to - # guess the cookie name. They are unlikely to be contained anywhere - # within the unauthenticated debug page. - private_bits = [ - str(uuid.getnode()), - get_machine_id(), - ] - - h = hashlib.md5() - for bit in chain(probably_public_bits, private_bits): - if not bit: - continue - if isinstance(bit, text_type): - bit = bit.encode('utf-8') - h.update(bit) - h.update(b'cookiesalt') - - cookie_name = '__wzd' + h.hexdigest()[:20] - - # If we need to generate a pin we salt it a bit more so that we don't - # end up with the same value and generate out 9 digits - if num is None: - h.update(b'pinsalt') - num = ('%09d' % int(h.hexdigest(), 16))[:9] - - # Format the pincode in groups of digits for easier remembering if - # we don't have a result yet. - if rv is None: - for group_size in 5, 4, 3: - if len(num) % group_size == 0: - rv = '-'.join(num[x:x + group_size].rjust(group_size, '0') - for x in range(0, len(num), group_size)) - break - else: - rv = num - - return rv, cookie_name - - -class DebuggedApplication(object): - """Enables debugging support for a given application:: - - from werkzeug.debug import DebuggedApplication - from myapp import app - app = DebuggedApplication(app, evalex=True) - - The `evalex` keyword argument allows evaluating expressions in a - traceback's frame context. - - .. versionadded:: 0.9 - The `lodgeit_url` parameter was deprecated. - - :param app: the WSGI application to run debugged. - :param evalex: enable exception evaluation feature (interactive - debugging). This requires a non-forking server. - :param request_key: The key that points to the request object in ths - environment. This parameter is ignored in current - versions. - :param console_path: the URL for a general purpose console. - :param console_init_func: the function that is executed before starting - the general purpose console. The return value - is used as initial namespace. - :param show_hidden_frames: by default hidden traceback frames are skipped. - You can show them by setting this parameter - to `True`. - :param pin_security: can be used to disable the pin based security system. - :param pin_logging: enables the logging of the pin system. - """ - - def __init__(self, app, evalex=False, request_key='werkzeug.request', - console_path='/console', console_init_func=None, - show_hidden_frames=False, lodgeit_url=None, - pin_security=True, pin_logging=True): - if lodgeit_url is not None: - from warnings import warn - warn(DeprecationWarning('Werkzeug now pastes into gists.')) - if not console_init_func: - console_init_func = None - self.app = app - self.evalex = evalex - self.frames = {} - self.tracebacks = {} - self.request_key = request_key - self.console_path = console_path - self.console_init_func = console_init_func - self.show_hidden_frames = show_hidden_frames - self.secret = gen_salt(20) - self._failed_pin_auth = 0 - - self.pin_logging = pin_logging - if pin_security: - # Print out the pin for the debugger on standard out. - if os.environ.get('WERKZEUG_RUN_MAIN') == 'true' and \ - pin_logging: - _log('warning', ' * Debugger is active!') - if self.pin is None: - _log('warning', ' * Debugger PIN disabled. ' - 'DEBUGGER UNSECURED!') - else: - _log('info', ' * Debugger PIN: %s' % self.pin) - else: - self.pin = None - - def _get_pin(self): - if not hasattr(self, '_pin'): - self._pin, self._pin_cookie = get_pin_and_cookie_name(self.app) - return self._pin - - def _set_pin(self, value): - self._pin = value - - pin = property(_get_pin, _set_pin) - del _get_pin, _set_pin - - @property - def pin_cookie_name(self): - """The name of the pin cookie.""" - if not hasattr(self, '_pin_cookie'): - self._pin, self._pin_cookie = get_pin_and_cookie_name(self.app) - return self._pin_cookie - - def debug_application(self, environ, start_response): - """Run the application and conserve the traceback frames.""" - app_iter = None - try: - app_iter = self.app(environ, start_response) - for item in app_iter: - yield item - if hasattr(app_iter, 'close'): - app_iter.close() - except Exception: - if hasattr(app_iter, 'close'): - app_iter.close() - traceback = get_current_traceback( - skip=1, show_hidden_frames=self.show_hidden_frames, - ignore_system_exceptions=True) - for frame in traceback.frames: - self.frames[frame.id] = frame - self.tracebacks[traceback.id] = traceback - - try: - start_response('500 INTERNAL SERVER ERROR', [ - ('Content-Type', 'text/html; charset=utf-8'), - # Disable Chrome's XSS protection, the debug - # output can cause false-positives. - ('X-XSS-Protection', '0'), - ]) - except Exception: - # if we end up here there has been output but an error - # occurred. in that situation we can do nothing fancy any - # more, better log something into the error log and fall - # back gracefully. - environ['wsgi.errors'].write( - 'Debugging middleware caught exception in streamed ' - 'response at a point where response headers were already ' - 'sent.\n') - else: - is_trusted = bool(self.check_pin_trust(environ)) - yield traceback.render_full(evalex=self.evalex, - evalex_trusted=is_trusted, - secret=self.secret) \ - .encode('utf-8', 'replace') - - traceback.log(environ['wsgi.errors']) - - def execute_command(self, request, command, frame): - """Execute a command in a console.""" - return Response(frame.console.eval(command), mimetype='text/html') - - def display_console(self, request): - """Display a standalone shell.""" - if 0 not in self.frames: - if self.console_init_func is None: - ns = {} - else: - ns = dict(self.console_init_func()) - ns.setdefault('app', self.app) - self.frames[0] = _ConsoleFrame(ns) - is_trusted = bool(self.check_pin_trust(request.environ)) - return Response(render_console_html(secret=self.secret, - evalex_trusted=is_trusted), - mimetype='text/html') - - def paste_traceback(self, request, traceback): - """Paste the traceback and return a JSON response.""" - rv = traceback.paste() - return Response(json.dumps(rv), mimetype='application/json') - - def get_resource(self, request, filename): - """Return a static resource from the shared folder.""" - filename = join(dirname(__file__), 'shared', basename(filename)) - if isfile(filename): - mimetype = mimetypes.guess_type(filename)[0] \ - or 'application/octet-stream' - f = open(filename, 'rb') - try: - return Response(f.read(), mimetype=mimetype) - finally: - f.close() - return Response('Not Found', status=404) - - def check_pin_trust(self, environ): - """Checks if the request passed the pin test. This returns `True` if the - request is trusted on a pin/cookie basis and returns `False` if not. - Additionally if the cookie's stored pin hash is wrong it will return - `None` so that appropriate action can be taken. - """ - if self.pin is None: - return True - val = parse_cookie(environ).get(self.pin_cookie_name) - if not val or '|' not in val: - return False - ts, pin_hash = val.split('|', 1) - if not ts.isdigit(): - return False - if pin_hash != hash_pin(self.pin): - return None - return (time.time() - PIN_TIME) < int(ts) - - def _fail_pin_auth(self): - time.sleep(self._failed_pin_auth > 5 and 5.0 or 0.5) - self._failed_pin_auth += 1 - - def pin_auth(self, request): - """Authenticates with the pin.""" - exhausted = False - auth = False - trust = self.check_pin_trust(request.environ) - - # If the trust return value is `None` it means that the cookie is - # set but the stored pin hash value is bad. This means that the - # pin was changed. In this case we count a bad auth and unset the - # cookie. This way it becomes harder to guess the cookie name - # instead of the pin as we still count up failures. - bad_cookie = False - if trust is None: - self._fail_pin_auth() - bad_cookie = True - - # If we're trusted, we're authenticated. - elif trust: - auth = True - - # If we failed too many times, then we're locked out. - elif self._failed_pin_auth > 10: - exhausted = True - - # Otherwise go through pin based authentication - else: - entered_pin = request.args.get('pin') - if entered_pin.strip().replace('-', '') == \ - self.pin.replace('-', ''): - self._failed_pin_auth = 0 - auth = True - else: - self._fail_pin_auth() - - rv = Response(json.dumps({ - 'auth': auth, - 'exhausted': exhausted, - }), mimetype='application/json') - if auth: - rv.set_cookie(self.pin_cookie_name, '%s|%s' % ( - int(time.time()), - hash_pin(self.pin) - ), httponly=True) - elif bad_cookie: - rv.delete_cookie(self.pin_cookie_name) - return rv - - def log_pin_request(self): - """Log the pin if needed.""" - if self.pin_logging and self.pin is not None: - _log('info', ' * To enable the debugger you need to ' - 'enter the security pin:') - _log('info', ' * Debugger pin code: %s' % self.pin) - return Response('') - - def __call__(self, environ, start_response): - """Dispatch the requests.""" - # important: don't ever access a function here that reads the incoming - # form data! Otherwise the application won't have access to that data - # any more! - request = Request(environ) - response = self.debug_application - if request.args.get('__debugger__') == 'yes': - cmd = request.args.get('cmd') - arg = request.args.get('f') - secret = request.args.get('s') - traceback = self.tracebacks.get(request.args.get('tb', type=int)) - frame = self.frames.get(request.args.get('frm', type=int)) - if cmd == 'resource' and arg: - response = self.get_resource(request, arg) - elif cmd == 'paste' and traceback is not None and \ - secret == self.secret: - response = self.paste_traceback(request, traceback) - elif cmd == 'pinauth' and secret == self.secret: - response = self.pin_auth(request) - elif cmd == 'printpin' and secret == self.secret: - response = self.log_pin_request() - elif self.evalex and cmd is not None and frame is not None \ - and self.secret == secret and \ - self.check_pin_trust(environ): - response = self.execute_command(request, cmd, frame) - elif self.evalex and self.console_path is not None and \ - request.path == self.console_path: - response = self.display_console(request) - return response(environ, start_response) diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/__pycache__/__init__.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/debug/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index 872c27ba76041c41ac72ab72c909421f2859f72a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12713 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 diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/__pycache__/console.cpython-36.pyc b/flask/venv/lib/python3.6/site-packages/werkzeug/debug/__pycache__/console.cpython-36.pyc deleted file mode 100644 index 8a327c1855ee2ce794ceb645753672719405b941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7327 zcmbtZ%aa>N9iEp)qgk!I-d*q7j!Be+JVatSaUcX^TY@zd|%IK^ssEGLR;O_GyUuC-}}+~ z%Id0n-`V}-UuQJ!pW4jN!gvQQ{0lmv)ij|Cqodb!^)zY*o@U4FS~W}OoYl#7?V7E| zxlX?8)EqUoJB6-WbGs|Gm2R8U`;k_VSyu0ds&DYzf zYwP}6`?Rlnr!l)CikK~`*$uHOO82zdCcd8%YxutA8|^dLXA56Wi*6&sl==TE|RTGFS z&7eP&t%JkpO8NO_rF{9Nm%mwV49n4>U;Z#Xw0zsIcV8@rzF)rnquX!4|G};Dejv-; zK>B6jNA*@Gtg7R#bXrZn7y4Jquitv3>fQ(cwY`cSJG+7KZx8!E#uQv{88qvi ziW$3#C{Ox*8Czn|?Z@_^-|73Z$qgny6N4SJuz}9kAWn^}fB?7(Xq|7fQtgpEV!)q&ILu>-FD9(s2JXggwSbr{FdHeQzH*ZC<)jN29 zbn$vQ9hUF-GHeAs@TeY@2~$pJ3d{KTg=|HBwW$M1{`fS|cF{r?-GO$jc~DE7pp!Rw zuQAx)_a%l_=y&#iugMjF{rl>rsN28PZ}l&>dSO)WbS{4Ta(K6Mw=FMCiZN*fY7a5VOAD10iqB=%~YbVao{~&I;*5k3k2)gP>;$3zq1-a%c^)qjl&7ta;mM8+ zxlRwkccGutPV{8-J?)rcGxrq6F$5T!9ls|FSY0s^%uMM=i�*uZvEr=YNBkQPi4V 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 ' - try: - source_to_eval = ''.join(self.buffer + [source]) - if code.InteractiveInterpreter.runsource(self, - source_to_eval, '', 'single'): - self.more = True - self.buffer.append(source) - else: - self.more = False - del self.buffer[:] - finally: - output = ThreadedStream.fetch() - return prompt + escape(source) + output - - def runcode(self, code): - try: - eval(code, self.globals, self.locals) - except Exception: - self.showtraceback() - - def showtraceback(self): - from werkzeug.debug.tbtools import get_current_traceback - tb = get_current_traceback(skip=1) - sys.stdout._write(tb.render_summary()) - - def showsyntaxerror(self, filename=None): - from werkzeug.debug.tbtools import get_current_traceback - tb = get_current_traceback(skip=4) - sys.stdout._write(tb.render_summary()) - - def write(self, data): - sys.stdout.write(data) - - -class Console(object): - - """An interactive console.""" - - def __init__(self, globals=None, locals=None): - if locals is None: - locals = {} - if globals is None: - globals = {} - self._ipy = _InteractiveConsole(globals, locals) - - def eval(self, code): - _local._current_ipy = self._ipy - old_sys_stdout = sys.stdout - try: - return self._ipy.runsource(code) - finally: - sys.stdout = old_sys_stdout diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/repr.py b/flask/venv/lib/python3.6/site-packages/werkzeug/debug/repr.py deleted file mode 100644 index 0a02457..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/repr.py +++ /dev/null @@ -1,280 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.debug.repr - ~~~~~~~~~~~~~~~~~~~ - - This module implements object representations for debugging purposes. - Unlike the default repr these reprs expose a lot more information and - produce HTML instead of ASCII. - - Together with the CSS and JavaScript files of the debugger this gives - a colorful and more compact output. - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -import sys -import re -import codecs -from traceback import format_exception_only -try: - from collections import deque -except ImportError: # pragma: no cover - deque = None -from werkzeug.utils import escape -from werkzeug._compat import iteritems, PY2, text_type, integer_types, \ - string_types - - -missing = object() -_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}') -RegexType = type(_paragraph_re) - - -HELP_HTML = '''\ -
-

%(title)s

-
%(text)s
-
\ -''' -OBJECT_DUMP_HTML = '''\ -
-

%(title)s

- %(repr)s - %(items)s
-
\ -''' - - -def debug_repr(obj): - """Creates a debug repr of an object as HTML unicode string.""" - return DebugReprGenerator().repr(obj) - - -def dump(obj=missing): - """Print the object details to stdout._write (for the interactive - console of the web debugger. - """ - gen = DebugReprGenerator() - if obj is missing: - rv = gen.dump_locals(sys._getframe(1).f_locals) - else: - rv = gen.dump_object(obj) - sys.stdout._write(rv) - - -class _Helper(object): - - """Displays an HTML version of the normal help, for the interactive - debugger only because it requires a patched sys.stdout. - """ - - def __repr__(self): - return 'Type help(object) for help about object.' - - def __call__(self, topic=None): - if topic is None: - sys.stdout._write('%s' % repr(self)) - return - import pydoc - pydoc.help(topic) - rv = sys.stdout.reset() - if isinstance(rv, bytes): - rv = rv.decode('utf-8', 'ignore') - paragraphs = _paragraph_re.split(rv) - if len(paragraphs) > 1: - title = paragraphs[0] - text = '\n\n'.join(paragraphs[1:]) - else: # pragma: no cover - title = 'Help' - text = paragraphs[0] - sys.stdout._write(HELP_HTML % {'title': title, 'text': text}) - - -helper = _Helper() - - -def _add_subclass_info(inner, obj, base): - if isinstance(base, tuple): - for base in base: - if type(obj) is base: - return inner - elif type(obj) is base: - return inner - module = '' - if obj.__class__.__module__ not in ('__builtin__', 'exceptions'): - module = '%s.' % obj.__class__.__module__ - return '%s%s(%s)' % (module, obj.__class__.__name__, inner) - - -class DebugReprGenerator(object): - - def __init__(self): - self._stack = [] - - def _sequence_repr_maker(left, right, base=object(), limit=8): - def proxy(self, obj, recursive): - if recursive: - return _add_subclass_info(left + '...' + right, obj, base) - buf = [left] - have_extended_section = False - for idx, item in enumerate(obj): - if idx: - buf.append(', ') - if idx == limit: - buf.append('') - have_extended_section = True - buf.append(self.repr(item)) - if have_extended_section: - buf.append('') - buf.append(right) - return _add_subclass_info(u''.join(buf), obj, base) - return proxy - - list_repr = _sequence_repr_maker('[', ']', list) - tuple_repr = _sequence_repr_maker('(', ')', tuple) - set_repr = _sequence_repr_maker('set([', '])', set) - frozenset_repr = _sequence_repr_maker('frozenset([', '])', frozenset) - if deque is not None: - deque_repr = _sequence_repr_maker('collections.' - 'deque([', '])', deque) - del _sequence_repr_maker - - def regex_repr(self, obj): - pattern = repr(obj.pattern) - if PY2: - pattern = pattern.decode('string-escape', 'ignore') - else: - pattern = codecs.decode(pattern, 'unicode-escape', 'ignore') - if pattern[:1] == 'u': - pattern = 'ur' + pattern[1:] - else: - pattern = 'r' + pattern - return u're.compile(%s)' % pattern - - def string_repr(self, obj, limit=70): - buf = [''] - a = repr(obj[:limit]) - b = repr(obj[limit:]) - if isinstance(obj, text_type) and PY2: - buf.append('u') - a = a[1:] - b = b[1:] - if b != "''": - buf.extend((escape(a[:-1]), '', escape(b[1:]), '')) - else: - buf.append(escape(a)) - buf.append('') - return _add_subclass_info(u''.join(buf), obj, (bytes, text_type)) - - def dict_repr(self, d, recursive, limit=5): - if recursive: - return _add_subclass_info(u'{...}', d, dict) - buf = ['{'] - have_extended_section = False - for idx, (key, value) in enumerate(iteritems(d)): - if idx: - buf.append(', ') - if idx == limit - 1: - buf.append('') - have_extended_section = True - buf.append('%s: ' - '%s' % - (self.repr(key), self.repr(value))) - if have_extended_section: - buf.append('') - buf.append('}') - return _add_subclass_info(u''.join(buf), d, dict) - - def object_repr(self, obj): - r = repr(obj) - if PY2: - r = r.decode('utf-8', 'replace') - return u'%s' % escape(r) - - def dispatch_repr(self, obj, recursive): - if obj is helper: - return u'%r' % helper - if isinstance(obj, (integer_types, float, complex)): - return u'%r' % obj - if isinstance(obj, string_types): - return self.string_repr(obj) - if isinstance(obj, RegexType): - return self.regex_repr(obj) - if isinstance(obj, list): - return self.list_repr(obj, recursive) - if isinstance(obj, tuple): - return self.tuple_repr(obj, recursive) - if isinstance(obj, set): - return self.set_repr(obj, recursive) - if isinstance(obj, frozenset): - return self.frozenset_repr(obj, recursive) - if isinstance(obj, dict): - return self.dict_repr(obj, recursive) - if deque is not None and isinstance(obj, deque): - return self.deque_repr(obj, recursive) - return self.object_repr(obj) - - def fallback_repr(self): - try: - info = ''.join(format_exception_only(*sys.exc_info()[:2])) - except Exception: # pragma: no cover - info = '?' - if PY2: - info = info.decode('utf-8', 'ignore') - return u'<broken repr (%s)>' \ - u'' % escape(info.strip()) - - def repr(self, obj): - recursive = False - for item in self._stack: - if item is obj: - recursive = True - break - self._stack.append(obj) - try: - try: - return self.dispatch_repr(obj, recursive) - except Exception: - return self.fallback_repr() - finally: - self._stack.pop() - - def dump_object(self, obj): - repr = items = None - if isinstance(obj, dict): - title = 'Contents of' - items = [] - for key, value in iteritems(obj): - if not isinstance(key, string_types): - items = None - break - items.append((key, self.repr(value))) - if items is None: - items = [] - repr = self.repr(obj) - for key in dir(obj): - try: - items.append((key, self.repr(getattr(obj, key)))) - except Exception: - pass - title = 'Details for' - title += ' ' + object.__repr__(obj)[1:-1] - return self.render_object_dump(items, title, repr) - - def dump_locals(self, d): - items = [(key, self.repr(value)) for key, value in d.items()] - return self.render_object_dump(items, 'Local variables in frame') - - def render_object_dump(self, items, title, repr=None): - html_items = [] - for key, value in items: - html_items.append('%s
%s
' % - (escape(key), value)) - if not html_items: - html_items.append('Nothing') - return OBJECT_DUMP_HTML % { - 'title': escape(title), - 'repr': repr and '
%s
' % repr or '', - 'items': '\n'.join(html_items) - } diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/FONT_LICENSE b/flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/FONT_LICENSE deleted file mode 100644 index ae78a8f..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/FONT_LICENSE +++ /dev/null @@ -1,96 +0,0 @@ -------------------------------- -UBUNTU FONT LICENCE Version 1.0 -------------------------------- - -PREAMBLE -This licence allows the licensed fonts to be used, studied, modified and -redistributed freely. The fonts, including any derivative works, can be -bundled, embedded, and redistributed provided the terms of this licence -are met. The fonts and derivatives, however, cannot be released under -any other licence. The requirement for fonts to remain under this -licence does not require any document created using the fonts or their -derivatives to be published under this licence, as long as the primary -purpose of the document is not to be a vehicle for the distribution of -the fonts. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this licence and clearly marked as such. This may -include source files, build scripts and documentation. - -"Original Version" refers to the collection of Font Software components -as received under this licence. - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to -a new environment. - -"Copyright Holder(s)" refers to all individuals and companies who have a -copyright ownership of the Font Software. - -"Substantially Changed" refers to Modified Versions which can be easily -identified as dissimilar to the Font Software by users of the Font -Software comparing the Original Version with the Modified Version. - -To "Propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification and with or without charging -a redistribution fee), making available to the public, and in some -countries other activities as well. - -PERMISSION & CONDITIONS -This licence does not grant any rights under trademark law and all such -rights are reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of the Font Software, to propagate the Font Software, subject to -the below conditions: - -1) Each copy of the Font Software must contain the above copyright -notice and this licence. These can be included either as stand-alone -text files, human-readable headers or in the appropriate machine- -readable metadata fields within text or binary files as long as those -fields can be easily viewed by the user. - -2) The font name complies with the following: -(a) The Original Version must retain its name, unmodified. -(b) Modified Versions which are Substantially Changed must be renamed to -avoid use of the name of the Original Version or similar names entirely. -(c) Modified Versions which are not Substantially Changed must be -renamed to both (i) retain the name of the Original Version and (ii) add -additional naming elements to distinguish the Modified Version from the -Original Version. The name of such Modified Versions must be the name of -the Original Version, with "derivative X" where X represents the name of -the new work, appended to that name. - -3) The name(s) of the Copyright Holder(s) and any contributor to the -Font Software shall not be used to promote, endorse or advertise any -Modified Version, except (i) as required by this licence, (ii) to -acknowledge the contribution(s) of the Copyright Holder(s) or (iii) with -their explicit written permission. - -4) The Font Software, modified or unmodified, in part or in whole, must -be distributed entirely under this licence, and must not be distributed -under any other licence. The requirement for fonts to remain under this -licence does not affect any document created using the Font Software, -except any version of the Font Software extracted from a document -created using the Font Software may only be distributed under this -licence. - -TERMINATION -This licence becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF -COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER -DEALINGS IN THE FONT SOFTWARE. diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/console.png b/flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/console.png deleted file mode 100644 index c28dd63812d80e416682f835652f8e5824bdccb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507 zcmVM#v1#3=Jvuyn6YS$$CoGDq?9U@APAh~ZOF>jp#TVKsZ^rDVDQJO z=z(unDix`Pp@6(DbUGbswOaq~fE^0}P{J^D(r7fOTCGyOUUzmBMUy*UwAN0eHX3ch z0VGKh>h*fm?RK3*p0=MB(nc}0O&K6sv)ObGuro)jd=1C!>krB`s44?r3Yg)uiG7!8OBL$a-Fo@&0(0LjNH2#KGJZi@q2YVKu xMc5!EfO4vTMwnf`nA&W_@!!aPwbiWO`5Vn?>V~$MffN7$002ovPDHLkV1l0g-PQmA diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/debugger.js b/flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/debugger.js deleted file mode 100644 index 534019d..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/debugger.js +++ /dev/null @@ -1,205 +0,0 @@ -$(function() { - if (!EVALEX_TRUSTED) { - initPinBox(); - } - - /** - * if we are in console mode, show the console. - */ - if (CONSOLE_MODE && EVALEX) { - openShell(null, $('div.console div.inner').empty(), 0); - } - - $('div.traceback div.frame').each(function() { - var - target = $('pre', this), - consoleNode = null, - frameID = this.id.substring(6); - - target.click(function() { - $(this).parent().toggleClass('expanded'); - }); - - /** - * Add an interactive console to the frames - */ - if (EVALEX && target.is('.current')) { - $('') - .attr('title', 'Open an interactive python shell in this frame') - .click(function() { - consoleNode = openShell(consoleNode, target, frameID); - return false; - }) - .prependTo(target); - } - }); - - /** - * toggle traceback types on click. - */ - $('h2.traceback').click(function() { - $(this).next().slideToggle('fast'); - $('div.plain').slideToggle('fast'); - }).css('cursor', 'pointer'); - $('div.plain').hide(); - - /** - * Add extra info (this is here so that only users with JavaScript - * enabled see it.) - */ - $('span.nojavascript') - .removeClass('nojavascript') - .html('

To switch between the interactive traceback and the plaintext ' + - 'one, you can click on the "Traceback" headline. From the text ' + - 'traceback you can also create a paste of it. ' + (!EVALEX ? '' : - 'For code execution mouse-over the frame you want to debug and ' + - 'click on the console icon on the right side.' + - '

You can execute arbitrary Python code in the stack frames and ' + - 'there are some extra helpers available for introspection:' + - '

  • dump() shows all variables in the frame' + - '
  • dump(obj) dumps all that\'s known about the object
')); - - /** - * Add the pastebin feature - */ - $('div.plain form') - .submit(function() { - var label = $('input[type="submit"]', this); - var old_val = label.val(); - label.val('submitting...'); - $.ajax({ - dataType: 'json', - url: document.location.pathname, - data: {__debugger__: 'yes', tb: TRACEBACK, cmd: 'paste', - s: SECRET}, - success: function(data) { - $('div.plain span.pastemessage') - .removeClass('pastemessage') - .text('Paste created: ') - .append($('
#' + data.id + '').attr('href', data.url)); - }, - error: function() { - alert('Error: Could not submit paste. No network connection?'); - label.val(old_val); - } - }); - return false; - }); - - // if we have javascript we submit by ajax anyways, so no need for the - // not scaling textarea. - var plainTraceback = $('div.plain textarea'); - plainTraceback.replaceWith($('
').text(plainTraceback.text()));
-});
-
-function initPinBox() {
-  $('.pin-prompt form').submit(function(evt) {
-    evt.preventDefault();
-    var pin = this.pin.value;
-    var btn = this.btn;
-    btn.disabled = true;
-    $.ajax({
-      dataType: 'json',
-      url: document.location.pathname,
-      data: {__debugger__: 'yes', cmd: 'pinauth', pin: pin,
-             s: SECRET},
-      success: function(data) {
-        btn.disabled = false;
-        if (data.auth) {
-          EVALEX_TRUSTED = true;
-          $('.pin-prompt').fadeOut();
-        } else {
-          if (data.exhausted) {
-            alert('Error: too many attempts.  Restart server to retry.');
-          } else {
-            alert('Error: incorrect pin');
-          }
-        }
-        console.log(data);
-      },
-      error: function() {
-        btn.disabled = false;
-        alert('Error: Could not verify PIN.  Network error?');
-      }
-    });
-  });
-}
-
-function promptForPin() {
-  if (!EVALEX_TRUSTED) {
-    $.ajax({
-      url: document.location.pathname,
-      data: {__debugger__: 'yes', cmd: 'printpin', s: SECRET}
-    });
-    $('.pin-prompt').fadeIn(function() {
-      $('.pin-prompt input[name="pin"]').focus();
-    });
-  }
-}
-
-
-/**
- * Helper function for shell initialization
- */
-function openShell(consoleNode, target, frameID) {
-  promptForPin();
-  if (consoleNode)
-    return consoleNode.slideToggle('fast');
-  consoleNode = $('
')
-    .appendTo(target.parent())
-    .hide()
-  var historyPos = 0, history = [''];
-  var output = $('
[console ready]
') - .appendTo(consoleNode); - var form = $('
>>>
') - .submit(function() { - var cmd = command.val(); - $.get('', { - __debugger__: 'yes', cmd: cmd, frm: frameID, s: SECRET}, function(data) { - var tmp = $('
').html(data); - $('span.extended', tmp).each(function() { - var hidden = $(this).wrap('').hide(); - hidden - .parent() - .append($('  ') - .click(function() { - hidden.toggle(); - $(this).toggleClass('open') - return false; - })); - }); - output.append(tmp); - command.focus(); - consoleNode.scrollTop(consoleNode.get(0).scrollHeight); - var old = history.pop(); - history.push(cmd); - if (typeof old != 'undefined') - history.push(old); - historyPos = history.length - 1; - }); - command.val(''); - return false; - }). - appendTo(consoleNode); - - var command = $('') - .appendTo(form) - .keydown(function(e) { - if (e.charCode == 100 && e.ctrlKey) { - output.text('--- screen cleared ---'); - return false; - } - else if (e.charCode == 0 && (e.keyCode == 38 || e.keyCode == 40)) { - if (e.keyCode == 38 && historyPos > 0) - historyPos--; - else if (e.keyCode == 40 && historyPos < history.length) - historyPos++; - command.val(history[historyPos]); - return false; - } - }); - - return consoleNode.slideDown('fast', function() { - command.focus(); - }); -} diff --git a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/jquery.js b/flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/jquery.js deleted file mode 100644 index 0f60b7b..0000000 --- a/flask/venv/lib/python3.6/site-packages/werkzeug/debug/shared/jquery.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; - -return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("