From e388447959e86a24745f4cd5119a489f3d468d17 Mon Sep 17 00:00:00 2001 From: Nam Pham Date: Tue, 30 Oct 2018 18:48:39 +0700 Subject: [PATCH] remove env folder --- .../Flask-0.12.2.dist-info/DESCRIPTION.rst | 46 - .../Flask-0.12.2.dist-info/INSTALLER | 1 - .../Flask-0.12.2.dist-info/LICENSE.txt | 33 - .../Flask-0.12.2.dist-info/METADATA | 75 - .../Flask-0.12.2.dist-info/RECORD | 52 - .../Flask-0.12.2.dist-info/WHEEL | 6 - .../Flask-0.12.2.dist-info/entry_points.txt | 4 - .../Flask-0.12.2.dist-info/metadata.json | 1 - .../Flask-0.12.2.dist-info/top_level.txt | 1 - .../Flask_OAuth-0.12-py3.6.egg-info/PKG-INFO | 30 - .../SOURCES.txt | 10 - .../dependency_links.txt | 1 - .../installed-files.txt | 8 - .../not-zip-safe | 1 - .../requires.txt | 2 - .../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.0-py3.6.egg-info/PKG-INFO | 133 - .../MarkupSafe-1.0-py3.6.egg-info/SOURCES.txt | 18 - .../dependency_links.txt | 1 - .../installed-files.txt | 15 - .../not-zip-safe | 1 - .../top_level.txt | 1 - .../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 - .../_cffi_backend.cp36-win_amd64.pyd | Bin 170496 -> 0 bytes .../cffi-1.11.4.dist-info/DESCRIPTION.rst | 13 - .../cffi-1.11.4.dist-info/INSTALLER | 1 - .../cffi-1.11.4.dist-info/METADATA | 37 - .../cffi-1.11.4.dist-info/RECORD | 43 - .../site-packages/cffi-1.11.4.dist-info/WHEEL | 5 - .../cffi-1.11.4.dist-info/entry_points.txt | 3 - .../cffi-1.11.4.dist-info/metadata.json | 1 - .../cffi-1.11.4.dist-info/top_level.txt | 2 - .../web/Lib/site-packages/cffi/__init__.py | 13 - .../web/Lib/site-packages/cffi/_cffi_errors.h | 145 - .../Lib/site-packages/cffi/_cffi_include.h | 308 - .../web/Lib/site-packages/cffi/_embedding.h | 536 -- website/web/Lib/site-packages/cffi/api.py | 925 --- .../Lib/site-packages/cffi/backend_ctypes.py | 1114 ---- .../web/Lib/site-packages/cffi/cffi_opcode.py | 187 - .../web/Lib/site-packages/cffi/commontypes.py | 80 - website/web/Lib/site-packages/cffi/cparser.py | 891 --- website/web/Lib/site-packages/cffi/error.py | 23 - .../web/Lib/site-packages/cffi/ffiplatform.py | 127 - website/web/Lib/site-packages/cffi/lock.py | 30 - website/web/Lib/site-packages/cffi/model.py | 612 -- .../web/Lib/site-packages/cffi/parse_c_type.h | 181 - .../web/Lib/site-packages/cffi/recompiler.py | 1555 ----- .../Lib/site-packages/cffi/setuptools_ext.py | 193 - .../web/Lib/site-packages/cffi/vengine_cpy.py | 1015 --- .../web/Lib/site-packages/cffi/vengine_gen.py | 675 -- .../web/Lib/site-packages/cffi/verifier.py | 306 - .../click-6.7.dist-info/DESCRIPTION.rst | 3 - .../click-6.7.dist-info/INSTALLER | 1 - .../click-6.7.dist-info/METADATA | 16 - .../site-packages/click-6.7.dist-info/RECORD | 41 - .../site-packages/click-6.7.dist-info/WHEEL | 6 - .../click-6.7.dist-info/metadata.json | 1 - .../click-6.7.dist-info/top_level.txt | 1 - .../web/Lib/site-packages/click/__init__.py | 98 - .../Lib/site-packages/click/_bashcomplete.py | 83 - .../web/Lib/site-packages/click/_compat.py | 648 -- .../Lib/site-packages/click/_termui_impl.py | 547 -- .../web/Lib/site-packages/click/_textwrap.py | 38 - .../Lib/site-packages/click/_unicodefun.py | 118 - .../Lib/site-packages/click/_winconsole.py | 273 - website/web/Lib/site-packages/click/core.py | 1744 ----- .../web/Lib/site-packages/click/decorators.py | 304 - .../web/Lib/site-packages/click/exceptions.py | 201 - .../web/Lib/site-packages/click/formatting.py | 256 - .../web/Lib/site-packages/click/globals.py | 48 - website/web/Lib/site-packages/click/parser.py | 426 -- website/web/Lib/site-packages/click/termui.py | 539 -- .../web/Lib/site-packages/click/testing.py | 322 - website/web/Lib/site-packages/click/types.py | 550 -- website/web/Lib/site-packages/click/utils.py | 415 -- website/web/Lib/site-packages/easy_install.py | 5 - .../emoji-0.4.5-py3.6.egg-info/PKG-INFO | 102 - .../emoji-0.4.5-py3.6.egg-info/SOURCES.txt | 18 - .../dependency_links.txt | 1 - .../installed-files.txt | 12 - .../emoji-0.4.5-py3.6.egg-info/requires.txt | 5 - .../emoji-0.4.5-py3.6.egg-info/top_level.txt | 1 - .../emoji-0.4.5-py3.6.egg-info/zip-safe | 1 - .../web/Lib/site-packages/emoji/__init__.py | 60 - website/web/Lib/site-packages/emoji/core.py | 94 - .../Lib/site-packages/emoji/unicode_codes.py | 3711 ----------- .../web/Lib/site-packages/flask/__init__.py | 49 - .../web/Lib/site-packages/flask/__main__.py | 15 - .../web/Lib/site-packages/flask/_compat.py | 96 - website/web/Lib/site-packages/flask/app.py | 2003 ------ .../web/Lib/site-packages/flask/blueprints.py | 413 -- website/web/Lib/site-packages/flask/cli.py | 517 -- website/web/Lib/site-packages/flask/config.py | 263 - website/web/Lib/site-packages/flask/ctx.py | 410 -- .../Lib/site-packages/flask/debughelpers.py | 155 - .../Lib/site-packages/flask/ext/__init__.py | 29 - .../web/Lib/site-packages/flask/exthook.py | 143 - .../web/Lib/site-packages/flask/globals.py | 61 - .../web/Lib/site-packages/flask/helpers.py | 966 --- website/web/Lib/site-packages/flask/json.py | 269 - .../web/Lib/site-packages/flask/logging.py | 94 - .../web/Lib/site-packages/flask/sessions.py | 366 -- .../web/Lib/site-packages/flask/signals.py | 56 - .../web/Lib/site-packages/flask/templating.py | 149 - .../web/Lib/site-packages/flask/testing.py | 143 - website/web/Lib/site-packages/flask/views.py | 149 - .../web/Lib/site-packages/flask/wrappers.py | 205 - website/web/Lib/site-packages/flask_oauth.py | 434 -- .../gunicorn-19.7.1.dist-info/DESCRIPTION.rst | 59 - .../gunicorn-19.7.1.dist-info/INSTALLER | 1 - .../gunicorn-19.7.1.dist-info/LICENSE.txt | 23 - .../gunicorn-19.7.1.dist-info/METADATA | 92 - .../gunicorn-19.7.1.dist-info/RECORD | 91 - .../gunicorn-19.7.1.dist-info/WHEEL | 6 - .../entry_points.txt | 8 - .../gunicorn-19.7.1.dist-info/metadata.json | 1 - .../gunicorn-19.7.1.dist-info/top_level.txt | 1 - .../Lib/site-packages/gunicorn/__init__.py | 8 - .../web/Lib/site-packages/gunicorn/_compat.py | 264 - .../site-packages/gunicorn/app/__init__.py | 4 - .../Lib/site-packages/gunicorn/app/base.py | 203 - .../site-packages/gunicorn/app/pasterapp.py | 210 - .../Lib/site-packages/gunicorn/app/wsgiapp.py | 78 - .../web/Lib/site-packages/gunicorn/arbiter.py | 641 -- .../site-packages/gunicorn/argparse_compat.py | 2362 ------- .../web/Lib/site-packages/gunicorn/config.py | 1860 ------ .../web/Lib/site-packages/gunicorn/debug.py | 70 - .../web/Lib/site-packages/gunicorn/errors.py | 23 - .../Lib/site-packages/gunicorn/glogging.py | 456 -- .../site-packages/gunicorn/http/__init__.py | 9 - .../site-packages/gunicorn/http/_sendfile.py | 67 - .../Lib/site-packages/gunicorn/http/body.py | 259 - .../Lib/site-packages/gunicorn/http/errors.py | 109 - .../site-packages/gunicorn/http/message.py | 342 - .../Lib/site-packages/gunicorn/http/parser.py | 51 - .../site-packages/gunicorn/http/unreader.py | 80 - .../Lib/site-packages/gunicorn/http/wsgi.py | 419 -- .../gunicorn/instrument/__init__.py | 0 .../gunicorn/instrument/statsd.py | 123 - .../web/Lib/site-packages/gunicorn/pidfile.py | 86 - .../Lib/site-packages/gunicorn/reloader.py | 123 - .../Lib/site-packages/gunicorn/selectors.py | 592 -- website/web/Lib/site-packages/gunicorn/six.py | 762 --- .../web/Lib/site-packages/gunicorn/sock.py | 208 - .../web/Lib/site-packages/gunicorn/systemd.py | 45 - .../web/Lib/site-packages/gunicorn/util.py | 547 -- .../gunicorn/workers/__init__.py | 22 - .../gunicorn/workers/_gaiohttp.py | 168 - .../site-packages/gunicorn/workers/async.py | 147 - .../site-packages/gunicorn/workers/base.py | 257 - .../gunicorn/workers/gaiohttp.py | 17 - .../gunicorn/workers/geventlet.py | 142 - .../site-packages/gunicorn/workers/ggevent.py | 233 - .../site-packages/gunicorn/workers/gthread.py | 372 -- .../gunicorn/workers/gtornado.py | 130 - .../site-packages/gunicorn/workers/sync.py | 208 - .../gunicorn/workers/workertmp.py | 56 - .../httplib2-0.10.3-py3.6.egg-info/PKG-INFO | 63 - .../SOURCES.txt | 28 - .../dependency_links.txt | 1 - .../installed-files.txt | 9 - .../top_level.txt | 1 - .../Lib/site-packages/httplib2/__init__.py | 1399 ---- .../Lib/site-packages/httplib2/cacerts.txt | 2167 ------- .../web/Lib/site-packages/httplib2/iri2uri.py | 110 - .../itsdangerous-0.24-py3.6.egg-info/PKG-INFO | 13 - .../SOURCES.txt | 27 - .../dependency_links.txt | 1 - .../installed-files.txt | 7 - .../not-zip-safe | 1 - .../top_level.txt | 1 - website/web/Lib/site-packages/itsdangerous.py | 872 --- .../web/Lib/site-packages/jinja2/__init__.py | 83 - .../web/Lib/site-packages/jinja2/_compat.py | 99 - .../Lib/site-packages/jinja2/_identifier.py | 2 - .../Lib/site-packages/jinja2/asyncfilters.py | 146 - .../Lib/site-packages/jinja2/asyncsupport.py | 256 - .../web/Lib/site-packages/jinja2/bccache.py | 362 -- .../web/Lib/site-packages/jinja2/compiler.py | 1721 ----- .../web/Lib/site-packages/jinja2/constants.py | 32 - website/web/Lib/site-packages/jinja2/debug.py | 372 -- .../web/Lib/site-packages/jinja2/defaults.py | 56 - .../Lib/site-packages/jinja2/environment.py | 1276 ---- .../Lib/site-packages/jinja2/exceptions.py | 146 - website/web/Lib/site-packages/jinja2/ext.py | 627 -- .../web/Lib/site-packages/jinja2/filters.py | 1190 ---- .../Lib/site-packages/jinja2/idtracking.py | 286 - website/web/Lib/site-packages/jinja2/lexer.py | 739 --- .../web/Lib/site-packages/jinja2/loaders.py | 481 -- website/web/Lib/site-packages/jinja2/meta.py | 106 - .../Lib/site-packages/jinja2/nativetypes.py | 220 - website/web/Lib/site-packages/jinja2/nodes.py | 999 --- .../web/Lib/site-packages/jinja2/optimizer.py | 49 - .../web/Lib/site-packages/jinja2/parser.py | 903 --- .../web/Lib/site-packages/jinja2/runtime.py | 813 --- .../web/Lib/site-packages/jinja2/sandbox.py | 475 -- website/web/Lib/site-packages/jinja2/tests.py | 175 - website/web/Lib/site-packages/jinja2/utils.py | 647 -- .../web/Lib/site-packages/jinja2/visitor.py | 87 - .../Lib/site-packages/markupsafe/__init__.py | 305 - .../Lib/site-packages/markupsafe/_compat.py | 26 - .../site-packages/markupsafe/_constants.py | 267 - .../Lib/site-packages/markupsafe/_native.py | 46 - .../Lib/site-packages/markupsafe/_speedups.c | 239 - .../markupsafe/_speedups.cp36-win_amd64.pyd | Bin 13824 -> 0 bytes .../misaka-2.1.0-py3.6.egg-info/PKG-INFO | 80 - .../misaka-2.1.0-py3.6.egg-info/SOURCES.txt | 145 - .../dependency_links.txt | 1 - .../installed-files.txt | 17 - .../misaka-2.1.0-py3.6.egg-info/requires.txt | 1 - .../misaka-2.1.0-py3.6.egg-info/top_level.txt | 1 - .../web/Lib/site-packages/misaka/__init__.py | 3 - .../misaka/_hoedown.cp36-win_amd64.pyd | Bin 88064 -> 0 bytes website/web/Lib/site-packages/misaka/api.py | 378 -- .../web/Lib/site-packages/misaka/callbacks.py | 462 -- .../web/Lib/site-packages/misaka/constants.py | 19 - website/web/Lib/site-packages/misaka/utils.py | 61 - .../mistune-0.8.3.dist-info/DESCRIPTION.rst | 259 - .../mistune-0.8.3.dist-info/INSTALLER | 1 - .../mistune-0.8.3.dist-info/METADATA | 284 - .../mistune-0.8.3.dist-info/RECORD | 9 - .../mistune-0.8.3.dist-info/WHEEL | 6 - .../mistune-0.8.3.dist-info/metadata.json | 1 - .../mistune-0.8.3.dist-info/top_level.txt | 1 - website/web/Lib/site-packages/mistune.py | 1160 ---- .../DESCRIPTION.rst | 3 - .../oauth2-1.9.0.post1.dist-info/INSTALLER | 1 - .../oauth2-1.9.0.post1.dist-info/METADATA | 26 - .../oauth2-1.9.0.post1.dist-info/RECORD | 24 - .../oauth2-1.9.0.post1.dist-info/WHEEL | 6 - .../metadata.json | 1 - .../top_level.txt | 2 - .../oauth2-1.9.0.post1.dist-info/zip-safe | 1 - .../web/Lib/site-packages/oauth2/__init__.py | 860 --- .../web/Lib/site-packages/oauth2/_compat.py | 48 - .../web/Lib/site-packages/oauth2/_version.py | 19 - .../site-packages/oauth2/clients/__init__.py | 0 .../Lib/site-packages/oauth2/clients/imap.py | 40 - .../Lib/site-packages/oauth2/clients/smtp.py | 41 - .../pip-9.0.1.dist-info/DESCRIPTION.rst | 39 - .../pip-9.0.1.dist-info/INSTALLER | 1 - .../pip-9.0.1.dist-info/METADATA | 69 - .../site-packages/pip-9.0.1.dist-info/RECORD | 501 -- .../site-packages/pip-9.0.1.dist-info/WHEEL | 6 - .../pip-9.0.1.dist-info/entry_points.txt | 5 - .../pip-9.0.1.dist-info/metadata.json | 1 - .../pip-9.0.1.dist-info/top_level.txt | 1 - website/web/Lib/site-packages/pip/__init__.py | 331 - website/web/Lib/site-packages/pip/__main__.py | 19 - .../Lib/site-packages/pip/_vendor/__init__.py | 107 - .../Lib/site-packages/pip/_vendor/appdirs.py | 552 -- .../pip/_vendor/cachecontrol/__init__.py | 11 - .../pip/_vendor/cachecontrol/_cmd.py | 60 - .../pip/_vendor/cachecontrol/adapter.py | 125 - .../pip/_vendor/cachecontrol/cache.py | 39 - .../_vendor/cachecontrol/caches/__init__.py | 18 - .../_vendor/cachecontrol/caches/file_cache.py | 116 - .../cachecontrol/caches/redis_cache.py | 41 - .../pip/_vendor/cachecontrol/compat.py | 20 - .../pip/_vendor/cachecontrol/controller.py | 353 - .../pip/_vendor/cachecontrol/filewrapper.py | 78 - .../pip/_vendor/cachecontrol/heuristics.py | 138 - .../pip/_vendor/cachecontrol/serialize.py | 196 - .../pip/_vendor/cachecontrol/wrapper.py | 21 - .../pip/_vendor/colorama/__init__.py | 7 - .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 236 - .../pip/_vendor/colorama/initialise.py | 82 - .../pip/_vendor/colorama/win32.py | 154 - .../pip/_vendor/colorama/winterm.py | 162 - .../pip/_vendor/distlib/__init__.py | 23 - .../pip/_vendor/distlib/_backport/__init__.py | 6 - .../pip/_vendor/distlib/_backport/misc.py | 41 - .../pip/_vendor/distlib/_backport/shutil.py | 761 --- .../_vendor/distlib/_backport/sysconfig.cfg | 84 - .../_vendor/distlib/_backport/sysconfig.py | 788 --- .../pip/_vendor/distlib/_backport/tarfile.py | 2607 -------- .../pip/_vendor/distlib/compat.py | 1111 ---- .../pip/_vendor/distlib/database.py | 1312 ---- .../pip/_vendor/distlib/index.py | 515 -- .../pip/_vendor/distlib/locators.py | 1283 ---- .../pip/_vendor/distlib/manifest.py | 393 -- .../pip/_vendor/distlib/markers.py | 190 - .../pip/_vendor/distlib/metadata.py | 1068 ---- .../pip/_vendor/distlib/resources.py | 355 - .../pip/_vendor/distlib/scripts.py | 384 -- .../site-packages/pip/_vendor/distlib/t32.exe | Bin 89088 -> 0 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 97792 -> 0 bytes .../site-packages/pip/_vendor/distlib/util.py | 1611 ----- .../pip/_vendor/distlib/version.py | 742 --- .../site-packages/pip/_vendor/distlib/w32.exe | Bin 85504 -> 0 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 94208 -> 0 bytes .../pip/_vendor/distlib/wheel.py | 978 --- .../Lib/site-packages/pip/_vendor/distro.py | 1081 ---- .../pip/_vendor/html5lib/__init__.py | 25 - .../pip/_vendor/html5lib/_ihatexml.py | 288 - .../pip/_vendor/html5lib/_inputstream.py | 923 --- .../pip/_vendor/html5lib/_tokenizer.py | 1721 ----- .../pip/_vendor/html5lib/_trie/__init__.py | 14 - .../pip/_vendor/html5lib/_trie/_base.py | 38 - .../pip/_vendor/html5lib/_trie/datrie.py | 44 - .../pip/_vendor/html5lib/_trie/py.py | 67 - .../pip/_vendor/html5lib/_utils.py | 127 - .../pip/_vendor/html5lib/constants.py | 2945 --------- .../pip/_vendor/html5lib/filters/__init__.py | 0 .../filters/alphabeticalattributes.py | 20 - .../pip/_vendor/html5lib/filters/base.py | 12 - .../html5lib/filters/inject_meta_charset.py | 65 - .../pip/_vendor/html5lib/filters/lint.py | 81 - .../_vendor/html5lib/filters/optionaltags.py | 206 - .../pip/_vendor/html5lib/filters/sanitizer.py | 865 --- .../_vendor/html5lib/filters/whitespace.py | 38 - .../pip/_vendor/html5lib/html5parser.py | 2733 -------- .../pip/_vendor/html5lib/serializer.py | 334 - .../_vendor/html5lib/treeadapters/__init__.py | 12 - .../_vendor/html5lib/treeadapters/genshi.py | 47 - .../pip/_vendor/html5lib/treeadapters/sax.py | 44 - .../_vendor/html5lib/treebuilders/__init__.py | 76 - .../pip/_vendor/html5lib/treebuilders/base.py | 383 -- .../pip/_vendor/html5lib/treebuilders/dom.py | 236 - .../_vendor/html5lib/treebuilders/etree.py | 340 - .../html5lib/treebuilders/etree_lxml.py | 367 -- .../_vendor/html5lib/treewalkers/__init__.py | 143 - .../pip/_vendor/html5lib/treewalkers/base.py | 150 - .../pip/_vendor/html5lib/treewalkers/dom.py | 43 - .../pip/_vendor/html5lib/treewalkers/etree.py | 137 - .../html5lib/treewalkers/etree_lxml.py | 213 - .../_vendor/html5lib/treewalkers/genshi.py | 69 - .../site-packages/pip/_vendor/ipaddress.py | 2425 ------- .../pip/_vendor/lockfile/__init__.py | 347 - .../pip/_vendor/lockfile/linklockfile.py | 73 - .../pip/_vendor/lockfile/mkdirlockfile.py | 84 - .../pip/_vendor/lockfile/pidlockfile.py | 190 - .../pip/_vendor/lockfile/sqlitelockfile.py | 156 - .../pip/_vendor/lockfile/symlinklockfile.py | 70 - .../site-packages/pip/_vendor/ordereddict.py | 127 - .../pip/_vendor/packaging/__about__.py | 21 - .../pip/_vendor/packaging/__init__.py | 14 - .../pip/_vendor/packaging/_compat.py | 30 - .../pip/_vendor/packaging/_structures.py | 68 - .../pip/_vendor/packaging/markers.py | 303 - .../pip/_vendor/packaging/requirements.py | 129 - .../pip/_vendor/packaging/specifiers.py | 774 --- .../pip/_vendor/packaging/utils.py | 14 - .../pip/_vendor/packaging/version.py | 393 -- .../pip/_vendor/pkg_resources/__init__.py | 3052 --------- .../pip/_vendor/progress/__init__.py | 123 - .../site-packages/pip/_vendor/progress/bar.py | 83 - .../pip/_vendor/progress/counter.py | 47 - .../pip/_vendor/progress/helpers.py | 91 - .../pip/_vendor/progress/spinner.py | 40 - .../site-packages/pip/_vendor/pyparsing.py | 5696 ----------------- .../site-packages/pip/_vendor/re-vendor.py | 34 - .../pip/_vendor/requests/__init__.py | 88 - .../pip/_vendor/requests/adapters.py | 503 -- .../site-packages/pip/_vendor/requests/api.py | 148 - .../pip/_vendor/requests/auth.py | 252 - .../pip/_vendor/requests/cacert.pem | 5616 ---------------- .../pip/_vendor/requests/certs.py | 25 - .../pip/_vendor/requests/compat.py | 68 - .../pip/_vendor/requests/cookies.py | 540 -- .../pip/_vendor/requests/exceptions.py | 114 - .../pip/_vendor/requests/hooks.py | 34 - .../pip/_vendor/requests/models.py | 873 --- .../pip/_vendor/requests/packages/__init__.py | 36 - .../requests/packages/chardet/__init__.py | 32 - .../requests/packages/chardet/big5freq.py | 925 --- .../requests/packages/chardet/big5prober.py | 42 - .../requests/packages/chardet/chardetect.py | 80 - .../packages/chardet/chardistribution.py | 231 - .../packages/chardet/charsetgroupprober.py | 106 - .../packages/chardet/charsetprober.py | 62 - .../packages/chardet/codingstatemachine.py | 61 - .../requests/packages/chardet/compat.py | 34 - .../requests/packages/chardet/constants.py | 39 - .../requests/packages/chardet/cp949prober.py | 44 - .../requests/packages/chardet/escprober.py | 86 - .../requests/packages/chardet/escsm.py | 242 - .../requests/packages/chardet/eucjpprober.py | 90 - .../requests/packages/chardet/euckrfreq.py | 596 -- .../requests/packages/chardet/euckrprober.py | 42 - .../requests/packages/chardet/euctwfreq.py | 428 -- .../requests/packages/chardet/euctwprober.py | 41 - .../requests/packages/chardet/gb2312freq.py | 472 -- .../requests/packages/chardet/gb2312prober.py | 41 - .../requests/packages/chardet/hebrewprober.py | 283 - .../requests/packages/chardet/jisfreq.py | 569 -- .../requests/packages/chardet/jpcntx.py | 227 - .../packages/chardet/langbulgarianmodel.py | 229 - .../packages/chardet/langcyrillicmodel.py | 329 - .../packages/chardet/langgreekmodel.py | 225 - .../packages/chardet/langhebrewmodel.py | 201 - .../packages/chardet/langhungarianmodel.py | 225 - .../packages/chardet/langthaimodel.py | 200 - .../requests/packages/chardet/latin1prober.py | 139 - .../packages/chardet/mbcharsetprober.py | 86 - .../packages/chardet/mbcsgroupprober.py | 54 - .../requests/packages/chardet/mbcssm.py | 572 -- .../packages/chardet/sbcharsetprober.py | 120 - .../packages/chardet/sbcsgroupprober.py | 69 - .../requests/packages/chardet/sjisprober.py | 91 - .../packages/chardet/universaldetector.py | 170 - .../requests/packages/chardet/utf8prober.py | 76 - .../requests/packages/urllib3/__init__.py | 96 - .../requests/packages/urllib3/_collections.py | 324 - .../requests/packages/urllib3/connection.py | 330 - .../packages/urllib3/connectionpool.py | 866 --- .../packages/urllib3/contrib/__init__.py | 0 .../packages/urllib3/contrib/appengine.py | 231 - .../packages/urllib3/contrib/ntlmpool.py | 115 - .../packages/urllib3/contrib/pyopenssl.py | 358 -- .../packages/urllib3/contrib/socks.py | 172 - .../requests/packages/urllib3/exceptions.py | 209 - .../requests/packages/urllib3/fields.py | 178 - .../requests/packages/urllib3/filepost.py | 94 - .../packages/urllib3/packages/__init__.py | 5 - .../packages/urllib3/packages/ordered_dict.py | 259 - .../requests/packages/urllib3/packages/six.py | 868 --- .../packages/ssl_match_hostname/__init__.py | 13 - .../ssl_match_hostname/_implementation.py | 105 - .../requests/packages/urllib3/poolmanager.py | 367 -- .../requests/packages/urllib3/request.py | 151 - .../requests/packages/urllib3/response.py | 530 -- .../packages/urllib3/util/__init__.py | 46 - .../packages/urllib3/util/connection.py | 144 - .../requests/packages/urllib3/util/request.py | 72 - .../packages/urllib3/util/response.py | 74 - .../requests/packages/urllib3/util/retry.py | 300 - .../requests/packages/urllib3/util/ssl_.py | 320 - .../requests/packages/urllib3/util/timeout.py | 242 - .../requests/packages/urllib3/util/url.py | 217 - .../pip/_vendor/requests/sessions.py | 712 --- .../pip/_vendor/requests/status_codes.py | 91 - .../pip/_vendor/requests/structures.py | 105 - .../pip/_vendor/requests/utils.py | 817 --- .../Lib/site-packages/pip/_vendor/retrying.py | 267 - .../web/Lib/site-packages/pip/_vendor/six.py | 868 --- .../pip/_vendor/webencodings/__init__.py | 342 - .../pip/_vendor/webencodings/labels.py | 231 - .../pip/_vendor/webencodings/mklabels.py | 59 - .../pip/_vendor/webencodings/tests.py | 153 - .../_vendor/webencodings/x_user_defined.py | 325 - .../web/Lib/site-packages/pip/basecommand.py | 337 - .../web/Lib/site-packages/pip/baseparser.py | 293 - .../web/Lib/site-packages/pip/cmdoptions.py | 633 -- .../site-packages/pip/commands/__init__.py | 86 - .../Lib/site-packages/pip/commands/check.py | 39 - .../site-packages/pip/commands/completion.py | 81 - .../site-packages/pip/commands/download.py | 212 - .../Lib/site-packages/pip/commands/freeze.py | 87 - .../Lib/site-packages/pip/commands/hash.py | 57 - .../Lib/site-packages/pip/commands/help.py | 35 - .../Lib/site-packages/pip/commands/install.py | 437 -- .../Lib/site-packages/pip/commands/list.py | 337 - .../Lib/site-packages/pip/commands/search.py | 133 - .../Lib/site-packages/pip/commands/show.py | 154 - .../site-packages/pip/commands/uninstall.py | 76 - .../Lib/site-packages/pip/commands/wheel.py | 208 - .../Lib/site-packages/pip/compat/__init__.py | 164 - .../site-packages/pip/compat/dictconfig.py | 565 -- website/web/Lib/site-packages/pip/download.py | 906 --- .../web/Lib/site-packages/pip/exceptions.py | 244 - website/web/Lib/site-packages/pip/index.py | 1102 ---- .../web/Lib/site-packages/pip/locations.py | 182 - .../Lib/site-packages/pip/models/__init__.py | 4 - .../web/Lib/site-packages/pip/models/index.py | 16 - .../site-packages/pip/operations/__init__.py | 0 .../Lib/site-packages/pip/operations/check.py | 49 - .../site-packages/pip/operations/freeze.py | 132 - .../web/Lib/site-packages/pip/pep425tags.py | 324 - .../web/Lib/site-packages/pip/req/__init__.py | 10 - .../web/Lib/site-packages/pip/req/req_file.py | 342 - .../Lib/site-packages/pip/req/req_install.py | 1204 ---- .../web/Lib/site-packages/pip/req/req_set.py | 798 --- .../site-packages/pip/req/req_uninstall.py | 195 - .../web/Lib/site-packages/pip/status_codes.py | 8 - .../Lib/site-packages/pip/utils/__init__.py | 852 --- .../Lib/site-packages/pip/utils/appdirs.py | 248 - .../web/Lib/site-packages/pip/utils/build.py | 42 - .../site-packages/pip/utils/deprecation.py | 76 - .../Lib/site-packages/pip/utils/encoding.py | 31 - .../Lib/site-packages/pip/utils/filesystem.py | 28 - .../web/Lib/site-packages/pip/utils/glibc.py | 81 - .../web/Lib/site-packages/pip/utils/hashes.py | 92 - .../Lib/site-packages/pip/utils/logging.py | 130 - .../Lib/site-packages/pip/utils/outdated.py | 162 - .../Lib/site-packages/pip/utils/packaging.py | 63 - .../pip/utils/setuptools_build.py | 8 - website/web/Lib/site-packages/pip/utils/ui.py | 344 - .../web/Lib/site-packages/pip/vcs/__init__.py | 366 -- .../web/Lib/site-packages/pip/vcs/bazaar.py | 116 - website/web/Lib/site-packages/pip/vcs/git.py | 300 - .../Lib/site-packages/pip/vcs/mercurial.py | 103 - .../Lib/site-packages/pip/vcs/subversion.py | 269 - website/web/Lib/site-packages/pip/wheel.py | 853 --- .../site-packages/pkg_resources/__init__.py | 3051 --------- .../pkg_resources/_vendor/__init__.py | 0 .../pkg_resources/_vendor/appdirs.py | 552 -- .../_vendor/packaging/__about__.py | 21 - .../_vendor/packaging/__init__.py | 14 - .../_vendor/packaging/_compat.py | 30 - .../_vendor/packaging/_structures.py | 68 - .../_vendor/packaging/markers.py | 287 - .../_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 | 5696 ----------------- .../pkg_resources/_vendor/six.py | 868 --- .../pkg_resources/extern/__init__.py | 73 - .../pycparser-2.18-py3.6.egg-info/PKG-INFO | 17 - .../pycparser-2.18-py3.6.egg-info/SOURCES.txt | 153 - .../dependency_links.txt | 1 - .../installed-files.txt | 39 - .../top_level.txt | 1 - .../Lib/site-packages/pycparser/__init__.py | 93 - .../Lib/site-packages/pycparser/_ast_gen.py | 278 - .../site-packages/pycparser/_build_tables.py | 33 - .../Lib/site-packages/pycparser/_c_ast.cfg | 191 - .../site-packages/pycparser/ast_transforms.py | 105 - .../web/Lib/site-packages/pycparser/c_ast.py | 809 --- .../site-packages/pycparser/c_generator.py | 411 -- .../Lib/site-packages/pycparser/c_lexer.py | 485 -- .../Lib/site-packages/pycparser/c_parser.py | 1782 ------ .../web/Lib/site-packages/pycparser/lextab.py | 10 - .../site-packages/pycparser/ply/__init__.py | 5 - .../Lib/site-packages/pycparser/ply/cpp.py | 907 --- .../site-packages/pycparser/ply/ctokens.py | 133 - .../Lib/site-packages/pycparser/ply/lex.py | 1099 ---- .../Lib/site-packages/pycparser/ply/yacc.py | 3494 ---------- .../Lib/site-packages/pycparser/ply/ygen.py | 74 - .../Lib/site-packages/pycparser/plyparser.py | 116 - .../Lib/site-packages/pycparser/yacctab.py | 332 - .../DESCRIPTION.rst | 243 - .../setuptools-28.8.0.dist-info/INSTALLER | 1 - .../setuptools-28.8.0.dist-info/METADATA | 272 - .../setuptools-28.8.0.dist-info/RECORD | 143 - .../setuptools-28.8.0.dist-info/WHEEL | 6 - .../dependency_links.txt | 2 - .../entry_points.txt | 63 - .../setuptools-28.8.0.dist-info/metadata.json | 1 - .../setuptools-28.8.0.dist-info/top_level.txt | 3 - .../setuptools-28.8.0.dist-info/zip-safe | 1 - .../Lib/site-packages/setuptools/__init__.py | 160 - .../site-packages/setuptools/archive_util.py | 173 - .../Lib/site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes .../Lib/site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .../web/Lib/site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 17 - .../site-packages/setuptools/command/alias.py | 80 - .../setuptools/command/bdist_egg.py | 472 -- .../setuptools/command/bdist_rpm.py | 43 - .../setuptools/command/bdist_wininst.py | 21 - .../setuptools/command/build_ext.py | 328 - .../setuptools/command/build_py.py | 270 - .../setuptools/command/develop.py | 197 - .../setuptools/command/easy_install.py | 2287 ------- .../setuptools/command/egg_info.py | 697 -- .../setuptools/command/install.py | 125 - .../setuptools/command/install_egg_info.py | 62 - .../setuptools/command/install_lib.py | 121 - .../setuptools/command/install_scripts.py | 65 - .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/py36compat.py | 136 - .../setuptools/command/register.py | 10 - .../setuptools/command/rotate.py | 66 - .../setuptools/command/saveopts.py | 22 - .../site-packages/setuptools/command/sdist.py | 202 - .../setuptools/command/setopt.py | 149 - .../site-packages/setuptools/command/test.py | 247 - .../setuptools/command/upload.py | 38 - .../setuptools/command/upload_docs.py | 206 - .../Lib/site-packages/setuptools/depends.py | 217 - .../web/Lib/site-packages/setuptools/dist.py | 914 --- .../Lib/site-packages/setuptools/extension.py | 57 - .../setuptools/extern/__init__.py | 4 - .../web/Lib/site-packages/setuptools/glob.py | 176 - .../Lib/site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes .../Lib/site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .../web/Lib/site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../Lib/site-packages/setuptools/launch.py | 35 - .../site-packages/setuptools/lib2to3_ex.py | 62 - .../Lib/site-packages/setuptools/monkey.py | 186 - .../web/Lib/site-packages/setuptools/msvc.py | 1193 ---- .../site-packages/setuptools/namespaces.py | 93 - .../site-packages/setuptools/package_index.py | 1115 ---- .../site-packages/setuptools/py26compat.py | 31 - .../site-packages/setuptools/py27compat.py | 18 - .../site-packages/setuptools/py31compat.py | 56 - .../Lib/site-packages/setuptools/sandbox.py | 492 -- .../setuptools/script (dev).tmpl | 5 - .../Lib/site-packages/setuptools/script.tmpl | 3 - .../site-packages/setuptools/site-patch.py | 74 - .../site-packages/setuptools/ssl_support.py | 250 - .../site-packages/setuptools/unicode_utils.py | 44 - .../Lib/site-packages/setuptools/version.py | 6 - .../setuptools/windows_support.py | 29 - .../web/Lib/site-packages/tests/__init__.py | 0 .../web/Lib/site-packages/tests/test_oauth.py | 1633 ----- .../Lib/site-packages/werkzeug/__init__.py | 151 - .../web/Lib/site-packages/werkzeug/_compat.py | 206 - .../Lib/site-packages/werkzeug/_internal.py | 419 -- .../Lib/site-packages/werkzeug/_reloader.py | 277 - .../werkzeug/contrib/__init__.py | 16 - .../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 -- .../site-packages/werkzeug/debug/console.py | 215 - .../Lib/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 -- .../Lib/site-packages/werkzeug/exceptions.py | 719 --- .../Lib/site-packages/werkzeug/filesystem.py | 66 - .../Lib/site-packages/werkzeug/formparser.py | 534 -- .../web/Lib/site-packages/werkzeug/http.py | 1158 ---- .../web/Lib/site-packages/werkzeug/local.py | 420 -- .../site-packages/werkzeug/posixemulation.py | 106 - .../web/Lib/site-packages/werkzeug/routing.py | 1792 ------ .../web/Lib/site-packages/werkzeug/script.py | 318 - .../Lib/site-packages/werkzeug/security.py | 270 - .../web/Lib/site-packages/werkzeug/serving.py | 862 --- .../web/Lib/site-packages/werkzeug/test.py | 948 --- .../web/Lib/site-packages/werkzeug/testapp.py | 230 - .../web/Lib/site-packages/werkzeug/urls.py | 1007 --- .../Lib/site-packages/werkzeug/useragents.py | 212 - .../web/Lib/site-packages/werkzeug/utils.py | 628 -- .../Lib/site-packages/werkzeug/websocket.py | 337 - .../Lib/site-packages/werkzeug/wrappers.py | 2028 ------ .../web/Lib/site-packages/werkzeug/wsgi.py | 1364 ---- website/web/Lib/tcl8.6/init.tcl | 818 --- website/web/Scripts/Activate.ps1 | 51 - website/web/Scripts/_asyncio.pyd | Bin 60568 -> 0 bytes website/web/Scripts/_bz2.pyd | Bin 94360 -> 0 bytes website/web/Scripts/_ctypes.pyd | Bin 129688 -> 0 bytes website/web/Scripts/_ctypes_test.pyd | Bin 31384 -> 0 bytes website/web/Scripts/_decimal.pyd | Bin 267928 -> 0 bytes website/web/Scripts/_elementtree.pyd | Bin 168600 -> 0 bytes website/web/Scripts/_hashlib.pyd | Bin 1450648 -> 0 bytes website/web/Scripts/_lzma.pyd | Bin 254104 -> 0 bytes website/web/Scripts/_msi.pyd | Bin 38040 -> 0 bytes website/web/Scripts/_multiprocessing.pyd | Bin 29336 -> 0 bytes website/web/Scripts/_overlapped.pyd | Bin 42648 -> 0 bytes website/web/Scripts/_socket.pyd | Bin 72344 -> 0 bytes website/web/Scripts/_sqlite3.pyd | Bin 85144 -> 0 bytes website/web/Scripts/_ssl.pyd | Bin 2060952 -> 0 bytes website/web/Scripts/_testbuffer.pyd | Bin 51864 -> 0 bytes website/web/Scripts/_testcapi.pyd | Bin 91288 -> 0 bytes website/web/Scripts/_testconsole.pyd | Bin 23704 -> 0 bytes website/web/Scripts/_testimportmultiple.pyd | Bin 22168 -> 0 bytes website/web/Scripts/_testmultiphase.pyd | Bin 30360 -> 0 bytes website/web/Scripts/_tkinter.pyd | Bin 69272 -> 0 bytes website/web/Scripts/activate | 76 - website/web/Scripts/activate.bat | 32 - website/web/Scripts/deactivate.bat | 21 - website/web/Scripts/easy_install-3.6.exe | Bin 98172 -> 0 bytes website/web/Scripts/easy_install.exe | Bin 98172 -> 0 bytes website/web/Scripts/flask.exe | Bin 98150 -> 0 bytes website/web/Scripts/gunicorn.exe | Bin 98159 -> 0 bytes website/web/Scripts/gunicorn_paster.exe | Bin 98161 -> 0 bytes website/web/Scripts/misaka | 74 - website/web/Scripts/pip.exe | Bin 98144 -> 0 bytes website/web/Scripts/pip3.6.exe | Bin 98144 -> 0 bytes website/web/Scripts/pip3.exe | Bin 98144 -> 0 bytes website/web/Scripts/pyexpat.pyd | Bin 196248 -> 0 bytes website/web/Scripts/python.exe | Bin 100504 -> 0 bytes website/web/Scripts/python3.dll | Bin 58008 -> 0 bytes website/web/Scripts/python3.exe | Bin 100504 -> 0 bytes website/web/Scripts/python36.dll | Bin 3567256 -> 0 bytes website/web/Scripts/pythonw.exe | Bin 98968 -> 0 bytes website/web/Scripts/select.pyd | Bin 26776 -> 0 bytes website/web/Scripts/sqlite3.dll | Bin 1124504 -> 0 bytes website/web/Scripts/tcl86t.dll | Bin 1666048 -> 0 bytes website/web/Scripts/tk86t.dll | Bin 1967104 -> 0 bytes website/web/Scripts/unicodedata.pyd | Bin 905880 -> 0 bytes website/web/Scripts/vcruntime140.dll | Bin 87888 -> 0 bytes website/web/Scripts/winsound.pyd | Bin 27800 -> 0 bytes website/web/pip-selfcheck.json | 1 - website/web/pyvenv.cfg | 3 - 713 files changed, 207598 deletions(-) delete mode 100644 website/web/Lib/site-packages/Flask-0.12.2.dist-info/DESCRIPTION.rst delete mode 100644 website/web/Lib/site-packages/Flask-0.12.2.dist-info/INSTALLER delete mode 100644 website/web/Lib/site-packages/Flask-0.12.2.dist-info/LICENSE.txt delete mode 100644 website/web/Lib/site-packages/Flask-0.12.2.dist-info/METADATA delete mode 100644 website/web/Lib/site-packages/Flask-0.12.2.dist-info/RECORD delete mode 100644 website/web/Lib/site-packages/Flask-0.12.2.dist-info/WHEEL delete mode 100644 website/web/Lib/site-packages/Flask-0.12.2.dist-info/entry_points.txt delete mode 100644 website/web/Lib/site-packages/Flask-0.12.2.dist-info/metadata.json delete mode 100644 website/web/Lib/site-packages/Flask-0.12.2.dist-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/PKG-INFO delete mode 100644 website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/SOURCES.txt delete mode 100644 website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/dependency_links.txt delete mode 100644 website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/installed-files.txt delete mode 100644 website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/not-zip-safe delete mode 100644 website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/requires.txt delete mode 100644 website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst delete mode 100644 website/web/Lib/site-packages/Jinja2-2.10.dist-info/INSTALLER delete mode 100644 website/web/Lib/site-packages/Jinja2-2.10.dist-info/LICENSE.txt delete mode 100644 website/web/Lib/site-packages/Jinja2-2.10.dist-info/METADATA delete mode 100644 website/web/Lib/site-packages/Jinja2-2.10.dist-info/RECORD delete mode 100644 website/web/Lib/site-packages/Jinja2-2.10.dist-info/WHEEL delete mode 100644 website/web/Lib/site-packages/Jinja2-2.10.dist-info/entry_points.txt delete mode 100644 website/web/Lib/site-packages/Jinja2-2.10.dist-info/metadata.json delete mode 100644 website/web/Lib/site-packages/Jinja2-2.10.dist-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/PKG-INFO delete mode 100644 website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/SOURCES.txt delete mode 100644 website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/dependency_links.txt delete mode 100644 website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/installed-files.txt delete mode 100644 website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/not-zip-safe delete mode 100644 website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst delete mode 100644 website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER delete mode 100644 website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt delete mode 100644 website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/METADATA delete mode 100644 website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/RECORD delete mode 100644 website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/WHEEL delete mode 100644 website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/metadata.json delete mode 100644 website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/_cffi_backend.cp36-win_amd64.pyd delete mode 100644 website/web/Lib/site-packages/cffi-1.11.4.dist-info/DESCRIPTION.rst delete mode 100644 website/web/Lib/site-packages/cffi-1.11.4.dist-info/INSTALLER delete mode 100644 website/web/Lib/site-packages/cffi-1.11.4.dist-info/METADATA delete mode 100644 website/web/Lib/site-packages/cffi-1.11.4.dist-info/RECORD delete mode 100644 website/web/Lib/site-packages/cffi-1.11.4.dist-info/WHEEL delete mode 100644 website/web/Lib/site-packages/cffi-1.11.4.dist-info/entry_points.txt delete mode 100644 website/web/Lib/site-packages/cffi-1.11.4.dist-info/metadata.json delete mode 100644 website/web/Lib/site-packages/cffi-1.11.4.dist-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/cffi/__init__.py delete mode 100644 website/web/Lib/site-packages/cffi/_cffi_errors.h delete mode 100644 website/web/Lib/site-packages/cffi/_cffi_include.h delete mode 100644 website/web/Lib/site-packages/cffi/_embedding.h delete mode 100644 website/web/Lib/site-packages/cffi/api.py delete mode 100644 website/web/Lib/site-packages/cffi/backend_ctypes.py delete mode 100644 website/web/Lib/site-packages/cffi/cffi_opcode.py delete mode 100644 website/web/Lib/site-packages/cffi/commontypes.py delete mode 100644 website/web/Lib/site-packages/cffi/cparser.py delete mode 100644 website/web/Lib/site-packages/cffi/error.py delete mode 100644 website/web/Lib/site-packages/cffi/ffiplatform.py delete mode 100644 website/web/Lib/site-packages/cffi/lock.py delete mode 100644 website/web/Lib/site-packages/cffi/model.py delete mode 100644 website/web/Lib/site-packages/cffi/parse_c_type.h delete mode 100644 website/web/Lib/site-packages/cffi/recompiler.py delete mode 100644 website/web/Lib/site-packages/cffi/setuptools_ext.py delete mode 100644 website/web/Lib/site-packages/cffi/vengine_cpy.py delete mode 100644 website/web/Lib/site-packages/cffi/vengine_gen.py delete mode 100644 website/web/Lib/site-packages/cffi/verifier.py delete mode 100644 website/web/Lib/site-packages/click-6.7.dist-info/DESCRIPTION.rst delete mode 100644 website/web/Lib/site-packages/click-6.7.dist-info/INSTALLER delete mode 100644 website/web/Lib/site-packages/click-6.7.dist-info/METADATA delete mode 100644 website/web/Lib/site-packages/click-6.7.dist-info/RECORD delete mode 100644 website/web/Lib/site-packages/click-6.7.dist-info/WHEEL delete mode 100644 website/web/Lib/site-packages/click-6.7.dist-info/metadata.json delete mode 100644 website/web/Lib/site-packages/click-6.7.dist-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/click/__init__.py delete mode 100644 website/web/Lib/site-packages/click/_bashcomplete.py delete mode 100644 website/web/Lib/site-packages/click/_compat.py delete mode 100644 website/web/Lib/site-packages/click/_termui_impl.py delete mode 100644 website/web/Lib/site-packages/click/_textwrap.py delete mode 100644 website/web/Lib/site-packages/click/_unicodefun.py delete mode 100644 website/web/Lib/site-packages/click/_winconsole.py delete mode 100644 website/web/Lib/site-packages/click/core.py delete mode 100644 website/web/Lib/site-packages/click/decorators.py delete mode 100644 website/web/Lib/site-packages/click/exceptions.py delete mode 100644 website/web/Lib/site-packages/click/formatting.py delete mode 100644 website/web/Lib/site-packages/click/globals.py delete mode 100644 website/web/Lib/site-packages/click/parser.py delete mode 100644 website/web/Lib/site-packages/click/termui.py delete mode 100644 website/web/Lib/site-packages/click/testing.py delete mode 100644 website/web/Lib/site-packages/click/types.py delete mode 100644 website/web/Lib/site-packages/click/utils.py delete mode 100644 website/web/Lib/site-packages/easy_install.py delete mode 100644 website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/PKG-INFO delete mode 100644 website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/SOURCES.txt delete mode 100644 website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/dependency_links.txt delete mode 100644 website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/installed-files.txt delete mode 100644 website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/requires.txt delete mode 100644 website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/zip-safe delete mode 100644 website/web/Lib/site-packages/emoji/__init__.py delete mode 100644 website/web/Lib/site-packages/emoji/core.py delete mode 100644 website/web/Lib/site-packages/emoji/unicode_codes.py delete mode 100644 website/web/Lib/site-packages/flask/__init__.py delete mode 100644 website/web/Lib/site-packages/flask/__main__.py delete mode 100644 website/web/Lib/site-packages/flask/_compat.py delete mode 100644 website/web/Lib/site-packages/flask/app.py delete mode 100644 website/web/Lib/site-packages/flask/blueprints.py delete mode 100644 website/web/Lib/site-packages/flask/cli.py delete mode 100644 website/web/Lib/site-packages/flask/config.py delete mode 100644 website/web/Lib/site-packages/flask/ctx.py delete mode 100644 website/web/Lib/site-packages/flask/debughelpers.py delete mode 100644 website/web/Lib/site-packages/flask/ext/__init__.py delete mode 100644 website/web/Lib/site-packages/flask/exthook.py delete mode 100644 website/web/Lib/site-packages/flask/globals.py delete mode 100644 website/web/Lib/site-packages/flask/helpers.py delete mode 100644 website/web/Lib/site-packages/flask/json.py delete mode 100644 website/web/Lib/site-packages/flask/logging.py delete mode 100644 website/web/Lib/site-packages/flask/sessions.py delete mode 100644 website/web/Lib/site-packages/flask/signals.py delete mode 100644 website/web/Lib/site-packages/flask/templating.py delete mode 100644 website/web/Lib/site-packages/flask/testing.py delete mode 100644 website/web/Lib/site-packages/flask/views.py delete mode 100644 website/web/Lib/site-packages/flask/wrappers.py delete mode 100644 website/web/Lib/site-packages/flask_oauth.py delete mode 100644 website/web/Lib/site-packages/gunicorn-19.7.1.dist-info/DESCRIPTION.rst delete mode 100644 website/web/Lib/site-packages/gunicorn-19.7.1.dist-info/INSTALLER delete mode 100644 website/web/Lib/site-packages/gunicorn-19.7.1.dist-info/LICENSE.txt delete mode 100644 website/web/Lib/site-packages/gunicorn-19.7.1.dist-info/METADATA delete mode 100644 website/web/Lib/site-packages/gunicorn-19.7.1.dist-info/RECORD delete mode 100644 website/web/Lib/site-packages/gunicorn-19.7.1.dist-info/WHEEL delete mode 100644 website/web/Lib/site-packages/gunicorn-19.7.1.dist-info/entry_points.txt delete mode 100644 website/web/Lib/site-packages/gunicorn-19.7.1.dist-info/metadata.json delete mode 100644 website/web/Lib/site-packages/gunicorn-19.7.1.dist-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/gunicorn/__init__.py delete mode 100644 website/web/Lib/site-packages/gunicorn/_compat.py delete mode 100644 website/web/Lib/site-packages/gunicorn/app/__init__.py delete mode 100644 website/web/Lib/site-packages/gunicorn/app/base.py delete mode 100644 website/web/Lib/site-packages/gunicorn/app/pasterapp.py delete mode 100644 website/web/Lib/site-packages/gunicorn/app/wsgiapp.py delete mode 100644 website/web/Lib/site-packages/gunicorn/arbiter.py delete mode 100644 website/web/Lib/site-packages/gunicorn/argparse_compat.py delete mode 100644 website/web/Lib/site-packages/gunicorn/config.py delete mode 100644 website/web/Lib/site-packages/gunicorn/debug.py delete mode 100644 website/web/Lib/site-packages/gunicorn/errors.py delete mode 100644 website/web/Lib/site-packages/gunicorn/glogging.py delete mode 100644 website/web/Lib/site-packages/gunicorn/http/__init__.py delete mode 100644 website/web/Lib/site-packages/gunicorn/http/_sendfile.py delete mode 100644 website/web/Lib/site-packages/gunicorn/http/body.py delete mode 100644 website/web/Lib/site-packages/gunicorn/http/errors.py delete mode 100644 website/web/Lib/site-packages/gunicorn/http/message.py delete mode 100644 website/web/Lib/site-packages/gunicorn/http/parser.py delete mode 100644 website/web/Lib/site-packages/gunicorn/http/unreader.py delete mode 100644 website/web/Lib/site-packages/gunicorn/http/wsgi.py delete mode 100644 website/web/Lib/site-packages/gunicorn/instrument/__init__.py delete mode 100644 website/web/Lib/site-packages/gunicorn/instrument/statsd.py delete mode 100644 website/web/Lib/site-packages/gunicorn/pidfile.py delete mode 100644 website/web/Lib/site-packages/gunicorn/reloader.py delete mode 100644 website/web/Lib/site-packages/gunicorn/selectors.py delete mode 100644 website/web/Lib/site-packages/gunicorn/six.py delete mode 100644 website/web/Lib/site-packages/gunicorn/sock.py delete mode 100644 website/web/Lib/site-packages/gunicorn/systemd.py delete mode 100644 website/web/Lib/site-packages/gunicorn/util.py delete mode 100644 website/web/Lib/site-packages/gunicorn/workers/__init__.py delete mode 100644 website/web/Lib/site-packages/gunicorn/workers/_gaiohttp.py delete mode 100644 website/web/Lib/site-packages/gunicorn/workers/async.py delete mode 100644 website/web/Lib/site-packages/gunicorn/workers/base.py delete mode 100644 website/web/Lib/site-packages/gunicorn/workers/gaiohttp.py delete mode 100644 website/web/Lib/site-packages/gunicorn/workers/geventlet.py delete mode 100644 website/web/Lib/site-packages/gunicorn/workers/ggevent.py delete mode 100644 website/web/Lib/site-packages/gunicorn/workers/gthread.py delete mode 100644 website/web/Lib/site-packages/gunicorn/workers/gtornado.py delete mode 100644 website/web/Lib/site-packages/gunicorn/workers/sync.py delete mode 100644 website/web/Lib/site-packages/gunicorn/workers/workertmp.py delete mode 100644 website/web/Lib/site-packages/httplib2-0.10.3-py3.6.egg-info/PKG-INFO delete mode 100644 website/web/Lib/site-packages/httplib2-0.10.3-py3.6.egg-info/SOURCES.txt delete mode 100644 website/web/Lib/site-packages/httplib2-0.10.3-py3.6.egg-info/dependency_links.txt delete mode 100644 website/web/Lib/site-packages/httplib2-0.10.3-py3.6.egg-info/installed-files.txt delete mode 100644 website/web/Lib/site-packages/httplib2-0.10.3-py3.6.egg-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/httplib2/__init__.py delete mode 100644 website/web/Lib/site-packages/httplib2/cacerts.txt delete mode 100644 website/web/Lib/site-packages/httplib2/iri2uri.py delete mode 100644 website/web/Lib/site-packages/itsdangerous-0.24-py3.6.egg-info/PKG-INFO delete mode 100644 website/web/Lib/site-packages/itsdangerous-0.24-py3.6.egg-info/SOURCES.txt delete mode 100644 website/web/Lib/site-packages/itsdangerous-0.24-py3.6.egg-info/dependency_links.txt delete mode 100644 website/web/Lib/site-packages/itsdangerous-0.24-py3.6.egg-info/installed-files.txt delete mode 100644 website/web/Lib/site-packages/itsdangerous-0.24-py3.6.egg-info/not-zip-safe delete mode 100644 website/web/Lib/site-packages/itsdangerous-0.24-py3.6.egg-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/itsdangerous.py delete mode 100644 website/web/Lib/site-packages/jinja2/__init__.py delete mode 100644 website/web/Lib/site-packages/jinja2/_compat.py delete mode 100644 website/web/Lib/site-packages/jinja2/_identifier.py delete mode 100644 website/web/Lib/site-packages/jinja2/asyncfilters.py delete mode 100644 website/web/Lib/site-packages/jinja2/asyncsupport.py delete mode 100644 website/web/Lib/site-packages/jinja2/bccache.py delete mode 100644 website/web/Lib/site-packages/jinja2/compiler.py delete mode 100644 website/web/Lib/site-packages/jinja2/constants.py delete mode 100644 website/web/Lib/site-packages/jinja2/debug.py delete mode 100644 website/web/Lib/site-packages/jinja2/defaults.py delete mode 100644 website/web/Lib/site-packages/jinja2/environment.py delete mode 100644 website/web/Lib/site-packages/jinja2/exceptions.py delete mode 100644 website/web/Lib/site-packages/jinja2/ext.py delete mode 100644 website/web/Lib/site-packages/jinja2/filters.py delete mode 100644 website/web/Lib/site-packages/jinja2/idtracking.py delete mode 100644 website/web/Lib/site-packages/jinja2/lexer.py delete mode 100644 website/web/Lib/site-packages/jinja2/loaders.py delete mode 100644 website/web/Lib/site-packages/jinja2/meta.py delete mode 100644 website/web/Lib/site-packages/jinja2/nativetypes.py delete mode 100644 website/web/Lib/site-packages/jinja2/nodes.py delete mode 100644 website/web/Lib/site-packages/jinja2/optimizer.py delete mode 100644 website/web/Lib/site-packages/jinja2/parser.py delete mode 100644 website/web/Lib/site-packages/jinja2/runtime.py delete mode 100644 website/web/Lib/site-packages/jinja2/sandbox.py delete mode 100644 website/web/Lib/site-packages/jinja2/tests.py delete mode 100644 website/web/Lib/site-packages/jinja2/utils.py delete mode 100644 website/web/Lib/site-packages/jinja2/visitor.py delete mode 100644 website/web/Lib/site-packages/markupsafe/__init__.py delete mode 100644 website/web/Lib/site-packages/markupsafe/_compat.py delete mode 100644 website/web/Lib/site-packages/markupsafe/_constants.py delete mode 100644 website/web/Lib/site-packages/markupsafe/_native.py delete mode 100644 website/web/Lib/site-packages/markupsafe/_speedups.c delete mode 100644 website/web/Lib/site-packages/markupsafe/_speedups.cp36-win_amd64.pyd delete mode 100644 website/web/Lib/site-packages/misaka-2.1.0-py3.6.egg-info/PKG-INFO delete mode 100644 website/web/Lib/site-packages/misaka-2.1.0-py3.6.egg-info/SOURCES.txt delete mode 100644 website/web/Lib/site-packages/misaka-2.1.0-py3.6.egg-info/dependency_links.txt delete mode 100644 website/web/Lib/site-packages/misaka-2.1.0-py3.6.egg-info/installed-files.txt delete mode 100644 website/web/Lib/site-packages/misaka-2.1.0-py3.6.egg-info/requires.txt delete mode 100644 website/web/Lib/site-packages/misaka-2.1.0-py3.6.egg-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/misaka/__init__.py delete mode 100644 website/web/Lib/site-packages/misaka/_hoedown.cp36-win_amd64.pyd delete mode 100644 website/web/Lib/site-packages/misaka/api.py delete mode 100644 website/web/Lib/site-packages/misaka/callbacks.py delete mode 100644 website/web/Lib/site-packages/misaka/constants.py delete mode 100644 website/web/Lib/site-packages/misaka/utils.py delete mode 100644 website/web/Lib/site-packages/mistune-0.8.3.dist-info/DESCRIPTION.rst delete mode 100644 website/web/Lib/site-packages/mistune-0.8.3.dist-info/INSTALLER delete mode 100644 website/web/Lib/site-packages/mistune-0.8.3.dist-info/METADATA delete mode 100644 website/web/Lib/site-packages/mistune-0.8.3.dist-info/RECORD delete mode 100644 website/web/Lib/site-packages/mistune-0.8.3.dist-info/WHEEL delete mode 100644 website/web/Lib/site-packages/mistune-0.8.3.dist-info/metadata.json delete mode 100644 website/web/Lib/site-packages/mistune-0.8.3.dist-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/mistune.py delete mode 100644 website/web/Lib/site-packages/oauth2-1.9.0.post1.dist-info/DESCRIPTION.rst delete mode 100644 website/web/Lib/site-packages/oauth2-1.9.0.post1.dist-info/INSTALLER delete mode 100644 website/web/Lib/site-packages/oauth2-1.9.0.post1.dist-info/METADATA delete mode 100644 website/web/Lib/site-packages/oauth2-1.9.0.post1.dist-info/RECORD delete mode 100644 website/web/Lib/site-packages/oauth2-1.9.0.post1.dist-info/WHEEL delete mode 100644 website/web/Lib/site-packages/oauth2-1.9.0.post1.dist-info/metadata.json delete mode 100644 website/web/Lib/site-packages/oauth2-1.9.0.post1.dist-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/oauth2-1.9.0.post1.dist-info/zip-safe delete mode 100644 website/web/Lib/site-packages/oauth2/__init__.py delete mode 100644 website/web/Lib/site-packages/oauth2/_compat.py delete mode 100644 website/web/Lib/site-packages/oauth2/_version.py delete mode 100644 website/web/Lib/site-packages/oauth2/clients/__init__.py delete mode 100644 website/web/Lib/site-packages/oauth2/clients/imap.py delete mode 100644 website/web/Lib/site-packages/oauth2/clients/smtp.py delete mode 100644 website/web/Lib/site-packages/pip-9.0.1.dist-info/DESCRIPTION.rst delete mode 100644 website/web/Lib/site-packages/pip-9.0.1.dist-info/INSTALLER delete mode 100644 website/web/Lib/site-packages/pip-9.0.1.dist-info/METADATA delete mode 100644 website/web/Lib/site-packages/pip-9.0.1.dist-info/RECORD delete mode 100644 website/web/Lib/site-packages/pip-9.0.1.dist-info/WHEEL delete mode 100644 website/web/Lib/site-packages/pip-9.0.1.dist-info/entry_points.txt delete mode 100644 website/web/Lib/site-packages/pip-9.0.1.dist-info/metadata.json delete mode 100644 website/web/Lib/site-packages/pip-9.0.1.dist-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/pip/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/__main__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/appdirs.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/compat.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/database.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/index.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/t32.exe delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/t64.exe delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/util.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/version.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/w32.exe delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/w64.exe delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/distro.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/_trie/datrie.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/_utils.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/constants.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/filters/base.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/html5parser.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/serializer.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/ipaddress.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/lockfile/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/lockfile/linklockfile.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/lockfile/mkdirlockfile.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/lockfile/pidlockfile.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/lockfile/sqlitelockfile.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/lockfile/symlinklockfile.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/ordereddict.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/packaging/_compat.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/packaging/version.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/progress/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/progress/bar.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/progress/counter.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/progress/helpers.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/progress/spinner.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/pyparsing.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/re-vendor.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/api.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/auth.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/cacert.pem delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/certs.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/compat.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/models.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/big5freq.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/big5prober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/chardetect.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/chardistribution.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/charsetgroupprober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/charsetprober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/codingstatemachine.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/compat.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/constants.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/cp949prober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/escprober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/escsm.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/eucjpprober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/euckrfreq.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/euckrprober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/euctwfreq.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/euctwprober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/gb2312freq.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/gb2312prober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/hebrewprober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/jisfreq.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/jpcntx.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/langbulgarianmodel.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/langcyrillicmodel.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/langgreekmodel.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/langhebrewmodel.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/langhungarianmodel.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/langthaimodel.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/latin1prober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/mbcharsetprober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/mbcsgroupprober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/mbcssm.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/sbcharsetprober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/sbcsgroupprober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/sjisprober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/universaldetector.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/chardet/utf8prober.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/_collections.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/connection.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/connectionpool.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/contrib/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/contrib/appengine.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/contrib/ntlmpool.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/contrib/socks.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/exceptions.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/fields.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/filepost.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/packages/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/packages/ordered_dict.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/packages/six.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/poolmanager.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/request.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/response.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/util/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/util/connection.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/util/request.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/util/response.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/util/retry.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/util/timeout.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/packages/urllib3/util/url.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/structures.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/requests/utils.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/retrying.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/six.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 website/web/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 website/web/Lib/site-packages/pip/basecommand.py delete mode 100644 website/web/Lib/site-packages/pip/baseparser.py delete mode 100644 website/web/Lib/site-packages/pip/cmdoptions.py delete mode 100644 website/web/Lib/site-packages/pip/commands/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/commands/check.py delete mode 100644 website/web/Lib/site-packages/pip/commands/completion.py delete mode 100644 website/web/Lib/site-packages/pip/commands/download.py delete mode 100644 website/web/Lib/site-packages/pip/commands/freeze.py delete mode 100644 website/web/Lib/site-packages/pip/commands/hash.py delete mode 100644 website/web/Lib/site-packages/pip/commands/help.py delete mode 100644 website/web/Lib/site-packages/pip/commands/install.py delete mode 100644 website/web/Lib/site-packages/pip/commands/list.py delete mode 100644 website/web/Lib/site-packages/pip/commands/search.py delete mode 100644 website/web/Lib/site-packages/pip/commands/show.py delete mode 100644 website/web/Lib/site-packages/pip/commands/uninstall.py delete mode 100644 website/web/Lib/site-packages/pip/commands/wheel.py delete mode 100644 website/web/Lib/site-packages/pip/compat/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/compat/dictconfig.py delete mode 100644 website/web/Lib/site-packages/pip/download.py delete mode 100644 website/web/Lib/site-packages/pip/exceptions.py delete mode 100644 website/web/Lib/site-packages/pip/index.py delete mode 100644 website/web/Lib/site-packages/pip/locations.py delete mode 100644 website/web/Lib/site-packages/pip/models/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/models/index.py delete mode 100644 website/web/Lib/site-packages/pip/operations/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/operations/check.py delete mode 100644 website/web/Lib/site-packages/pip/operations/freeze.py delete mode 100644 website/web/Lib/site-packages/pip/pep425tags.py delete mode 100644 website/web/Lib/site-packages/pip/req/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/req/req_file.py delete mode 100644 website/web/Lib/site-packages/pip/req/req_install.py delete mode 100644 website/web/Lib/site-packages/pip/req/req_set.py delete mode 100644 website/web/Lib/site-packages/pip/req/req_uninstall.py delete mode 100644 website/web/Lib/site-packages/pip/status_codes.py delete mode 100644 website/web/Lib/site-packages/pip/utils/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/utils/appdirs.py delete mode 100644 website/web/Lib/site-packages/pip/utils/build.py delete mode 100644 website/web/Lib/site-packages/pip/utils/deprecation.py delete mode 100644 website/web/Lib/site-packages/pip/utils/encoding.py delete mode 100644 website/web/Lib/site-packages/pip/utils/filesystem.py delete mode 100644 website/web/Lib/site-packages/pip/utils/glibc.py delete mode 100644 website/web/Lib/site-packages/pip/utils/hashes.py delete mode 100644 website/web/Lib/site-packages/pip/utils/logging.py delete mode 100644 website/web/Lib/site-packages/pip/utils/outdated.py delete mode 100644 website/web/Lib/site-packages/pip/utils/packaging.py delete mode 100644 website/web/Lib/site-packages/pip/utils/setuptools_build.py delete mode 100644 website/web/Lib/site-packages/pip/utils/ui.py delete mode 100644 website/web/Lib/site-packages/pip/vcs/__init__.py delete mode 100644 website/web/Lib/site-packages/pip/vcs/bazaar.py delete mode 100644 website/web/Lib/site-packages/pip/vcs/git.py delete mode 100644 website/web/Lib/site-packages/pip/vcs/mercurial.py delete mode 100644 website/web/Lib/site-packages/pip/vcs/subversion.py delete mode 100644 website/web/Lib/site-packages/pip/wheel.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/__init__.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/appdirs.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/pyparsing.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/_vendor/six.py delete mode 100644 website/web/Lib/site-packages/pkg_resources/extern/__init__.py delete mode 100644 website/web/Lib/site-packages/pycparser-2.18-py3.6.egg-info/PKG-INFO delete mode 100644 website/web/Lib/site-packages/pycparser-2.18-py3.6.egg-info/SOURCES.txt delete mode 100644 website/web/Lib/site-packages/pycparser-2.18-py3.6.egg-info/dependency_links.txt delete mode 100644 website/web/Lib/site-packages/pycparser-2.18-py3.6.egg-info/installed-files.txt delete mode 100644 website/web/Lib/site-packages/pycparser-2.18-py3.6.egg-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/pycparser/__init__.py delete mode 100644 website/web/Lib/site-packages/pycparser/_ast_gen.py delete mode 100644 website/web/Lib/site-packages/pycparser/_build_tables.py delete mode 100644 website/web/Lib/site-packages/pycparser/_c_ast.cfg delete mode 100644 website/web/Lib/site-packages/pycparser/ast_transforms.py delete mode 100644 website/web/Lib/site-packages/pycparser/c_ast.py delete mode 100644 website/web/Lib/site-packages/pycparser/c_generator.py delete mode 100644 website/web/Lib/site-packages/pycparser/c_lexer.py delete mode 100644 website/web/Lib/site-packages/pycparser/c_parser.py delete mode 100644 website/web/Lib/site-packages/pycparser/lextab.py delete mode 100644 website/web/Lib/site-packages/pycparser/ply/__init__.py delete mode 100644 website/web/Lib/site-packages/pycparser/ply/cpp.py delete mode 100644 website/web/Lib/site-packages/pycparser/ply/ctokens.py delete mode 100644 website/web/Lib/site-packages/pycparser/ply/lex.py delete mode 100644 website/web/Lib/site-packages/pycparser/ply/yacc.py delete mode 100644 website/web/Lib/site-packages/pycparser/ply/ygen.py delete mode 100644 website/web/Lib/site-packages/pycparser/plyparser.py delete mode 100644 website/web/Lib/site-packages/pycparser/yacctab.py delete mode 100644 website/web/Lib/site-packages/setuptools-28.8.0.dist-info/DESCRIPTION.rst delete mode 100644 website/web/Lib/site-packages/setuptools-28.8.0.dist-info/INSTALLER delete mode 100644 website/web/Lib/site-packages/setuptools-28.8.0.dist-info/METADATA delete mode 100644 website/web/Lib/site-packages/setuptools-28.8.0.dist-info/RECORD delete mode 100644 website/web/Lib/site-packages/setuptools-28.8.0.dist-info/WHEEL delete mode 100644 website/web/Lib/site-packages/setuptools-28.8.0.dist-info/dependency_links.txt delete mode 100644 website/web/Lib/site-packages/setuptools-28.8.0.dist-info/entry_points.txt delete mode 100644 website/web/Lib/site-packages/setuptools-28.8.0.dist-info/metadata.json delete mode 100644 website/web/Lib/site-packages/setuptools-28.8.0.dist-info/top_level.txt delete mode 100644 website/web/Lib/site-packages/setuptools-28.8.0.dist-info/zip-safe delete mode 100644 website/web/Lib/site-packages/setuptools/__init__.py delete mode 100644 website/web/Lib/site-packages/setuptools/archive_util.py delete mode 100644 website/web/Lib/site-packages/setuptools/cli-32.exe delete mode 100644 website/web/Lib/site-packages/setuptools/cli-64.exe delete mode 100644 website/web/Lib/site-packages/setuptools/cli.exe delete mode 100644 website/web/Lib/site-packages/setuptools/command/__init__.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/alias.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/bdist_egg.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/bdist_wininst.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/build_ext.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/build_py.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/develop.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/easy_install.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/egg_info.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/install.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/install_egg_info.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/install_lib.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/install_scripts.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 website/web/Lib/site-packages/setuptools/command/py36compat.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/register.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/rotate.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/saveopts.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/sdist.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/setopt.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/test.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/upload.py delete mode 100644 website/web/Lib/site-packages/setuptools/command/upload_docs.py delete mode 100644 website/web/Lib/site-packages/setuptools/depends.py delete mode 100644 website/web/Lib/site-packages/setuptools/dist.py delete mode 100644 website/web/Lib/site-packages/setuptools/extension.py delete mode 100644 website/web/Lib/site-packages/setuptools/extern/__init__.py delete mode 100644 website/web/Lib/site-packages/setuptools/glob.py delete mode 100644 website/web/Lib/site-packages/setuptools/gui-32.exe delete mode 100644 website/web/Lib/site-packages/setuptools/gui-64.exe delete mode 100644 website/web/Lib/site-packages/setuptools/gui.exe delete mode 100644 website/web/Lib/site-packages/setuptools/launch.py delete mode 100644 website/web/Lib/site-packages/setuptools/lib2to3_ex.py delete mode 100644 website/web/Lib/site-packages/setuptools/monkey.py delete mode 100644 website/web/Lib/site-packages/setuptools/msvc.py delete mode 100644 website/web/Lib/site-packages/setuptools/namespaces.py delete mode 100644 website/web/Lib/site-packages/setuptools/package_index.py delete mode 100644 website/web/Lib/site-packages/setuptools/py26compat.py delete mode 100644 website/web/Lib/site-packages/setuptools/py27compat.py delete mode 100644 website/web/Lib/site-packages/setuptools/py31compat.py delete mode 100644 website/web/Lib/site-packages/setuptools/sandbox.py delete mode 100644 website/web/Lib/site-packages/setuptools/script (dev).tmpl delete mode 100644 website/web/Lib/site-packages/setuptools/script.tmpl delete mode 100644 website/web/Lib/site-packages/setuptools/site-patch.py delete mode 100644 website/web/Lib/site-packages/setuptools/ssl_support.py delete mode 100644 website/web/Lib/site-packages/setuptools/unicode_utils.py delete mode 100644 website/web/Lib/site-packages/setuptools/version.py delete mode 100644 website/web/Lib/site-packages/setuptools/windows_support.py delete mode 100644 website/web/Lib/site-packages/tests/__init__.py delete mode 100644 website/web/Lib/site-packages/tests/test_oauth.py delete mode 100644 website/web/Lib/site-packages/werkzeug/__init__.py delete mode 100644 website/web/Lib/site-packages/werkzeug/_compat.py delete mode 100644 website/web/Lib/site-packages/werkzeug/_internal.py delete mode 100644 website/web/Lib/site-packages/werkzeug/_reloader.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/__init__.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/atom.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/cache.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/fixers.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/iterio.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/jsrouting.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/limiter.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/lint.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/profiler.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/securecookie.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/sessions.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/testtools.py delete mode 100644 website/web/Lib/site-packages/werkzeug/contrib/wrappers.py delete mode 100644 website/web/Lib/site-packages/werkzeug/datastructures.py delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/__init__.py delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/console.py delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/repr.py delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/shared/FONT_LICENSE delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/shared/console.png delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/shared/debugger.js delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/shared/jquery.js delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/shared/less.png delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/shared/more.png delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/shared/source.png delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/shared/style.css delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/shared/ubuntu.ttf delete mode 100644 website/web/Lib/site-packages/werkzeug/debug/tbtools.py delete mode 100644 website/web/Lib/site-packages/werkzeug/exceptions.py delete mode 100644 website/web/Lib/site-packages/werkzeug/filesystem.py delete mode 100644 website/web/Lib/site-packages/werkzeug/formparser.py delete mode 100644 website/web/Lib/site-packages/werkzeug/http.py delete mode 100644 website/web/Lib/site-packages/werkzeug/local.py delete mode 100644 website/web/Lib/site-packages/werkzeug/posixemulation.py delete mode 100644 website/web/Lib/site-packages/werkzeug/routing.py delete mode 100644 website/web/Lib/site-packages/werkzeug/script.py delete mode 100644 website/web/Lib/site-packages/werkzeug/security.py delete mode 100644 website/web/Lib/site-packages/werkzeug/serving.py delete mode 100644 website/web/Lib/site-packages/werkzeug/test.py delete mode 100644 website/web/Lib/site-packages/werkzeug/testapp.py delete mode 100644 website/web/Lib/site-packages/werkzeug/urls.py delete mode 100644 website/web/Lib/site-packages/werkzeug/useragents.py delete mode 100644 website/web/Lib/site-packages/werkzeug/utils.py delete mode 100644 website/web/Lib/site-packages/werkzeug/websocket.py delete mode 100644 website/web/Lib/site-packages/werkzeug/wrappers.py delete mode 100644 website/web/Lib/site-packages/werkzeug/wsgi.py delete mode 100644 website/web/Lib/tcl8.6/init.tcl delete mode 100644 website/web/Scripts/Activate.ps1 delete mode 100644 website/web/Scripts/_asyncio.pyd delete mode 100644 website/web/Scripts/_bz2.pyd delete mode 100644 website/web/Scripts/_ctypes.pyd delete mode 100644 website/web/Scripts/_ctypes_test.pyd delete mode 100644 website/web/Scripts/_decimal.pyd delete mode 100644 website/web/Scripts/_elementtree.pyd delete mode 100644 website/web/Scripts/_hashlib.pyd delete mode 100644 website/web/Scripts/_lzma.pyd delete mode 100644 website/web/Scripts/_msi.pyd delete mode 100644 website/web/Scripts/_multiprocessing.pyd delete mode 100644 website/web/Scripts/_overlapped.pyd delete mode 100644 website/web/Scripts/_socket.pyd delete mode 100644 website/web/Scripts/_sqlite3.pyd delete mode 100644 website/web/Scripts/_ssl.pyd delete mode 100644 website/web/Scripts/_testbuffer.pyd delete mode 100644 website/web/Scripts/_testcapi.pyd delete mode 100644 website/web/Scripts/_testconsole.pyd delete mode 100644 website/web/Scripts/_testimportmultiple.pyd delete mode 100644 website/web/Scripts/_testmultiphase.pyd delete mode 100644 website/web/Scripts/_tkinter.pyd delete mode 100644 website/web/Scripts/activate delete mode 100644 website/web/Scripts/activate.bat delete mode 100644 website/web/Scripts/deactivate.bat delete mode 100644 website/web/Scripts/easy_install-3.6.exe delete mode 100644 website/web/Scripts/easy_install.exe delete mode 100644 website/web/Scripts/flask.exe delete mode 100644 website/web/Scripts/gunicorn.exe delete mode 100644 website/web/Scripts/gunicorn_paster.exe delete mode 100644 website/web/Scripts/misaka delete mode 100644 website/web/Scripts/pip.exe delete mode 100644 website/web/Scripts/pip3.6.exe delete mode 100644 website/web/Scripts/pip3.exe delete mode 100644 website/web/Scripts/pyexpat.pyd delete mode 100644 website/web/Scripts/python.exe delete mode 100644 website/web/Scripts/python3.dll delete mode 100644 website/web/Scripts/python3.exe delete mode 100644 website/web/Scripts/python36.dll delete mode 100644 website/web/Scripts/pythonw.exe delete mode 100644 website/web/Scripts/select.pyd delete mode 100644 website/web/Scripts/sqlite3.dll delete mode 100644 website/web/Scripts/tcl86t.dll delete mode 100644 website/web/Scripts/tk86t.dll delete mode 100644 website/web/Scripts/unicodedata.pyd delete mode 100644 website/web/Scripts/vcruntime140.dll delete mode 100644 website/web/Scripts/winsound.pyd delete mode 100644 website/web/pip-selfcheck.json delete mode 100644 website/web/pyvenv.cfg diff --git a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/DESCRIPTION.rst b/website/web/Lib/site-packages/Flask-0.12.2.dist-info/DESCRIPTION.rst deleted file mode 100644 index 239dbda32..000000000 --- a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,46 +0,0 @@ -Flask ------ - -Flask is a microframework for Python based on Werkzeug, Jinja 2 and good -intentions. And before you ask: It's BSD licensed! - -Flask is Fun -```````````` - -Save in a hello.py: - -.. code:: python - - from flask import Flask - app = Flask(__name__) - - @app.route("/") - def hello(): - return "Hello World!" - - if __name__ == "__main__": - app.run() - -And Easy to Setup -````````````````` - -And run it: - -.. code:: bash - - $ pip install Flask - $ python hello.py - * Running on http://localhost:5000/ - - Ready for production? `Read this first `. - -Links -````` - -* `website `_ -* `documentation `_ -* `development version - `_ - - - diff --git a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/INSTALLER b/website/web/Lib/site-packages/Flask-0.12.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e38..000000000 --- a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/LICENSE.txt b/website/web/Lib/site-packages/Flask-0.12.2.dist-info/LICENSE.txt deleted file mode 100644 index a7da10e17..000000000 --- a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/LICENSE.txt +++ /dev/null @@ -1,33 +0,0 @@ -Copyright (c) 2015 by Armin Ronacher and contributors. See AUTHORS -for more details. - -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. - -* 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 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 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 AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. diff --git a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/METADATA b/website/web/Lib/site-packages/Flask-0.12.2.dist-info/METADATA deleted file mode 100644 index 8c43205bb..000000000 --- a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/METADATA +++ /dev/null @@ -1,75 +0,0 @@ -Metadata-Version: 2.0 -Name: Flask -Version: 0.12.2 -Summary: A microframework based on Werkzeug, Jinja2 and good intentions -Home-page: http://github.com/pallets/flask/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -License: BSD -Platform: any -Classifier: Development Status :: 4 - Beta -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: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Dist: Jinja2 (>=2.4) -Requires-Dist: Werkzeug (>=0.7) -Requires-Dist: click (>=2.0) -Requires-Dist: itsdangerous (>=0.21) - -Flask ------ - -Flask is a microframework for Python based on Werkzeug, Jinja 2 and good -intentions. And before you ask: It's BSD licensed! - -Flask is Fun -```````````` - -Save in a hello.py: - -.. code:: python - - from flask import Flask - app = Flask(__name__) - - @app.route("/") - def hello(): - return "Hello World!" - - if __name__ == "__main__": - app.run() - -And Easy to Setup -````````````````` - -And run it: - -.. code:: bash - - $ pip install Flask - $ python hello.py - * Running on http://localhost:5000/ - - Ready for production? `Read this first `. - -Links -````` - -* `website `_ -* `documentation `_ -* `development version - `_ - - - diff --git a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/RECORD b/website/web/Lib/site-packages/Flask-0.12.2.dist-info/RECORD deleted file mode 100644 index 69d2b278a..000000000 --- a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/RECORD +++ /dev/null @@ -1,52 +0,0 @@ -Flask-0.12.2.dist-info/DESCRIPTION.rst,sha256=DmJm8IBlBjl3wkm0Ly23jYvWbvK_mCuE5oUseYCijbI,810 -Flask-0.12.2.dist-info/LICENSE.txt,sha256=hLgKluMRHSnxG-L0EmrqjmKgG5cHlff6pIh3rCNINeI,1582 -Flask-0.12.2.dist-info/METADATA,sha256=OgSkJQ_kmrz4qEkS-OzYtL75uZmXAThymkOcGR4kXRQ,1948 -Flask-0.12.2.dist-info/RECORD,, -Flask-0.12.2.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 -Flask-0.12.2.dist-info/entry_points.txt,sha256=jzk2Wy2h30uEcqqzd4CVnlzsMXB-vaD5GXjuPMXmTmI,60 -Flask-0.12.2.dist-info/metadata.json,sha256=By8kZ1vY9lLEAGnRiWNBhudqKvLPo0HkZVXTYECyPKk,1389 -Flask-0.12.2.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 -flask/__init__.py,sha256=sHdK1v6WRbVmCN0fEv990EE7rOT2UlamQkSof2d0Dt0,1673 -flask/__main__.py,sha256=cldbNi5zpjE68XzIWI8uYHNWwBHHVJmwtlXWk6P4CO4,291 -flask/_compat.py,sha256=VlfjUuLjufsTHJIjr_ZsnnOesSbAXIslBBgRe5tfOok,2802 -flask/app.py,sha256=6DPjtb5jUJWgL5fXksG5boA49EB3l-k9pWyftitbNNk,83169 -flask/blueprints.py,sha256=6HVasMcPcaq7tk36kCrgX4bnhTkky4G5WIWCyyJL8HY,16872 -flask/cli.py,sha256=2NXEdCOu5-4ymklxX4Lf6bjb-89I4VHYeP6xScR3i8E,18328 -flask/config.py,sha256=Ym5Jenyu6zAZ1fdVLeKekY9-EsKmq8183qnRgauwCMY,9905 -flask/ctx.py,sha256=UPA0YwoIlHP0txOGanC9lQLSGv6eCqV5Fmw2cVJRmgQ,14739 -flask/debughelpers.py,sha256=z-uQavKIymOZl0WQDLXsnacA00ERIlCx3S3Tnb_OYsE,6024 -flask/exthook.py,sha256=SvXs5jwpcOjogwJ7SNquiWTxowoN1-MHFoqAejWnk2o,5762 -flask/globals.py,sha256=I3m_4RssLhWW1R11zuEI8oFryHUHX3NQwjMkGXOZzg8,1645 -flask/helpers.py,sha256=KrsQ2Yo3lOVHvBTgQCLvpubgmTOpQdTTyiCOOYlwDuQ,38452 -flask/json.py,sha256=1zPM-NPLiWoOfGd0P14FxnEkeKtjtUZxMC9pyYyDBYI,9183 -flask/logging.py,sha256=UG-77jPkRClk9w1B-_ArjjXPuj9AmZz9mG0IRGvptW0,2751 -flask/sessions.py,sha256=QBKXVYKJ-HKbx9m6Yb5yan_EPq84a5yevVLgAzNKFQY,14394 -flask/signals.py,sha256=MfZk5qTRj_R_O3aGYlTEnx2g3SvlZncz8Ii73eKK59g,2209 -flask/templating.py,sha256=u7FbN6j56H_q6CrdJJyJ6gZtqaMa0vh1_GP12gEHRQQ,4912 -flask/testing.py,sha256=II8EO_NjOT1LvL8Hh_SdIFL_BdlwVPcB9yot5pbltxE,5630 -flask/views.py,sha256=6OPv7gwu3h14JhqpeeMRWwrxoGHsUr4_nOGSyTRAxAI,5630 -flask/wrappers.py,sha256=1S_5mmuA1Tlx7D9lXV6xMblrg-PdAauNWahe-henMEE,7612 -flask/ext/__init__.py,sha256=UEezCApsG4ZJWqwUnX9YmWcNN4OVENgph_9L05n0eOM,842 -../../Scripts/flask.exe,sha256=WiosIiBPkig5ooCR_yaHUrP5WMPviLDqJxogDFixmOY,98150 -Flask-0.12.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -flask/ext/__pycache__/__init__.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__/exthook.cpython-36.pyc,, -flask/__pycache__/globals.cpython-36.pyc,, -flask/__pycache__/helpers.cpython-36.pyc,, -flask/__pycache__/json.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/__pycache__/_compat.cpython-36.pyc,, -flask/__pycache__/__init__.cpython-36.pyc,, -flask/__pycache__/__main__.cpython-36.pyc,, diff --git a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/WHEEL b/website/web/Lib/site-packages/Flask-0.12.2.dist-info/WHEEL deleted file mode 100644 index 8b6dd1b5a..000000000 --- a/website/web/Lib/site-packages/Flask-0.12.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/website/web/Lib/site-packages/Flask-0.12.2.dist-info/entry_points.txt b/website/web/Lib/site-packages/Flask-0.12.2.dist-info/entry_points.txt deleted file mode 100644 index 14adf18ab..000000000 --- a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/entry_points.txt +++ /dev/null @@ -1,4 +0,0 @@ - - [console_scripts] - flask=flask.cli:main - \ No newline at end of file diff --git a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/metadata.json b/website/web/Lib/site-packages/Flask-0.12.2.dist-info/metadata.json deleted file mode 100644 index 4d814b8b3..000000000 --- a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 4 - Beta", "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", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "extensions": {"python.commands": {"wrap_console": {"flask": "flask.cli:main"}}, "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://github.com/pallets/flask/"}}, "python.exports": {"console_scripts": {"flask": "flask.cli:main"}}}, "extras": [], "generator": "bdist_wheel (0.29.0)", "license": "BSD", "metadata_version": "2.0", "name": "Flask", "platform": "any", "run_requires": [{"requires": ["Jinja2 (>=2.4)", "Werkzeug (>=0.7)", "click (>=2.0)", "itsdangerous (>=0.21)"]}], "summary": "A microframework based on Werkzeug, Jinja2 and good intentions", "version": "0.12.2"} \ No newline at end of file diff --git a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/top_level.txt b/website/web/Lib/site-packages/Flask-0.12.2.dist-info/top_level.txt deleted file mode 100644 index 7e1060246..000000000 --- a/website/web/Lib/site-packages/Flask-0.12.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -flask diff --git a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/PKG-INFO b/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/PKG-INFO deleted file mode 100644 index 63db21e96..000000000 --- a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/PKG-INFO +++ /dev/null @@ -1,30 +0,0 @@ -Metadata-Version: 1.1 -Name: Flask-OAuth -Version: 0.12 -Summary: Adds OAuth support to Flask -Home-page: http://github.com/mitsuhiko/flask-oauth -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -License: BSD -Description: - Flask-OAuth - ----------- - - Adds OAuth support to Flask. - - Links - ````` - - * `documentation `_ - * `development version - `_ - -Platform: any -Classifier: Development Status :: 4 - Beta -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Software Development :: Libraries :: Python Modules diff --git a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/SOURCES.txt b/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/SOURCES.txt deleted file mode 100644 index f12db5add..000000000 --- a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/SOURCES.txt +++ /dev/null @@ -1,10 +0,0 @@ -README -flask_oauth.py -setup.cfg -setup.py -Flask_OAuth.egg-info/PKG-INFO -Flask_OAuth.egg-info/SOURCES.txt -Flask_OAuth.egg-info/dependency_links.txt -Flask_OAuth.egg-info/not-zip-safe -Flask_OAuth.egg-info/requires.txt -Flask_OAuth.egg-info/top_level.txt \ No newline at end of file diff --git a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/dependency_links.txt b/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/dependency_links.txt deleted file mode 100644 index 8b1378917..000000000 --- a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/installed-files.txt b/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/installed-files.txt deleted file mode 100644 index 57bfb769b..000000000 --- a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/installed-files.txt +++ /dev/null @@ -1,8 +0,0 @@ -..\flask_oauth.py -..\__pycache__\flask_oauth.cpython-36.pyc -dependency_links.txt -not-zip-safe -PKG-INFO -requires.txt -SOURCES.txt -top_level.txt diff --git a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/not-zip-safe b/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/not-zip-safe deleted file mode 100644 index 8b1378917..000000000 --- a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/not-zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/requires.txt b/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/requires.txt deleted file mode 100644 index b17522e93..000000000 --- a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/requires.txt +++ /dev/null @@ -1,2 +0,0 @@ -Flask -oauth2 diff --git a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/top_level.txt b/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/top_level.txt deleted file mode 100644 index b53f96d53..000000000 --- a/website/web/Lib/site-packages/Flask_OAuth-0.12-py3.6.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -flask_oauth diff --git a/website/web/Lib/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst b/website/web/Lib/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst deleted file mode 100644 index 1594da5ce..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/Jinja2-2.10.dist-info/INSTALLER b/website/web/Lib/site-packages/Jinja2-2.10.dist-info/INSTALLER deleted file mode 100644 index a1b589e38..000000000 --- a/website/web/Lib/site-packages/Jinja2-2.10.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/website/web/Lib/site-packages/Jinja2-2.10.dist-info/LICENSE.txt b/website/web/Lib/site-packages/Jinja2-2.10.dist-info/LICENSE.txt deleted file mode 100644 index 10145a264..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/Jinja2-2.10.dist-info/METADATA b/website/web/Lib/site-packages/Jinja2-2.10.dist-info/METADATA deleted file mode 100644 index 40f2b46b4..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/Jinja2-2.10.dist-info/RECORD b/website/web/Lib/site-packages/Jinja2-2.10.dist-info/RECORD deleted file mode 100644 index a1ec831ea..000000000 --- a/website/web/Lib/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/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/_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 -Jinja2-2.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -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/__pycache__/_compat.cpython-36.pyc,, -jinja2/__pycache__/_identifier.cpython-36.pyc,, -jinja2/__pycache__/__init__.cpython-36.pyc,, diff --git a/website/web/Lib/site-packages/Jinja2-2.10.dist-info/WHEEL b/website/web/Lib/site-packages/Jinja2-2.10.dist-info/WHEEL deleted file mode 100644 index 7332a419c..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/Jinja2-2.10.dist-info/entry_points.txt b/website/web/Lib/site-packages/Jinja2-2.10.dist-info/entry_points.txt deleted file mode 100644 index 32e6b7530..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/Jinja2-2.10.dist-info/metadata.json b/website/web/Lib/site-packages/Jinja2-2.10.dist-info/metadata.json deleted file mode 100644 index 7f5dc3879..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/Jinja2-2.10.dist-info/top_level.txt b/website/web/Lib/site-packages/Jinja2-2.10.dist-info/top_level.txt deleted file mode 100644 index 7f7afbf3b..000000000 --- a/website/web/Lib/site-packages/Jinja2-2.10.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -jinja2 diff --git a/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/PKG-INFO b/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/PKG-INFO deleted file mode 100644 index ad3a5a4ab..000000000 --- a/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/PKG-INFO +++ /dev/null @@ -1,133 +0,0 @@ -Metadata-Version: 1.1 -Name: MarkupSafe -Version: 1.0 -Summary: Implements a XML/HTML/XHTML Markup safe string for Python -Home-page: http://github.com/pallets/markupsafe -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -License: BSD -Description: MarkupSafe - ========== - - Implements a unicode subclass that supports HTML strings: - - .. code-block:: python - - >>> from markupsafe import Markup, escape - >>> escape("") - Markup(u'<script>alert(document.cookie);</script>') - >>> tmpl = Markup("%s") - >>> tmpl % "Peter > Lustig" - Markup(u'Peter > Lustig') - - If you want to make an object unicode that is not yet unicode - but don't want to lose the taint information, you can use the - ``soft_unicode`` function. (On Python 3 you can also use ``soft_str`` which - is a different name for the same function). - - .. code-block:: python - - >>> from markupsafe import soft_unicode - >>> soft_unicode(42) - u'42' - >>> soft_unicode(Markup('foo')) - Markup(u'foo') - - HTML Representations - -------------------- - - Objects can customize their HTML markup equivalent by overriding - the ``__html__`` function: - - .. code-block:: python - - >>> class Foo(object): - ... def __html__(self): - ... return 'Nice' - ... - >>> escape(Foo()) - Markup(u'Nice') - >>> Markup(Foo()) - Markup(u'Nice') - - Silent Escapes - -------------- - - Since MarkupSafe 0.10 there is now also a separate escape function - called ``escape_silent`` that returns an empty string for ``None`` for - consistency with other systems that return empty strings for ``None`` - when escaping (for instance Pylons' webhelpers). - - If you also want to use this for the escape method of the Markup - object, you can create your own subclass that does that: - - .. code-block:: python - - from markupsafe import Markup, escape_silent as escape - - class SilentMarkup(Markup): - __slots__ = () - - @classmethod - def escape(cls, s): - return cls(escape(s)) - - New-Style String Formatting - --------------------------- - - Starting with MarkupSafe 0.21 new style string formats from Python 2.6 and - 3.x are now fully supported. Previously the escape behavior of those - functions was spotty at best. The new implementations operates under the - following algorithm: - - 1. if an object has an ``__html_format__`` method it is called as - replacement for ``__format__`` with the format specifier. It either - has to return a string or markup object. - 2. if an object has an ``__html__`` method it is called. - 3. otherwise the default format system of Python kicks in and the result - is HTML escaped. - - Here is how you can implement your own formatting: - - .. code-block:: python - - class User(object): - - def __init__(self, id, username): - self.id = id - self.username = username - - def __html_format__(self, format_spec): - if format_spec == 'link': - return Markup('{1}').format( - self.id, - self.__html__(), - ) - elif format_spec: - raise ValueError('Invalid format spec') - return self.__html__() - - def __html__(self): - return Markup('{0}').format(self.username) - - And to format that user: - - .. code-block:: python - - >>> user = User(1, 'foo') - >>> Markup('

User: {0:link}').format(user) - Markup(u'

User: foo') - - Markupsafe supports Python 2.6, 2.7 and Python 3.3 and higher. - -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 :: 3 -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Text Processing :: Markup :: HTML diff --git a/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/SOURCES.txt b/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/SOURCES.txt deleted file mode 100644 index 210b339ce..000000000 --- a/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/SOURCES.txt +++ /dev/null @@ -1,18 +0,0 @@ -AUTHORS -CHANGES -LICENSE -MANIFEST.in -README.rst -setup.cfg -setup.py -tests.py -MarkupSafe.egg-info/PKG-INFO -MarkupSafe.egg-info/SOURCES.txt -MarkupSafe.egg-info/dependency_links.txt -MarkupSafe.egg-info/not-zip-safe -MarkupSafe.egg-info/top_level.txt -markupsafe/__init__.py -markupsafe/_compat.py -markupsafe/_constants.py -markupsafe/_native.py -markupsafe/_speedups.c \ No newline at end of file diff --git a/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/dependency_links.txt b/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/dependency_links.txt deleted file mode 100644 index 8b1378917..000000000 --- a/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/installed-files.txt b/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/installed-files.txt deleted file mode 100644 index 22e67eaa9..000000000 --- a/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/installed-files.txt +++ /dev/null @@ -1,15 +0,0 @@ -..\markupsafe\_compat.py -..\markupsafe\_constants.py -..\markupsafe\_native.py -..\markupsafe\__init__.py -..\markupsafe\_speedups.c -..\markupsafe\__pycache__\_compat.cpython-36.pyc -..\markupsafe\__pycache__\_constants.cpython-36.pyc -..\markupsafe\__pycache__\_native.cpython-36.pyc -..\markupsafe\__pycache__\__init__.cpython-36.pyc -..\markupsafe\_speedups.cp36-win_amd64.pyd -dependency_links.txt -not-zip-safe -PKG-INFO -SOURCES.txt -top_level.txt diff --git a/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/not-zip-safe b/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/not-zip-safe deleted file mode 100644 index 8b1378917..000000000 --- a/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/not-zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/top_level.txt b/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/top_level.txt deleted file mode 100644 index 75bf72925..000000000 --- a/website/web/Lib/site-packages/MarkupSafe-1.0-py3.6.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -markupsafe diff --git a/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst b/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst deleted file mode 100644 index 675f08d10..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER b/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e38..000000000 --- a/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt b/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt deleted file mode 100644 index 1cc75bb0e..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/METADATA b/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/METADATA deleted file mode 100644 index bfc3c4e89..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/RECORD b/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/RECORD deleted file mode 100644 index 421652cd0..000000000 --- a/website/web/Lib/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/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/_compat.py,sha256=8c4U9o6A_TR9nKCcTbpZNxpqCXcXDVIbFawwKM2s92c,6311 -werkzeug/_internal.py,sha256=GhEyGMlsSz_tYjsDWO9TG35VN7304MM8gjKDrXLEdVc,13873 -werkzeug/_reloader.py,sha256=AyPphcOHPbu6qzW0UbrVvTDJdre5WgpxbhIJN_TqzUc,9264 -werkzeug/datastructures.py,sha256=3IgNKNqrz-ZjmAG7y3YgEYK-enDiMT_b652PsypWcYg,90080 -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 -werkzeug/contrib/__init__.py,sha256=f7PfttZhbrImqpr5Ezre8CXgwvcGUJK7zWNpO34WWrw,623 -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/debug/__init__.py,sha256=uSn9BqCZ5E3ySgpoZtundpROGsn-uYvZtSFiTfAX24M,17452 -werkzeug/debug/console.py,sha256=n3-dsKk1TsjnN-u4ZgmuWCU_HO0qw5IA7ttjhyyMM6I,5607 -werkzeug/debug/repr.py,sha256=bKqstDYGfECpeLerd48s_hxuqK4b6UWnjMu3d_DHO8I,9340 -werkzeug/debug/tbtools.py,sha256=rBudXCmkVdAKIcdhxANxgf09g6kQjJWW9_5bjSpr4OY,18451 -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-0.14.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -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/__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/__pycache__/__init__.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/__pycache__/_compat.cpython-36.pyc,, -werkzeug/__pycache__/_internal.cpython-36.pyc,, -werkzeug/__pycache__/_reloader.cpython-36.pyc,, -werkzeug/__pycache__/__init__.cpython-36.pyc,, diff --git a/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/WHEEL b/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/WHEEL deleted file mode 100644 index 0de529b1e..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/metadata.json b/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/metadata.json deleted file mode 100644 index bca8d1262..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt b/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt deleted file mode 100644 index 6fe8da849..000000000 --- a/website/web/Lib/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -werkzeug diff --git a/website/web/Lib/site-packages/_cffi_backend.cp36-win_amd64.pyd b/website/web/Lib/site-packages/_cffi_backend.cp36-win_amd64.pyd deleted file mode 100644 index f87d64670b650778d4fe74100568313001718a57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170496 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 kKqL6RZZWk8F;U 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 G|NCD*6q~*P diff --git a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/DESCRIPTION.rst b/website/web/Lib/site-packages/cffi-1.11.4.dist-info/DESCRIPTION.rst deleted file mode 100644 index ef4aa7bb3..000000000 --- a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,13 +0,0 @@ - -CFFI -==== - -Foreign Function Interface for Python calling C code. -Please see the `Documentation `_. - -Contact -------- - -`Mailing list `_ - - diff --git a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/INSTALLER b/website/web/Lib/site-packages/cffi-1.11.4.dist-info/INSTALLER deleted file mode 100644 index a1b589e38..000000000 --- a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/METADATA b/website/web/Lib/site-packages/cffi-1.11.4.dist-info/METADATA deleted file mode 100644 index 549dfe5e4..000000000 --- a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/METADATA +++ /dev/null @@ -1,37 +0,0 @@ -Metadata-Version: 2.0 -Name: cffi -Version: 1.11.4 -Summary: Foreign Function Interface for Python calling C code. -Home-page: http://cffi.readthedocs.org -Author: Armin Rigo, Maciej Fijalkowski -Author-email: python-cffi@googlegroups.com -License: MIT -Description-Content-Type: UNKNOWN -Platform: UNKNOWN -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.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Requires-Dist: pycparser - - -CFFI -==== - -Foreign Function Interface for Python calling C code. -Please see the `Documentation `_. - -Contact -------- - -`Mailing list `_ - - diff --git a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/RECORD b/website/web/Lib/site-packages/cffi-1.11.4.dist-info/RECORD deleted file mode 100644 index 01d1c5060..000000000 --- a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/RECORD +++ /dev/null @@ -1,43 +0,0 @@ -_cffi_backend.cp36-win_amd64.pyd,sha256=likuFoX9C7Qi1bfHpJJHzKgOXmWFdXIN1IbPCbmO7bc,170496 -cffi/__init__.py,sha256=mewOsqyqnxYpvL3XfQFIRYyxcoW2ic60hMResP7gdJM,479 -cffi/_cffi_errors.h,sha256=NLNuKgpRUJ4x0ku4pi-Pe1vT1mzovxBTeHjPZTxCB7U,3804 -cffi/_cffi_include.h,sha256=JuFfmwpRE65vym3Nxr9vDMOIEuv21tXdarkL1l2WNms,12149 -cffi/_embedding.h,sha256=iSs9APxG4SDy_ahlyV1s46_lvWdVBxnuOwaEBN5jOUg,17643 -cffi/api.py,sha256=eUXlc8fTxiS3PjpfBU3sMi8gVgeG4yIsPA6teyNWehI,40221 -cffi/backend_ctypes.py,sha256=XxMfz3Kn_QZhvLLqNXmIL_Z9M8CGlGAa1YWtH6k8wYQ,42086 -cffi/cffi_opcode.py,sha256=v9RdD_ovA8rCtqsC95Ivki5V667rAOhGgs3fb2q9xpM,5724 -cffi/commontypes.py,sha256=QS4uxCDI7JhtTyjh1hlnCA-gynmaszWxJaRRLGkJa1A,2689 -cffi/cparser.py,sha256=R0_gdB8vL1YNf-W5G_5KvV1pOTnZwvuLeioaDvODI6c,39250 -cffi/error.py,sha256=L_J76qbh6LSxH4A64muOUwJKL6zVHC32E3gG1ntUM-A,666 -cffi/ffiplatform.py,sha256=HMXqR8ks2wtdsNxGaWpQ_PyqIvtiuos_vf1qKCy-cwg,4046 -cffi/lock.py,sha256=l9TTdwMIMpi6jDkJGnQgE9cvTIR7CAntIJr8EGHt3pY,747 -cffi/model.py,sha256=-ZXCFO_EPbX3zN3ecx4H2rR0MZZA16ZwldDuv3CzJXU,21495 -cffi/parse_c_type.h,sha256=OdwQfwM9ktq6vlCB43exFQmxDBtj2MBNdK8LYl15tjw,5976 -cffi/recompiler.py,sha256=4qpl0bOTaegsWJbaCvjtRh4q6KH5hWZurnKK1YGEeRk,63092 -cffi/setuptools_ext.py,sha256=6K2HJn-qNTQL-FvILZCH0T90MR6FVelFClL4f8ZCWaQ,7682 -cffi/vengine_cpy.py,sha256=hdyjjZNijLrg_uGMnnFyC-7GG_LxWtwB8BlS2vvVDQ0,41470 -cffi/vengine_gen.py,sha256=Zkq0-EdeZwn6qUvf_CI8iUEs2UxVIvDmKCH1j0-y0GI,26676 -cffi/verifier.py,sha256=J9Enz2rbJb9CHPqWlWQ5uQESoyr0uc7MNWugchjXBv4,11207 -cffi-1.11.4.dist-info/DESCRIPTION.rst,sha256=9ijQLbcqTWNF-iV0RznFiBeBCNrjArA0P-eutKUPw98,220 -cffi-1.11.4.dist-info/METADATA,sha256=uiGWsWy8zEb_-R4-vMutpELIrBKsvCV-_soHfZNjUaw,1174 -cffi-1.11.4.dist-info/RECORD,, -cffi-1.11.4.dist-info/WHEEL,sha256=3o6dJ54ci-MtRFdJCPkLCK5G-vO7QSv3lIQ-NrhglGk,106 -cffi-1.11.4.dist-info/entry_points.txt,sha256=Q9f5C9IpjYxo0d2PK9eUcnkgxHc9pHWwjEMaANPKNCI,76 -cffi-1.11.4.dist-info/metadata.json,sha256=8S4WNSCRPXo6P__ARsF2aUGV0Drrh82dQQxr9Xsj9vw,1192 -cffi-1.11.4.dist-info/top_level.txt,sha256=rE7WR3rZfNKxWI9-jn6hsHCAl7MDkB-FmuQbxWjFehQ,19 -cffi-1.11.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -cffi/__pycache__/api.cpython-36.pyc,, -cffi/__pycache__/backend_ctypes.cpython-36.pyc,, -cffi/__pycache__/cffi_opcode.cpython-36.pyc,, -cffi/__pycache__/commontypes.cpython-36.pyc,, -cffi/__pycache__/cparser.cpython-36.pyc,, -cffi/__pycache__/error.cpython-36.pyc,, -cffi/__pycache__/ffiplatform.cpython-36.pyc,, -cffi/__pycache__/lock.cpython-36.pyc,, -cffi/__pycache__/model.cpython-36.pyc,, -cffi/__pycache__/recompiler.cpython-36.pyc,, -cffi/__pycache__/setuptools_ext.cpython-36.pyc,, -cffi/__pycache__/vengine_cpy.cpython-36.pyc,, -cffi/__pycache__/vengine_gen.cpython-36.pyc,, -cffi/__pycache__/verifier.cpython-36.pyc,, -cffi/__pycache__/__init__.cpython-36.pyc,, diff --git a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/WHEEL b/website/web/Lib/site-packages/cffi-1.11.4.dist-info/WHEEL deleted file mode 100644 index 938a5223f..000000000 --- a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.30.0) -Root-Is-Purelib: false -Tag: cp36-cp36m-win_amd64 - diff --git a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/entry_points.txt b/website/web/Lib/site-packages/cffi-1.11.4.dist-info/entry_points.txt deleted file mode 100644 index eee7e0fb1..000000000 --- a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[distutils.setup_keywords] -cffi_modules = cffi.setuptools_ext:cffi_modules - diff --git a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/metadata.json b/website/web/Lib/site-packages/cffi-1.11.4.dist-info/metadata.json deleted file mode 100644 index 76e93d287..000000000 --- a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["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.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"contacts": [{"email": "python-cffi@googlegroups.com", "name": "Armin Rigo, Maciej Fijalkowski", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://cffi.readthedocs.org"}}, "python.exports": {"distutils.setup_keywords": {"cffi_modules": "cffi.setuptools_ext:cffi_modules"}}}, "extras": [], "generator": "bdist_wheel (0.30.0)", "license": "MIT", "metadata_version": "2.0", "name": "cffi", "run_requires": [{"requires": ["pycparser"]}], "summary": "Foreign Function Interface for Python calling C code.", "version": "1.11.4"} \ No newline at end of file diff --git a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/top_level.txt b/website/web/Lib/site-packages/cffi-1.11.4.dist-info/top_level.txt deleted file mode 100644 index f64577957..000000000 --- a/website/web/Lib/site-packages/cffi-1.11.4.dist-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -_cffi_backend -cffi diff --git a/website/web/Lib/site-packages/cffi/__init__.py b/website/web/Lib/site-packages/cffi/__init__.py deleted file mode 100644 index 519a6fa42..000000000 --- a/website/web/Lib/site-packages/cffi/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -__all__ = ['FFI', 'VerificationError', 'VerificationMissing', 'CDefError', - 'FFIError'] - -from .api import FFI -from .error import CDefError, FFIError, VerificationError, VerificationMissing - -__version__ = "1.11.4" -__version_info__ = (1, 11, 4) - -# The verifier module file names are based on the CRC32 of a string that -# contains the following version number. It may be older than __version__ -# if nothing is clearly incompatible. -__version_verifier_modules__ = "0.8.6" diff --git a/website/web/Lib/site-packages/cffi/_cffi_errors.h b/website/web/Lib/site-packages/cffi/_cffi_errors.h deleted file mode 100644 index 60dcc3b86..000000000 --- a/website/web/Lib/site-packages/cffi/_cffi_errors.h +++ /dev/null @@ -1,145 +0,0 @@ -#ifndef CFFI_MESSAGEBOX -# ifdef _MSC_VER -# define CFFI_MESSAGEBOX 1 -# else -# define CFFI_MESSAGEBOX 0 -# endif -#endif - - -#if CFFI_MESSAGEBOX -/* Windows only: logic to take the Python-CFFI embedding logic - initialization errors and display them in a background thread - with MessageBox. The idea is that if the whole program closes - as a result of this problem, then likely it is already a console - program and you can read the stderr output in the console too. - If it is not a console program, then it will likely show its own - dialog to complain, or generally not abruptly close, and for this - case the background thread should stay alive. -*/ -static void *volatile _cffi_bootstrap_text; - -static PyObject *_cffi_start_error_capture(void) -{ - PyObject *result = NULL; - PyObject *x, *m, *bi; - - if (InterlockedCompareExchangePointer(&_cffi_bootstrap_text, - (void *)1, NULL) != NULL) - return (PyObject *)1; - - m = PyImport_AddModule("_cffi_error_capture"); - if (m == NULL) - goto error; - - result = PyModule_GetDict(m); - if (result == NULL) - goto error; - -#if PY_MAJOR_VERSION >= 3 - bi = PyImport_ImportModule("builtins"); -#else - bi = PyImport_ImportModule("__builtin__"); -#endif - if (bi == NULL) - goto error; - PyDict_SetItemString(result, "__builtins__", bi); - Py_DECREF(bi); - - x = PyRun_String( - "import sys\n" - "class FileLike:\n" - " def write(self, x):\n" - " of.write(x)\n" - " self.buf += x\n" - "fl = FileLike()\n" - "fl.buf = ''\n" - "of = sys.stderr\n" - "sys.stderr = fl\n" - "def done():\n" - " sys.stderr = of\n" - " return fl.buf\n", /* make sure the returned value stays alive */ - Py_file_input, - result, result); - Py_XDECREF(x); - - error: - if (PyErr_Occurred()) - { - PyErr_WriteUnraisable(Py_None); - PyErr_Clear(); - } - return result; -} - -#pragma comment(lib, "user32.lib") - -static DWORD WINAPI _cffi_bootstrap_dialog(LPVOID ignored) -{ - Sleep(666); /* may be interrupted if the whole process is closing */ -#if PY_MAJOR_VERSION >= 3 - MessageBoxW(NULL, (wchar_t *)_cffi_bootstrap_text, - L"Python-CFFI error", - MB_OK | MB_ICONERROR); -#else - MessageBoxA(NULL, (char *)_cffi_bootstrap_text, - "Python-CFFI error", - MB_OK | MB_ICONERROR); -#endif - _cffi_bootstrap_text = NULL; - return 0; -} - -static void _cffi_stop_error_capture(PyObject *ecap) -{ - PyObject *s; - void *text; - - if (ecap == (PyObject *)1) - return; - - if (ecap == NULL) - goto error; - - s = PyRun_String("done()", Py_eval_input, ecap, ecap); - if (s == NULL) - goto error; - - /* Show a dialog box, but in a background thread, and - never show multiple dialog boxes at once. */ -#if PY_MAJOR_VERSION >= 3 - text = PyUnicode_AsWideCharString(s, NULL); -#else - text = PyString_AsString(s); -#endif - - _cffi_bootstrap_text = text; - - if (text != NULL) - { - HANDLE h; - h = CreateThread(NULL, 0, _cffi_bootstrap_dialog, - NULL, 0, NULL); - if (h != NULL) - CloseHandle(h); - } - /* decref the string, but it should stay alive as 'fl.buf' - in the small module above. It will really be freed only if - we later get another similar error. So it's a leak of at - most one copy of the small module. That's fine for this - situation which is usually a "fatal error" anyway. */ - Py_DECREF(s); - PyErr_Clear(); - return; - - error: - _cffi_bootstrap_text = NULL; - PyErr_Clear(); -} - -#else - -static PyObject *_cffi_start_error_capture(void) { return NULL; } -static void _cffi_stop_error_capture(PyObject *ecap) { } - -#endif diff --git a/website/web/Lib/site-packages/cffi/_cffi_include.h b/website/web/Lib/site-packages/cffi/_cffi_include.h deleted file mode 100644 index 37ea74feb..000000000 --- a/website/web/Lib/site-packages/cffi/_cffi_include.h +++ /dev/null @@ -1,308 +0,0 @@ -#define _CFFI_ - -/* We try to define Py_LIMITED_API before including Python.h. - - Mess: we can only define it if Py_DEBUG, Py_TRACE_REFS and - Py_REF_DEBUG are not defined. This is a best-effort approximation: - we can learn about Py_DEBUG from pyconfig.h, but it is unclear if - the same works for the other two macros. Py_DEBUG implies them, - but not the other way around. - - Issue #350 is still open: on Windows, the code here causes it to link - with PYTHON36.DLL (for example) instead of PYTHON3.DLL. A fix was - attempted in 164e526a5515 and 14ce6985e1c3, but reverted: virtualenv - does not make PYTHON3.DLL available, and so the "correctly" compiled - version would not run inside a virtualenv. We will re-apply the fix - after virtualenv has been fixed for some time. For explanation, see - issue #355. For a workaround if you want PYTHON3.DLL and don't worry - about virtualenv, see issue #350. See also 'py_limited_api' in - setuptools_ext.py. -*/ -#if !defined(_CFFI_USE_EMBEDDING) && !defined(Py_LIMITED_API) -# include -# if !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) -# define Py_LIMITED_API -# endif -#endif - -#include -#ifdef __cplusplus -extern "C" { -#endif -#include -#include "parse_c_type.h" - -/* this block of #ifs should be kept exactly identical between - c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py - and cffi/_cffi_include.h */ -#if defined(_MSC_VER) -# include /* for alloca() */ -# if _MSC_VER < 1600 /* MSVC < 2010 */ - typedef __int8 int8_t; - typedef __int16 int16_t; - typedef __int32 int32_t; - typedef __int64 int64_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int64 uint64_t; - typedef __int8 int_least8_t; - typedef __int16 int_least16_t; - typedef __int32 int_least32_t; - typedef __int64 int_least64_t; - typedef unsigned __int8 uint_least8_t; - typedef unsigned __int16 uint_least16_t; - typedef unsigned __int32 uint_least32_t; - typedef unsigned __int64 uint_least64_t; - typedef __int8 int_fast8_t; - typedef __int16 int_fast16_t; - typedef __int32 int_fast32_t; - typedef __int64 int_fast64_t; - typedef unsigned __int8 uint_fast8_t; - typedef unsigned __int16 uint_fast16_t; - typedef unsigned __int32 uint_fast32_t; - typedef unsigned __int64 uint_fast64_t; - typedef __int64 intmax_t; - typedef unsigned __int64 uintmax_t; -# else -# include -# endif -# if _MSC_VER < 1800 /* MSVC < 2013 */ -# ifndef __cplusplus - typedef unsigned char _Bool; -# endif -# endif -#else -# include -# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) -# include -# endif -#endif - -#ifdef __GNUC__ -# define _CFFI_UNUSED_FN __attribute__((unused)) -#else -# define _CFFI_UNUSED_FN /* nothing */ -#endif - -#ifdef __cplusplus -# ifndef _Bool - typedef bool _Bool; /* semi-hackish: C++ has no _Bool; bool is builtin */ -# endif -#endif - -/********** CPython-specific section **********/ -#ifndef PYPY_VERSION - - -#if PY_MAJOR_VERSION >= 3 -# define PyInt_FromLong PyLong_FromLong -#endif - -#define _cffi_from_c_double PyFloat_FromDouble -#define _cffi_from_c_float PyFloat_FromDouble -#define _cffi_from_c_long PyInt_FromLong -#define _cffi_from_c_ulong PyLong_FromUnsignedLong -#define _cffi_from_c_longlong PyLong_FromLongLong -#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong -#define _cffi_from_c__Bool PyBool_FromLong - -#define _cffi_to_c_double PyFloat_AsDouble -#define _cffi_to_c_float PyFloat_AsDouble - -#define _cffi_from_c_int(x, type) \ - (((type)-1) > 0 ? /* unsigned */ \ - (sizeof(type) < sizeof(long) ? \ - PyInt_FromLong((long)x) : \ - sizeof(type) == sizeof(long) ? \ - PyLong_FromUnsignedLong((unsigned long)x) : \ - PyLong_FromUnsignedLongLong((unsigned long long)x)) : \ - (sizeof(type) <= sizeof(long) ? \ - PyInt_FromLong((long)x) : \ - PyLong_FromLongLong((long long)x))) - -#define _cffi_to_c_int(o, type) \ - ((type)( \ - sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \ - : (type)_cffi_to_c_i8(o)) : \ - sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \ - : (type)_cffi_to_c_i16(o)) : \ - sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \ - : (type)_cffi_to_c_i32(o)) : \ - sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \ - : (type)_cffi_to_c_i64(o)) : \ - (Py_FatalError("unsupported size for type " #type), (type)0))) - -#define _cffi_to_c_i8 \ - ((int(*)(PyObject *))_cffi_exports[1]) -#define _cffi_to_c_u8 \ - ((int(*)(PyObject *))_cffi_exports[2]) -#define _cffi_to_c_i16 \ - ((int(*)(PyObject *))_cffi_exports[3]) -#define _cffi_to_c_u16 \ - ((int(*)(PyObject *))_cffi_exports[4]) -#define _cffi_to_c_i32 \ - ((int(*)(PyObject *))_cffi_exports[5]) -#define _cffi_to_c_u32 \ - ((unsigned int(*)(PyObject *))_cffi_exports[6]) -#define _cffi_to_c_i64 \ - ((long long(*)(PyObject *))_cffi_exports[7]) -#define _cffi_to_c_u64 \ - ((unsigned long long(*)(PyObject *))_cffi_exports[8]) -#define _cffi_to_c_char \ - ((int(*)(PyObject *))_cffi_exports[9]) -#define _cffi_from_c_pointer \ - ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[10]) -#define _cffi_to_c_pointer \ - ((char *(*)(PyObject *, struct _cffi_ctypedescr *))_cffi_exports[11]) -#define _cffi_get_struct_layout \ - not used any more -#define _cffi_restore_errno \ - ((void(*)(void))_cffi_exports[13]) -#define _cffi_save_errno \ - ((void(*)(void))_cffi_exports[14]) -#define _cffi_from_c_char \ - ((PyObject *(*)(char))_cffi_exports[15]) -#define _cffi_from_c_deref \ - ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[16]) -#define _cffi_to_c \ - ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[17]) -#define _cffi_from_c_struct \ - ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[18]) -#define _cffi_to_c_wchar_t \ - ((_cffi_wchar_t(*)(PyObject *))_cffi_exports[19]) -#define _cffi_from_c_wchar_t \ - ((PyObject *(*)(_cffi_wchar_t))_cffi_exports[20]) -#define _cffi_to_c_long_double \ - ((long double(*)(PyObject *))_cffi_exports[21]) -#define _cffi_to_c__Bool \ - ((_Bool(*)(PyObject *))_cffi_exports[22]) -#define _cffi_prepare_pointer_call_argument \ - ((Py_ssize_t(*)(struct _cffi_ctypedescr *, \ - PyObject *, char **))_cffi_exports[23]) -#define _cffi_convert_array_from_object \ - ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[24]) -#define _CFFI_CPIDX 25 -#define _cffi_call_python \ - ((void(*)(struct _cffi_externpy_s *, char *))_cffi_exports[_CFFI_CPIDX]) -#define _cffi_to_c_wchar3216_t \ - ((int(*)(PyObject *))_cffi_exports[26]) -#define _cffi_from_c_wchar3216_t \ - ((PyObject *(*)(int))_cffi_exports[27]) -#define _CFFI_NUM_EXPORTS 28 - -struct _cffi_ctypedescr; - -static void *_cffi_exports[_CFFI_NUM_EXPORTS]; - -#define _cffi_type(index) ( \ - assert((((uintptr_t)_cffi_types[index]) & 1) == 0), \ - (struct _cffi_ctypedescr *)_cffi_types[index]) - -static PyObject *_cffi_init(const char *module_name, Py_ssize_t version, - const struct _cffi_type_context_s *ctx) -{ - PyObject *module, *o_arg, *new_module; - void *raw[] = { - (void *)module_name, - (void *)version, - (void *)_cffi_exports, - (void *)ctx, - }; - - module = PyImport_ImportModule("_cffi_backend"); - if (module == NULL) - goto failure; - - o_arg = PyLong_FromVoidPtr((void *)raw); - if (o_arg == NULL) - goto failure; - - new_module = PyObject_CallMethod( - module, (char *)"_init_cffi_1_0_external_module", (char *)"O", o_arg); - - Py_DECREF(o_arg); - Py_DECREF(module); - return new_module; - - failure: - Py_XDECREF(module); - return NULL; -} - - -#ifdef HAVE_WCHAR_H -typedef wchar_t _cffi_wchar_t; -#else -typedef uint16_t _cffi_wchar_t; /* same random pick as _cffi_backend.c */ -#endif - -_CFFI_UNUSED_FN static uint16_t _cffi_to_c_char16_t(PyObject *o) -{ - if (sizeof(_cffi_wchar_t) == 2) - return (uint16_t)_cffi_to_c_wchar_t(o); - else - return (uint16_t)_cffi_to_c_wchar3216_t(o); -} - -_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char16_t(uint16_t x) -{ - if (sizeof(_cffi_wchar_t) == 2) - return _cffi_from_c_wchar_t((_cffi_wchar_t)x); - else - return _cffi_from_c_wchar3216_t((int)x); -} - -_CFFI_UNUSED_FN static int _cffi_to_c_char32_t(PyObject *o) -{ - if (sizeof(_cffi_wchar_t) == 4) - return (int)_cffi_to_c_wchar_t(o); - else - return (int)_cffi_to_c_wchar3216_t(o); -} - -_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char32_t(int x) -{ - if (sizeof(_cffi_wchar_t) == 4) - return _cffi_from_c_wchar_t((_cffi_wchar_t)x); - else - return _cffi_from_c_wchar3216_t(x); -} - - -/********** end CPython-specific section **********/ -#else -_CFFI_UNUSED_FN -static void (*_cffi_call_python_org)(struct _cffi_externpy_s *, char *); -# define _cffi_call_python _cffi_call_python_org -#endif - - -#define _cffi_array_len(array) (sizeof(array) / sizeof((array)[0])) - -#define _cffi_prim_int(size, sign) \ - ((size) == 1 ? ((sign) ? _CFFI_PRIM_INT8 : _CFFI_PRIM_UINT8) : \ - (size) == 2 ? ((sign) ? _CFFI_PRIM_INT16 : _CFFI_PRIM_UINT16) : \ - (size) == 4 ? ((sign) ? _CFFI_PRIM_INT32 : _CFFI_PRIM_UINT32) : \ - (size) == 8 ? ((sign) ? _CFFI_PRIM_INT64 : _CFFI_PRIM_UINT64) : \ - _CFFI__UNKNOWN_PRIM) - -#define _cffi_prim_float(size) \ - ((size) == sizeof(float) ? _CFFI_PRIM_FLOAT : \ - (size) == sizeof(double) ? _CFFI_PRIM_DOUBLE : \ - (size) == sizeof(long double) ? _CFFI__UNKNOWN_LONG_DOUBLE : \ - _CFFI__UNKNOWN_FLOAT_PRIM) - -#define _cffi_check_int(got, got_nonpos, expected) \ - ((got_nonpos) == (expected <= 0) && \ - (got) == (unsigned long long)expected) - -#ifdef MS_WIN32 -# define _cffi_stdcall __stdcall -#else -# define _cffi_stdcall /* nothing */ -#endif - -#ifdef __cplusplus -} -#endif diff --git a/website/web/Lib/site-packages/cffi/_embedding.h b/website/web/Lib/site-packages/cffi/_embedding.h deleted file mode 100644 index 2b744dfa5..000000000 --- a/website/web/Lib/site-packages/cffi/_embedding.h +++ /dev/null @@ -1,536 +0,0 @@ - -/***** Support code for embedding *****/ - -#ifdef __cplusplus -extern "C" { -#endif - - -#if defined(_WIN32) -# define CFFI_DLLEXPORT __declspec(dllexport) -#elif defined(__GNUC__) -# define CFFI_DLLEXPORT __attribute__((visibility("default"))) -#else -# define CFFI_DLLEXPORT /* nothing */ -#endif - - -/* There are two global variables of type _cffi_call_python_fnptr: - - * _cffi_call_python, which we declare just below, is the one called - by ``extern "Python"`` implementations. - - * _cffi_call_python_org, which on CPython is actually part of the - _cffi_exports[] array, is the function pointer copied from - _cffi_backend. - - After initialization is complete, both are equal. However, the - first one remains equal to &_cffi_start_and_call_python until the - very end of initialization, when we are (or should be) sure that - concurrent threads also see a completely initialized world, and - only then is it changed. -*/ -#undef _cffi_call_python -typedef void (*_cffi_call_python_fnptr)(struct _cffi_externpy_s *, char *); -static void _cffi_start_and_call_python(struct _cffi_externpy_s *, char *); -static _cffi_call_python_fnptr _cffi_call_python = &_cffi_start_and_call_python; - - -#ifndef _MSC_VER - /* --- Assuming a GCC not infinitely old --- */ -# define cffi_compare_and_swap(l,o,n) __sync_bool_compare_and_swap(l,o,n) -# define cffi_write_barrier() __sync_synchronize() -# if !defined(__amd64__) && !defined(__x86_64__) && \ - !defined(__i386__) && !defined(__i386) -# define cffi_read_barrier() __sync_synchronize() -# else -# define cffi_read_barrier() (void)0 -# endif -#else - /* --- Windows threads version --- */ -# include -# define cffi_compare_and_swap(l,o,n) \ - (InterlockedCompareExchangePointer(l,n,o) == (o)) -# define cffi_write_barrier() InterlockedCompareExchange(&_cffi_dummy,0,0) -# define cffi_read_barrier() (void)0 -static volatile LONG _cffi_dummy; -#endif - -#ifdef WITH_THREAD -# ifndef _MSC_VER -# include - static pthread_mutex_t _cffi_embed_startup_lock; -# else - static CRITICAL_SECTION _cffi_embed_startup_lock; -# endif - static char _cffi_embed_startup_lock_ready = 0; -#endif - -static void _cffi_acquire_reentrant_mutex(void) -{ - static void *volatile lock = NULL; - - while (!cffi_compare_and_swap(&lock, NULL, (void *)1)) { - /* should ideally do a spin loop instruction here, but - hard to do it portably and doesn't really matter I - think: pthread_mutex_init() should be very fast, and - this is only run at start-up anyway. */ - } - -#ifdef WITH_THREAD - if (!_cffi_embed_startup_lock_ready) { -# ifndef _MSC_VER - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&_cffi_embed_startup_lock, &attr); -# else - InitializeCriticalSection(&_cffi_embed_startup_lock); -# endif - _cffi_embed_startup_lock_ready = 1; - } -#endif - - while (!cffi_compare_and_swap(&lock, (void *)1, NULL)) - ; - -#ifndef _MSC_VER - pthread_mutex_lock(&_cffi_embed_startup_lock); -#else - EnterCriticalSection(&_cffi_embed_startup_lock); -#endif -} - -static void _cffi_release_reentrant_mutex(void) -{ -#ifndef _MSC_VER - pthread_mutex_unlock(&_cffi_embed_startup_lock); -#else - LeaveCriticalSection(&_cffi_embed_startup_lock); -#endif -} - - -/********** CPython-specific section **********/ -#ifndef PYPY_VERSION - -#include "_cffi_errors.h" - - -#define _cffi_call_python_org _cffi_exports[_CFFI_CPIDX] - -PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(void); /* forward */ - -static void _cffi_py_initialize(void) -{ - /* XXX use initsigs=0, which "skips initialization registration of - signal handlers, which might be useful when Python is - embedded" according to the Python docs. But review and think - if it should be a user-controllable setting. - - XXX we should also give a way to write errors to a buffer - instead of to stderr. - - XXX if importing 'site' fails, CPython (any version) calls - exit(). Should we try to work around this behavior here? - */ - Py_InitializeEx(0); -} - -static int _cffi_initialize_python(void) -{ - /* This initializes Python, imports _cffi_backend, and then the - present .dll/.so is set up as a CPython C extension module. - */ - int result; - PyGILState_STATE state; - PyObject *pycode=NULL, *global_dict=NULL, *x; - -#if PY_MAJOR_VERSION >= 3 - /* see comments in _cffi_carefully_make_gil() about the - Python2/Python3 difference - */ -#else - /* Acquire the GIL. We have no threadstate here. If Python is - already initialized, it is possible that there is already one - existing for this thread, but it is not made current now. - */ - PyEval_AcquireLock(); - - _cffi_py_initialize(); - - /* The Py_InitializeEx() sometimes made a threadstate for us, but - not always. Indeed Py_InitializeEx() could be called and do - nothing. So do we have a threadstate, or not? We don't know, - but we can replace it with NULL in all cases. - */ - (void)PyThreadState_Swap(NULL); - - /* Now we can release the GIL and re-acquire immediately using the - logic of PyGILState(), which handles making or installing the - correct threadstate. - */ - PyEval_ReleaseLock(); -#endif - state = PyGILState_Ensure(); - - /* Call the initxxx() function from the present module. It will - create and initialize us as a CPython extension module, instead - of letting the startup Python code do it---it might reimport - the same .dll/.so and get maybe confused on some platforms. - It might also have troubles locating the .dll/.so again for all - I know. - */ - (void)_CFFI_PYTHON_STARTUP_FUNC(); - if (PyErr_Occurred()) - goto error; - - /* Now run the Python code provided to ffi.embedding_init_code(). - */ - pycode = Py_CompileString(_CFFI_PYTHON_STARTUP_CODE, - "", - Py_file_input); - if (pycode == NULL) - goto error; - global_dict = PyDict_New(); - if (global_dict == NULL) - goto error; - if (PyDict_SetItemString(global_dict, "__builtins__", - PyThreadState_GET()->interp->builtins) < 0) - goto error; - x = PyEval_EvalCode( -#if PY_MAJOR_VERSION < 3 - (PyCodeObject *) -#endif - pycode, global_dict, global_dict); - if (x == NULL) - goto error; - Py_DECREF(x); - - /* Done! Now if we've been called from - _cffi_start_and_call_python() in an ``extern "Python"``, we can - only hope that the Python code did correctly set up the - corresponding @ffi.def_extern() function. Otherwise, the - general logic of ``extern "Python"`` functions (inside the - _cffi_backend module) will find that the reference is still - missing and print an error. - */ - result = 0; - done: - Py_XDECREF(pycode); - Py_XDECREF(global_dict); - PyGILState_Release(state); - return result; - - error:; - { - /* Print as much information as potentially useful. - Debugging load-time failures with embedding is not fun - */ - PyObject *ecap; - PyObject *exception, *v, *tb, *f, *modules, *mod; - PyErr_Fetch(&exception, &v, &tb); - ecap = _cffi_start_error_capture(); - f = PySys_GetObject((char *)"stderr"); - if (f != NULL && f != Py_None) { - PyFile_WriteString( - "Failed to initialize the Python-CFFI embedding logic:\n\n", f); - } - - if (exception != NULL) { - PyErr_NormalizeException(&exception, &v, &tb); - PyErr_Display(exception, v, tb); - } - Py_XDECREF(exception); - Py_XDECREF(v); - Py_XDECREF(tb); - - if (f != NULL && f != Py_None) { - PyFile_WriteString("\nFrom: " _CFFI_MODULE_NAME - "\ncompiled with cffi version: 1.11.4" - "\n_cffi_backend module: ", f); - modules = PyImport_GetModuleDict(); - mod = PyDict_GetItemString(modules, "_cffi_backend"); - if (mod == NULL) { - PyFile_WriteString("not loaded", f); - } - else { - v = PyObject_GetAttrString(mod, "__file__"); - PyFile_WriteObject(v, f, 0); - Py_XDECREF(v); - } - PyFile_WriteString("\nsys.path: ", f); - PyFile_WriteObject(PySys_GetObject((char *)"path"), f, 0); - PyFile_WriteString("\n\n", f); - } - _cffi_stop_error_capture(ecap); - } - result = -1; - goto done; -} - -PyAPI_DATA(char *) _PyParser_TokenNames[]; /* from CPython */ - -static int _cffi_carefully_make_gil(void) -{ - /* This does the basic initialization of Python. It can be called - completely concurrently from unrelated threads. It assumes - that we don't hold the GIL before (if it exists), and we don't - hold it afterwards. - - What it really does is completely different in Python 2 and - Python 3. - - Python 2 - ======== - - Initialize the GIL, without initializing the rest of Python, - by calling PyEval_InitThreads(). - - PyEval_InitThreads() must not be called concurrently at all. - So we use a global variable as a simple spin lock. This global - variable must be from 'libpythonX.Y.so', not from this - cffi-based extension module, because it must be shared from - different cffi-based extension modules. We choose - _PyParser_TokenNames[0] as a completely arbitrary pointer value - that is never written to. The default is to point to the - string "ENDMARKER". We change it temporarily to point to the - next character in that string. (Yes, I know it's REALLY - obscure.) - - Python 3 - ======== - - In Python 3, PyEval_InitThreads() cannot be called before - Py_InitializeEx() any more. So this function calls - Py_InitializeEx() first. It uses the same obscure logic to - make sure we never call it concurrently. - - Arguably, this is less good on the spinlock, because - Py_InitializeEx() takes much longer to run than - PyEval_InitThreads(). But I didn't find a way around it. - */ - -#ifdef WITH_THREAD - char *volatile *lock = (char *volatile *)_PyParser_TokenNames; - char *old_value; - - while (1) { /* spin loop */ - old_value = *lock; - if (old_value[0] == 'E') { - assert(old_value[1] == 'N'); - if (cffi_compare_and_swap(lock, old_value, old_value + 1)) - break; - } - else { - assert(old_value[0] == 'N'); - /* should ideally do a spin loop instruction here, but - hard to do it portably and doesn't really matter I - think: PyEval_InitThreads() should be very fast, and - this is only run at start-up anyway. */ - } - } -#endif - -#if PY_MAJOR_VERSION >= 3 - /* Python 3: call Py_InitializeEx() */ - { - PyGILState_STATE state = PyGILState_UNLOCKED; - if (!Py_IsInitialized()) - _cffi_py_initialize(); - else - state = PyGILState_Ensure(); - - PyEval_InitThreads(); - PyGILState_Release(state); - } -#else - /* Python 2: call PyEval_InitThreads() */ -# ifdef WITH_THREAD - if (!PyEval_ThreadsInitialized()) { - PyEval_InitThreads(); /* makes the GIL */ - PyEval_ReleaseLock(); /* then release it */ - } - /* else: there is already a GIL, but we still needed to do the - spinlock dance to make sure that we see it as fully ready */ -# endif -#endif - -#ifdef WITH_THREAD - /* release the lock */ - while (!cffi_compare_and_swap(lock, old_value + 1, old_value)) - ; -#endif - - return 0; -} - -/********** end CPython-specific section **********/ - - -#else - - -/********** PyPy-specific section **********/ - -PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(const void *[]); /* forward */ - -static struct _cffi_pypy_init_s { - const char *name; - void (*func)(const void *[]); - const char *code; -} _cffi_pypy_init = { - _CFFI_MODULE_NAME, - (void(*)(const void *[]))_CFFI_PYTHON_STARTUP_FUNC, - _CFFI_PYTHON_STARTUP_CODE, -}; - -extern int pypy_carefully_make_gil(const char *); -extern int pypy_init_embedded_cffi_module(int, struct _cffi_pypy_init_s *); - -static int _cffi_carefully_make_gil(void) -{ - return pypy_carefully_make_gil(_CFFI_MODULE_NAME); -} - -static int _cffi_initialize_python(void) -{ - return pypy_init_embedded_cffi_module(0xB011, &_cffi_pypy_init); -} - -/********** end PyPy-specific section **********/ - - -#endif - - -#ifdef __GNUC__ -__attribute__((noinline)) -#endif -static _cffi_call_python_fnptr _cffi_start_python(void) -{ - /* Delicate logic to initialize Python. This function can be - called multiple times concurrently, e.g. when the process calls - its first ``extern "Python"`` functions in multiple threads at - once. It can also be called recursively, in which case we must - ignore it. We also have to consider what occurs if several - different cffi-based extensions reach this code in parallel - threads---it is a different copy of the code, then, and we - can't have any shared global variable unless it comes from - 'libpythonX.Y.so'. - - Idea: - - * _cffi_carefully_make_gil(): "carefully" call - PyEval_InitThreads() (possibly with Py_InitializeEx() first). - - * then we use a (local) custom lock to make sure that a call to this - cffi-based extension will wait if another call to the *same* - extension is running the initialization in another thread. - It is reentrant, so that a recursive call will not block, but - only one from a different thread. - - * then we grab the GIL and (Python 2) we call Py_InitializeEx(). - At this point, concurrent calls to Py_InitializeEx() are not - possible: we have the GIL. - - * do the rest of the specific initialization, which may - temporarily release the GIL but not the custom lock. - Only release the custom lock when we are done. - */ - static char called = 0; - - if (_cffi_carefully_make_gil() != 0) - return NULL; - - _cffi_acquire_reentrant_mutex(); - - /* Here the GIL exists, but we don't have it. We're only protected - from concurrency by the reentrant mutex. */ - - /* This file only initializes the embedded module once, the first - time this is called, even if there are subinterpreters. */ - if (!called) { - called = 1; /* invoke _cffi_initialize_python() only once, - but don't set '_cffi_call_python' right now, - otherwise concurrent threads won't call - this function at all (we need them to wait) */ - if (_cffi_initialize_python() == 0) { - /* now initialization is finished. Switch to the fast-path. */ - - /* We would like nobody to see the new value of - '_cffi_call_python' without also seeing the rest of the - data initialized. However, this is not possible. But - the new value of '_cffi_call_python' is the function - 'cffi_call_python()' from _cffi_backend. So: */ - cffi_write_barrier(); - /* ^^^ we put a write barrier here, and a corresponding - read barrier at the start of cffi_call_python(). This - ensures that after that read barrier, we see everything - done here before the write barrier. - */ - - assert(_cffi_call_python_org != NULL); - _cffi_call_python = (_cffi_call_python_fnptr)_cffi_call_python_org; - } - else { - /* initialization failed. Reset this to NULL, even if it was - already set to some other value. Future calls to - _cffi_start_python() are still forced to occur, and will - always return NULL from now on. */ - _cffi_call_python_org = NULL; - } - } - - _cffi_release_reentrant_mutex(); - - return (_cffi_call_python_fnptr)_cffi_call_python_org; -} - -static -void _cffi_start_and_call_python(struct _cffi_externpy_s *externpy, char *args) -{ - _cffi_call_python_fnptr fnptr; - int current_err = errno; -#ifdef _MSC_VER - int current_lasterr = GetLastError(); -#endif - fnptr = _cffi_start_python(); - if (fnptr == NULL) { - fprintf(stderr, "function %s() called, but initialization code " - "failed. Returning 0.\n", externpy->name); - memset(args, 0, externpy->size_of_result); - } -#ifdef _MSC_VER - SetLastError(current_lasterr); -#endif - errno = current_err; - - if (fnptr != NULL) - fnptr(externpy, args); -} - - -/* The cffi_start_python() function makes sure Python is initialized - and our cffi module is set up. It can be called manually from the - user C code. The same effect is obtained automatically from any - dll-exported ``extern "Python"`` function. This function returns - -1 if initialization failed, 0 if all is OK. */ -_CFFI_UNUSED_FN -static int cffi_start_python(void) -{ - if (_cffi_call_python == &_cffi_start_and_call_python) { - if (_cffi_start_python() == NULL) - return -1; - } - cffi_read_barrier(); - return 0; -} - -#undef cffi_compare_and_swap -#undef cffi_write_barrier -#undef cffi_read_barrier - -#ifdef __cplusplus -} -#endif diff --git a/website/web/Lib/site-packages/cffi/api.py b/website/web/Lib/site-packages/cffi/api.py deleted file mode 100644 index 446e55481..000000000 --- a/website/web/Lib/site-packages/cffi/api.py +++ /dev/null @@ -1,925 +0,0 @@ -import sys, types -from .lock import allocate_lock -from .error import CDefError -from . import model - -try: - callable -except NameError: - # Python 3.1 - from collections import Callable - callable = lambda x: isinstance(x, Callable) - -try: - basestring -except NameError: - # Python 3.x - basestring = str - - - -class FFI(object): - r''' - The main top-level class that you instantiate once, or once per module. - - Example usage: - - ffi = FFI() - ffi.cdef(""" - int printf(const char *, ...); - """) - - C = ffi.dlopen(None) # standard library - -or- - C = ffi.verify() # use a C compiler: verify the decl above is right - - C.printf("hello, %s!\n", ffi.new("char[]", "world")) - ''' - - def __init__(self, backend=None): - """Create an FFI instance. The 'backend' argument is used to - select a non-default backend, mostly for tests. - """ - if backend is None: - # You need PyPy (>= 2.0 beta), or a CPython (>= 2.6) with - # _cffi_backend.so compiled. - import _cffi_backend as backend - from . import __version__ - if backend.__version__ != __version__: - # bad version! Try to be as explicit as possible. - if hasattr(backend, '__file__'): - # CPython - raise Exception("Version mismatch: this is the 'cffi' package version %s, located in %r. When we import the top-level '_cffi_backend' extension module, we get version %s, located in %r. The two versions should be equal; check your installation." % ( - __version__, __file__, - backend.__version__, backend.__file__)) - else: - # PyPy - raise Exception("Version mismatch: this is the 'cffi' package version %s, located in %r. This interpreter comes with a built-in '_cffi_backend' module, which is version %s. The two versions should be equal; check your installation." % ( - __version__, __file__, backend.__version__)) - # (If you insist you can also try to pass the option - # 'backend=backend_ctypes.CTypesBackend()', but don't - # rely on it! It's probably not going to work well.) - - from . import cparser - self._backend = backend - self._lock = allocate_lock() - self._parser = cparser.Parser() - self._cached_btypes = {} - self._parsed_types = types.ModuleType('parsed_types').__dict__ - self._new_types = types.ModuleType('new_types').__dict__ - self._function_caches = [] - self._libraries = [] - self._cdefsources = [] - self._included_ffis = [] - self._windows_unicode = None - self._init_once_cache = {} - self._cdef_version = None - self._embedding = None - self._typecache = model.get_typecache(backend) - if hasattr(backend, 'set_ffi'): - backend.set_ffi(self) - for name in list(backend.__dict__): - if name.startswith('RTLD_'): - setattr(self, name, getattr(backend, name)) - # - with self._lock: - self.BVoidP = self._get_cached_btype(model.voidp_type) - self.BCharA = self._get_cached_btype(model.char_array_type) - if isinstance(backend, types.ModuleType): - # _cffi_backend: attach these constants to the class - if not hasattr(FFI, 'NULL'): - FFI.NULL = self.cast(self.BVoidP, 0) - FFI.CData, FFI.CType = backend._get_types() - else: - # ctypes backend: attach these constants to the instance - self.NULL = self.cast(self.BVoidP, 0) - self.CData, self.CType = backend._get_types() - self.buffer = backend.buffer - - def cdef(self, csource, override=False, packed=False): - """Parse the given C source. This registers all declared functions, - types, and global variables. The functions and global variables can - then be accessed via either 'ffi.dlopen()' or 'ffi.verify()'. - The types can be used in 'ffi.new()' and other functions. - If 'packed' is specified as True, all structs declared inside this - cdef are packed, i.e. laid out without any field alignment at all. - """ - self._cdef(csource, override=override, packed=packed) - - def embedding_api(self, csource, packed=False): - self._cdef(csource, packed=packed, dllexport=True) - if self._embedding is None: - self._embedding = '' - - def _cdef(self, csource, override=False, **options): - if not isinstance(csource, str): # unicode, on Python 2 - if not isinstance(csource, basestring): - raise TypeError("cdef() argument must be a string") - csource = csource.encode('ascii') - with self._lock: - self._cdef_version = object() - self._parser.parse(csource, override=override, **options) - self._cdefsources.append(csource) - if override: - for cache in self._function_caches: - cache.clear() - finishlist = self._parser._recomplete - if finishlist: - self._parser._recomplete = [] - for tp in finishlist: - tp.finish_backend_type(self, finishlist) - - def dlopen(self, name, flags=0): - """Load and return a dynamic library identified by 'name'. - The standard C library can be loaded by passing None. - Note that functions and types declared by 'ffi.cdef()' are not - linked to a particular library, just like C headers; in the - library we only look for the actual (untyped) symbols. - """ - assert isinstance(name, basestring) or name is None - with self._lock: - lib, function_cache = _make_ffi_library(self, name, flags) - self._function_caches.append(function_cache) - self._libraries.append(lib) - return lib - - def _typeof_locked(self, cdecl): - # call me with the lock! - key = cdecl - if key in self._parsed_types: - return self._parsed_types[key] - # - if not isinstance(cdecl, str): # unicode, on Python 2 - cdecl = cdecl.encode('ascii') - # - type = self._parser.parse_type(cdecl) - really_a_function_type = type.is_raw_function - if really_a_function_type: - type = type.as_function_pointer() - btype = self._get_cached_btype(type) - result = btype, really_a_function_type - self._parsed_types[key] = result - return result - - def _typeof(self, cdecl, consider_function_as_funcptr=False): - # string -> ctype object - try: - result = self._parsed_types[cdecl] - except KeyError: - with self._lock: - result = self._typeof_locked(cdecl) - # - btype, really_a_function_type = result - if really_a_function_type and not consider_function_as_funcptr: - raise CDefError("the type %r is a function type, not a " - "pointer-to-function type" % (cdecl,)) - return btype - - def typeof(self, cdecl): - """Parse the C type given as a string and return the - corresponding object. - It can also be used on 'cdata' instance to get its C type. - """ - if isinstance(cdecl, basestring): - return self._typeof(cdecl) - if isinstance(cdecl, self.CData): - return self._backend.typeof(cdecl) - if isinstance(cdecl, types.BuiltinFunctionType): - res = _builtin_function_type(cdecl) - if res is not None: - return res - if (isinstance(cdecl, types.FunctionType) - and hasattr(cdecl, '_cffi_base_type')): - with self._lock: - return self._get_cached_btype(cdecl._cffi_base_type) - raise TypeError(type(cdecl)) - - def sizeof(self, cdecl): - """Return the size in bytes of the argument. It can be a - string naming a C type, or a 'cdata' instance. - """ - if isinstance(cdecl, basestring): - BType = self._typeof(cdecl) - return self._backend.sizeof(BType) - else: - return self._backend.sizeof(cdecl) - - def alignof(self, cdecl): - """Return the natural alignment size in bytes of the C type - given as a string. - """ - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl) - return self._backend.alignof(cdecl) - - def offsetof(self, cdecl, *fields_or_indexes): - """Return the offset of the named field inside the given - structure or array, which must be given as a C type name. - You can give several field names in case of nested structures. - You can also give numeric values which correspond to array - items, in case of an array type. - """ - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl) - return self._typeoffsetof(cdecl, *fields_or_indexes)[1] - - def new(self, cdecl, init=None): - """Allocate an instance according to the specified C type and - return a pointer to it. The specified C type must be either a - pointer or an array: ``new('X *')`` allocates an X and returns - a pointer to it, whereas ``new('X[n]')`` allocates an array of - n X'es and returns an array referencing it (which works - mostly like a pointer, like in C). You can also use - ``new('X[]', n)`` to allocate an array of a non-constant - length n. - - The memory is initialized following the rules of declaring a - global variable in C: by default it is zero-initialized, but - an explicit initializer can be given which can be used to - fill all or part of the memory. - - When the returned object goes out of scope, the memory - is freed. In other words the returned object has - ownership of the value of type 'cdecl' that it points to. This - means that the raw data can be used as long as this object is - kept alive, but must not be used for a longer time. Be careful - about that when copying the pointer to the memory somewhere - else, e.g. into another structure. - """ - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl) - return self._backend.newp(cdecl, init) - - def new_allocator(self, alloc=None, free=None, - should_clear_after_alloc=True): - """Return a new allocator, i.e. a function that behaves like ffi.new() - but uses the provided low-level 'alloc' and 'free' functions. - - 'alloc' is called with the size as argument. If it returns NULL, a - MemoryError is raised. 'free' is called with the result of 'alloc' - as argument. Both can be either Python function or directly C - functions. If 'free' is None, then no free function is called. - If both 'alloc' and 'free' are None, the default is used. - - If 'should_clear_after_alloc' is set to False, then the memory - returned by 'alloc' is assumed to be already cleared (or you are - fine with garbage); otherwise CFFI will clear it. - """ - compiled_ffi = self._backend.FFI() - allocator = compiled_ffi.new_allocator(alloc, free, - should_clear_after_alloc) - def allocate(cdecl, init=None): - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl) - return allocator(cdecl, init) - return allocate - - def cast(self, cdecl, source): - """Similar to a C cast: returns an instance of the named C - type initialized with the given 'source'. The source is - casted between integers or pointers of any type. - """ - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl) - return self._backend.cast(cdecl, source) - - def string(self, cdata, maxlen=-1): - """Return a Python string (or unicode string) from the 'cdata'. - If 'cdata' is a pointer or array of characters or bytes, returns - the null-terminated string. The returned string extends until - the first null character, or at most 'maxlen' characters. If - 'cdata' is an array then 'maxlen' defaults to its length. - - If 'cdata' is a pointer or array of wchar_t, returns a unicode - string following the same rules. - - If 'cdata' is a single character or byte or a wchar_t, returns - it as a string or unicode string. - - If 'cdata' is an enum, returns the value of the enumerator as a - string, or 'NUMBER' if the value is out of range. - """ - return self._backend.string(cdata, maxlen) - - def unpack(self, cdata, length): - """Unpack an array of C data of the given length, - returning a Python string/unicode/list. - - If 'cdata' is a pointer to 'char', returns a byte string. - It does not stop at the first null. This is equivalent to: - ffi.buffer(cdata, length)[:] - - If 'cdata' is a pointer to 'wchar_t', returns a unicode string. - 'length' is measured in wchar_t's; it is not the size in bytes. - - If 'cdata' is a pointer to anything else, returns a list of - 'length' items. This is a faster equivalent to: - [cdata[i] for i in range(length)] - """ - return self._backend.unpack(cdata, length) - - #def buffer(self, cdata, size=-1): - # """Return a read-write buffer object that references the raw C data - # pointed to by the given 'cdata'. The 'cdata' must be a pointer or - # an array. Can be passed to functions expecting a buffer, or directly - # manipulated with: - # - # buf[:] get a copy of it in a regular string, or - # buf[idx] as a single character - # buf[:] = ... - # buf[idx] = ... change the content - # """ - # note that 'buffer' is a type, set on this instance by __init__ - - def from_buffer(self, python_buffer): - """Return a that points to the data of the - given Python object, which must support the buffer interface. - Note that this is not meant to be used on the built-in types - str or unicode (you can build 'char[]' arrays explicitly) - but only on objects containing large quantities of raw data - in some other format, like 'array.array' or numpy arrays. - """ - return self._backend.from_buffer(self.BCharA, python_buffer) - - def memmove(self, dest, src, n): - """ffi.memmove(dest, src, n) copies n bytes of memory from src to dest. - - Like the C function memmove(), the memory areas may overlap; - apart from that it behaves like the C function memcpy(). - - 'src' can be any cdata ptr or array, or any Python buffer object. - 'dest' can be any cdata ptr or array, or a writable Python buffer - object. The size to copy, 'n', is always measured in bytes. - - Unlike other methods, this one supports all Python buffer including - byte strings and bytearrays---but it still does not support - non-contiguous buffers. - """ - return self._backend.memmove(dest, src, n) - - def callback(self, cdecl, python_callable=None, error=None, onerror=None): - """Return a callback object or a decorator making such a - callback object. 'cdecl' must name a C function pointer type. - The callback invokes the specified 'python_callable' (which may - be provided either directly or via a decorator). Important: the - callback object must be manually kept alive for as long as the - callback may be invoked from the C level. - """ - def callback_decorator_wrap(python_callable): - if not callable(python_callable): - raise TypeError("the 'python_callable' argument " - "is not callable") - return self._backend.callback(cdecl, python_callable, - error, onerror) - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl, consider_function_as_funcptr=True) - if python_callable is None: - return callback_decorator_wrap # decorator mode - else: - return callback_decorator_wrap(python_callable) # direct mode - - def getctype(self, cdecl, replace_with=''): - """Return a string giving the C type 'cdecl', which may be itself - a string or a object. If 'replace_with' is given, it gives - extra text to append (or insert for more complicated C types), like - a variable name, or '*' to get actually the C type 'pointer-to-cdecl'. - """ - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl) - replace_with = replace_with.strip() - if (replace_with.startswith('*') - and '&[' in self._backend.getcname(cdecl, '&')): - replace_with = '(%s)' % replace_with - elif replace_with and not replace_with[0] in '[(': - replace_with = ' ' + replace_with - return self._backend.getcname(cdecl, replace_with) - - def gc(self, cdata, destructor, size=0): - """Return a new cdata object that points to the same - data. Later, when this new cdata object is garbage-collected, - 'destructor(old_cdata_object)' will be called. - - The optional 'size' gives an estimate of the size, used to - trigger the garbage collection more eagerly. So far only used - on PyPy. It tells the GC that the returned object keeps alive - roughly 'size' bytes of external memory. - """ - return self._backend.gcp(cdata, destructor, size) - - def _get_cached_btype(self, type): - assert self._lock.acquire(False) is False - # call me with the lock! - try: - BType = self._cached_btypes[type] - except KeyError: - finishlist = [] - BType = type.get_cached_btype(self, finishlist) - for type in finishlist: - type.finish_backend_type(self, finishlist) - return BType - - def verify(self, source='', tmpdir=None, **kwargs): - """Verify that the current ffi signatures compile on this - machine, and return a dynamic library object. The dynamic - library can be used to call functions and access global - variables declared in this 'ffi'. The library is compiled - by the C compiler: it gives you C-level API compatibility - (including calling macros). This is unlike 'ffi.dlopen()', - which requires binary compatibility in the signatures. - """ - from .verifier import Verifier, _caller_dir_pycache - # - # If set_unicode(True) was called, insert the UNICODE and - # _UNICODE macro declarations - if self._windows_unicode: - self._apply_windows_unicode(kwargs) - # - # Set the tmpdir here, and not in Verifier.__init__: it picks - # up the caller's directory, which we want to be the caller of - # ffi.verify(), as opposed to the caller of Veritier(). - tmpdir = tmpdir or _caller_dir_pycache() - # - # Make a Verifier() and use it to load the library. - self.verifier = Verifier(self, source, tmpdir, **kwargs) - lib = self.verifier.load_library() - # - # Save the loaded library for keep-alive purposes, even - # if the caller doesn't keep it alive itself (it should). - self._libraries.append(lib) - return lib - - def _get_errno(self): - return self._backend.get_errno() - def _set_errno(self, errno): - self._backend.set_errno(errno) - errno = property(_get_errno, _set_errno, None, - "the value of 'errno' from/to the C calls") - - def getwinerror(self, code=-1): - return self._backend.getwinerror(code) - - def _pointer_to(self, ctype): - with self._lock: - return model.pointer_cache(self, ctype) - - def addressof(self, cdata, *fields_or_indexes): - """Return the address of a . - If 'fields_or_indexes' are given, returns the address of that - field or array item in the structure or array, recursively in - case of nested structures. - """ - try: - ctype = self._backend.typeof(cdata) - except TypeError: - if '__addressof__' in type(cdata).__dict__: - return type(cdata).__addressof__(cdata, *fields_or_indexes) - raise - if fields_or_indexes: - ctype, offset = self._typeoffsetof(ctype, *fields_or_indexes) - else: - if ctype.kind == "pointer": - raise TypeError("addressof(pointer)") - offset = 0 - ctypeptr = self._pointer_to(ctype) - return self._backend.rawaddressof(ctypeptr, cdata, offset) - - def _typeoffsetof(self, ctype, field_or_index, *fields_or_indexes): - ctype, offset = self._backend.typeoffsetof(ctype, field_or_index) - for field1 in fields_or_indexes: - ctype, offset1 = self._backend.typeoffsetof(ctype, field1, 1) - offset += offset1 - return ctype, offset - - def include(self, ffi_to_include): - """Includes the typedefs, structs, unions and enums defined - in another FFI instance. Usage is similar to a #include in C, - where a part of the program might include types defined in - another part for its own usage. Note that the include() - method has no effect on functions, constants and global - variables, which must anyway be accessed directly from the - lib object returned by the original FFI instance. - """ - if not isinstance(ffi_to_include, FFI): - raise TypeError("ffi.include() expects an argument that is also of" - " type cffi.FFI, not %r" % ( - type(ffi_to_include).__name__,)) - if ffi_to_include is self: - raise ValueError("self.include(self)") - with ffi_to_include._lock: - with self._lock: - self._parser.include(ffi_to_include._parser) - self._cdefsources.append('[') - self._cdefsources.extend(ffi_to_include._cdefsources) - self._cdefsources.append(']') - self._included_ffis.append(ffi_to_include) - - def new_handle(self, x): - return self._backend.newp_handle(self.BVoidP, x) - - def from_handle(self, x): - return self._backend.from_handle(x) - - def set_unicode(self, enabled_flag): - """Windows: if 'enabled_flag' is True, enable the UNICODE and - _UNICODE defines in C, and declare the types like TCHAR and LPTCSTR - to be (pointers to) wchar_t. If 'enabled_flag' is False, - declare these types to be (pointers to) plain 8-bit characters. - This is mostly for backward compatibility; you usually want True. - """ - if self._windows_unicode is not None: - raise ValueError("set_unicode() can only be called once") - enabled_flag = bool(enabled_flag) - if enabled_flag: - self.cdef("typedef wchar_t TBYTE;" - "typedef wchar_t TCHAR;" - "typedef const wchar_t *LPCTSTR;" - "typedef const wchar_t *PCTSTR;" - "typedef wchar_t *LPTSTR;" - "typedef wchar_t *PTSTR;" - "typedef TBYTE *PTBYTE;" - "typedef TCHAR *PTCHAR;") - else: - self.cdef("typedef char TBYTE;" - "typedef char TCHAR;" - "typedef const char *LPCTSTR;" - "typedef const char *PCTSTR;" - "typedef char *LPTSTR;" - "typedef char *PTSTR;" - "typedef TBYTE *PTBYTE;" - "typedef TCHAR *PTCHAR;") - self._windows_unicode = enabled_flag - - def _apply_windows_unicode(self, kwds): - defmacros = kwds.get('define_macros', ()) - if not isinstance(defmacros, (list, tuple)): - raise TypeError("'define_macros' must be a list or tuple") - defmacros = list(defmacros) + [('UNICODE', '1'), - ('_UNICODE', '1')] - kwds['define_macros'] = defmacros - - def _apply_embedding_fix(self, kwds): - # must include an argument like "-lpython2.7" for the compiler - def ensure(key, value): - lst = kwds.setdefault(key, []) - if value not in lst: - lst.append(value) - # - if '__pypy__' in sys.builtin_module_names: - import os - if sys.platform == "win32": - # we need 'libpypy-c.lib'. Current distributions of - # pypy (>= 4.1) contain it as 'libs/python27.lib'. - pythonlib = "python27" - if hasattr(sys, 'prefix'): - ensure('library_dirs', os.path.join(sys.prefix, 'libs')) - else: - # we need 'libpypy-c.{so,dylib}', which should be by - # default located in 'sys.prefix/bin' for installed - # systems. - if sys.version_info < (3,): - pythonlib = "pypy-c" - else: - pythonlib = "pypy3-c" - if hasattr(sys, 'prefix'): - ensure('library_dirs', os.path.join(sys.prefix, 'bin')) - # On uninstalled pypy's, the libpypy-c is typically found in - # .../pypy/goal/. - if hasattr(sys, 'prefix'): - ensure('library_dirs', os.path.join(sys.prefix, 'pypy', 'goal')) - else: - if sys.platform == "win32": - template = "python%d%d" - if hasattr(sys, 'gettotalrefcount'): - template += '_d' - else: - try: - import sysconfig - except ImportError: # 2.6 - from distutils import sysconfig - template = "python%d.%d" - if sysconfig.get_config_var('DEBUG_EXT'): - template += sysconfig.get_config_var('DEBUG_EXT') - pythonlib = (template % - (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff)) - if hasattr(sys, 'abiflags'): - pythonlib += sys.abiflags - ensure('libraries', pythonlib) - if sys.platform == "win32": - ensure('extra_link_args', '/MANIFEST') - - def set_source(self, module_name, source, source_extension='.c', **kwds): - import os - if hasattr(self, '_assigned_source'): - raise ValueError("set_source() cannot be called several times " - "per ffi object") - if not isinstance(module_name, basestring): - raise TypeError("'module_name' must be a string") - if os.sep in module_name or (os.altsep and os.altsep in module_name): - raise ValueError("'module_name' must not contain '/': use a dotted " - "name to make a 'package.module' location") - self._assigned_source = (str(module_name), source, - source_extension, kwds) - - def distutils_extension(self, tmpdir='build', verbose=True): - from distutils.dir_util import mkpath - from .recompiler import recompile - # - if not hasattr(self, '_assigned_source'): - if hasattr(self, 'verifier'): # fallback, 'tmpdir' ignored - return self.verifier.get_extension() - raise ValueError("set_source() must be called before" - " distutils_extension()") - module_name, source, source_extension, kwds = self._assigned_source - if source is None: - raise TypeError("distutils_extension() is only for C extension " - "modules, not for dlopen()-style pure Python " - "modules") - mkpath(tmpdir) - ext, updated = recompile(self, module_name, - source, tmpdir=tmpdir, extradir=tmpdir, - source_extension=source_extension, - call_c_compiler=False, **kwds) - if verbose: - if updated: - sys.stderr.write("regenerated: %r\n" % (ext.sources[0],)) - else: - sys.stderr.write("not modified: %r\n" % (ext.sources[0],)) - return ext - - def emit_c_code(self, filename): - from .recompiler import recompile - # - if not hasattr(self, '_assigned_source'): - raise ValueError("set_source() must be called before emit_c_code()") - module_name, source, source_extension, kwds = self._assigned_source - if source is None: - raise TypeError("emit_c_code() is only for C extension modules, " - "not for dlopen()-style pure Python modules") - recompile(self, module_name, source, - c_file=filename, call_c_compiler=False, **kwds) - - def emit_python_code(self, filename): - from .recompiler import recompile - # - if not hasattr(self, '_assigned_source'): - raise ValueError("set_source() must be called before emit_c_code()") - module_name, source, source_extension, kwds = self._assigned_source - if source is not None: - raise TypeError("emit_python_code() is only for dlopen()-style " - "pure Python modules, not for C extension modules") - recompile(self, module_name, source, - c_file=filename, call_c_compiler=False, **kwds) - - def compile(self, tmpdir='.', verbose=0, target=None, debug=None): - """The 'target' argument gives the final file name of the - compiled DLL. Use '*' to force distutils' choice, suitable for - regular CPython C API modules. Use a file name ending in '.*' - to ask for the system's default extension for dynamic libraries - (.so/.dll/.dylib). - - The default is '*' when building a non-embedded C API extension, - and (module_name + '.*') when building an embedded library. - """ - from .recompiler import recompile - # - if not hasattr(self, '_assigned_source'): - raise ValueError("set_source() must be called before compile()") - module_name, source, source_extension, kwds = self._assigned_source - return recompile(self, module_name, source, tmpdir=tmpdir, - target=target, source_extension=source_extension, - compiler_verbose=verbose, debug=debug, **kwds) - - def init_once(self, func, tag): - # Read _init_once_cache[tag], which is either (False, lock) if - # we're calling the function now in some thread, or (True, result). - # Don't call setdefault() in most cases, to avoid allocating and - # immediately freeing a lock; but still use setdefaut() to avoid - # races. - try: - x = self._init_once_cache[tag] - except KeyError: - x = self._init_once_cache.setdefault(tag, (False, allocate_lock())) - # Common case: we got (True, result), so we return the result. - if x[0]: - return x[1] - # Else, it's a lock. Acquire it to serialize the following tests. - with x[1]: - # Read again from _init_once_cache the current status. - x = self._init_once_cache[tag] - if x[0]: - return x[1] - # Call the function and store the result back. - result = func() - self._init_once_cache[tag] = (True, result) - return result - - def embedding_init_code(self, pysource): - if self._embedding: - raise ValueError("embedding_init_code() can only be called once") - # fix 'pysource' before it gets dumped into the C file: - # - remove empty lines at the beginning, so it starts at "line 1" - # - dedent, if all non-empty lines are indented - # - check for SyntaxErrors - import re - match = re.match(r'\s*\n', pysource) - if match: - pysource = pysource[match.end():] - lines = pysource.splitlines() or [''] - prefix = re.match(r'\s*', lines[0]).group() - for i in range(1, len(lines)): - line = lines[i] - if line.rstrip(): - while not line.startswith(prefix): - prefix = prefix[:-1] - i = len(prefix) - lines = [line[i:]+'\n' for line in lines] - pysource = ''.join(lines) - # - compile(pysource, "cffi_init", "exec") - # - self._embedding = pysource - - def def_extern(self, *args, **kwds): - raise ValueError("ffi.def_extern() is only available on API-mode FFI " - "objects") - - def list_types(self): - """Returns the user type names known to this FFI instance. - This returns a tuple containing three lists of names: - (typedef_names, names_of_structs, names_of_unions) - """ - typedefs = [] - structs = [] - unions = [] - for key in self._parser._declarations: - if key.startswith('typedef '): - typedefs.append(key[8:]) - elif key.startswith('struct '): - structs.append(key[7:]) - elif key.startswith('union '): - unions.append(key[6:]) - typedefs.sort() - structs.sort() - unions.sort() - return (typedefs, structs, unions) - - -def _load_backend_lib(backend, name, flags): - import os - if name is None: - if sys.platform != "win32": - return backend.load_library(None, flags) - name = "c" # Windows: load_library(None) fails, but this works - # on Python 2 (backward compatibility hack only) - first_error = None - if '.' in name or '/' in name or os.sep in name: - try: - return backend.load_library(name, flags) - except OSError as e: - first_error = e - import ctypes.util - path = ctypes.util.find_library(name) - if path is None: - if name == "c" and sys.platform == "win32" and sys.version_info >= (3,): - raise OSError("dlopen(None) cannot work on Windows for Python 3 " - "(see http://bugs.python.org/issue23606)") - msg = ("ctypes.util.find_library() did not manage " - "to locate a library called %r" % (name,)) - if first_error is not None: - msg = "%s. Additionally, %s" % (first_error, msg) - raise OSError(msg) - return backend.load_library(path, flags) - -def _make_ffi_library(ffi, libname, flags): - backend = ffi._backend - backendlib = _load_backend_lib(backend, libname, flags) - # - def accessor_function(name): - key = 'function ' + name - tp, _ = ffi._parser._declarations[key] - BType = ffi._get_cached_btype(tp) - value = backendlib.load_function(BType, name) - library.__dict__[name] = value - # - def accessor_variable(name): - key = 'variable ' + name - tp, _ = ffi._parser._declarations[key] - BType = ffi._get_cached_btype(tp) - read_variable = backendlib.read_variable - write_variable = backendlib.write_variable - setattr(FFILibrary, name, property( - lambda self: read_variable(BType, name), - lambda self, value: write_variable(BType, name, value))) - # - def addressof_var(name): - try: - return addr_variables[name] - except KeyError: - with ffi._lock: - if name not in addr_variables: - key = 'variable ' + name - tp, _ = ffi._parser._declarations[key] - BType = ffi._get_cached_btype(tp) - if BType.kind != 'array': - BType = model.pointer_cache(ffi, BType) - p = backendlib.load_function(BType, name) - addr_variables[name] = p - return addr_variables[name] - # - def accessor_constant(name): - raise NotImplementedError("non-integer constant '%s' cannot be " - "accessed from a dlopen() library" % (name,)) - # - def accessor_int_constant(name): - library.__dict__[name] = ffi._parser._int_constants[name] - # - accessors = {} - accessors_version = [False] - addr_variables = {} - # - def update_accessors(): - if accessors_version[0] is ffi._cdef_version: - return - # - for key, (tp, _) in ffi._parser._declarations.items(): - if not isinstance(tp, model.EnumType): - tag, name = key.split(' ', 1) - if tag == 'function': - accessors[name] = accessor_function - elif tag == 'variable': - accessors[name] = accessor_variable - elif tag == 'constant': - accessors[name] = accessor_constant - else: - for i, enumname in enumerate(tp.enumerators): - def accessor_enum(name, tp=tp, i=i): - tp.check_not_partial() - library.__dict__[name] = tp.enumvalues[i] - accessors[enumname] = accessor_enum - for name in ffi._parser._int_constants: - accessors.setdefault(name, accessor_int_constant) - accessors_version[0] = ffi._cdef_version - # - def make_accessor(name): - with ffi._lock: - if name in library.__dict__ or name in FFILibrary.__dict__: - return # added by another thread while waiting for the lock - if name not in accessors: - update_accessors() - if name not in accessors: - raise AttributeError(name) - accessors[name](name) - # - class FFILibrary(object): - def __getattr__(self, name): - make_accessor(name) - return getattr(self, name) - def __setattr__(self, name, value): - try: - property = getattr(self.__class__, name) - except AttributeError: - make_accessor(name) - setattr(self, name, value) - else: - property.__set__(self, value) - def __dir__(self): - with ffi._lock: - update_accessors() - return accessors.keys() - def __addressof__(self, name): - if name in library.__dict__: - return library.__dict__[name] - if name in FFILibrary.__dict__: - return addressof_var(name) - make_accessor(name) - if name in library.__dict__: - return library.__dict__[name] - if name in FFILibrary.__dict__: - return addressof_var(name) - raise AttributeError("cffi library has no function or " - "global variable named '%s'" % (name,)) - # - if libname is not None: - try: - if not isinstance(libname, str): # unicode, on Python 2 - libname = libname.encode('utf-8') - FFILibrary.__name__ = 'FFILibrary_%s' % libname - except UnicodeError: - pass - library = FFILibrary() - return library, library.__dict__ - -def _builtin_function_type(func): - # a hack to make at least ffi.typeof(builtin_function) work, - # if the builtin function was obtained by 'vengine_cpy'. - import sys - try: - module = sys.modules[func.__module__] - ffi = module._cffi_original_ffi - types_of_builtin_funcs = module._cffi_types_of_builtin_funcs - tp = types_of_builtin_funcs[func] - except (KeyError, AttributeError, TypeError): - return None - else: - with ffi._lock: - return ffi._get_cached_btype(tp) diff --git a/website/web/Lib/site-packages/cffi/backend_ctypes.py b/website/web/Lib/site-packages/cffi/backend_ctypes.py deleted file mode 100644 index 5ef3c135e..000000000 --- a/website/web/Lib/site-packages/cffi/backend_ctypes.py +++ /dev/null @@ -1,1114 +0,0 @@ -import ctypes, ctypes.util, operator, sys -from . import model - -if sys.version_info < (3,): - bytechr = chr -else: - unicode = str - long = int - xrange = range - bytechr = lambda num: bytes([num]) - -class CTypesType(type): - pass - -class CTypesData(object): - __metaclass__ = CTypesType - __slots__ = ['__weakref__'] - __name__ = '' - - def __init__(self, *args): - raise TypeError("cannot instantiate %r" % (self.__class__,)) - - @classmethod - def _newp(cls, init): - raise TypeError("expected a pointer or array ctype, got '%s'" - % (cls._get_c_name(),)) - - @staticmethod - def _to_ctypes(value): - raise TypeError - - @classmethod - def _arg_to_ctypes(cls, *value): - try: - ctype = cls._ctype - except AttributeError: - raise TypeError("cannot create an instance of %r" % (cls,)) - if value: - res = cls._to_ctypes(*value) - if not isinstance(res, ctype): - res = cls._ctype(res) - else: - res = cls._ctype() - return res - - @classmethod - def _create_ctype_obj(cls, init): - if init is None: - return cls._arg_to_ctypes() - else: - return cls._arg_to_ctypes(init) - - @staticmethod - def _from_ctypes(ctypes_value): - raise TypeError - - @classmethod - def _get_c_name(cls, replace_with=''): - return cls._reftypename.replace(' &', replace_with) - - @classmethod - def _fix_class(cls): - cls.__name__ = 'CData<%s>' % (cls._get_c_name(),) - cls.__qualname__ = 'CData<%s>' % (cls._get_c_name(),) - cls.__module__ = 'ffi' - - def _get_own_repr(self): - raise NotImplementedError - - def _addr_repr(self, address): - if address == 0: - return 'NULL' - else: - if address < 0: - address += 1 << (8*ctypes.sizeof(ctypes.c_void_p)) - return '0x%x' % address - - def __repr__(self, c_name=None): - own = self._get_own_repr() - return '' % (c_name or self._get_c_name(), own) - - def _convert_to_address(self, BClass): - if BClass is None: - raise TypeError("cannot convert %r to an address" % ( - self._get_c_name(),)) - else: - raise TypeError("cannot convert %r to %r" % ( - self._get_c_name(), BClass._get_c_name())) - - @classmethod - def _get_size(cls): - return ctypes.sizeof(cls._ctype) - - def _get_size_of_instance(self): - return ctypes.sizeof(self._ctype) - - @classmethod - def _cast_from(cls, source): - raise TypeError("cannot cast to %r" % (cls._get_c_name(),)) - - def _cast_to_integer(self): - return self._convert_to_address(None) - - @classmethod - def _alignment(cls): - return ctypes.alignment(cls._ctype) - - def __iter__(self): - raise TypeError("cdata %r does not support iteration" % ( - self._get_c_name()),) - - def _make_cmp(name): - cmpfunc = getattr(operator, name) - def cmp(self, other): - v_is_ptr = not isinstance(self, CTypesGenericPrimitive) - w_is_ptr = (isinstance(other, CTypesData) and - not isinstance(other, CTypesGenericPrimitive)) - if v_is_ptr and w_is_ptr: - return cmpfunc(self._convert_to_address(None), - other._convert_to_address(None)) - elif v_is_ptr or w_is_ptr: - return NotImplemented - else: - if isinstance(self, CTypesGenericPrimitive): - self = self._value - if isinstance(other, CTypesGenericPrimitive): - other = other._value - return cmpfunc(self, other) - cmp.func_name = name - return cmp - - __eq__ = _make_cmp('__eq__') - __ne__ = _make_cmp('__ne__') - __lt__ = _make_cmp('__lt__') - __le__ = _make_cmp('__le__') - __gt__ = _make_cmp('__gt__') - __ge__ = _make_cmp('__ge__') - - def __hash__(self): - return hash(self._convert_to_address(None)) - - def _to_string(self, maxlen): - raise TypeError("string(): %r" % (self,)) - - -class CTypesGenericPrimitive(CTypesData): - __slots__ = [] - - def __hash__(self): - return hash(self._value) - - def _get_own_repr(self): - return repr(self._from_ctypes(self._value)) - - -class CTypesGenericArray(CTypesData): - __slots__ = [] - - @classmethod - def _newp(cls, init): - return cls(init) - - def __iter__(self): - for i in xrange(len(self)): - yield self[i] - - def _get_own_repr(self): - return self._addr_repr(ctypes.addressof(self._blob)) - - -class CTypesGenericPtr(CTypesData): - __slots__ = ['_address', '_as_ctype_ptr'] - _automatic_casts = False - kind = "pointer" - - @classmethod - def _newp(cls, init): - return cls(init) - - @classmethod - def _cast_from(cls, source): - if source is None: - address = 0 - elif isinstance(source, CTypesData): - address = source._cast_to_integer() - elif isinstance(source, (int, long)): - address = source - else: - raise TypeError("bad type for cast to %r: %r" % - (cls, type(source).__name__)) - return cls._new_pointer_at(address) - - @classmethod - def _new_pointer_at(cls, address): - self = cls.__new__(cls) - self._address = address - self._as_ctype_ptr = ctypes.cast(address, cls._ctype) - return self - - def _get_own_repr(self): - try: - return self._addr_repr(self._address) - except AttributeError: - return '???' - - def _cast_to_integer(self): - return self._address - - def __nonzero__(self): - return bool(self._address) - __bool__ = __nonzero__ - - @classmethod - def _to_ctypes(cls, value): - if not isinstance(value, CTypesData): - raise TypeError("unexpected %s object" % type(value).__name__) - address = value._convert_to_address(cls) - return ctypes.cast(address, cls._ctype) - - @classmethod - def _from_ctypes(cls, ctypes_ptr): - address = ctypes.cast(ctypes_ptr, ctypes.c_void_p).value or 0 - return cls._new_pointer_at(address) - - @classmethod - def _initialize(cls, ctypes_ptr, value): - if value: - ctypes_ptr.contents = cls._to_ctypes(value).contents - - def _convert_to_address(self, BClass): - if (BClass in (self.__class__, None) or BClass._automatic_casts - or self._automatic_casts): - return self._address - else: - return CTypesData._convert_to_address(self, BClass) - - -class CTypesBaseStructOrUnion(CTypesData): - __slots__ = ['_blob'] - - @classmethod - def _create_ctype_obj(cls, init): - # may be overridden - raise TypeError("cannot instantiate opaque type %s" % (cls,)) - - def _get_own_repr(self): - return self._addr_repr(ctypes.addressof(self._blob)) - - @classmethod - def _offsetof(cls, fieldname): - return getattr(cls._ctype, fieldname).offset - - def _convert_to_address(self, BClass): - if getattr(BClass, '_BItem', None) is self.__class__: - return ctypes.addressof(self._blob) - else: - return CTypesData._convert_to_address(self, BClass) - - @classmethod - def _from_ctypes(cls, ctypes_struct_or_union): - self = cls.__new__(cls) - self._blob = ctypes_struct_or_union - return self - - @classmethod - def _to_ctypes(cls, value): - return value._blob - - def __repr__(self, c_name=None): - return CTypesData.__repr__(self, c_name or self._get_c_name(' &')) - - -class CTypesBackend(object): - - PRIMITIVE_TYPES = { - 'char': ctypes.c_char, - 'short': ctypes.c_short, - 'int': ctypes.c_int, - 'long': ctypes.c_long, - 'long long': ctypes.c_longlong, - 'signed char': ctypes.c_byte, - 'unsigned char': ctypes.c_ubyte, - 'unsigned short': ctypes.c_ushort, - 'unsigned int': ctypes.c_uint, - 'unsigned long': ctypes.c_ulong, - 'unsigned long long': ctypes.c_ulonglong, - 'float': ctypes.c_float, - 'double': ctypes.c_double, - '_Bool': ctypes.c_bool, - } - - for _name in ['unsigned long long', 'unsigned long', - 'unsigned int', 'unsigned short', 'unsigned char']: - _size = ctypes.sizeof(PRIMITIVE_TYPES[_name]) - PRIMITIVE_TYPES['uint%d_t' % (8*_size)] = PRIMITIVE_TYPES[_name] - if _size == ctypes.sizeof(ctypes.c_void_p): - PRIMITIVE_TYPES['uintptr_t'] = PRIMITIVE_TYPES[_name] - if _size == ctypes.sizeof(ctypes.c_size_t): - PRIMITIVE_TYPES['size_t'] = PRIMITIVE_TYPES[_name] - - for _name in ['long long', 'long', 'int', 'short', 'signed char']: - _size = ctypes.sizeof(PRIMITIVE_TYPES[_name]) - PRIMITIVE_TYPES['int%d_t' % (8*_size)] = PRIMITIVE_TYPES[_name] - if _size == ctypes.sizeof(ctypes.c_void_p): - PRIMITIVE_TYPES['intptr_t'] = PRIMITIVE_TYPES[_name] - PRIMITIVE_TYPES['ptrdiff_t'] = PRIMITIVE_TYPES[_name] - if _size == ctypes.sizeof(ctypes.c_size_t): - PRIMITIVE_TYPES['ssize_t'] = PRIMITIVE_TYPES[_name] - - - def __init__(self): - self.RTLD_LAZY = 0 # not supported anyway by ctypes - self.RTLD_NOW = 0 - self.RTLD_GLOBAL = ctypes.RTLD_GLOBAL - self.RTLD_LOCAL = ctypes.RTLD_LOCAL - - def set_ffi(self, ffi): - self.ffi = ffi - - def _get_types(self): - return CTypesData, CTypesType - - def load_library(self, path, flags=0): - cdll = ctypes.CDLL(path, flags) - return CTypesLibrary(self, cdll) - - def new_void_type(self): - class CTypesVoid(CTypesData): - __slots__ = [] - _reftypename = 'void &' - @staticmethod - def _from_ctypes(novalue): - return None - @staticmethod - def _to_ctypes(novalue): - if novalue is not None: - raise TypeError("None expected, got %s object" % - (type(novalue).__name__,)) - return None - CTypesVoid._fix_class() - return CTypesVoid - - def new_primitive_type(self, name): - if name == 'wchar_t': - raise NotImplementedError(name) - ctype = self.PRIMITIVE_TYPES[name] - if name == 'char': - kind = 'char' - elif name in ('float', 'double'): - kind = 'float' - else: - if name in ('signed char', 'unsigned char'): - kind = 'byte' - elif name == '_Bool': - kind = 'bool' - else: - kind = 'int' - is_signed = (ctype(-1).value == -1) - # - def _cast_source_to_int(source): - if isinstance(source, (int, long, float)): - source = int(source) - elif isinstance(source, CTypesData): - source = source._cast_to_integer() - elif isinstance(source, bytes): - source = ord(source) - elif source is None: - source = 0 - else: - raise TypeError("bad type for cast to %r: %r" % - (CTypesPrimitive, type(source).__name__)) - return source - # - kind1 = kind - class CTypesPrimitive(CTypesGenericPrimitive): - __slots__ = ['_value'] - _ctype = ctype - _reftypename = '%s &' % name - kind = kind1 - - def __init__(self, value): - self._value = value - - @staticmethod - def _create_ctype_obj(init): - if init is None: - return ctype() - return ctype(CTypesPrimitive._to_ctypes(init)) - - if kind == 'int' or kind == 'byte': - @classmethod - def _cast_from(cls, source): - source = _cast_source_to_int(source) - source = ctype(source).value # cast within range - return cls(source) - def __int__(self): - return self._value - - if kind == 'bool': - @classmethod - def _cast_from(cls, source): - if not isinstance(source, (int, long, float)): - source = _cast_source_to_int(source) - return cls(bool(source)) - def __int__(self): - return self._value - - if kind == 'char': - @classmethod - def _cast_from(cls, source): - source = _cast_source_to_int(source) - source = bytechr(source & 0xFF) - return cls(source) - def __int__(self): - return ord(self._value) - - if kind == 'float': - @classmethod - def _cast_from(cls, source): - if isinstance(source, float): - pass - elif isinstance(source, CTypesGenericPrimitive): - if hasattr(source, '__float__'): - source = float(source) - else: - source = int(source) - else: - source = _cast_source_to_int(source) - source = ctype(source).value # fix precision - return cls(source) - def __int__(self): - return int(self._value) - def __float__(self): - return self._value - - _cast_to_integer = __int__ - - if kind == 'int' or kind == 'byte' or kind == 'bool': - @staticmethod - def _to_ctypes(x): - if not isinstance(x, (int, long)): - if isinstance(x, CTypesData): - x = int(x) - else: - raise TypeError("integer expected, got %s" % - type(x).__name__) - if ctype(x).value != x: - if not is_signed and x < 0: - raise OverflowError("%s: negative integer" % name) - else: - raise OverflowError("%s: integer out of bounds" - % name) - return x - - if kind == 'char': - @staticmethod - def _to_ctypes(x): - if isinstance(x, bytes) and len(x) == 1: - return x - if isinstance(x, CTypesPrimitive): # > - return x._value - raise TypeError("character expected, got %s" % - type(x).__name__) - def __nonzero__(self): - return ord(self._value) != 0 - else: - def __nonzero__(self): - return self._value != 0 - __bool__ = __nonzero__ - - if kind == 'float': - @staticmethod - def _to_ctypes(x): - if not isinstance(x, (int, long, float, CTypesData)): - raise TypeError("float expected, got %s" % - type(x).__name__) - return ctype(x).value - - @staticmethod - def _from_ctypes(value): - return getattr(value, 'value', value) - - @staticmethod - def _initialize(blob, init): - blob.value = CTypesPrimitive._to_ctypes(init) - - if kind == 'char': - def _to_string(self, maxlen): - return self._value - if kind == 'byte': - def _to_string(self, maxlen): - return chr(self._value & 0xff) - # - CTypesPrimitive._fix_class() - return CTypesPrimitive - - def new_pointer_type(self, BItem): - getbtype = self.ffi._get_cached_btype - if BItem is getbtype(model.PrimitiveType('char')): - kind = 'charp' - elif BItem in (getbtype(model.PrimitiveType('signed char')), - getbtype(model.PrimitiveType('unsigned char'))): - kind = 'bytep' - elif BItem is getbtype(model.void_type): - kind = 'voidp' - else: - kind = 'generic' - # - class CTypesPtr(CTypesGenericPtr): - __slots__ = ['_own'] - if kind == 'charp': - __slots__ += ['__as_strbuf'] - _BItem = BItem - if hasattr(BItem, '_ctype'): - _ctype = ctypes.POINTER(BItem._ctype) - _bitem_size = ctypes.sizeof(BItem._ctype) - else: - _ctype = ctypes.c_void_p - if issubclass(BItem, CTypesGenericArray): - _reftypename = BItem._get_c_name('(* &)') - else: - _reftypename = BItem._get_c_name(' * &') - - def __init__(self, init): - ctypeobj = BItem._create_ctype_obj(init) - if kind == 'charp': - self.__as_strbuf = ctypes.create_string_buffer( - ctypeobj.value + b'\x00') - self._as_ctype_ptr = ctypes.cast( - self.__as_strbuf, self._ctype) - else: - self._as_ctype_ptr = ctypes.pointer(ctypeobj) - self._address = ctypes.cast(self._as_ctype_ptr, - ctypes.c_void_p).value - self._own = True - - def __add__(self, other): - if isinstance(other, (int, long)): - return self._new_pointer_at(self._address + - other * self._bitem_size) - else: - return NotImplemented - - def __sub__(self, other): - if isinstance(other, (int, long)): - return self._new_pointer_at(self._address - - other * self._bitem_size) - elif type(self) is type(other): - return (self._address - other._address) // self._bitem_size - else: - return NotImplemented - - def __getitem__(self, index): - if getattr(self, '_own', False) and index != 0: - raise IndexError - return BItem._from_ctypes(self._as_ctype_ptr[index]) - - def __setitem__(self, index, value): - self._as_ctype_ptr[index] = BItem._to_ctypes(value) - - if kind == 'charp' or kind == 'voidp': - @classmethod - def _arg_to_ctypes(cls, *value): - if value and isinstance(value[0], bytes): - return ctypes.c_char_p(value[0]) - else: - return super(CTypesPtr, cls)._arg_to_ctypes(*value) - - if kind == 'charp' or kind == 'bytep': - def _to_string(self, maxlen): - if maxlen < 0: - maxlen = sys.maxsize - p = ctypes.cast(self._as_ctype_ptr, - ctypes.POINTER(ctypes.c_char)) - n = 0 - while n < maxlen and p[n] != b'\x00': - n += 1 - return b''.join([p[i] for i in range(n)]) - - def _get_own_repr(self): - if getattr(self, '_own', False): - return 'owning %d bytes' % ( - ctypes.sizeof(self._as_ctype_ptr.contents),) - return super(CTypesPtr, self)._get_own_repr() - # - if (BItem is self.ffi._get_cached_btype(model.void_type) or - BItem is self.ffi._get_cached_btype(model.PrimitiveType('char'))): - CTypesPtr._automatic_casts = True - # - CTypesPtr._fix_class() - return CTypesPtr - - def new_array_type(self, CTypesPtr, length): - if length is None: - brackets = ' &[]' - else: - brackets = ' &[%d]' % length - BItem = CTypesPtr._BItem - getbtype = self.ffi._get_cached_btype - if BItem is getbtype(model.PrimitiveType('char')): - kind = 'char' - elif BItem in (getbtype(model.PrimitiveType('signed char')), - getbtype(model.PrimitiveType('unsigned char'))): - kind = 'byte' - else: - kind = 'generic' - # - class CTypesArray(CTypesGenericArray): - __slots__ = ['_blob', '_own'] - if length is not None: - _ctype = BItem._ctype * length - else: - __slots__.append('_ctype') - _reftypename = BItem._get_c_name(brackets) - _declared_length = length - _CTPtr = CTypesPtr - - def __init__(self, init): - if length is None: - if isinstance(init, (int, long)): - len1 = init - init = None - elif kind == 'char' and isinstance(init, bytes): - len1 = len(init) + 1 # extra null - else: - init = tuple(init) - len1 = len(init) - self._ctype = BItem._ctype * len1 - self._blob = self._ctype() - self._own = True - if init is not None: - self._initialize(self._blob, init) - - @staticmethod - def _initialize(blob, init): - if isinstance(init, bytes): - init = [init[i:i+1] for i in range(len(init))] - else: - init = tuple(init) - if len(init) > len(blob): - raise IndexError("too many initializers") - addr = ctypes.cast(blob, ctypes.c_void_p).value - PTR = ctypes.POINTER(BItem._ctype) - itemsize = ctypes.sizeof(BItem._ctype) - for i, value in enumerate(init): - p = ctypes.cast(addr + i * itemsize, PTR) - BItem._initialize(p.contents, value) - - def __len__(self): - return len(self._blob) - - def __getitem__(self, index): - if not (0 <= index < len(self._blob)): - raise IndexError - return BItem._from_ctypes(self._blob[index]) - - def __setitem__(self, index, value): - if not (0 <= index < len(self._blob)): - raise IndexError - self._blob[index] = BItem._to_ctypes(value) - - if kind == 'char' or kind == 'byte': - def _to_string(self, maxlen): - if maxlen < 0: - maxlen = len(self._blob) - p = ctypes.cast(self._blob, - ctypes.POINTER(ctypes.c_char)) - n = 0 - while n < maxlen and p[n] != b'\x00': - n += 1 - return b''.join([p[i] for i in range(n)]) - - def _get_own_repr(self): - if getattr(self, '_own', False): - return 'owning %d bytes' % (ctypes.sizeof(self._blob),) - return super(CTypesArray, self)._get_own_repr() - - def _convert_to_address(self, BClass): - if BClass in (CTypesPtr, None) or BClass._automatic_casts: - return ctypes.addressof(self._blob) - else: - return CTypesData._convert_to_address(self, BClass) - - @staticmethod - def _from_ctypes(ctypes_array): - self = CTypesArray.__new__(CTypesArray) - self._blob = ctypes_array - return self - - @staticmethod - def _arg_to_ctypes(value): - return CTypesPtr._arg_to_ctypes(value) - - def __add__(self, other): - if isinstance(other, (int, long)): - return CTypesPtr._new_pointer_at( - ctypes.addressof(self._blob) + - other * ctypes.sizeof(BItem._ctype)) - else: - return NotImplemented - - @classmethod - def _cast_from(cls, source): - raise NotImplementedError("casting to %r" % ( - cls._get_c_name(),)) - # - CTypesArray._fix_class() - return CTypesArray - - def _new_struct_or_union(self, kind, name, base_ctypes_class): - # - class struct_or_union(base_ctypes_class): - pass - struct_or_union.__name__ = '%s_%s' % (kind, name) - kind1 = kind - # - class CTypesStructOrUnion(CTypesBaseStructOrUnion): - __slots__ = ['_blob'] - _ctype = struct_or_union - _reftypename = '%s &' % (name,) - _kind = kind = kind1 - # - CTypesStructOrUnion._fix_class() - return CTypesStructOrUnion - - def new_struct_type(self, name): - return self._new_struct_or_union('struct', name, ctypes.Structure) - - def new_union_type(self, name): - return self._new_struct_or_union('union', name, ctypes.Union) - - def complete_struct_or_union(self, CTypesStructOrUnion, fields, tp, - totalsize=-1, totalalignment=-1, sflags=0): - if totalsize >= 0 or totalalignment >= 0: - raise NotImplementedError("the ctypes backend of CFFI does not support " - "structures completed by verify(); please " - "compile and install the _cffi_backend module.") - struct_or_union = CTypesStructOrUnion._ctype - fnames = [fname for (fname, BField, bitsize) in fields] - btypes = [BField for (fname, BField, bitsize) in fields] - bitfields = [bitsize for (fname, BField, bitsize) in fields] - # - bfield_types = {} - cfields = [] - for (fname, BField, bitsize) in fields: - if bitsize < 0: - cfields.append((fname, BField._ctype)) - bfield_types[fname] = BField - else: - cfields.append((fname, BField._ctype, bitsize)) - bfield_types[fname] = Ellipsis - if sflags & 8: - struct_or_union._pack_ = 1 - struct_or_union._fields_ = cfields - CTypesStructOrUnion._bfield_types = bfield_types - # - @staticmethod - def _create_ctype_obj(init): - result = struct_or_union() - if init is not None: - initialize(result, init) - return result - CTypesStructOrUnion._create_ctype_obj = _create_ctype_obj - # - def initialize(blob, init): - if is_union: - if len(init) > 1: - raise ValueError("union initializer: %d items given, but " - "only one supported (use a dict if needed)" - % (len(init),)) - if not isinstance(init, dict): - if isinstance(init, (bytes, unicode)): - raise TypeError("union initializer: got a str") - init = tuple(init) - if len(init) > len(fnames): - raise ValueError("too many values for %s initializer" % - CTypesStructOrUnion._get_c_name()) - init = dict(zip(fnames, init)) - addr = ctypes.addressof(blob) - for fname, value in init.items(): - BField, bitsize = name2fieldtype[fname] - assert bitsize < 0, \ - "not implemented: initializer with bit fields" - offset = CTypesStructOrUnion._offsetof(fname) - PTR = ctypes.POINTER(BField._ctype) - p = ctypes.cast(addr + offset, PTR) - BField._initialize(p.contents, value) - is_union = CTypesStructOrUnion._kind == 'union' - name2fieldtype = dict(zip(fnames, zip(btypes, bitfields))) - # - for fname, BField, bitsize in fields: - if fname == '': - raise NotImplementedError("nested anonymous structs/unions") - if hasattr(CTypesStructOrUnion, fname): - raise ValueError("the field name %r conflicts in " - "the ctypes backend" % fname) - if bitsize < 0: - def getter(self, fname=fname, BField=BField, - offset=CTypesStructOrUnion._offsetof(fname), - PTR=ctypes.POINTER(BField._ctype)): - addr = ctypes.addressof(self._blob) - p = ctypes.cast(addr + offset, PTR) - return BField._from_ctypes(p.contents) - def setter(self, value, fname=fname, BField=BField): - setattr(self._blob, fname, BField._to_ctypes(value)) - # - if issubclass(BField, CTypesGenericArray): - setter = None - if BField._declared_length == 0: - def getter(self, fname=fname, BFieldPtr=BField._CTPtr, - offset=CTypesStructOrUnion._offsetof(fname), - PTR=ctypes.POINTER(BField._ctype)): - addr = ctypes.addressof(self._blob) - p = ctypes.cast(addr + offset, PTR) - return BFieldPtr._from_ctypes(p) - # - else: - def getter(self, fname=fname, BField=BField): - return BField._from_ctypes(getattr(self._blob, fname)) - def setter(self, value, fname=fname, BField=BField): - # xxx obscure workaround - value = BField._to_ctypes(value) - oldvalue = getattr(self._blob, fname) - setattr(self._blob, fname, value) - if value != getattr(self._blob, fname): - setattr(self._blob, fname, oldvalue) - raise OverflowError("value too large for bitfield") - setattr(CTypesStructOrUnion, fname, property(getter, setter)) - # - CTypesPtr = self.ffi._get_cached_btype(model.PointerType(tp)) - for fname in fnames: - if hasattr(CTypesPtr, fname): - raise ValueError("the field name %r conflicts in " - "the ctypes backend" % fname) - def getter(self, fname=fname): - return getattr(self[0], fname) - def setter(self, value, fname=fname): - setattr(self[0], fname, value) - setattr(CTypesPtr, fname, property(getter, setter)) - - def new_function_type(self, BArgs, BResult, has_varargs): - nameargs = [BArg._get_c_name() for BArg in BArgs] - if has_varargs: - nameargs.append('...') - nameargs = ', '.join(nameargs) - # - class CTypesFunctionPtr(CTypesGenericPtr): - __slots__ = ['_own_callback', '_name'] - _ctype = ctypes.CFUNCTYPE(getattr(BResult, '_ctype', None), - *[BArg._ctype for BArg in BArgs], - use_errno=True) - _reftypename = BResult._get_c_name('(* &)(%s)' % (nameargs,)) - - def __init__(self, init, error=None): - # create a callback to the Python callable init() - import traceback - assert not has_varargs, "varargs not supported for callbacks" - if getattr(BResult, '_ctype', None) is not None: - error = BResult._from_ctypes( - BResult._create_ctype_obj(error)) - else: - error = None - def callback(*args): - args2 = [] - for arg, BArg in zip(args, BArgs): - args2.append(BArg._from_ctypes(arg)) - try: - res2 = init(*args2) - res2 = BResult._to_ctypes(res2) - except: - traceback.print_exc() - res2 = error - if issubclass(BResult, CTypesGenericPtr): - if res2: - res2 = ctypes.cast(res2, ctypes.c_void_p).value - # .value: http://bugs.python.org/issue1574593 - else: - res2 = None - #print repr(res2) - return res2 - if issubclass(BResult, CTypesGenericPtr): - # The only pointers callbacks can return are void*s: - # http://bugs.python.org/issue5710 - callback_ctype = ctypes.CFUNCTYPE( - ctypes.c_void_p, - *[BArg._ctype for BArg in BArgs], - use_errno=True) - else: - callback_ctype = CTypesFunctionPtr._ctype - self._as_ctype_ptr = callback_ctype(callback) - self._address = ctypes.cast(self._as_ctype_ptr, - ctypes.c_void_p).value - self._own_callback = init - - @staticmethod - def _initialize(ctypes_ptr, value): - if value: - raise NotImplementedError("ctypes backend: not supported: " - "initializers for function pointers") - - def __repr__(self): - c_name = getattr(self, '_name', None) - if c_name: - i = self._reftypename.index('(* &)') - if self._reftypename[i-1] not in ' )*': - c_name = ' ' + c_name - c_name = self._reftypename.replace('(* &)', c_name) - return CTypesData.__repr__(self, c_name) - - def _get_own_repr(self): - if getattr(self, '_own_callback', None) is not None: - return 'calling %r' % (self._own_callback,) - return super(CTypesFunctionPtr, self)._get_own_repr() - - def __call__(self, *args): - if has_varargs: - assert len(args) >= len(BArgs) - extraargs = args[len(BArgs):] - args = args[:len(BArgs)] - else: - assert len(args) == len(BArgs) - ctypes_args = [] - for arg, BArg in zip(args, BArgs): - ctypes_args.append(BArg._arg_to_ctypes(arg)) - if has_varargs: - for i, arg in enumerate(extraargs): - if arg is None: - ctypes_args.append(ctypes.c_void_p(0)) # NULL - continue - if not isinstance(arg, CTypesData): - raise TypeError( - "argument %d passed in the variadic part " - "needs to be a cdata object (got %s)" % - (1 + len(BArgs) + i, type(arg).__name__)) - ctypes_args.append(arg._arg_to_ctypes(arg)) - result = self._as_ctype_ptr(*ctypes_args) - return BResult._from_ctypes(result) - # - CTypesFunctionPtr._fix_class() - return CTypesFunctionPtr - - def new_enum_type(self, name, enumerators, enumvalues, CTypesInt): - assert isinstance(name, str) - reverse_mapping = dict(zip(reversed(enumvalues), - reversed(enumerators))) - # - class CTypesEnum(CTypesInt): - __slots__ = [] - _reftypename = '%s &' % name - - def _get_own_repr(self): - value = self._value - try: - return '%d: %s' % (value, reverse_mapping[value]) - except KeyError: - return str(value) - - def _to_string(self, maxlen): - value = self._value - try: - return reverse_mapping[value] - except KeyError: - return str(value) - # - CTypesEnum._fix_class() - return CTypesEnum - - def get_errno(self): - return ctypes.get_errno() - - def set_errno(self, value): - ctypes.set_errno(value) - - def string(self, b, maxlen=-1): - return b._to_string(maxlen) - - def buffer(self, bptr, size=-1): - raise NotImplementedError("buffer() with ctypes backend") - - def sizeof(self, cdata_or_BType): - if isinstance(cdata_or_BType, CTypesData): - return cdata_or_BType._get_size_of_instance() - else: - assert issubclass(cdata_or_BType, CTypesData) - return cdata_or_BType._get_size() - - def alignof(self, BType): - assert issubclass(BType, CTypesData) - return BType._alignment() - - def newp(self, BType, source): - if not issubclass(BType, CTypesData): - raise TypeError - return BType._newp(source) - - def cast(self, BType, source): - return BType._cast_from(source) - - def callback(self, BType, source, error, onerror): - assert onerror is None # XXX not implemented - return BType(source, error) - - _weakref_cache_ref = None - - def gcp(self, cdata, destructor, size=0): - if self._weakref_cache_ref is None: - import weakref - class MyRef(weakref.ref): - def __eq__(self, other): - myref = self() - return self is other or ( - myref is not None and myref is other()) - def __ne__(self, other): - return not (self == other) - def __hash__(self): - try: - return self._hash - except AttributeError: - self._hash = hash(self()) - return self._hash - self._weakref_cache_ref = {}, MyRef - weak_cache, MyRef = self._weakref_cache_ref - - if destructor is None: - try: - del weak_cache[MyRef(cdata)] - except KeyError: - raise TypeError("Can remove destructor only on a object " - "previously returned by ffi.gc()") - return None - - def remove(k): - cdata, destructor = weak_cache.pop(k, (None, None)) - if destructor is not None: - destructor(cdata) - - new_cdata = self.cast(self.typeof(cdata), cdata) - assert new_cdata is not cdata - weak_cache[MyRef(new_cdata, remove)] = (cdata, destructor) - return new_cdata - - typeof = type - - def getcname(self, BType, replace_with): - return BType._get_c_name(replace_with) - - def typeoffsetof(self, BType, fieldname, num=0): - if isinstance(fieldname, str): - if num == 0 and issubclass(BType, CTypesGenericPtr): - BType = BType._BItem - if not issubclass(BType, CTypesBaseStructOrUnion): - raise TypeError("expected a struct or union ctype") - BField = BType._bfield_types[fieldname] - if BField is Ellipsis: - raise TypeError("not supported for bitfields") - return (BField, BType._offsetof(fieldname)) - elif isinstance(fieldname, (int, long)): - if issubclass(BType, CTypesGenericArray): - BType = BType._CTPtr - if not issubclass(BType, CTypesGenericPtr): - raise TypeError("expected an array or ptr ctype") - BItem = BType._BItem - offset = BItem._get_size() * fieldname - if offset > sys.maxsize: - raise OverflowError - return (BItem, offset) - else: - raise TypeError(type(fieldname)) - - def rawaddressof(self, BTypePtr, cdata, offset=None): - if isinstance(cdata, CTypesBaseStructOrUnion): - ptr = ctypes.pointer(type(cdata)._to_ctypes(cdata)) - elif isinstance(cdata, CTypesGenericPtr): - if offset is None or not issubclass(type(cdata)._BItem, - CTypesBaseStructOrUnion): - raise TypeError("unexpected cdata type") - ptr = type(cdata)._to_ctypes(cdata) - elif isinstance(cdata, CTypesGenericArray): - ptr = type(cdata)._to_ctypes(cdata) - else: - raise TypeError("expected a ") - if offset: - ptr = ctypes.cast( - ctypes.c_void_p( - ctypes.cast(ptr, ctypes.c_void_p).value + offset), - type(ptr)) - return BTypePtr._from_ctypes(ptr) - - -class CTypesLibrary(object): - - def __init__(self, backend, cdll): - self.backend = backend - self.cdll = cdll - - def load_function(self, BType, name): - c_func = getattr(self.cdll, name) - funcobj = BType._from_ctypes(c_func) - funcobj._name = name - return funcobj - - def read_variable(self, BType, name): - try: - ctypes_obj = BType._ctype.in_dll(self.cdll, name) - except AttributeError as e: - raise NotImplementedError(e) - return BType._from_ctypes(ctypes_obj) - - def write_variable(self, BType, name, value): - new_ctypes_obj = BType._to_ctypes(value) - ctypes_obj = BType._ctype.in_dll(self.cdll, name) - ctypes.memmove(ctypes.addressof(ctypes_obj), - ctypes.addressof(new_ctypes_obj), - ctypes.sizeof(BType._ctype)) diff --git a/website/web/Lib/site-packages/cffi/cffi_opcode.py b/website/web/Lib/site-packages/cffi/cffi_opcode.py deleted file mode 100644 index a0df98d1c..000000000 --- a/website/web/Lib/site-packages/cffi/cffi_opcode.py +++ /dev/null @@ -1,187 +0,0 @@ -from .error import VerificationError - -class CffiOp(object): - def __init__(self, op, arg): - self.op = op - self.arg = arg - - def as_c_expr(self): - if self.op is None: - assert isinstance(self.arg, str) - return '(_cffi_opcode_t)(%s)' % (self.arg,) - classname = CLASS_NAME[self.op] - return '_CFFI_OP(_CFFI_OP_%s, %s)' % (classname, self.arg) - - def as_python_bytes(self): - if self.op is None and self.arg.isdigit(): - value = int(self.arg) # non-negative: '-' not in self.arg - if value >= 2**31: - raise OverflowError("cannot emit %r: limited to 2**31-1" - % (self.arg,)) - return format_four_bytes(value) - if isinstance(self.arg, str): - raise VerificationError("cannot emit to Python: %r" % (self.arg,)) - return format_four_bytes((self.arg << 8) | self.op) - - def __str__(self): - classname = CLASS_NAME.get(self.op, self.op) - return '(%s %s)' % (classname, self.arg) - -def format_four_bytes(num): - return '\\x%02X\\x%02X\\x%02X\\x%02X' % ( - (num >> 24) & 0xFF, - (num >> 16) & 0xFF, - (num >> 8) & 0xFF, - (num ) & 0xFF) - -OP_PRIMITIVE = 1 -OP_POINTER = 3 -OP_ARRAY = 5 -OP_OPEN_ARRAY = 7 -OP_STRUCT_UNION = 9 -OP_ENUM = 11 -OP_FUNCTION = 13 -OP_FUNCTION_END = 15 -OP_NOOP = 17 -OP_BITFIELD = 19 -OP_TYPENAME = 21 -OP_CPYTHON_BLTN_V = 23 # varargs -OP_CPYTHON_BLTN_N = 25 # noargs -OP_CPYTHON_BLTN_O = 27 # O (i.e. a single arg) -OP_CONSTANT = 29 -OP_CONSTANT_INT = 31 -OP_GLOBAL_VAR = 33 -OP_DLOPEN_FUNC = 35 -OP_DLOPEN_CONST = 37 -OP_GLOBAL_VAR_F = 39 -OP_EXTERN_PYTHON = 41 - -PRIM_VOID = 0 -PRIM_BOOL = 1 -PRIM_CHAR = 2 -PRIM_SCHAR = 3 -PRIM_UCHAR = 4 -PRIM_SHORT = 5 -PRIM_USHORT = 6 -PRIM_INT = 7 -PRIM_UINT = 8 -PRIM_LONG = 9 -PRIM_ULONG = 10 -PRIM_LONGLONG = 11 -PRIM_ULONGLONG = 12 -PRIM_FLOAT = 13 -PRIM_DOUBLE = 14 -PRIM_LONGDOUBLE = 15 - -PRIM_WCHAR = 16 -PRIM_INT8 = 17 -PRIM_UINT8 = 18 -PRIM_INT16 = 19 -PRIM_UINT16 = 20 -PRIM_INT32 = 21 -PRIM_UINT32 = 22 -PRIM_INT64 = 23 -PRIM_UINT64 = 24 -PRIM_INTPTR = 25 -PRIM_UINTPTR = 26 -PRIM_PTRDIFF = 27 -PRIM_SIZE = 28 -PRIM_SSIZE = 29 -PRIM_INT_LEAST8 = 30 -PRIM_UINT_LEAST8 = 31 -PRIM_INT_LEAST16 = 32 -PRIM_UINT_LEAST16 = 33 -PRIM_INT_LEAST32 = 34 -PRIM_UINT_LEAST32 = 35 -PRIM_INT_LEAST64 = 36 -PRIM_UINT_LEAST64 = 37 -PRIM_INT_FAST8 = 38 -PRIM_UINT_FAST8 = 39 -PRIM_INT_FAST16 = 40 -PRIM_UINT_FAST16 = 41 -PRIM_INT_FAST32 = 42 -PRIM_UINT_FAST32 = 43 -PRIM_INT_FAST64 = 44 -PRIM_UINT_FAST64 = 45 -PRIM_INTMAX = 46 -PRIM_UINTMAX = 47 -PRIM_FLOATCOMPLEX = 48 -PRIM_DOUBLECOMPLEX = 49 -PRIM_CHAR16 = 50 -PRIM_CHAR32 = 51 - -_NUM_PRIM = 52 -_UNKNOWN_PRIM = -1 -_UNKNOWN_FLOAT_PRIM = -2 -_UNKNOWN_LONG_DOUBLE = -3 - -_IO_FILE_STRUCT = -1 - -PRIMITIVE_TO_INDEX = { - 'char': PRIM_CHAR, - 'short': PRIM_SHORT, - 'int': PRIM_INT, - 'long': PRIM_LONG, - 'long long': PRIM_LONGLONG, - 'signed char': PRIM_SCHAR, - 'unsigned char': PRIM_UCHAR, - 'unsigned short': PRIM_USHORT, - 'unsigned int': PRIM_UINT, - 'unsigned long': PRIM_ULONG, - 'unsigned long long': PRIM_ULONGLONG, - 'float': PRIM_FLOAT, - 'double': PRIM_DOUBLE, - 'long double': PRIM_LONGDOUBLE, - 'float _Complex': PRIM_FLOATCOMPLEX, - 'double _Complex': PRIM_DOUBLECOMPLEX, - '_Bool': PRIM_BOOL, - 'wchar_t': PRIM_WCHAR, - 'char16_t': PRIM_CHAR16, - 'char32_t': PRIM_CHAR32, - 'int8_t': PRIM_INT8, - 'uint8_t': PRIM_UINT8, - 'int16_t': PRIM_INT16, - 'uint16_t': PRIM_UINT16, - 'int32_t': PRIM_INT32, - 'uint32_t': PRIM_UINT32, - 'int64_t': PRIM_INT64, - 'uint64_t': PRIM_UINT64, - 'intptr_t': PRIM_INTPTR, - 'uintptr_t': PRIM_UINTPTR, - 'ptrdiff_t': PRIM_PTRDIFF, - 'size_t': PRIM_SIZE, - 'ssize_t': PRIM_SSIZE, - 'int_least8_t': PRIM_INT_LEAST8, - 'uint_least8_t': PRIM_UINT_LEAST8, - 'int_least16_t': PRIM_INT_LEAST16, - 'uint_least16_t': PRIM_UINT_LEAST16, - 'int_least32_t': PRIM_INT_LEAST32, - 'uint_least32_t': PRIM_UINT_LEAST32, - 'int_least64_t': PRIM_INT_LEAST64, - 'uint_least64_t': PRIM_UINT_LEAST64, - 'int_fast8_t': PRIM_INT_FAST8, - 'uint_fast8_t': PRIM_UINT_FAST8, - 'int_fast16_t': PRIM_INT_FAST16, - 'uint_fast16_t': PRIM_UINT_FAST16, - 'int_fast32_t': PRIM_INT_FAST32, - 'uint_fast32_t': PRIM_UINT_FAST32, - 'int_fast64_t': PRIM_INT_FAST64, - 'uint_fast64_t': PRIM_UINT_FAST64, - 'intmax_t': PRIM_INTMAX, - 'uintmax_t': PRIM_UINTMAX, - } - -F_UNION = 0x01 -F_CHECK_FIELDS = 0x02 -F_PACKED = 0x04 -F_EXTERNAL = 0x08 -F_OPAQUE = 0x10 - -G_FLAGS = dict([('_CFFI_' + _key, globals()[_key]) - for _key in ['F_UNION', 'F_CHECK_FIELDS', 'F_PACKED', - 'F_EXTERNAL', 'F_OPAQUE']]) - -CLASS_NAME = {} -for _name, _value in list(globals().items()): - if _name.startswith('OP_') and isinstance(_value, int): - CLASS_NAME[_value] = _name[3:] diff --git a/website/web/Lib/site-packages/cffi/commontypes.py b/website/web/Lib/site-packages/cffi/commontypes.py deleted file mode 100644 index 8ec97c756..000000000 --- a/website/web/Lib/site-packages/cffi/commontypes.py +++ /dev/null @@ -1,80 +0,0 @@ -import sys -from . import model -from .error import FFIError - - -COMMON_TYPES = {} - -try: - # fetch "bool" and all simple Windows types - from _cffi_backend import _get_common_types - _get_common_types(COMMON_TYPES) -except ImportError: - pass - -COMMON_TYPES['FILE'] = model.unknown_type('FILE', '_IO_FILE') -COMMON_TYPES['bool'] = '_Bool' # in case we got ImportError above - -for _type in model.PrimitiveType.ALL_PRIMITIVE_TYPES: - if _type.endswith('_t'): - COMMON_TYPES[_type] = _type -del _type - -_CACHE = {} - -def resolve_common_type(parser, commontype): - try: - return _CACHE[commontype] - except KeyError: - cdecl = COMMON_TYPES.get(commontype, commontype) - if not isinstance(cdecl, str): - result, quals = cdecl, 0 # cdecl is already a BaseType - elif cdecl in model.PrimitiveType.ALL_PRIMITIVE_TYPES: - result, quals = model.PrimitiveType(cdecl), 0 - elif cdecl == 'set-unicode-needed': - raise FFIError("The Windows type %r is only available after " - "you call ffi.set_unicode()" % (commontype,)) - else: - if commontype == cdecl: - raise FFIError( - "Unsupported type: %r. Please look at " - "http://cffi.readthedocs.io/en/latest/cdef.html#ffi-cdef-limitations " - "and file an issue if you think this type should really " - "be supported." % (commontype,)) - result, quals = parser.parse_type_and_quals(cdecl) # recursive - - assert isinstance(result, model.BaseTypeByIdentity) - _CACHE[commontype] = result, quals - return result, quals - - -# ____________________________________________________________ -# extra types for Windows (most of them are in commontypes.c) - - -def win_common_types(): - return { - "UNICODE_STRING": model.StructType( - "_UNICODE_STRING", - ["Length", - "MaximumLength", - "Buffer"], - [model.PrimitiveType("unsigned short"), - model.PrimitiveType("unsigned short"), - model.PointerType(model.PrimitiveType("wchar_t"))], - [-1, -1, -1]), - "PUNICODE_STRING": "UNICODE_STRING *", - "PCUNICODE_STRING": "const UNICODE_STRING *", - - "TBYTE": "set-unicode-needed", - "TCHAR": "set-unicode-needed", - "LPCTSTR": "set-unicode-needed", - "PCTSTR": "set-unicode-needed", - "LPTSTR": "set-unicode-needed", - "PTSTR": "set-unicode-needed", - "PTBYTE": "set-unicode-needed", - "PTCHAR": "set-unicode-needed", - } - -if sys.platform == 'win32': - COMMON_TYPES.update(win_common_types()) diff --git a/website/web/Lib/site-packages/cffi/cparser.py b/website/web/Lib/site-packages/cffi/cparser.py deleted file mode 100644 index f7e2e3563..000000000 --- a/website/web/Lib/site-packages/cffi/cparser.py +++ /dev/null @@ -1,891 +0,0 @@ -from . import model -from .commontypes import COMMON_TYPES, resolve_common_type -from .error import FFIError, CDefError -try: - from . import _pycparser as pycparser -except ImportError: - import pycparser -import weakref, re, sys - -try: - if sys.version_info < (3,): - import thread as _thread - else: - import _thread - lock = _thread.allocate_lock() -except ImportError: - lock = None - -CDEF_SOURCE_STRING = "" -_r_comment = re.compile(r"/\*.*?\*/|//([^\n\\]|\\.)*?$", - re.DOTALL | re.MULTILINE) -_r_define = re.compile(r"^\s*#\s*define\s+([A-Za-z_][A-Za-z_0-9]*)" - r"\b((?:[^\n\\]|\\.)*?)$", - re.DOTALL | re.MULTILINE) -_r_partial_enum = re.compile(r"=\s*\.\.\.\s*[,}]|\.\.\.\s*\}") -_r_enum_dotdotdot = re.compile(r"__dotdotdot\d+__$") -_r_partial_array = re.compile(r"\[\s*\.\.\.\s*\]") -_r_words = re.compile(r"\w+|\S") -_parser_cache = None -_r_int_literal = re.compile(r"-?0?x?[0-9a-f]+[lu]*$", re.IGNORECASE) -_r_stdcall1 = re.compile(r"\b(__stdcall|WINAPI)\b") -_r_stdcall2 = re.compile(r"[(]\s*(__stdcall|WINAPI)\b") -_r_cdecl = re.compile(r"\b__cdecl\b") -_r_extern_python = re.compile(r'\bextern\s*"' - r'(Python|Python\s*\+\s*C|C\s*\+\s*Python)"\s*.') -_r_star_const_space = re.compile( # matches "* const " - r"[*]\s*((const|volatile|restrict)\b\s*)+") -_r_int_dotdotdot = re.compile(r"(\b(int|long|short|signed|unsigned|char)\s*)+" - r"\.\.\.") -_r_float_dotdotdot = re.compile(r"\b(double|float)\s*\.\.\.") - -def _get_parser(): - global _parser_cache - if _parser_cache is None: - _parser_cache = pycparser.CParser() - return _parser_cache - -def _workaround_for_old_pycparser(csource): - # Workaround for a pycparser issue (fixed between pycparser 2.10 and - # 2.14): "char*const***" gives us a wrong syntax tree, the same as - # for "char***(*const)". This means we can't tell the difference - # afterwards. But "char(*const(***))" gives us the right syntax - # tree. The issue only occurs if there are several stars in - # sequence with no parenthesis inbetween, just possibly qualifiers. - # Attempt to fix it by adding some parentheses in the source: each - # time we see "* const" or "* const *", we add an opening - # parenthesis before each star---the hard part is figuring out where - # to close them. - parts = [] - while True: - match = _r_star_const_space.search(csource) - if not match: - break - #print repr(''.join(parts)+csource), '=>', - parts.append(csource[:match.start()]) - parts.append('('); closing = ')' - parts.append(match.group()) # e.g. "* const " - endpos = match.end() - if csource.startswith('*', endpos): - parts.append('('); closing += ')' - level = 0 - i = endpos - while i < len(csource): - c = csource[i] - if c == '(': - level += 1 - elif c == ')': - if level == 0: - break - level -= 1 - elif c in ',;=': - if level == 0: - break - i += 1 - csource = csource[endpos:i] + closing + csource[i:] - #print repr(''.join(parts)+csource) - parts.append(csource) - return ''.join(parts) - -def _preprocess_extern_python(csource): - # input: `extern "Python" int foo(int);` or - # `extern "Python" { int foo(int); }` - # output: - # void __cffi_extern_python_start; - # int foo(int); - # void __cffi_extern_python_stop; - # - # input: `extern "Python+C" int foo(int);` - # output: - # void __cffi_extern_python_plus_c_start; - # int foo(int); - # void __cffi_extern_python_stop; - parts = [] - while True: - match = _r_extern_python.search(csource) - if not match: - break - endpos = match.end() - 1 - #print - #print ''.join(parts)+csource - #print '=>' - parts.append(csource[:match.start()]) - if 'C' in match.group(1): - parts.append('void __cffi_extern_python_plus_c_start; ') - else: - parts.append('void __cffi_extern_python_start; ') - if csource[endpos] == '{': - # grouping variant - closing = csource.find('}', endpos) - if closing < 0: - raise CDefError("'extern \"Python\" {': no '}' found") - if csource.find('{', endpos + 1, closing) >= 0: - raise NotImplementedError("cannot use { } inside a block " - "'extern \"Python\" { ... }'") - parts.append(csource[endpos+1:closing]) - csource = csource[closing+1:] - else: - # non-grouping variant - semicolon = csource.find(';', endpos) - if semicolon < 0: - raise CDefError("'extern \"Python\": no ';' found") - parts.append(csource[endpos:semicolon+1]) - csource = csource[semicolon+1:] - parts.append(' void __cffi_extern_python_stop;') - #print ''.join(parts)+csource - #print - parts.append(csource) - return ''.join(parts) - -def _preprocess(csource): - # Remove comments. NOTE: this only work because the cdef() section - # should not contain any string literal! - csource = _r_comment.sub(' ', csource) - # Remove the "#define FOO x" lines - macros = {} - for match in _r_define.finditer(csource): - macroname, macrovalue = match.groups() - macrovalue = macrovalue.replace('\\\n', '').strip() - macros[macroname] = macrovalue - csource = _r_define.sub('', csource) - # - if pycparser.__version__ < '2.14': - csource = _workaround_for_old_pycparser(csource) - # - # BIG HACK: replace WINAPI or __stdcall with "volatile const". - # It doesn't make sense for the return type of a function to be - # "volatile volatile const", so we abuse it to detect __stdcall... - # Hack number 2 is that "int(volatile *fptr)();" is not valid C - # syntax, so we place the "volatile" before the opening parenthesis. - csource = _r_stdcall2.sub(' volatile volatile const(', csource) - csource = _r_stdcall1.sub(' volatile volatile const ', csource) - csource = _r_cdecl.sub(' ', csource) - # - # Replace `extern "Python"` with start/end markers - csource = _preprocess_extern_python(csource) - # - # Replace "[...]" with "[__dotdotdotarray__]" - csource = _r_partial_array.sub('[__dotdotdotarray__]', csource) - # - # Replace "...}" with "__dotdotdotNUM__}". This construction should - # occur only at the end of enums; at the end of structs we have "...;}" - # and at the end of vararg functions "...);". Also replace "=...[,}]" - # with ",__dotdotdotNUM__[,}]": this occurs in the enums too, when - # giving an unknown value. - matches = list(_r_partial_enum.finditer(csource)) - for number, match in enumerate(reversed(matches)): - p = match.start() - if csource[p] == '=': - p2 = csource.find('...', p, match.end()) - assert p2 > p - csource = '%s,__dotdotdot%d__ %s' % (csource[:p], number, - csource[p2+3:]) - else: - assert csource[p:p+3] == '...' - csource = '%s __dotdotdot%d__ %s' % (csource[:p], number, - csource[p+3:]) - # Replace "int ..." or "unsigned long int..." with "__dotdotdotint__" - csource = _r_int_dotdotdot.sub(' __dotdotdotint__ ', csource) - # Replace "float ..." or "double..." with "__dotdotdotfloat__" - csource = _r_float_dotdotdot.sub(' __dotdotdotfloat__ ', csource) - # Replace all remaining "..." with the same name, "__dotdotdot__", - # which is declared with a typedef for the purpose of C parsing. - return csource.replace('...', ' __dotdotdot__ '), macros - -def _common_type_names(csource): - # Look in the source for what looks like usages of types from the - # list of common types. A "usage" is approximated here as the - # appearance of the word, minus a "definition" of the type, which - # is the last word in a "typedef" statement. Approximative only - # but should be fine for all the common types. - look_for_words = set(COMMON_TYPES) - look_for_words.add(';') - look_for_words.add(',') - look_for_words.add('(') - look_for_words.add(')') - look_for_words.add('typedef') - words_used = set() - is_typedef = False - paren = 0 - previous_word = '' - for word in _r_words.findall(csource): - if word in look_for_words: - if word == ';': - if is_typedef: - words_used.discard(previous_word) - look_for_words.discard(previous_word) - is_typedef = False - elif word == 'typedef': - is_typedef = True - paren = 0 - elif word == '(': - paren += 1 - elif word == ')': - paren -= 1 - elif word == ',': - if is_typedef and paren == 0: - words_used.discard(previous_word) - look_for_words.discard(previous_word) - else: # word in COMMON_TYPES - words_used.add(word) - previous_word = word - return words_used - - -class Parser(object): - - def __init__(self): - self._declarations = {} - self._included_declarations = set() - self._anonymous_counter = 0 - self._structnode2type = weakref.WeakKeyDictionary() - self._options = {} - self._int_constants = {} - self._recomplete = [] - self._uses_new_feature = None - - def _parse(self, csource): - csource, macros = _preprocess(csource) - # XXX: for more efficiency we would need to poke into the - # internals of CParser... the following registers the - # typedefs, because their presence or absence influences the - # parsing itself (but what they are typedef'ed to plays no role) - ctn = _common_type_names(csource) - typenames = [] - for name in sorted(self._declarations): - if name.startswith('typedef '): - name = name[8:] - typenames.append(name) - ctn.discard(name) - typenames += sorted(ctn) - # - csourcelines = [] - csourcelines.append('# 1 ""') - for typename in typenames: - csourcelines.append('typedef int %s;' % typename) - csourcelines.append('typedef int __dotdotdotint__, __dotdotdotfloat__,' - ' __dotdotdot__;') - # this forces pycparser to consider the following in the file - # called from line 1 - csourcelines.append('# 1 "%s"' % (CDEF_SOURCE_STRING,)) - csourcelines.append(csource) - fullcsource = '\n'.join(csourcelines) - if lock is not None: - lock.acquire() # pycparser is not thread-safe... - try: - ast = _get_parser().parse(fullcsource) - except pycparser.c_parser.ParseError as e: - self.convert_pycparser_error(e, csource) - finally: - if lock is not None: - lock.release() - # csource will be used to find buggy source text - return ast, macros, csource - - def _convert_pycparser_error(self, e, csource): - # xxx look for ":NUM:" at the start of str(e) - # and interpret that as a line number. This will not work if - # the user gives explicit ``# NUM "FILE"`` directives. - line = None - msg = str(e) - match = re.match(r"%s:(\d+):" % (CDEF_SOURCE_STRING,), msg) - if match: - linenum = int(match.group(1), 10) - csourcelines = csource.splitlines() - if 1 <= linenum <= len(csourcelines): - line = csourcelines[linenum-1] - return line - - def convert_pycparser_error(self, e, csource): - line = self._convert_pycparser_error(e, csource) - - msg = str(e) - if line: - msg = 'cannot parse "%s"\n%s' % (line.strip(), msg) - else: - msg = 'parse error\n%s' % (msg,) - raise CDefError(msg) - - def parse(self, csource, override=False, packed=False, dllexport=False): - prev_options = self._options - try: - self._options = {'override': override, - 'packed': packed, - 'dllexport': dllexport} - self._internal_parse(csource) - finally: - self._options = prev_options - - def _internal_parse(self, csource): - ast, macros, csource = self._parse(csource) - # add the macros - self._process_macros(macros) - # find the first "__dotdotdot__" and use that as a separator - # between the repeated typedefs and the real csource - iterator = iter(ast.ext) - for decl in iterator: - if decl.name == '__dotdotdot__': - break - else: - assert 0 - current_decl = None - # - try: - self._inside_extern_python = '__cffi_extern_python_stop' - for decl in iterator: - current_decl = decl - if isinstance(decl, pycparser.c_ast.Decl): - self._parse_decl(decl) - elif isinstance(decl, pycparser.c_ast.Typedef): - if not decl.name: - raise CDefError("typedef does not declare any name", - decl) - quals = 0 - if (isinstance(decl.type.type, pycparser.c_ast.IdentifierType) and - decl.type.type.names[-1].startswith('__dotdotdot')): - realtype = self._get_unknown_type(decl) - elif (isinstance(decl.type, pycparser.c_ast.PtrDecl) and - isinstance(decl.type.type, pycparser.c_ast.TypeDecl) and - isinstance(decl.type.type.type, - pycparser.c_ast.IdentifierType) and - decl.type.type.type.names[-1].startswith('__dotdotdot')): - realtype = self._get_unknown_ptr_type(decl) - else: - realtype, quals = self._get_type_and_quals( - decl.type, name=decl.name, partial_length_ok=True) - self._declare('typedef ' + decl.name, realtype, quals=quals) - elif decl.__class__.__name__ == 'Pragma': - pass # skip pragma, only in pycparser 2.15 - else: - raise CDefError("unexpected <%s>: this construct is valid " - "C but not valid in cdef()" % - decl.__class__.__name__, decl) - except CDefError as e: - if len(e.args) == 1: - e.args = e.args + (current_decl,) - raise - except FFIError as e: - msg = self._convert_pycparser_error(e, csource) - if msg: - e.args = (e.args[0] + "\n *** Err: %s" % msg,) - raise - - def _add_constants(self, key, val): - if key in self._int_constants: - if self._int_constants[key] == val: - return # ignore identical double declarations - raise FFIError( - "multiple declarations of constant: %s" % (key,)) - self._int_constants[key] = val - - def _add_integer_constant(self, name, int_str): - int_str = int_str.lower().rstrip("ul") - neg = int_str.startswith('-') - if neg: - int_str = int_str[1:] - # "010" is not valid oct in py3 - if (int_str.startswith("0") and int_str != '0' - and not int_str.startswith("0x")): - int_str = "0o" + int_str[1:] - pyvalue = int(int_str, 0) - if neg: - pyvalue = -pyvalue - self._add_constants(name, pyvalue) - self._declare('macro ' + name, pyvalue) - - def _process_macros(self, macros): - for key, value in macros.items(): - value = value.strip() - if _r_int_literal.match(value): - self._add_integer_constant(key, value) - elif value == '...': - self._declare('macro ' + key, value) - else: - raise CDefError( - 'only supports one of the following syntax:\n' - ' #define %s ... (literally dot-dot-dot)\n' - ' #define %s NUMBER (with NUMBER an integer' - ' constant, decimal/hex/octal)\n' - 'got:\n' - ' #define %s %s' - % (key, key, key, value)) - - def _declare_function(self, tp, quals, decl): - tp = self._get_type_pointer(tp, quals) - if self._options.get('dllexport'): - tag = 'dllexport_python ' - elif self._inside_extern_python == '__cffi_extern_python_start': - tag = 'extern_python ' - elif self._inside_extern_python == '__cffi_extern_python_plus_c_start': - tag = 'extern_python_plus_c ' - else: - tag = 'function ' - self._declare(tag + decl.name, tp) - - def _parse_decl(self, decl): - node = decl.type - if isinstance(node, pycparser.c_ast.FuncDecl): - tp, quals = self._get_type_and_quals(node, name=decl.name) - assert isinstance(tp, model.RawFunctionType) - self._declare_function(tp, quals, decl) - else: - if isinstance(node, pycparser.c_ast.Struct): - self._get_struct_union_enum_type('struct', node) - elif isinstance(node, pycparser.c_ast.Union): - self._get_struct_union_enum_type('union', node) - elif isinstance(node, pycparser.c_ast.Enum): - self._get_struct_union_enum_type('enum', node) - elif not decl.name: - raise CDefError("construct does not declare any variable", - decl) - # - if decl.name: - tp, quals = self._get_type_and_quals(node, - partial_length_ok=True) - if tp.is_raw_function: - self._declare_function(tp, quals, decl) - elif (tp.is_integer_type() and - hasattr(decl, 'init') and - hasattr(decl.init, 'value') and - _r_int_literal.match(decl.init.value)): - self._add_integer_constant(decl.name, decl.init.value) - elif (tp.is_integer_type() and - isinstance(decl.init, pycparser.c_ast.UnaryOp) and - decl.init.op == '-' and - hasattr(decl.init.expr, 'value') and - _r_int_literal.match(decl.init.expr.value)): - self._add_integer_constant(decl.name, - '-' + decl.init.expr.value) - elif (tp is model.void_type and - decl.name.startswith('__cffi_extern_python_')): - # hack: `extern "Python"` in the C source is replaced - # with "void __cffi_extern_python_start;" and - # "void __cffi_extern_python_stop;" - self._inside_extern_python = decl.name - else: - if self._inside_extern_python !='__cffi_extern_python_stop': - raise CDefError( - "cannot declare constants or " - "variables with 'extern \"Python\"'") - if (quals & model.Q_CONST) and not tp.is_array_type: - self._declare('constant ' + decl.name, tp, quals=quals) - else: - self._declare('variable ' + decl.name, tp, quals=quals) - - def parse_type(self, cdecl): - return self.parse_type_and_quals(cdecl)[0] - - def parse_type_and_quals(self, cdecl): - ast, macros = self._parse('void __dummy(\n%s\n);' % cdecl)[:2] - assert not macros - exprnode = ast.ext[-1].type.args.params[0] - if isinstance(exprnode, pycparser.c_ast.ID): - raise CDefError("unknown identifier '%s'" % (exprnode.name,)) - return self._get_type_and_quals(exprnode.type) - - def _declare(self, name, obj, included=False, quals=0): - if name in self._declarations: - prevobj, prevquals = self._declarations[name] - if prevobj is obj and prevquals == quals: - return - if not self._options.get('override'): - raise FFIError( - "multiple declarations of %s (for interactive usage, " - "try cdef(xx, override=True))" % (name,)) - assert '__dotdotdot__' not in name.split() - self._declarations[name] = (obj, quals) - if included: - self._included_declarations.add(obj) - - def _extract_quals(self, type): - quals = 0 - if isinstance(type, (pycparser.c_ast.TypeDecl, - pycparser.c_ast.PtrDecl)): - if 'const' in type.quals: - quals |= model.Q_CONST - if 'volatile' in type.quals: - quals |= model.Q_VOLATILE - if 'restrict' in type.quals: - quals |= model.Q_RESTRICT - return quals - - def _get_type_pointer(self, type, quals, declname=None): - if isinstance(type, model.RawFunctionType): - return type.as_function_pointer() - if (isinstance(type, model.StructOrUnionOrEnum) and - type.name.startswith('$') and type.name[1:].isdigit() and - type.forcename is None and declname is not None): - return model.NamedPointerType(type, declname, quals) - return model.PointerType(type, quals) - - def _get_type_and_quals(self, typenode, name=None, partial_length_ok=False): - # first, dereference typedefs, if we have it already parsed, we're good - if (isinstance(typenode, pycparser.c_ast.TypeDecl) and - isinstance(typenode.type, pycparser.c_ast.IdentifierType) and - len(typenode.type.names) == 1 and - ('typedef ' + typenode.type.names[0]) in self._declarations): - tp, quals = self._declarations['typedef ' + typenode.type.names[0]] - quals |= self._extract_quals(typenode) - return tp, quals - # - if isinstance(typenode, pycparser.c_ast.ArrayDecl): - # array type - if typenode.dim is None: - length = None - else: - length = self._parse_constant( - typenode.dim, partial_length_ok=partial_length_ok) - tp, quals = self._get_type_and_quals(typenode.type, - partial_length_ok=partial_length_ok) - return model.ArrayType(tp, length), quals - # - if isinstance(typenode, pycparser.c_ast.PtrDecl): - # pointer type - itemtype, itemquals = self._get_type_and_quals(typenode.type) - tp = self._get_type_pointer(itemtype, itemquals, declname=name) - quals = self._extract_quals(typenode) - return tp, quals - # - if isinstance(typenode, pycparser.c_ast.TypeDecl): - quals = self._extract_quals(typenode) - type = typenode.type - if isinstance(type, pycparser.c_ast.IdentifierType): - # assume a primitive type. get it from .names, but reduce - # synonyms to a single chosen combination - names = list(type.names) - if names != ['signed', 'char']: # keep this unmodified - prefixes = {} - while names: - name = names[0] - if name in ('short', 'long', 'signed', 'unsigned'): - prefixes[name] = prefixes.get(name, 0) + 1 - del names[0] - else: - break - # ignore the 'signed' prefix below, and reorder the others - newnames = [] - for prefix in ('unsigned', 'short', 'long'): - for i in range(prefixes.get(prefix, 0)): - newnames.append(prefix) - if not names: - names = ['int'] # implicitly - if names == ['int']: # but kill it if 'short' or 'long' - if 'short' in prefixes or 'long' in prefixes: - names = [] - names = newnames + names - ident = ' '.join(names) - if ident == 'void': - return model.void_type, quals - if ident == '__dotdotdot__': - raise FFIError(':%d: bad usage of "..."' % - typenode.coord.line) - tp0, quals0 = resolve_common_type(self, ident) - return tp0, (quals | quals0) - # - if isinstance(type, pycparser.c_ast.Struct): - # 'struct foobar' - tp = self._get_struct_union_enum_type('struct', type, name) - return tp, quals - # - if isinstance(type, pycparser.c_ast.Union): - # 'union foobar' - tp = self._get_struct_union_enum_type('union', type, name) - return tp, quals - # - if isinstance(type, pycparser.c_ast.Enum): - # 'enum foobar' - tp = self._get_struct_union_enum_type('enum', type, name) - return tp, quals - # - if isinstance(typenode, pycparser.c_ast.FuncDecl): - # a function type - return self._parse_function_type(typenode, name), 0 - # - # nested anonymous structs or unions end up here - if isinstance(typenode, pycparser.c_ast.Struct): - return self._get_struct_union_enum_type('struct', typenode, name, - nested=True), 0 - if isinstance(typenode, pycparser.c_ast.Union): - return self._get_struct_union_enum_type('union', typenode, name, - nested=True), 0 - # - raise FFIError(":%d: bad or unsupported type declaration" % - typenode.coord.line) - - def _parse_function_type(self, typenode, funcname=None): - params = list(getattr(typenode.args, 'params', [])) - for i, arg in enumerate(params): - if not hasattr(arg, 'type'): - raise CDefError("%s arg %d: unknown type '%s'" - " (if you meant to use the old C syntax of giving" - " untyped arguments, it is not supported)" - % (funcname or 'in expression', i + 1, - getattr(arg, 'name', '?'))) - ellipsis = ( - len(params) > 0 and - isinstance(params[-1].type, pycparser.c_ast.TypeDecl) and - isinstance(params[-1].type.type, - pycparser.c_ast.IdentifierType) and - params[-1].type.type.names == ['__dotdotdot__']) - if ellipsis: - params.pop() - if not params: - raise CDefError( - "%s: a function with only '(...)' as argument" - " is not correct C" % (funcname or 'in expression')) - args = [self._as_func_arg(*self._get_type_and_quals(argdeclnode.type)) - for argdeclnode in params] - if not ellipsis and args == [model.void_type]: - args = [] - result, quals = self._get_type_and_quals(typenode.type) - # the 'quals' on the result type are ignored. HACK: we absure them - # to detect __stdcall functions: we textually replace "__stdcall" - # with "volatile volatile const" above. - abi = None - if hasattr(typenode.type, 'quals'): # else, probable syntax error anyway - if typenode.type.quals[-3:] == ['volatile', 'volatile', 'const']: - abi = '__stdcall' - return model.RawFunctionType(tuple(args), result, ellipsis, abi) - - def _as_func_arg(self, type, quals): - if isinstance(type, model.ArrayType): - return model.PointerType(type.item, quals) - elif isinstance(type, model.RawFunctionType): - return type.as_function_pointer() - else: - return type - - def _get_struct_union_enum_type(self, kind, type, name=None, nested=False): - # First, a level of caching on the exact 'type' node of the AST. - # This is obscure, but needed because pycparser "unrolls" declarations - # such as "typedef struct { } foo_t, *foo_p" and we end up with - # an AST that is not a tree, but a DAG, with the "type" node of the - # two branches foo_t and foo_p of the trees being the same node. - # It's a bit silly but detecting "DAG-ness" in the AST tree seems - # to be the only way to distinguish this case from two independent - # structs. See test_struct_with_two_usages. - try: - return self._structnode2type[type] - except KeyError: - pass - # - # Note that this must handle parsing "struct foo" any number of - # times and always return the same StructType object. Additionally, - # one of these times (not necessarily the first), the fields of - # the struct can be specified with "struct foo { ...fields... }". - # If no name is given, then we have to create a new anonymous struct - # with no caching; in this case, the fields are either specified - # right now or never. - # - force_name = name - name = type.name - # - # get the type or create it if needed - if name is None: - # 'force_name' is used to guess a more readable name for - # anonymous structs, for the common case "typedef struct { } foo". - if force_name is not None: - explicit_name = '$%s' % force_name - else: - self._anonymous_counter += 1 - explicit_name = '$%d' % self._anonymous_counter - tp = None - else: - explicit_name = name - key = '%s %s' % (kind, name) - tp, _ = self._declarations.get(key, (None, None)) - # - if tp is None: - if kind == 'struct': - tp = model.StructType(explicit_name, None, None, None) - elif kind == 'union': - tp = model.UnionType(explicit_name, None, None, None) - elif kind == 'enum': - if explicit_name == '__dotdotdot__': - raise CDefError("Enums cannot be declared with ...") - tp = self._build_enum_type(explicit_name, type.values) - else: - raise AssertionError("kind = %r" % (kind,)) - if name is not None: - self._declare(key, tp) - else: - if kind == 'enum' and type.values is not None: - raise NotImplementedError( - "enum %s: the '{}' declaration should appear on the first " - "time the enum is mentioned, not later" % explicit_name) - if not tp.forcename: - tp.force_the_name(force_name) - if tp.forcename and '$' in tp.name: - self._declare('anonymous %s' % tp.forcename, tp) - # - self._structnode2type[type] = tp - # - # enums: done here - if kind == 'enum': - return tp - # - # is there a 'type.decls'? If yes, then this is the place in the - # C sources that declare the fields. If no, then just return the - # existing type, possibly still incomplete. - if type.decls is None: - return tp - # - if tp.fldnames is not None: - raise CDefError("duplicate declaration of struct %s" % name) - fldnames = [] - fldtypes = [] - fldbitsize = [] - fldquals = [] - for decl in type.decls: - if (isinstance(decl.type, pycparser.c_ast.IdentifierType) and - ''.join(decl.type.names) == '__dotdotdot__'): - # XXX pycparser is inconsistent: 'names' should be a list - # of strings, but is sometimes just one string. Use - # str.join() as a way to cope with both. - self._make_partial(tp, nested) - continue - if decl.bitsize is None: - bitsize = -1 - else: - bitsize = self._parse_constant(decl.bitsize) - self._partial_length = False - type, fqual = self._get_type_and_quals(decl.type, - partial_length_ok=True) - if self._partial_length: - self._make_partial(tp, nested) - if isinstance(type, model.StructType) and type.partial: - self._make_partial(tp, nested) - fldnames.append(decl.name or '') - fldtypes.append(type) - fldbitsize.append(bitsize) - fldquals.append(fqual) - tp.fldnames = tuple(fldnames) - tp.fldtypes = tuple(fldtypes) - tp.fldbitsize = tuple(fldbitsize) - tp.fldquals = tuple(fldquals) - if fldbitsize != [-1] * len(fldbitsize): - if isinstance(tp, model.StructType) and tp.partial: - raise NotImplementedError("%s: using both bitfields and '...;'" - % (tp,)) - tp.packed = self._options.get('packed') - if tp.completed: # must be re-completed: it is not opaque any more - tp.completed = 0 - self._recomplete.append(tp) - return tp - - def _make_partial(self, tp, nested): - if not isinstance(tp, model.StructOrUnion): - raise CDefError("%s cannot be partial" % (tp,)) - if not tp.has_c_name() and not nested: - raise NotImplementedError("%s is partial but has no C name" %(tp,)) - tp.partial = True - - def _parse_constant(self, exprnode, partial_length_ok=False): - # for now, limited to expressions that are an immediate number - # or positive/negative number - if isinstance(exprnode, pycparser.c_ast.Constant): - s = exprnode.value - if s.startswith('0'): - if s.startswith('0x') or s.startswith('0X'): - return int(s, 16) - return int(s, 8) - elif '1' <= s[0] <= '9': - return int(s, 10) - elif s[0] == "'" and s[-1] == "'" and ( - len(s) == 3 or (len(s) == 4 and s[1] == "\\")): - return ord(s[-2]) - else: - raise CDefError("invalid constant %r" % (s,)) - # - if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and - exprnode.op == '+'): - return self._parse_constant(exprnode.expr) - # - if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and - exprnode.op == '-'): - return -self._parse_constant(exprnode.expr) - # load previously defined int constant - if (isinstance(exprnode, pycparser.c_ast.ID) and - exprnode.name in self._int_constants): - return self._int_constants[exprnode.name] - # - if (isinstance(exprnode, pycparser.c_ast.ID) and - exprnode.name == '__dotdotdotarray__'): - if partial_length_ok: - self._partial_length = True - return '...' - raise FFIError(":%d: unsupported '[...]' here, cannot derive " - "the actual array length in this context" - % exprnode.coord.line) - # - if (isinstance(exprnode, pycparser.c_ast.BinaryOp) and - exprnode.op == '+'): - return (self._parse_constant(exprnode.left) + - self._parse_constant(exprnode.right)) - # - if (isinstance(exprnode, pycparser.c_ast.BinaryOp) and - exprnode.op == '-'): - return (self._parse_constant(exprnode.left) - - self._parse_constant(exprnode.right)) - # - raise FFIError(":%d: unsupported expression: expected a " - "simple numeric constant" % exprnode.coord.line) - - def _build_enum_type(self, explicit_name, decls): - if decls is not None: - partial = False - enumerators = [] - enumvalues = [] - nextenumvalue = 0 - for enum in decls.enumerators: - if _r_enum_dotdotdot.match(enum.name): - partial = True - continue - if enum.value is not None: - nextenumvalue = self._parse_constant(enum.value) - enumerators.append(enum.name) - enumvalues.append(nextenumvalue) - self._add_constants(enum.name, nextenumvalue) - nextenumvalue += 1 - enumerators = tuple(enumerators) - enumvalues = tuple(enumvalues) - tp = model.EnumType(explicit_name, enumerators, enumvalues) - tp.partial = partial - else: # opaque enum - tp = model.EnumType(explicit_name, (), ()) - return tp - - def include(self, other): - for name, (tp, quals) in other._declarations.items(): - if name.startswith('anonymous $enum_$'): - continue # fix for test_anonymous_enum_include - kind = name.split(' ', 1)[0] - if kind in ('struct', 'union', 'enum', 'anonymous', 'typedef'): - self._declare(name, tp, included=True, quals=quals) - for k, v in other._int_constants.items(): - self._add_constants(k, v) - - def _get_unknown_type(self, decl): - typenames = decl.type.type.names - if typenames == ['__dotdotdot__']: - return model.unknown_type(decl.name) - - if typenames == ['__dotdotdotint__']: - if self._uses_new_feature is None: - self._uses_new_feature = "'typedef int... %s'" % decl.name - return model.UnknownIntegerType(decl.name) - - if typenames == ['__dotdotdotfloat__']: - # note: not for 'long double' so far - if self._uses_new_feature is None: - self._uses_new_feature = "'typedef float... %s'" % decl.name - return model.UnknownFloatType(decl.name) - - raise FFIError(':%d: unsupported usage of "..." in typedef' - % decl.coord.line) - - def _get_unknown_ptr_type(self, decl): - if decl.type.type.type.names == ['__dotdotdot__']: - return model.unknown_ptr_type(decl.name) - raise FFIError(':%d: unsupported usage of "..." in typedef' - % decl.coord.line) diff --git a/website/web/Lib/site-packages/cffi/error.py b/website/web/Lib/site-packages/cffi/error.py deleted file mode 100644 index ec1996484..000000000 --- a/website/web/Lib/site-packages/cffi/error.py +++ /dev/null @@ -1,23 +0,0 @@ - -class FFIError(Exception): - pass - -class CDefError(Exception): - def __str__(self): - try: - current_decl = self.args[1] - filename = current_decl.coord.file - linenum = current_decl.coord.line - prefix = '%s:%d: ' % (filename, linenum) - except (AttributeError, TypeError, IndexError): - prefix = '' - return '%s%s' % (prefix, self.args[0]) - -class VerificationError(Exception): - """ An error raised when verification fails - """ - -class VerificationMissing(Exception): - """ An error raised when incomplete structures are passed into - cdef, but no verification has been done - """ diff --git a/website/web/Lib/site-packages/cffi/ffiplatform.py b/website/web/Lib/site-packages/cffi/ffiplatform.py deleted file mode 100644 index 85313460a..000000000 --- a/website/web/Lib/site-packages/cffi/ffiplatform.py +++ /dev/null @@ -1,127 +0,0 @@ -import sys, os -from .error import VerificationError - - -LIST_OF_FILE_NAMES = ['sources', 'include_dirs', 'library_dirs', - 'extra_objects', 'depends'] - -def get_extension(srcfilename, modname, sources=(), **kwds): - _hack_at_distutils() - from distutils.core import Extension - allsources = [srcfilename] - for src in sources: - allsources.append(os.path.normpath(src)) - return Extension(name=modname, sources=allsources, **kwds) - -def compile(tmpdir, ext, compiler_verbose=0, debug=None): - """Compile a C extension module using distutils.""" - - _hack_at_distutils() - saved_environ = os.environ.copy() - try: - outputfilename = _build(tmpdir, ext, compiler_verbose, debug) - outputfilename = os.path.abspath(outputfilename) - finally: - # workaround for a distutils bugs where some env vars can - # become longer and longer every time it is used - for key, value in saved_environ.items(): - if os.environ.get(key) != value: - os.environ[key] = value - return outputfilename - -def _build(tmpdir, ext, compiler_verbose=0, debug=None): - # XXX compact but horrible :-( - from distutils.core import Distribution - import distutils.errors, distutils.log - # - dist = Distribution({'ext_modules': [ext]}) - dist.parse_config_files() - options = dist.get_option_dict('build_ext') - if debug is None: - debug = sys.flags.debug - options['debug'] = ('ffiplatform', debug) - options['force'] = ('ffiplatform', True) - options['build_lib'] = ('ffiplatform', tmpdir) - options['build_temp'] = ('ffiplatform', tmpdir) - # - try: - old_level = distutils.log.set_threshold(0) or 0 - try: - distutils.log.set_verbosity(compiler_verbose) - dist.run_command('build_ext') - cmd_obj = dist.get_command_obj('build_ext') - [soname] = cmd_obj.get_outputs() - finally: - distutils.log.set_threshold(old_level) - except (distutils.errors.CompileError, - distutils.errors.LinkError) as e: - raise VerificationError('%s: %s' % (e.__class__.__name__, e)) - # - return soname - -try: - from os.path import samefile -except ImportError: - def samefile(f1, f2): - return os.path.abspath(f1) == os.path.abspath(f2) - -def maybe_relative_path(path): - if not os.path.isabs(path): - return path # already relative - dir = path - names = [] - while True: - prevdir = dir - dir, name = os.path.split(prevdir) - if dir == prevdir or not dir: - return path # failed to make it relative - names.append(name) - try: - if samefile(dir, os.curdir): - names.reverse() - return os.path.join(*names) - except OSError: - pass - -# ____________________________________________________________ - -try: - int_or_long = (int, long) - import cStringIO -except NameError: - int_or_long = int # Python 3 - import io as cStringIO - -def _flatten(x, f): - if isinstance(x, str): - f.write('%ds%s' % (len(x), x)) - elif isinstance(x, dict): - keys = sorted(x.keys()) - f.write('%dd' % len(keys)) - for key in keys: - _flatten(key, f) - _flatten(x[key], f) - elif isinstance(x, (list, tuple)): - f.write('%dl' % len(x)) - for value in x: - _flatten(value, f) - elif isinstance(x, int_or_long): - f.write('%di' % (x,)) - else: - raise TypeError( - "the keywords to verify() contains unsupported object %r" % (x,)) - -def flatten(x): - f = cStringIO.StringIO() - _flatten(x, f) - return f.getvalue() - -def _hack_at_distutils(): - # Windows-only workaround for some configurations: see - # https://bugs.python.org/issue23246 (Python 2.7 with - # a specific MS compiler suite download) - if sys.platform == "win32": - try: - import setuptools # for side-effects, patches distutils - except ImportError: - pass diff --git a/website/web/Lib/site-packages/cffi/lock.py b/website/web/Lib/site-packages/cffi/lock.py deleted file mode 100644 index db91b7158..000000000 --- a/website/web/Lib/site-packages/cffi/lock.py +++ /dev/null @@ -1,30 +0,0 @@ -import sys - -if sys.version_info < (3,): - try: - from thread import allocate_lock - except ImportError: - from dummy_thread import allocate_lock -else: - try: - from _thread import allocate_lock - except ImportError: - from _dummy_thread import allocate_lock - - -##import sys -##l1 = allocate_lock - -##class allocate_lock(object): -## def __init__(self): -## self._real = l1() -## def __enter__(self): -## for i in range(4, 0, -1): -## print sys._getframe(i).f_code -## print -## return self._real.__enter__() -## def __exit__(self, *args): -## return self._real.__exit__(*args) -## def acquire(self, f): -## assert f is False -## return self._real.acquire(f) diff --git a/website/web/Lib/site-packages/cffi/model.py b/website/web/Lib/site-packages/cffi/model.py deleted file mode 100644 index fb30f7d8b..000000000 --- a/website/web/Lib/site-packages/cffi/model.py +++ /dev/null @@ -1,612 +0,0 @@ -import types -import weakref - -from .lock import allocate_lock -from .error import CDefError, VerificationError, VerificationMissing - -# type qualifiers -Q_CONST = 0x01 -Q_RESTRICT = 0x02 -Q_VOLATILE = 0x04 - -def qualify(quals, replace_with): - if quals & Q_CONST: - replace_with = ' const ' + replace_with.lstrip() - if quals & Q_VOLATILE: - replace_with = ' volatile ' + replace_with.lstrip() - if quals & Q_RESTRICT: - # It seems that __restrict is supported by gcc and msvc. - # If you hit some different compiler, add a #define in - # _cffi_include.h for it (and in its copies, documented there) - replace_with = ' __restrict ' + replace_with.lstrip() - return replace_with - - -class BaseTypeByIdentity(object): - is_array_type = False - is_raw_function = False - - def get_c_name(self, replace_with='', context='a C file', quals=0): - result = self.c_name_with_marker - assert result.count('&') == 1 - # some logic duplication with ffi.getctype()... :-( - replace_with = replace_with.strip() - if replace_with: - if replace_with.startswith('*') and '&[' in result: - replace_with = '(%s)' % replace_with - elif not replace_with[0] in '[(': - replace_with = ' ' + replace_with - replace_with = qualify(quals, replace_with) - result = result.replace('&', replace_with) - if '$' in result: - raise VerificationError( - "cannot generate '%s' in %s: unknown type name" - % (self._get_c_name(), context)) - return result - - def _get_c_name(self): - return self.c_name_with_marker.replace('&', '') - - def has_c_name(self): - return '$' not in self._get_c_name() - - def is_integer_type(self): - return False - - def get_cached_btype(self, ffi, finishlist, can_delay=False): - try: - BType = ffi._cached_btypes[self] - except KeyError: - BType = self.build_backend_type(ffi, finishlist) - BType2 = ffi._cached_btypes.setdefault(self, BType) - assert BType2 is BType - return BType - - def __repr__(self): - return '<%s>' % (self._get_c_name(),) - - def _get_items(self): - return [(name, getattr(self, name)) for name in self._attrs_] - - -class BaseType(BaseTypeByIdentity): - - def __eq__(self, other): - return (self.__class__ == other.__class__ and - self._get_items() == other._get_items()) - - def __ne__(self, other): - return not self == other - - def __hash__(self): - return hash((self.__class__, tuple(self._get_items()))) - - -class VoidType(BaseType): - _attrs_ = () - - def __init__(self): - self.c_name_with_marker = 'void&' - - def build_backend_type(self, ffi, finishlist): - return global_cache(self, ffi, 'new_void_type') - -void_type = VoidType() - - -class BasePrimitiveType(BaseType): - def is_complex_type(self): - return False - - -class PrimitiveType(BasePrimitiveType): - _attrs_ = ('name',) - - ALL_PRIMITIVE_TYPES = { - 'char': 'c', - 'short': 'i', - 'int': 'i', - 'long': 'i', - 'long long': 'i', - 'signed char': 'i', - 'unsigned char': 'i', - 'unsigned short': 'i', - 'unsigned int': 'i', - 'unsigned long': 'i', - 'unsigned long long': 'i', - 'float': 'f', - 'double': 'f', - 'long double': 'f', - 'float _Complex': 'j', - 'double _Complex': 'j', - '_Bool': 'i', - # the following types are not primitive in the C sense - 'wchar_t': 'c', - 'char16_t': 'c', - 'char32_t': 'c', - 'int8_t': 'i', - 'uint8_t': 'i', - 'int16_t': 'i', - 'uint16_t': 'i', - 'int32_t': 'i', - 'uint32_t': 'i', - 'int64_t': 'i', - 'uint64_t': 'i', - 'int_least8_t': 'i', - 'uint_least8_t': 'i', - 'int_least16_t': 'i', - 'uint_least16_t': 'i', - 'int_least32_t': 'i', - 'uint_least32_t': 'i', - 'int_least64_t': 'i', - 'uint_least64_t': 'i', - 'int_fast8_t': 'i', - 'uint_fast8_t': 'i', - 'int_fast16_t': 'i', - 'uint_fast16_t': 'i', - 'int_fast32_t': 'i', - 'uint_fast32_t': 'i', - 'int_fast64_t': 'i', - 'uint_fast64_t': 'i', - 'intptr_t': 'i', - 'uintptr_t': 'i', - 'intmax_t': 'i', - 'uintmax_t': 'i', - 'ptrdiff_t': 'i', - 'size_t': 'i', - 'ssize_t': 'i', - } - - def __init__(self, name): - assert name in self.ALL_PRIMITIVE_TYPES - self.name = name - self.c_name_with_marker = name + '&' - - def is_char_type(self): - return self.ALL_PRIMITIVE_TYPES[self.name] == 'c' - def is_integer_type(self): - return self.ALL_PRIMITIVE_TYPES[self.name] == 'i' - def is_float_type(self): - return self.ALL_PRIMITIVE_TYPES[self.name] == 'f' - def is_complex_type(self): - return self.ALL_PRIMITIVE_TYPES[self.name] == 'j' - - def build_backend_type(self, ffi, finishlist): - return global_cache(self, ffi, 'new_primitive_type', self.name) - - -class UnknownIntegerType(BasePrimitiveType): - _attrs_ = ('name',) - - def __init__(self, name): - self.name = name - self.c_name_with_marker = name + '&' - - def is_integer_type(self): - return True - - def build_backend_type(self, ffi, finishlist): - raise NotImplementedError("integer type '%s' can only be used after " - "compilation" % self.name) - -class UnknownFloatType(BasePrimitiveType): - _attrs_ = ('name', ) - - def __init__(self, name): - self.name = name - self.c_name_with_marker = name + '&' - - def build_backend_type(self, ffi, finishlist): - raise NotImplementedError("float type '%s' can only be used after " - "compilation" % self.name) - - -class BaseFunctionType(BaseType): - _attrs_ = ('args', 'result', 'ellipsis', 'abi') - - def __init__(self, args, result, ellipsis, abi=None): - self.args = args - self.result = result - self.ellipsis = ellipsis - self.abi = abi - # - reprargs = [arg._get_c_name() for arg in self.args] - if self.ellipsis: - reprargs.append('...') - reprargs = reprargs or ['void'] - replace_with = self._base_pattern % (', '.join(reprargs),) - if abi is not None: - replace_with = replace_with[:1] + abi + ' ' + replace_with[1:] - self.c_name_with_marker = ( - self.result.c_name_with_marker.replace('&', replace_with)) - - -class RawFunctionType(BaseFunctionType): - # Corresponds to a C type like 'int(int)', which is the C type of - # a function, but not a pointer-to-function. The backend has no - # notion of such a type; it's used temporarily by parsing. - _base_pattern = '(&)(%s)' - is_raw_function = True - - def build_backend_type(self, ffi, finishlist): - raise CDefError("cannot render the type %r: it is a function " - "type, not a pointer-to-function type" % (self,)) - - def as_function_pointer(self): - return FunctionPtrType(self.args, self.result, self.ellipsis, self.abi) - - -class FunctionPtrType(BaseFunctionType): - _base_pattern = '(*&)(%s)' - - def build_backend_type(self, ffi, finishlist): - result = self.result.get_cached_btype(ffi, finishlist) - args = [] - for tp in self.args: - args.append(tp.get_cached_btype(ffi, finishlist)) - abi_args = () - if self.abi == "__stdcall": - if not self.ellipsis: # __stdcall ignored for variadic funcs - try: - abi_args = (ffi._backend.FFI_STDCALL,) - except AttributeError: - pass - return global_cache(self, ffi, 'new_function_type', - tuple(args), result, self.ellipsis, *abi_args) - - def as_raw_function(self): - return RawFunctionType(self.args, self.result, self.ellipsis, self.abi) - - -class PointerType(BaseType): - _attrs_ = ('totype', 'quals') - - def __init__(self, totype, quals=0): - self.totype = totype - self.quals = quals - extra = qualify(quals, " *&") - if totype.is_array_type: - extra = "(%s)" % (extra.lstrip(),) - self.c_name_with_marker = totype.c_name_with_marker.replace('&', extra) - - def build_backend_type(self, ffi, finishlist): - BItem = self.totype.get_cached_btype(ffi, finishlist, can_delay=True) - return global_cache(self, ffi, 'new_pointer_type', BItem) - -voidp_type = PointerType(void_type) - -def ConstPointerType(totype): - return PointerType(totype, Q_CONST) - -const_voidp_type = ConstPointerType(void_type) - - -class NamedPointerType(PointerType): - _attrs_ = ('totype', 'name') - - def __init__(self, totype, name, quals=0): - PointerType.__init__(self, totype, quals) - self.name = name - self.c_name_with_marker = name + '&' - - -class ArrayType(BaseType): - _attrs_ = ('item', 'length') - is_array_type = True - - def __init__(self, item, length): - self.item = item - self.length = length - # - if length is None: - brackets = '&[]' - elif length == '...': - brackets = '&[/*...*/]' - else: - brackets = '&[%s]' % length - self.c_name_with_marker = ( - self.item.c_name_with_marker.replace('&', brackets)) - - def resolve_length(self, newlength): - return ArrayType(self.item, newlength) - - def build_backend_type(self, ffi, finishlist): - if self.length == '...': - raise CDefError("cannot render the type %r: unknown length" % - (self,)) - self.item.get_cached_btype(ffi, finishlist) # force the item BType - BPtrItem = PointerType(self.item).get_cached_btype(ffi, finishlist) - return global_cache(self, ffi, 'new_array_type', BPtrItem, self.length) - -char_array_type = ArrayType(PrimitiveType('char'), None) - - -class StructOrUnionOrEnum(BaseTypeByIdentity): - _attrs_ = ('name',) - forcename = None - - def build_c_name_with_marker(self): - name = self.forcename or '%s %s' % (self.kind, self.name) - self.c_name_with_marker = name + '&' - - def force_the_name(self, forcename): - self.forcename = forcename - self.build_c_name_with_marker() - - def get_official_name(self): - assert self.c_name_with_marker.endswith('&') - return self.c_name_with_marker[:-1] - - -class StructOrUnion(StructOrUnionOrEnum): - fixedlayout = None - completed = 0 - partial = False - packed = False - - def __init__(self, name, fldnames, fldtypes, fldbitsize, fldquals=None): - self.name = name - self.fldnames = fldnames - self.fldtypes = fldtypes - self.fldbitsize = fldbitsize - self.fldquals = fldquals - self.build_c_name_with_marker() - - def has_anonymous_struct_fields(self): - if self.fldtypes is None: - return False - for name, type in zip(self.fldnames, self.fldtypes): - if name == '' and isinstance(type, StructOrUnion): - return True - return False - - def enumfields(self): - fldquals = self.fldquals - if fldquals is None: - fldquals = (0,) * len(self.fldnames) - for name, type, bitsize, quals in zip(self.fldnames, self.fldtypes, - self.fldbitsize, fldquals): - if name == '' and isinstance(type, StructOrUnion): - # nested anonymous struct/union - for result in type.enumfields(): - yield result - else: - yield (name, type, bitsize, quals) - - def force_flatten(self): - # force the struct or union to have a declaration that lists - # directly all fields returned by enumfields(), flattening - # nested anonymous structs/unions. - names = [] - types = [] - bitsizes = [] - fldquals = [] - for name, type, bitsize, quals in self.enumfields(): - names.append(name) - types.append(type) - bitsizes.append(bitsize) - fldquals.append(quals) - self.fldnames = tuple(names) - self.fldtypes = tuple(types) - self.fldbitsize = tuple(bitsizes) - self.fldquals = tuple(fldquals) - - def get_cached_btype(self, ffi, finishlist, can_delay=False): - BType = StructOrUnionOrEnum.get_cached_btype(self, ffi, finishlist, - can_delay) - if not can_delay: - self.finish_backend_type(ffi, finishlist) - return BType - - def finish_backend_type(self, ffi, finishlist): - if self.completed: - if self.completed != 2: - raise NotImplementedError("recursive structure declaration " - "for '%s'" % (self.name,)) - return - BType = ffi._cached_btypes[self] - # - self.completed = 1 - # - if self.fldtypes is None: - pass # not completing it: it's an opaque struct - # - elif self.fixedlayout is None: - fldtypes = [tp.get_cached_btype(ffi, finishlist) - for tp in self.fldtypes] - lst = list(zip(self.fldnames, fldtypes, self.fldbitsize)) - sflags = 0 - if self.packed: - sflags = 8 # SF_PACKED - ffi._backend.complete_struct_or_union(BType, lst, self, - -1, -1, sflags) - # - else: - fldtypes = [] - fieldofs, fieldsize, totalsize, totalalignment = self.fixedlayout - for i in range(len(self.fldnames)): - fsize = fieldsize[i] - ftype = self.fldtypes[i] - # - if isinstance(ftype, ArrayType) and ftype.length == '...': - # fix the length to match the total size - BItemType = ftype.item.get_cached_btype(ffi, finishlist) - nlen, nrest = divmod(fsize, ffi.sizeof(BItemType)) - if nrest != 0: - self._verification_error( - "field '%s.%s' has a bogus size?" % ( - self.name, self.fldnames[i] or '{}')) - ftype = ftype.resolve_length(nlen) - self.fldtypes = (self.fldtypes[:i] + (ftype,) + - self.fldtypes[i+1:]) - # - BFieldType = ftype.get_cached_btype(ffi, finishlist) - if isinstance(ftype, ArrayType) and ftype.length is None: - assert fsize == 0 - else: - bitemsize = ffi.sizeof(BFieldType) - if bitemsize != fsize: - self._verification_error( - "field '%s.%s' is declared as %d bytes, but is " - "really %d bytes" % (self.name, - self.fldnames[i] or '{}', - bitemsize, fsize)) - fldtypes.append(BFieldType) - # - lst = list(zip(self.fldnames, fldtypes, self.fldbitsize, fieldofs)) - ffi._backend.complete_struct_or_union(BType, lst, self, - totalsize, totalalignment) - self.completed = 2 - - def _verification_error(self, msg): - raise VerificationError(msg) - - def check_not_partial(self): - if self.partial and self.fixedlayout is None: - raise VerificationMissing(self._get_c_name()) - - def build_backend_type(self, ffi, finishlist): - self.check_not_partial() - finishlist.append(self) - # - return global_cache(self, ffi, 'new_%s_type' % self.kind, - self.get_official_name(), key=self) - - -class StructType(StructOrUnion): - kind = 'struct' - - -class UnionType(StructOrUnion): - kind = 'union' - - -class EnumType(StructOrUnionOrEnum): - kind = 'enum' - partial = False - partial_resolved = False - - def __init__(self, name, enumerators, enumvalues, baseinttype=None): - self.name = name - self.enumerators = enumerators - self.enumvalues = enumvalues - self.baseinttype = baseinttype - self.build_c_name_with_marker() - - def force_the_name(self, forcename): - StructOrUnionOrEnum.force_the_name(self, forcename) - if self.forcename is None: - name = self.get_official_name() - self.forcename = '$' + name.replace(' ', '_') - - def check_not_partial(self): - if self.partial and not self.partial_resolved: - raise VerificationMissing(self._get_c_name()) - - def build_backend_type(self, ffi, finishlist): - self.check_not_partial() - base_btype = self.build_baseinttype(ffi, finishlist) - return global_cache(self, ffi, 'new_enum_type', - self.get_official_name(), - self.enumerators, self.enumvalues, - base_btype, key=self) - - def build_baseinttype(self, ffi, finishlist): - if self.baseinttype is not None: - return self.baseinttype.get_cached_btype(ffi, finishlist) - # - if self.enumvalues: - smallest_value = min(self.enumvalues) - largest_value = max(self.enumvalues) - else: - import warnings - try: - # XXX! The goal is to ensure that the warnings.warn() - # will not suppress the warning. We want to get it - # several times if we reach this point several times. - __warningregistry__.clear() - except NameError: - pass - warnings.warn("%r has no values explicitly defined; " - "guessing that it is equivalent to 'unsigned int'" - % self._get_c_name()) - smallest_value = largest_value = 0 - if smallest_value < 0: # needs a signed type - sign = 1 - candidate1 = PrimitiveType("int") - candidate2 = PrimitiveType("long") - else: - sign = 0 - candidate1 = PrimitiveType("unsigned int") - candidate2 = PrimitiveType("unsigned long") - btype1 = candidate1.get_cached_btype(ffi, finishlist) - btype2 = candidate2.get_cached_btype(ffi, finishlist) - size1 = ffi.sizeof(btype1) - size2 = ffi.sizeof(btype2) - if (smallest_value >= ((-1) << (8*size1-1)) and - largest_value < (1 << (8*size1-sign))): - return btype1 - if (smallest_value >= ((-1) << (8*size2-1)) and - largest_value < (1 << (8*size2-sign))): - return btype2 - raise CDefError("%s values don't all fit into either 'long' " - "or 'unsigned long'" % self._get_c_name()) - -def unknown_type(name, structname=None): - if structname is None: - structname = '$%s' % name - tp = StructType(structname, None, None, None) - tp.force_the_name(name) - tp.origin = "unknown_type" - return tp - -def unknown_ptr_type(name, structname=None): - if structname is None: - structname = '$$%s' % name - tp = StructType(structname, None, None, None) - return NamedPointerType(tp, name) - - -global_lock = allocate_lock() -_typecache_cffi_backend = weakref.WeakValueDictionary() - -def get_typecache(backend): - # returns _typecache_cffi_backend if backend is the _cffi_backend - # module, or type(backend).__typecache if backend is an instance of - # CTypesBackend (or some FakeBackend class during tests) - if isinstance(backend, types.ModuleType): - return _typecache_cffi_backend - with global_lock: - if not hasattr(type(backend), '__typecache'): - type(backend).__typecache = weakref.WeakValueDictionary() - return type(backend).__typecache - -def global_cache(srctype, ffi, funcname, *args, **kwds): - key = kwds.pop('key', (funcname, args)) - assert not kwds - try: - return ffi._typecache[key] - except KeyError: - pass - try: - res = getattr(ffi._backend, funcname)(*args) - except NotImplementedError as e: - raise NotImplementedError("%s: %r: %s" % (funcname, srctype, e)) - # note that setdefault() on WeakValueDictionary is not atomic - # and contains a rare bug (http://bugs.python.org/issue19542); - # we have to use a lock and do it ourselves - cache = ffi._typecache - with global_lock: - res1 = cache.get(key) - if res1 is None: - cache[key] = res - return res - else: - return res1 - -def pointer_cache(ffi, BType): - return global_cache('?', ffi, 'new_pointer_type', BType) - -def attach_exception_info(e, name): - if e.args and type(e.args[0]) is str: - e.args = ('%s: %s' % (name, e.args[0]),) + e.args[1:] diff --git a/website/web/Lib/site-packages/cffi/parse_c_type.h b/website/web/Lib/site-packages/cffi/parse_c_type.h deleted file mode 100644 index 84e4ef856..000000000 --- a/website/web/Lib/site-packages/cffi/parse_c_type.h +++ /dev/null @@ -1,181 +0,0 @@ - -/* This part is from file 'cffi/parse_c_type.h'. It is copied at the - beginning of C sources generated by CFFI's ffi.set_source(). */ - -typedef void *_cffi_opcode_t; - -#define _CFFI_OP(opcode, arg) (_cffi_opcode_t)(opcode | (((uintptr_t)(arg)) << 8)) -#define _CFFI_GETOP(cffi_opcode) ((unsigned char)(uintptr_t)cffi_opcode) -#define _CFFI_GETARG(cffi_opcode) (((intptr_t)cffi_opcode) >> 8) - -#define _CFFI_OP_PRIMITIVE 1 -#define _CFFI_OP_POINTER 3 -#define _CFFI_OP_ARRAY 5 -#define _CFFI_OP_OPEN_ARRAY 7 -#define _CFFI_OP_STRUCT_UNION 9 -#define _CFFI_OP_ENUM 11 -#define _CFFI_OP_FUNCTION 13 -#define _CFFI_OP_FUNCTION_END 15 -#define _CFFI_OP_NOOP 17 -#define _CFFI_OP_BITFIELD 19 -#define _CFFI_OP_TYPENAME 21 -#define _CFFI_OP_CPYTHON_BLTN_V 23 // varargs -#define _CFFI_OP_CPYTHON_BLTN_N 25 // noargs -#define _CFFI_OP_CPYTHON_BLTN_O 27 // O (i.e. a single arg) -#define _CFFI_OP_CONSTANT 29 -#define _CFFI_OP_CONSTANT_INT 31 -#define _CFFI_OP_GLOBAL_VAR 33 -#define _CFFI_OP_DLOPEN_FUNC 35 -#define _CFFI_OP_DLOPEN_CONST 37 -#define _CFFI_OP_GLOBAL_VAR_F 39 -#define _CFFI_OP_EXTERN_PYTHON 41 - -#define _CFFI_PRIM_VOID 0 -#define _CFFI_PRIM_BOOL 1 -#define _CFFI_PRIM_CHAR 2 -#define _CFFI_PRIM_SCHAR 3 -#define _CFFI_PRIM_UCHAR 4 -#define _CFFI_PRIM_SHORT 5 -#define _CFFI_PRIM_USHORT 6 -#define _CFFI_PRIM_INT 7 -#define _CFFI_PRIM_UINT 8 -#define _CFFI_PRIM_LONG 9 -#define _CFFI_PRIM_ULONG 10 -#define _CFFI_PRIM_LONGLONG 11 -#define _CFFI_PRIM_ULONGLONG 12 -#define _CFFI_PRIM_FLOAT 13 -#define _CFFI_PRIM_DOUBLE 14 -#define _CFFI_PRIM_LONGDOUBLE 15 - -#define _CFFI_PRIM_WCHAR 16 -#define _CFFI_PRIM_INT8 17 -#define _CFFI_PRIM_UINT8 18 -#define _CFFI_PRIM_INT16 19 -#define _CFFI_PRIM_UINT16 20 -#define _CFFI_PRIM_INT32 21 -#define _CFFI_PRIM_UINT32 22 -#define _CFFI_PRIM_INT64 23 -#define _CFFI_PRIM_UINT64 24 -#define _CFFI_PRIM_INTPTR 25 -#define _CFFI_PRIM_UINTPTR 26 -#define _CFFI_PRIM_PTRDIFF 27 -#define _CFFI_PRIM_SIZE 28 -#define _CFFI_PRIM_SSIZE 29 -#define _CFFI_PRIM_INT_LEAST8 30 -#define _CFFI_PRIM_UINT_LEAST8 31 -#define _CFFI_PRIM_INT_LEAST16 32 -#define _CFFI_PRIM_UINT_LEAST16 33 -#define _CFFI_PRIM_INT_LEAST32 34 -#define _CFFI_PRIM_UINT_LEAST32 35 -#define _CFFI_PRIM_INT_LEAST64 36 -#define _CFFI_PRIM_UINT_LEAST64 37 -#define _CFFI_PRIM_INT_FAST8 38 -#define _CFFI_PRIM_UINT_FAST8 39 -#define _CFFI_PRIM_INT_FAST16 40 -#define _CFFI_PRIM_UINT_FAST16 41 -#define _CFFI_PRIM_INT_FAST32 42 -#define _CFFI_PRIM_UINT_FAST32 43 -#define _CFFI_PRIM_INT_FAST64 44 -#define _CFFI_PRIM_UINT_FAST64 45 -#define _CFFI_PRIM_INTMAX 46 -#define _CFFI_PRIM_UINTMAX 47 -#define _CFFI_PRIM_FLOATCOMPLEX 48 -#define _CFFI_PRIM_DOUBLECOMPLEX 49 -#define _CFFI_PRIM_CHAR16 50 -#define _CFFI_PRIM_CHAR32 51 - -#define _CFFI__NUM_PRIM 52 -#define _CFFI__UNKNOWN_PRIM (-1) -#define _CFFI__UNKNOWN_FLOAT_PRIM (-2) -#define _CFFI__UNKNOWN_LONG_DOUBLE (-3) - -#define _CFFI__IO_FILE_STRUCT (-1) - - -struct _cffi_global_s { - const char *name; - void *address; - _cffi_opcode_t type_op; - void *size_or_direct_fn; // OP_GLOBAL_VAR: size, or 0 if unknown - // OP_CPYTHON_BLTN_*: addr of direct function -}; - -struct _cffi_getconst_s { - unsigned long long value; - const struct _cffi_type_context_s *ctx; - int gindex; -}; - -struct _cffi_struct_union_s { - const char *name; - int type_index; // -> _cffi_types, on a OP_STRUCT_UNION - int flags; // _CFFI_F_* flags below - size_t size; - int alignment; - int first_field_index; // -> _cffi_fields array - int num_fields; -}; -#define _CFFI_F_UNION 0x01 // is a union, not a struct -#define _CFFI_F_CHECK_FIELDS 0x02 // complain if fields are not in the - // "standard layout" or if some are missing -#define _CFFI_F_PACKED 0x04 // for CHECK_FIELDS, assume a packed struct -#define _CFFI_F_EXTERNAL 0x08 // in some other ffi.include() -#define _CFFI_F_OPAQUE 0x10 // opaque - -struct _cffi_field_s { - const char *name; - size_t field_offset; - size_t field_size; - _cffi_opcode_t field_type_op; -}; - -struct _cffi_enum_s { - const char *name; - int type_index; // -> _cffi_types, on a OP_ENUM - int type_prim; // _CFFI_PRIM_xxx - const char *enumerators; // comma-delimited string -}; - -struct _cffi_typename_s { - const char *name; - int type_index; /* if opaque, points to a possibly artificial - OP_STRUCT which is itself opaque */ -}; - -struct _cffi_type_context_s { - _cffi_opcode_t *types; - const struct _cffi_global_s *globals; - const struct _cffi_field_s *fields; - const struct _cffi_struct_union_s *struct_unions; - const struct _cffi_enum_s *enums; - const struct _cffi_typename_s *typenames; - int num_globals; - int num_struct_unions; - int num_enums; - int num_typenames; - const char *const *includes; - int num_types; - int flags; /* future extension */ -}; - -struct _cffi_parse_info_s { - const struct _cffi_type_context_s *ctx; - _cffi_opcode_t *output; - unsigned int output_size; - size_t error_location; - const char *error_message; -}; - -struct _cffi_externpy_s { - const char *name; - size_t size_of_result; - void *reserved1, *reserved2; -}; - -#ifdef _CFFI_INTERNAL -static int parse_c_type(struct _cffi_parse_info_s *info, const char *input); -static int search_in_globals(const struct _cffi_type_context_s *ctx, - const char *search, size_t search_len); -static int search_in_struct_unions(const struct _cffi_type_context_s *ctx, - const char *search, size_t search_len); -#endif diff --git a/website/web/Lib/site-packages/cffi/recompiler.py b/website/web/Lib/site-packages/cffi/recompiler.py deleted file mode 100644 index 821be16dd..000000000 --- a/website/web/Lib/site-packages/cffi/recompiler.py +++ /dev/null @@ -1,1555 +0,0 @@ -import os, sys, io -from . import ffiplatform, model -from .error import VerificationError -from .cffi_opcode import * - -VERSION_BASE = 0x2601 -VERSION_EMBEDDED = 0x2701 -VERSION_CHAR16CHAR32 = 0x2801 - - -class GlobalExpr: - def __init__(self, name, address, type_op, size=0, check_value=0): - self.name = name - self.address = address - self.type_op = type_op - self.size = size - self.check_value = check_value - - def as_c_expr(self): - return ' { "%s", (void *)%s, %s, (void *)%s },' % ( - self.name, self.address, self.type_op.as_c_expr(), self.size) - - def as_python_expr(self): - return "b'%s%s',%d" % (self.type_op.as_python_bytes(), self.name, - self.check_value) - -class FieldExpr: - def __init__(self, name, field_offset, field_size, fbitsize, field_type_op): - self.name = name - self.field_offset = field_offset - self.field_size = field_size - self.fbitsize = fbitsize - self.field_type_op = field_type_op - - def as_c_expr(self): - spaces = " " * len(self.name) - return (' { "%s", %s,\n' % (self.name, self.field_offset) + - ' %s %s,\n' % (spaces, self.field_size) + - ' %s %s },' % (spaces, self.field_type_op.as_c_expr())) - - def as_python_expr(self): - raise NotImplementedError - - def as_field_python_expr(self): - if self.field_type_op.op == OP_NOOP: - size_expr = '' - elif self.field_type_op.op == OP_BITFIELD: - size_expr = format_four_bytes(self.fbitsize) - else: - raise NotImplementedError - return "b'%s%s%s'" % (self.field_type_op.as_python_bytes(), - size_expr, - self.name) - -class StructUnionExpr: - def __init__(self, name, type_index, flags, size, alignment, comment, - first_field_index, c_fields): - self.name = name - self.type_index = type_index - self.flags = flags - self.size = size - self.alignment = alignment - self.comment = comment - self.first_field_index = first_field_index - self.c_fields = c_fields - - def as_c_expr(self): - return (' { "%s", %d, %s,' % (self.name, self.type_index, self.flags) - + '\n %s, %s, ' % (self.size, self.alignment) - + '%d, %d ' % (self.first_field_index, len(self.c_fields)) - + ('/* %s */ ' % self.comment if self.comment else '') - + '},') - - def as_python_expr(self): - flags = eval(self.flags, G_FLAGS) - fields_expr = [c_field.as_field_python_expr() - for c_field in self.c_fields] - return "(b'%s%s%s',%s)" % ( - format_four_bytes(self.type_index), - format_four_bytes(flags), - self.name, - ','.join(fields_expr)) - -class EnumExpr: - def __init__(self, name, type_index, size, signed, allenums): - self.name = name - self.type_index = type_index - self.size = size - self.signed = signed - self.allenums = allenums - - def as_c_expr(self): - return (' { "%s", %d, _cffi_prim_int(%s, %s),\n' - ' "%s" },' % (self.name, self.type_index, - self.size, self.signed, self.allenums)) - - def as_python_expr(self): - prim_index = { - (1, 0): PRIM_UINT8, (1, 1): PRIM_INT8, - (2, 0): PRIM_UINT16, (2, 1): PRIM_INT16, - (4, 0): PRIM_UINT32, (4, 1): PRIM_INT32, - (8, 0): PRIM_UINT64, (8, 1): PRIM_INT64, - }[self.size, self.signed] - return "b'%s%s%s\\x00%s'" % (format_four_bytes(self.type_index), - format_four_bytes(prim_index), - self.name, self.allenums) - -class TypenameExpr: - def __init__(self, name, type_index): - self.name = name - self.type_index = type_index - - def as_c_expr(self): - return ' { "%s", %d },' % (self.name, self.type_index) - - def as_python_expr(self): - return "b'%s%s'" % (format_four_bytes(self.type_index), self.name) - - -# ____________________________________________________________ - - -class Recompiler: - _num_externpy = 0 - - def __init__(self, ffi, module_name, target_is_python=False): - self.ffi = ffi - self.module_name = module_name - self.target_is_python = target_is_python - self._version = VERSION_BASE - - def needs_version(self, ver): - self._version = max(self._version, ver) - - def collect_type_table(self): - self._typesdict = {} - self._generate("collecttype") - # - all_decls = sorted(self._typesdict, key=str) - # - # prepare all FUNCTION bytecode sequences first - self.cffi_types = [] - for tp in all_decls: - if tp.is_raw_function: - assert self._typesdict[tp] is None - self._typesdict[tp] = len(self.cffi_types) - self.cffi_types.append(tp) # placeholder - for tp1 in tp.args: - assert isinstance(tp1, (model.VoidType, - model.BasePrimitiveType, - model.PointerType, - model.StructOrUnionOrEnum, - model.FunctionPtrType)) - if self._typesdict[tp1] is None: - self._typesdict[tp1] = len(self.cffi_types) - self.cffi_types.append(tp1) # placeholder - self.cffi_types.append('END') # placeholder - # - # prepare all OTHER bytecode sequences - for tp in all_decls: - if not tp.is_raw_function and self._typesdict[tp] is None: - self._typesdict[tp] = len(self.cffi_types) - self.cffi_types.append(tp) # placeholder - if tp.is_array_type and tp.length is not None: - self.cffi_types.append('LEN') # placeholder - assert None not in self._typesdict.values() - # - # collect all structs and unions and enums - self._struct_unions = {} - self._enums = {} - for tp in all_decls: - if isinstance(tp, model.StructOrUnion): - self._struct_unions[tp] = None - elif isinstance(tp, model.EnumType): - self._enums[tp] = None - for i, tp in enumerate(sorted(self._struct_unions, - key=lambda tp: tp.name)): - self._struct_unions[tp] = i - for i, tp in enumerate(sorted(self._enums, - key=lambda tp: tp.name)): - self._enums[tp] = i - # - # emit all bytecode sequences now - for tp in all_decls: - method = getattr(self, '_emit_bytecode_' + tp.__class__.__name__) - method(tp, self._typesdict[tp]) - # - # consistency check - for op in self.cffi_types: - assert isinstance(op, CffiOp) - self.cffi_types = tuple(self.cffi_types) # don't change any more - - def _do_collect_type(self, tp): - if not isinstance(tp, model.BaseTypeByIdentity): - if isinstance(tp, tuple): - for x in tp: - self._do_collect_type(x) - return - if tp not in self._typesdict: - self._typesdict[tp] = None - if isinstance(tp, model.FunctionPtrType): - self._do_collect_type(tp.as_raw_function()) - elif isinstance(tp, model.StructOrUnion): - if tp.fldtypes is not None and ( - tp not in self.ffi._parser._included_declarations): - for name1, tp1, _, _ in tp.enumfields(): - self._do_collect_type(self._field_type(tp, name1, tp1)) - else: - for _, x in tp._get_items(): - self._do_collect_type(x) - - def _generate(self, step_name): - lst = self.ffi._parser._declarations.items() - for name, (tp, quals) in sorted(lst): - kind, realname = name.split(' ', 1) - try: - method = getattr(self, '_generate_cpy_%s_%s' % (kind, - step_name)) - except AttributeError: - raise VerificationError( - "not implemented in recompile(): %r" % name) - try: - self._current_quals = quals - method(tp, realname) - except Exception as e: - model.attach_exception_info(e, name) - raise - - # ---------- - - ALL_STEPS = ["global", "field", "struct_union", "enum", "typename"] - - def collect_step_tables(self): - # collect the declarations for '_cffi_globals', '_cffi_typenames', etc. - self._lsts = {} - for step_name in self.ALL_STEPS: - self._lsts[step_name] = [] - self._seen_struct_unions = set() - self._generate("ctx") - self._add_missing_struct_unions() - # - for step_name in self.ALL_STEPS: - lst = self._lsts[step_name] - if step_name != "field": - lst.sort(key=lambda entry: entry.name) - self._lsts[step_name] = tuple(lst) # don't change any more - # - # check for a possible internal inconsistency: _cffi_struct_unions - # should have been generated with exactly self._struct_unions - lst = self._lsts["struct_union"] - for tp, i in self._struct_unions.items(): - assert i < len(lst) - assert lst[i].name == tp.name - assert len(lst) == len(self._struct_unions) - # same with enums - lst = self._lsts["enum"] - for tp, i in self._enums.items(): - assert i < len(lst) - assert lst[i].name == tp.name - assert len(lst) == len(self._enums) - - # ---------- - - def _prnt(self, what=''): - self._f.write(what + '\n') - - def write_source_to_f(self, f, preamble): - if self.target_is_python: - assert preamble is None - self.write_py_source_to_f(f) - else: - assert preamble is not None - self.write_c_source_to_f(f, preamble) - - def _rel_readlines(self, filename): - g = open(os.path.join(os.path.dirname(__file__), filename), 'r') - lines = g.readlines() - g.close() - return lines - - def write_c_source_to_f(self, f, preamble): - self._f = f - prnt = self._prnt - if self.ffi._embedding is not None: - prnt('#define _CFFI_USE_EMBEDDING') - # - # first the '#include' (actually done by inlining the file's content) - lines = self._rel_readlines('_cffi_include.h') - i = lines.index('#include "parse_c_type.h"\n') - lines[i:i+1] = self._rel_readlines('parse_c_type.h') - prnt(''.join(lines)) - # - # if we have ffi._embedding != None, we give it here as a macro - # and include an extra file - base_module_name = self.module_name.split('.')[-1] - if self.ffi._embedding is not None: - prnt('#define _CFFI_MODULE_NAME "%s"' % (self.module_name,)) - prnt('static const char _CFFI_PYTHON_STARTUP_CODE[] = {') - self._print_string_literal_in_array(self.ffi._embedding) - prnt('0 };') - prnt('#ifdef PYPY_VERSION') - prnt('# define _CFFI_PYTHON_STARTUP_FUNC _cffi_pypyinit_%s' % ( - base_module_name,)) - prnt('#elif PY_MAJOR_VERSION >= 3') - prnt('# define _CFFI_PYTHON_STARTUP_FUNC PyInit_%s' % ( - base_module_name,)) - prnt('#else') - prnt('# define _CFFI_PYTHON_STARTUP_FUNC init%s' % ( - base_module_name,)) - prnt('#endif') - lines = self._rel_readlines('_embedding.h') - i = lines.index('#include "_cffi_errors.h"\n') - lines[i:i+1] = self._rel_readlines('_cffi_errors.h') - prnt(''.join(lines)) - self.needs_version(VERSION_EMBEDDED) - # - # then paste the C source given by the user, verbatim. - prnt('/************************************************************/') - prnt() - prnt(preamble) - prnt() - prnt('/************************************************************/') - prnt() - # - # the declaration of '_cffi_types' - prnt('static void *_cffi_types[] = {') - typeindex2type = dict([(i, tp) for (tp, i) in self._typesdict.items()]) - for i, op in enumerate(self.cffi_types): - comment = '' - if i in typeindex2type: - comment = ' // ' + typeindex2type[i]._get_c_name() - prnt('/* %2d */ %s,%s' % (i, op.as_c_expr(), comment)) - if not self.cffi_types: - prnt(' 0') - prnt('};') - prnt() - # - # call generate_cpy_xxx_decl(), for every xxx found from - # ffi._parser._declarations. This generates all the functions. - self._seen_constants = set() - self._generate("decl") - # - # the declaration of '_cffi_globals' and '_cffi_typenames' - nums = {} - for step_name in self.ALL_STEPS: - lst = self._lsts[step_name] - nums[step_name] = len(lst) - if nums[step_name] > 0: - prnt('static const struct _cffi_%s_s _cffi_%ss[] = {' % ( - step_name, step_name)) - for entry in lst: - prnt(entry.as_c_expr()) - prnt('};') - prnt() - # - # the declaration of '_cffi_includes' - if self.ffi._included_ffis: - prnt('static const char * const _cffi_includes[] = {') - for ffi_to_include in self.ffi._included_ffis: - try: - included_module_name, included_source = ( - ffi_to_include._assigned_source[:2]) - except AttributeError: - raise VerificationError( - "ffi object %r includes %r, but the latter has not " - "been prepared with set_source()" % ( - self.ffi, ffi_to_include,)) - if included_source is None: - raise VerificationError( - "not implemented yet: ffi.include() of a Python-based " - "ffi inside a C-based ffi") - prnt(' "%s",' % (included_module_name,)) - prnt(' NULL') - prnt('};') - prnt() - # - # the declaration of '_cffi_type_context' - prnt('static const struct _cffi_type_context_s _cffi_type_context = {') - prnt(' _cffi_types,') - for step_name in self.ALL_STEPS: - if nums[step_name] > 0: - prnt(' _cffi_%ss,' % step_name) - else: - prnt(' NULL, /* no %ss */' % step_name) - for step_name in self.ALL_STEPS: - if step_name != "field": - prnt(' %d, /* num_%ss */' % (nums[step_name], step_name)) - if self.ffi._included_ffis: - prnt(' _cffi_includes,') - else: - prnt(' NULL, /* no includes */') - prnt(' %d, /* num_types */' % (len(self.cffi_types),)) - flags = 0 - if self._num_externpy: - flags |= 1 # set to mean that we use extern "Python" - prnt(' %d, /* flags */' % flags) - prnt('};') - prnt() - # - # the init function - prnt('#ifdef __GNUC__') - prnt('# pragma GCC visibility push(default) /* for -fvisibility= */') - prnt('#endif') - prnt() - prnt('#ifdef PYPY_VERSION') - prnt('PyMODINIT_FUNC') - prnt('_cffi_pypyinit_%s(const void *p[])' % (base_module_name,)) - prnt('{') - if self._num_externpy: - prnt(' if (((intptr_t)p[0]) >= 0x0A03) {') - prnt(' _cffi_call_python_org = ' - '(void(*)(struct _cffi_externpy_s *, char *))p[1];') - prnt(' }') - prnt(' p[0] = (const void *)0x%x;' % self._version) - prnt(' p[1] = &_cffi_type_context;') - prnt('#if PY_MAJOR_VERSION >= 3') - prnt(' return NULL;') - prnt('#endif') - prnt('}') - # on Windows, distutils insists on putting init_cffi_xyz in - # 'export_symbols', so instead of fighting it, just give up and - # give it one - prnt('# ifdef _MSC_VER') - prnt(' PyMODINIT_FUNC') - prnt('# if PY_MAJOR_VERSION >= 3') - prnt(' PyInit_%s(void) { return NULL; }' % (base_module_name,)) - prnt('# else') - prnt(' init%s(void) { }' % (base_module_name,)) - prnt('# endif') - prnt('# endif') - prnt('#elif PY_MAJOR_VERSION >= 3') - prnt('PyMODINIT_FUNC') - prnt('PyInit_%s(void)' % (base_module_name,)) - prnt('{') - prnt(' return _cffi_init("%s", 0x%x, &_cffi_type_context);' % ( - self.module_name, self._version)) - prnt('}') - prnt('#else') - prnt('PyMODINIT_FUNC') - prnt('init%s(void)' % (base_module_name,)) - prnt('{') - prnt(' _cffi_init("%s", 0x%x, &_cffi_type_context);' % ( - self.module_name, self._version)) - prnt('}') - prnt('#endif') - prnt() - prnt('#ifdef __GNUC__') - prnt('# pragma GCC visibility pop') - prnt('#endif') - self._version = None - - def _to_py(self, x): - if isinstance(x, str): - return "b'%s'" % (x,) - if isinstance(x, (list, tuple)): - rep = [self._to_py(item) for item in x] - if len(rep) == 1: - rep.append('') - return "(%s)" % (','.join(rep),) - return x.as_python_expr() # Py2: unicode unexpected; Py3: bytes unexp. - - def write_py_source_to_f(self, f): - self._f = f - prnt = self._prnt - # - # header - prnt("# auto-generated file") - prnt("import _cffi_backend") - # - # the 'import' of the included ffis - num_includes = len(self.ffi._included_ffis or ()) - for i in range(num_includes): - ffi_to_include = self.ffi._included_ffis[i] - try: - included_module_name, included_source = ( - ffi_to_include._assigned_source[:2]) - except AttributeError: - raise VerificationError( - "ffi object %r includes %r, but the latter has not " - "been prepared with set_source()" % ( - self.ffi, ffi_to_include,)) - if included_source is not None: - raise VerificationError( - "not implemented yet: ffi.include() of a C-based " - "ffi inside a Python-based ffi") - prnt('from %s import ffi as _ffi%d' % (included_module_name, i)) - prnt() - prnt("ffi = _cffi_backend.FFI('%s'," % (self.module_name,)) - prnt(" _version = 0x%x," % (self._version,)) - self._version = None - # - # the '_types' keyword argument - self.cffi_types = tuple(self.cffi_types) # don't change any more - types_lst = [op.as_python_bytes() for op in self.cffi_types] - prnt(' _types = %s,' % (self._to_py(''.join(types_lst)),)) - typeindex2type = dict([(i, tp) for (tp, i) in self._typesdict.items()]) - # - # the keyword arguments from ALL_STEPS - for step_name in self.ALL_STEPS: - lst = self._lsts[step_name] - if len(lst) > 0 and step_name != "field": - prnt(' _%ss = %s,' % (step_name, self._to_py(lst))) - # - # the '_includes' keyword argument - if num_includes > 0: - prnt(' _includes = (%s,),' % ( - ', '.join(['_ffi%d' % i for i in range(num_includes)]),)) - # - # the footer - prnt(')') - - # ---------- - - def _gettypenum(self, type): - # a KeyError here is a bug. please report it! :-) - return self._typesdict[type] - - def _convert_funcarg_to_c(self, tp, fromvar, tovar, errcode): - extraarg = '' - if isinstance(tp, model.BasePrimitiveType) and not tp.is_complex_type(): - if tp.is_integer_type() and tp.name != '_Bool': - converter = '_cffi_to_c_int' - extraarg = ', %s' % tp.name - elif isinstance(tp, model.UnknownFloatType): - # don't check with is_float_type(): it may be a 'long - # double' here, and _cffi_to_c_double would loose precision - converter = '(%s)_cffi_to_c_double' % (tp.get_c_name(''),) - else: - cname = tp.get_c_name('') - converter = '(%s)_cffi_to_c_%s' % (cname, - tp.name.replace(' ', '_')) - if cname in ('char16_t', 'char32_t'): - self.needs_version(VERSION_CHAR16CHAR32) - errvalue = '-1' - # - elif isinstance(tp, model.PointerType): - self._convert_funcarg_to_c_ptr_or_array(tp, fromvar, - tovar, errcode) - return - # - elif (isinstance(tp, model.StructOrUnionOrEnum) or - isinstance(tp, model.BasePrimitiveType)): - # a struct (not a struct pointer) as a function argument; - # or, a complex (the same code works) - self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)' - % (tovar, self._gettypenum(tp), fromvar)) - self._prnt(' %s;' % errcode) - return - # - elif isinstance(tp, model.FunctionPtrType): - converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('') - extraarg = ', _cffi_type(%d)' % self._gettypenum(tp) - errvalue = 'NULL' - # - else: - raise NotImplementedError(tp) - # - self._prnt(' %s = %s(%s%s);' % (tovar, converter, fromvar, extraarg)) - self._prnt(' if (%s == (%s)%s && PyErr_Occurred())' % ( - tovar, tp.get_c_name(''), errvalue)) - self._prnt(' %s;' % errcode) - - def _extra_local_variables(self, tp, localvars): - if isinstance(tp, model.PointerType): - localvars.add('Py_ssize_t datasize') - - def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode): - self._prnt(' datasize = _cffi_prepare_pointer_call_argument(') - self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % ( - self._gettypenum(tp), fromvar, tovar)) - self._prnt(' if (datasize != 0) {') - self._prnt(' if (datasize < 0)') - self._prnt(' %s;' % errcode) - self._prnt(' %s = (%s)alloca((size_t)datasize);' % ( - tovar, tp.get_c_name(''))) - self._prnt(' memset((void *)%s, 0, (size_t)datasize);' % (tovar,)) - self._prnt(' if (_cffi_convert_array_from_object(' - '(char *)%s, _cffi_type(%d), %s) < 0)' % ( - tovar, self._gettypenum(tp), fromvar)) - self._prnt(' %s;' % errcode) - self._prnt(' }') - - def _convert_expr_from_c(self, tp, var, context): - if isinstance(tp, model.BasePrimitiveType): - if tp.is_integer_type() and tp.name != '_Bool': - return '_cffi_from_c_int(%s, %s)' % (var, tp.name) - elif isinstance(tp, model.UnknownFloatType): - return '_cffi_from_c_double(%s)' % (var,) - elif tp.name != 'long double' and not tp.is_complex_type(): - cname = tp.name.replace(' ', '_') - if cname in ('char16_t', 'char32_t'): - self.needs_version(VERSION_CHAR16CHAR32) - return '_cffi_from_c_%s(%s)' % (cname, var) - else: - return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( - var, self._gettypenum(tp)) - elif isinstance(tp, (model.PointerType, model.FunctionPtrType)): - return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( - var, self._gettypenum(tp)) - elif isinstance(tp, model.ArrayType): - return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( - var, self._gettypenum(model.PointerType(tp.item))) - elif isinstance(tp, model.StructOrUnion): - if tp.fldnames is None: - raise TypeError("'%s' is used as %s, but is opaque" % ( - tp._get_c_name(), context)) - return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % ( - var, self._gettypenum(tp)) - elif isinstance(tp, model.EnumType): - return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( - var, self._gettypenum(tp)) - else: - raise NotImplementedError(tp) - - # ---------- - # typedefs - - def _typedef_type(self, tp, name): - return self._global_type(tp, "(*(%s *)0)" % (name,)) - - def _generate_cpy_typedef_collecttype(self, tp, name): - self._do_collect_type(self._typedef_type(tp, name)) - - def _generate_cpy_typedef_decl(self, tp, name): - pass - - def _typedef_ctx(self, tp, name): - type_index = self._typesdict[tp] - self._lsts["typename"].append(TypenameExpr(name, type_index)) - - def _generate_cpy_typedef_ctx(self, tp, name): - tp = self._typedef_type(tp, name) - self._typedef_ctx(tp, name) - if getattr(tp, "origin", None) == "unknown_type": - self._struct_ctx(tp, tp.name, approxname=None) - elif isinstance(tp, model.NamedPointerType): - self._struct_ctx(tp.totype, tp.totype.name, approxname=tp.name, - named_ptr=tp) - - # ---------- - # function declarations - - def _generate_cpy_function_collecttype(self, tp, name): - self._do_collect_type(tp.as_raw_function()) - if tp.ellipsis and not self.target_is_python: - self._do_collect_type(tp) - - def _generate_cpy_function_decl(self, tp, name): - assert not self.target_is_python - assert isinstance(tp, model.FunctionPtrType) - if tp.ellipsis: - # cannot support vararg functions better than this: check for its - # exact type (including the fixed arguments), and build it as a - # constant function pointer (no CPython wrapper) - self._generate_cpy_constant_decl(tp, name) - return - prnt = self._prnt - numargs = len(tp.args) - if numargs == 0: - argname = 'noarg' - elif numargs == 1: - argname = 'arg0' - else: - argname = 'args' - # - # ------------------------------ - # the 'd' version of the function, only for addressof(lib, 'func') - arguments = [] - call_arguments = [] - context = 'argument of %s' % name - for i, type in enumerate(tp.args): - arguments.append(type.get_c_name(' x%d' % i, context)) - call_arguments.append('x%d' % i) - repr_arguments = ', '.join(arguments) - repr_arguments = repr_arguments or 'void' - if tp.abi: - abi = tp.abi + ' ' - else: - abi = '' - name_and_arguments = '%s_cffi_d_%s(%s)' % (abi, name, repr_arguments) - prnt('static %s' % (tp.result.get_c_name(name_and_arguments),)) - prnt('{') - call_arguments = ', '.join(call_arguments) - result_code = 'return ' - if isinstance(tp.result, model.VoidType): - result_code = '' - prnt(' %s%s(%s);' % (result_code, name, call_arguments)) - prnt('}') - # - prnt('#ifndef PYPY_VERSION') # ------------------------------ - # - prnt('static PyObject *') - prnt('_cffi_f_%s(PyObject *self, PyObject *%s)' % (name, argname)) - prnt('{') - # - context = 'argument of %s' % name - for i, type in enumerate(tp.args): - arg = type.get_c_name(' x%d' % i, context) - prnt(' %s;' % arg) - # - localvars = set() - for type in tp.args: - self._extra_local_variables(type, localvars) - for decl in localvars: - prnt(' %s;' % (decl,)) - # - if not isinstance(tp.result, model.VoidType): - result_code = 'result = ' - context = 'result of %s' % name - result_decl = ' %s;' % tp.result.get_c_name(' result', context) - prnt(result_decl) - else: - result_decl = None - result_code = '' - # - if len(tp.args) > 1: - rng = range(len(tp.args)) - for i in rng: - prnt(' PyObject *arg%d;' % i) - prnt() - prnt(' if (!PyArg_UnpackTuple(args, "%s", %d, %d, %s))' % ( - name, len(rng), len(rng), - ', '.join(['&arg%d' % i for i in rng]))) - prnt(' return NULL;') - prnt() - # - for i, type in enumerate(tp.args): - self._convert_funcarg_to_c(type, 'arg%d' % i, 'x%d' % i, - 'return NULL') - prnt() - # - prnt(' Py_BEGIN_ALLOW_THREADS') - prnt(' _cffi_restore_errno();') - call_arguments = ['x%d' % i for i in range(len(tp.args))] - call_arguments = ', '.join(call_arguments) - prnt(' { %s%s(%s); }' % (result_code, name, call_arguments)) - prnt(' _cffi_save_errno();') - prnt(' Py_END_ALLOW_THREADS') - prnt() - # - prnt(' (void)self; /* unused */') - if numargs == 0: - prnt(' (void)noarg; /* unused */') - if result_code: - prnt(' return %s;' % - self._convert_expr_from_c(tp.result, 'result', 'result type')) - else: - prnt(' Py_INCREF(Py_None);') - prnt(' return Py_None;') - prnt('}') - # - prnt('#else') # ------------------------------ - # - # the PyPy version: need to replace struct/union arguments with - # pointers, and if the result is a struct/union, insert a first - # arg that is a pointer to the result. We also do that for - # complex args and return type. - def need_indirection(type): - return (isinstance(type, model.StructOrUnion) or - (isinstance(type, model.PrimitiveType) and - type.is_complex_type())) - difference = False - arguments = [] - call_arguments = [] - context = 'argument of %s' % name - for i, type in enumerate(tp.args): - indirection = '' - if need_indirection(type): - indirection = '*' - difference = True - arg = type.get_c_name(' %sx%d' % (indirection, i), context) - arguments.append(arg) - call_arguments.append('%sx%d' % (indirection, i)) - tp_result = tp.result - if need_indirection(tp_result): - context = 'result of %s' % name - arg = tp_result.get_c_name(' *result', context) - arguments.insert(0, arg) - tp_result = model.void_type - result_decl = None - result_code = '*result = ' - difference = True - if difference: - repr_arguments = ', '.join(arguments) - repr_arguments = repr_arguments or 'void' - name_and_arguments = '%s_cffi_f_%s(%s)' % (abi, name, - repr_arguments) - prnt('static %s' % (tp_result.get_c_name(name_and_arguments),)) - prnt('{') - if result_decl: - prnt(result_decl) - call_arguments = ', '.join(call_arguments) - prnt(' { %s%s(%s); }' % (result_code, name, call_arguments)) - if result_decl: - prnt(' return result;') - prnt('}') - else: - prnt('# define _cffi_f_%s _cffi_d_%s' % (name, name)) - # - prnt('#endif') # ------------------------------ - prnt() - - def _generate_cpy_function_ctx(self, tp, name): - if tp.ellipsis and not self.target_is_python: - self._generate_cpy_constant_ctx(tp, name) - return - type_index = self._typesdict[tp.as_raw_function()] - numargs = len(tp.args) - if self.target_is_python: - meth_kind = OP_DLOPEN_FUNC - elif numargs == 0: - meth_kind = OP_CPYTHON_BLTN_N # 'METH_NOARGS' - elif numargs == 1: - meth_kind = OP_CPYTHON_BLTN_O # 'METH_O' - else: - meth_kind = OP_CPYTHON_BLTN_V # 'METH_VARARGS' - self._lsts["global"].append( - GlobalExpr(name, '_cffi_f_%s' % name, - CffiOp(meth_kind, type_index), - size='_cffi_d_%s' % name)) - - # ---------- - # named structs or unions - - def _field_type(self, tp_struct, field_name, tp_field): - if isinstance(tp_field, model.ArrayType): - actual_length = tp_field.length - if actual_length == '...': - ptr_struct_name = tp_struct.get_c_name('*') - actual_length = '_cffi_array_len(((%s)0)->%s)' % ( - ptr_struct_name, field_name) - tp_item = self._field_type(tp_struct, '%s[0]' % field_name, - tp_field.item) - tp_field = model.ArrayType(tp_item, actual_length) - return tp_field - - def _struct_collecttype(self, tp): - self._do_collect_type(tp) - - def _struct_decl(self, tp, cname, approxname): - if tp.fldtypes is None: - return - prnt = self._prnt - checkfuncname = '_cffi_checkfld_%s' % (approxname,) - prnt('_CFFI_UNUSED_FN') - prnt('static void %s(%s *p)' % (checkfuncname, cname)) - prnt('{') - prnt(' /* only to generate compile-time warnings or errors */') - prnt(' (void)p;') - for fname, ftype, fbitsize, fqual in tp.enumfields(): - try: - if ftype.is_integer_type() or fbitsize >= 0: - # accept all integers, but complain on float or double - prnt(" (void)((p->%s) | 0); /* check that '%s.%s' is " - "an integer */" % (fname, cname, fname)) - continue - # only accept exactly the type declared, except that '[]' - # is interpreted as a '*' and so will match any array length. - # (It would also match '*', but that's harder to detect...) - while (isinstance(ftype, model.ArrayType) - and (ftype.length is None or ftype.length == '...')): - ftype = ftype.item - fname = fname + '[0]' - prnt(' { %s = &p->%s; (void)tmp; }' % ( - ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual), - fname)) - except VerificationError as e: - prnt(' /* %s */' % str(e)) # cannot verify it, ignore - prnt('}') - prnt('struct _cffi_align_%s { char x; %s y; };' % (approxname, cname)) - prnt() - - def _struct_ctx(self, tp, cname, approxname, named_ptr=None): - type_index = self._typesdict[tp] - reason_for_not_expanding = None - flags = [] - if isinstance(tp, model.UnionType): - flags.append("_CFFI_F_UNION") - if tp.fldtypes is None: - flags.append("_CFFI_F_OPAQUE") - reason_for_not_expanding = "opaque" - if (tp not in self.ffi._parser._included_declarations and - (named_ptr is None or - named_ptr not in self.ffi._parser._included_declarations)): - if tp.fldtypes is None: - pass # opaque - elif tp.partial or tp.has_anonymous_struct_fields(): - pass # field layout obtained silently from the C compiler - else: - flags.append("_CFFI_F_CHECK_FIELDS") - if tp.packed: - flags.append("_CFFI_F_PACKED") - else: - flags.append("_CFFI_F_EXTERNAL") - reason_for_not_expanding = "external" - flags = '|'.join(flags) or '0' - c_fields = [] - if reason_for_not_expanding is None: - enumfields = list(tp.enumfields()) - for fldname, fldtype, fbitsize, fqual in enumfields: - fldtype = self._field_type(tp, fldname, fldtype) - self._check_not_opaque(fldtype, - "field '%s.%s'" % (tp.name, fldname)) - # cname is None for _add_missing_struct_unions() only - op = OP_NOOP - if fbitsize >= 0: - op = OP_BITFIELD - size = '%d /* bits */' % fbitsize - elif cname is None or ( - isinstance(fldtype, model.ArrayType) and - fldtype.length is None): - size = '(size_t)-1' - else: - size = 'sizeof(((%s)0)->%s)' % ( - tp.get_c_name('*') if named_ptr is None - else named_ptr.name, - fldname) - if cname is None or fbitsize >= 0: - offset = '(size_t)-1' - elif named_ptr is not None: - offset = '((char *)&((%s)0)->%s) - (char *)0' % ( - named_ptr.name, fldname) - else: - offset = 'offsetof(%s, %s)' % (tp.get_c_name(''), fldname) - c_fields.append( - FieldExpr(fldname, offset, size, fbitsize, - CffiOp(op, self._typesdict[fldtype]))) - first_field_index = len(self._lsts["field"]) - self._lsts["field"].extend(c_fields) - # - if cname is None: # unknown name, for _add_missing_struct_unions - size = '(size_t)-2' - align = -2 - comment = "unnamed" - else: - if named_ptr is not None: - size = 'sizeof(*(%s)0)' % (named_ptr.name,) - align = '-1 /* unknown alignment */' - else: - size = 'sizeof(%s)' % (cname,) - align = 'offsetof(struct _cffi_align_%s, y)' % (approxname,) - comment = None - else: - size = '(size_t)-1' - align = -1 - first_field_index = -1 - comment = reason_for_not_expanding - self._lsts["struct_union"].append( - StructUnionExpr(tp.name, type_index, flags, size, align, comment, - first_field_index, c_fields)) - self._seen_struct_unions.add(tp) - - def _check_not_opaque(self, tp, location): - while isinstance(tp, model.ArrayType): - tp = tp.item - if isinstance(tp, model.StructOrUnion) and tp.fldtypes is None: - raise TypeError( - "%s is of an opaque type (not declared in cdef())" % location) - - def _add_missing_struct_unions(self): - # not very nice, but some struct declarations might be missing - # because they don't have any known C name. Check that they are - # not partial (we can't complete or verify them!) and emit them - # anonymously. - lst = list(self._struct_unions.items()) - lst.sort(key=lambda tp_order: tp_order[1]) - for tp, order in lst: - if tp not in self._seen_struct_unions: - if tp.partial: - raise NotImplementedError("internal inconsistency: %r is " - "partial but was not seen at " - "this point" % (tp,)) - if tp.name.startswith('$') and tp.name[1:].isdigit(): - approxname = tp.name[1:] - elif tp.name == '_IO_FILE' and tp.forcename == 'FILE': - approxname = 'FILE' - self._typedef_ctx(tp, 'FILE') - else: - raise NotImplementedError("internal inconsistency: %r" % - (tp,)) - self._struct_ctx(tp, None, approxname) - - def _generate_cpy_struct_collecttype(self, tp, name): - self._struct_collecttype(tp) - _generate_cpy_union_collecttype = _generate_cpy_struct_collecttype - - def _struct_names(self, tp): - cname = tp.get_c_name('') - if ' ' in cname: - return cname, cname.replace(' ', '_') - else: - return cname, '_' + cname - - def _generate_cpy_struct_decl(self, tp, name): - self._struct_decl(tp, *self._struct_names(tp)) - _generate_cpy_union_decl = _generate_cpy_struct_decl - - def _generate_cpy_struct_ctx(self, tp, name): - self._struct_ctx(tp, *self._struct_names(tp)) - _generate_cpy_union_ctx = _generate_cpy_struct_ctx - - # ---------- - # 'anonymous' declarations. These are produced for anonymous structs - # or unions; the 'name' is obtained by a typedef. - - def _generate_cpy_anonymous_collecttype(self, tp, name): - if isinstance(tp, model.EnumType): - self._generate_cpy_enum_collecttype(tp, name) - else: - self._struct_collecttype(tp) - - def _generate_cpy_anonymous_decl(self, tp, name): - if isinstance(tp, model.EnumType): - self._generate_cpy_enum_decl(tp) - else: - self._struct_decl(tp, name, 'typedef_' + name) - - def _generate_cpy_anonymous_ctx(self, tp, name): - if isinstance(tp, model.EnumType): - self._enum_ctx(tp, name) - else: - self._struct_ctx(tp, name, 'typedef_' + name) - - # ---------- - # constants, declared with "static const ..." - - def _generate_cpy_const(self, is_int, name, tp=None, category='const', - check_value=None): - if (category, name) in self._seen_constants: - raise VerificationError( - "duplicate declaration of %s '%s'" % (category, name)) - self._seen_constants.add((category, name)) - # - prnt = self._prnt - funcname = '_cffi_%s_%s' % (category, name) - if is_int: - prnt('static int %s(unsigned long long *o)' % funcname) - prnt('{') - prnt(' int n = (%s) <= 0;' % (name,)) - prnt(' *o = (unsigned long long)((%s) | 0);' - ' /* check that %s is an integer */' % (name, name)) - if check_value is not None: - if check_value > 0: - check_value = '%dU' % (check_value,) - prnt(' if (!_cffi_check_int(*o, n, %s))' % (check_value,)) - prnt(' n |= 2;') - prnt(' return n;') - prnt('}') - else: - assert check_value is None - prnt('static void %s(char *o)' % funcname) - prnt('{') - prnt(' *(%s)o = %s;' % (tp.get_c_name('*'), name)) - prnt('}') - prnt() - - def _generate_cpy_constant_collecttype(self, tp, name): - is_int = tp.is_integer_type() - if not is_int or self.target_is_python: - self._do_collect_type(tp) - - def _generate_cpy_constant_decl(self, tp, name): - is_int = tp.is_integer_type() - self._generate_cpy_const(is_int, name, tp) - - def _generate_cpy_constant_ctx(self, tp, name): - if not self.target_is_python and tp.is_integer_type(): - type_op = CffiOp(OP_CONSTANT_INT, -1) - else: - if self.target_is_python: - const_kind = OP_DLOPEN_CONST - else: - const_kind = OP_CONSTANT - type_index = self._typesdict[tp] - type_op = CffiOp(const_kind, type_index) - self._lsts["global"].append( - GlobalExpr(name, '_cffi_const_%s' % name, type_op)) - - # ---------- - # enums - - def _generate_cpy_enum_collecttype(self, tp, name): - self._do_collect_type(tp) - - def _generate_cpy_enum_decl(self, tp, name=None): - for enumerator in tp.enumerators: - self._generate_cpy_const(True, enumerator) - - def _enum_ctx(self, tp, cname): - type_index = self._typesdict[tp] - type_op = CffiOp(OP_ENUM, -1) - if self.target_is_python: - tp.check_not_partial() - for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): - self._lsts["global"].append( - GlobalExpr(enumerator, '_cffi_const_%s' % enumerator, type_op, - check_value=enumvalue)) - # - if cname is not None and '$' not in cname and not self.target_is_python: - size = "sizeof(%s)" % cname - signed = "((%s)-1) <= 0" % cname - else: - basetp = tp.build_baseinttype(self.ffi, []) - size = self.ffi.sizeof(basetp) - signed = int(int(self.ffi.cast(basetp, -1)) < 0) - allenums = ",".join(tp.enumerators) - self._lsts["enum"].append( - EnumExpr(tp.name, type_index, size, signed, allenums)) - - def _generate_cpy_enum_ctx(self, tp, name): - self._enum_ctx(tp, tp._get_c_name()) - - # ---------- - # macros: for now only for integers - - def _generate_cpy_macro_collecttype(self, tp, name): - pass - - def _generate_cpy_macro_decl(self, tp, name): - if tp == '...': - check_value = None - else: - check_value = tp # an integer - self._generate_cpy_const(True, name, check_value=check_value) - - def _generate_cpy_macro_ctx(self, tp, name): - if tp == '...': - if self.target_is_python: - raise VerificationError( - "cannot use the syntax '...' in '#define %s ...' when " - "using the ABI mode" % (name,)) - check_value = None - else: - check_value = tp # an integer - type_op = CffiOp(OP_CONSTANT_INT, -1) - self._lsts["global"].append( - GlobalExpr(name, '_cffi_const_%s' % name, type_op, - check_value=check_value)) - - # ---------- - # global variables - - def _global_type(self, tp, global_name): - if isinstance(tp, model.ArrayType): - actual_length = tp.length - if actual_length == '...': - actual_length = '_cffi_array_len(%s)' % (global_name,) - tp_item = self._global_type(tp.item, '%s[0]' % global_name) - tp = model.ArrayType(tp_item, actual_length) - return tp - - def _generate_cpy_variable_collecttype(self, tp, name): - self._do_collect_type(self._global_type(tp, name)) - - def _generate_cpy_variable_decl(self, tp, name): - prnt = self._prnt - tp = self._global_type(tp, name) - if isinstance(tp, model.ArrayType) and tp.length is None: - tp = tp.item - ampersand = '' - else: - ampersand = '&' - # This code assumes that casts from "tp *" to "void *" is a - # no-op, i.e. a function that returns a "tp *" can be called - # as if it returned a "void *". This should be generally true - # on any modern machine. The only exception to that rule (on - # uncommon architectures, and as far as I can tell) might be - # if 'tp' were a function type, but that is not possible here. - # (If 'tp' is a function _pointer_ type, then casts from "fn_t - # **" to "void *" are again no-ops, as far as I can tell.) - decl = '*_cffi_var_%s(void)' % (name,) - prnt('static ' + tp.get_c_name(decl, quals=self._current_quals)) - prnt('{') - prnt(' return %s(%s);' % (ampersand, name)) - prnt('}') - prnt() - - def _generate_cpy_variable_ctx(self, tp, name): - tp = self._global_type(tp, name) - type_index = self._typesdict[tp] - if self.target_is_python: - op = OP_GLOBAL_VAR - else: - op = OP_GLOBAL_VAR_F - self._lsts["global"].append( - GlobalExpr(name, '_cffi_var_%s' % name, CffiOp(op, type_index))) - - # ---------- - # extern "Python" - - def _generate_cpy_extern_python_collecttype(self, tp, name): - assert isinstance(tp, model.FunctionPtrType) - self._do_collect_type(tp) - _generate_cpy_dllexport_python_collecttype = \ - _generate_cpy_extern_python_plus_c_collecttype = \ - _generate_cpy_extern_python_collecttype - - def _extern_python_decl(self, tp, name, tag_and_space): - prnt = self._prnt - if isinstance(tp.result, model.VoidType): - size_of_result = '0' - else: - context = 'result of %s' % name - size_of_result = '(int)sizeof(%s)' % ( - tp.result.get_c_name('', context),) - prnt('static struct _cffi_externpy_s _cffi_externpy__%s =' % name) - prnt(' { "%s.%s", %s };' % (self.module_name, name, size_of_result)) - prnt() - # - arguments = [] - context = 'argument of %s' % name - for i, type in enumerate(tp.args): - arg = type.get_c_name(' a%d' % i, context) - arguments.append(arg) - # - repr_arguments = ', '.join(arguments) - repr_arguments = repr_arguments or 'void' - name_and_arguments = '%s(%s)' % (name, repr_arguments) - if tp.abi == "__stdcall": - name_and_arguments = '_cffi_stdcall ' + name_and_arguments - # - def may_need_128_bits(tp): - return (isinstance(tp, model.PrimitiveType) and - tp.name == 'long double') - # - size_of_a = max(len(tp.args)*8, 8) - if may_need_128_bits(tp.result): - size_of_a = max(size_of_a, 16) - if isinstance(tp.result, model.StructOrUnion): - size_of_a = 'sizeof(%s) > %d ? sizeof(%s) : %d' % ( - tp.result.get_c_name(''), size_of_a, - tp.result.get_c_name(''), size_of_a) - prnt('%s%s' % (tag_and_space, tp.result.get_c_name(name_and_arguments))) - prnt('{') - prnt(' char a[%s];' % size_of_a) - prnt(' char *p = a;') - for i, type in enumerate(tp.args): - arg = 'a%d' % i - if (isinstance(type, model.StructOrUnion) or - may_need_128_bits(type)): - arg = '&' + arg - type = model.PointerType(type) - prnt(' *(%s)(p + %d) = %s;' % (type.get_c_name('*'), i*8, arg)) - prnt(' _cffi_call_python(&_cffi_externpy__%s, p);' % name) - if not isinstance(tp.result, model.VoidType): - prnt(' return *(%s)p;' % (tp.result.get_c_name('*'),)) - prnt('}') - prnt() - self._num_externpy += 1 - - def _generate_cpy_extern_python_decl(self, tp, name): - self._extern_python_decl(tp, name, 'static ') - - def _generate_cpy_dllexport_python_decl(self, tp, name): - self._extern_python_decl(tp, name, 'CFFI_DLLEXPORT ') - - def _generate_cpy_extern_python_plus_c_decl(self, tp, name): - self._extern_python_decl(tp, name, '') - - def _generate_cpy_extern_python_ctx(self, tp, name): - if self.target_is_python: - raise VerificationError( - "cannot use 'extern \"Python\"' in the ABI mode") - if tp.ellipsis: - raise NotImplementedError("a vararg function is extern \"Python\"") - type_index = self._typesdict[tp] - type_op = CffiOp(OP_EXTERN_PYTHON, type_index) - self._lsts["global"].append( - GlobalExpr(name, '&_cffi_externpy__%s' % name, type_op, name)) - - _generate_cpy_dllexport_python_ctx = \ - _generate_cpy_extern_python_plus_c_ctx = \ - _generate_cpy_extern_python_ctx - - def _print_string_literal_in_array(self, s): - prnt = self._prnt - prnt('// # NB. this is not a string because of a size limit in MSVC') - for line in s.splitlines(True): - prnt(('// ' + line).rstrip()) - printed_line = '' - for c in line: - if len(printed_line) >= 76: - prnt(printed_line) - printed_line = '' - printed_line += '%d,' % (ord(c),) - prnt(printed_line) - - # ---------- - # emitting the opcodes for individual types - - def _emit_bytecode_VoidType(self, tp, index): - self.cffi_types[index] = CffiOp(OP_PRIMITIVE, PRIM_VOID) - - def _emit_bytecode_PrimitiveType(self, tp, index): - prim_index = PRIMITIVE_TO_INDEX[tp.name] - self.cffi_types[index] = CffiOp(OP_PRIMITIVE, prim_index) - - def _emit_bytecode_UnknownIntegerType(self, tp, index): - s = ('_cffi_prim_int(sizeof(%s), (\n' - ' ((%s)-1) | 0 /* check that %s is an integer type */\n' - ' ) <= 0)' % (tp.name, tp.name, tp.name)) - self.cffi_types[index] = CffiOp(OP_PRIMITIVE, s) - - def _emit_bytecode_UnknownFloatType(self, tp, index): - s = ('_cffi_prim_float(sizeof(%s) *\n' - ' (((%s)1) / 2) * 2 /* integer => 0, float => 1 */\n' - ' )' % (tp.name, tp.name)) - self.cffi_types[index] = CffiOp(OP_PRIMITIVE, s) - - def _emit_bytecode_RawFunctionType(self, tp, index): - self.cffi_types[index] = CffiOp(OP_FUNCTION, self._typesdict[tp.result]) - index += 1 - for tp1 in tp.args: - realindex = self._typesdict[tp1] - if index != realindex: - if isinstance(tp1, model.PrimitiveType): - self._emit_bytecode_PrimitiveType(tp1, index) - else: - self.cffi_types[index] = CffiOp(OP_NOOP, realindex) - index += 1 - flags = int(tp.ellipsis) - if tp.abi is not None: - if tp.abi == '__stdcall': - flags |= 2 - else: - raise NotImplementedError("abi=%r" % (tp.abi,)) - self.cffi_types[index] = CffiOp(OP_FUNCTION_END, flags) - - def _emit_bytecode_PointerType(self, tp, index): - self.cffi_types[index] = CffiOp(OP_POINTER, self._typesdict[tp.totype]) - - _emit_bytecode_ConstPointerType = _emit_bytecode_PointerType - _emit_bytecode_NamedPointerType = _emit_bytecode_PointerType - - def _emit_bytecode_FunctionPtrType(self, tp, index): - raw = tp.as_raw_function() - self.cffi_types[index] = CffiOp(OP_POINTER, self._typesdict[raw]) - - def _emit_bytecode_ArrayType(self, tp, index): - item_index = self._typesdict[tp.item] - if tp.length is None: - self.cffi_types[index] = CffiOp(OP_OPEN_ARRAY, item_index) - elif tp.length == '...': - raise VerificationError( - "type %s badly placed: the '...' array length can only be " - "used on global arrays or on fields of structures" % ( - str(tp).replace('/*...*/', '...'),)) - else: - assert self.cffi_types[index + 1] == 'LEN' - self.cffi_types[index] = CffiOp(OP_ARRAY, item_index) - self.cffi_types[index + 1] = CffiOp(None, str(tp.length)) - - def _emit_bytecode_StructType(self, tp, index): - struct_index = self._struct_unions[tp] - self.cffi_types[index] = CffiOp(OP_STRUCT_UNION, struct_index) - _emit_bytecode_UnionType = _emit_bytecode_StructType - - def _emit_bytecode_EnumType(self, tp, index): - enum_index = self._enums[tp] - self.cffi_types[index] = CffiOp(OP_ENUM, enum_index) - - -if sys.version_info >= (3,): - NativeIO = io.StringIO -else: - class NativeIO(io.BytesIO): - def write(self, s): - if isinstance(s, unicode): - s = s.encode('ascii') - super(NativeIO, self).write(s) - -def _make_c_or_py_source(ffi, module_name, preamble, target_file, verbose): - if verbose: - print("generating %s" % (target_file,)) - recompiler = Recompiler(ffi, module_name, - target_is_python=(preamble is None)) - recompiler.collect_type_table() - recompiler.collect_step_tables() - f = NativeIO() - recompiler.write_source_to_f(f, preamble) - output = f.getvalue() - try: - with open(target_file, 'r') as f1: - if f1.read(len(output) + 1) != output: - raise IOError - if verbose: - print("(already up-to-date)") - return False # already up-to-date - except IOError: - tmp_file = '%s.~%d' % (target_file, os.getpid()) - with open(tmp_file, 'w') as f1: - f1.write(output) - try: - os.rename(tmp_file, target_file) - except OSError: - os.unlink(target_file) - os.rename(tmp_file, target_file) - return True - -def make_c_source(ffi, module_name, preamble, target_c_file, verbose=False): - assert preamble is not None - return _make_c_or_py_source(ffi, module_name, preamble, target_c_file, - verbose) - -def make_py_source(ffi, module_name, target_py_file, verbose=False): - return _make_c_or_py_source(ffi, module_name, None, target_py_file, - verbose) - -def _modname_to_file(outputdir, modname, extension): - parts = modname.split('.') - try: - os.makedirs(os.path.join(outputdir, *parts[:-1])) - except OSError: - pass - parts[-1] += extension - return os.path.join(outputdir, *parts), parts - - -# Aaargh. Distutils is not tested at all for the purpose of compiling -# DLLs that are not extension modules. Here are some hacks to work -# around that, in the _patch_for_*() functions... - -def _patch_meth(patchlist, cls, name, new_meth): - old = getattr(cls, name) - patchlist.append((cls, name, old)) - setattr(cls, name, new_meth) - return old - -def _unpatch_meths(patchlist): - for cls, name, old_meth in reversed(patchlist): - setattr(cls, name, old_meth) - -def _patch_for_embedding(patchlist): - if sys.platform == 'win32': - # we must not remove the manifest when building for embedding! - from distutils.msvc9compiler import MSVCCompiler - _patch_meth(patchlist, MSVCCompiler, '_remove_visual_c_ref', - lambda self, manifest_file: manifest_file) - - if sys.platform == 'darwin': - # we must not make a '-bundle', but a '-dynamiclib' instead - from distutils.ccompiler import CCompiler - def my_link_shared_object(self, *args, **kwds): - if '-bundle' in self.linker_so: - self.linker_so = list(self.linker_so) - i = self.linker_so.index('-bundle') - self.linker_so[i] = '-dynamiclib' - return old_link_shared_object(self, *args, **kwds) - old_link_shared_object = _patch_meth(patchlist, CCompiler, - 'link_shared_object', - my_link_shared_object) - -def _patch_for_target(patchlist, target): - from distutils.command.build_ext import build_ext - # if 'target' is different from '*', we need to patch some internal - # method to just return this 'target' value, instead of having it - # built from module_name - if target.endswith('.*'): - target = target[:-2] - if sys.platform == 'win32': - target += '.dll' - elif sys.platform == 'darwin': - target += '.dylib' - else: - target += '.so' - _patch_meth(patchlist, build_ext, 'get_ext_filename', - lambda self, ext_name: target) - - -def recompile(ffi, module_name, preamble, tmpdir='.', call_c_compiler=True, - c_file=None, source_extension='.c', extradir=None, - compiler_verbose=1, target=None, debug=None, **kwds): - if not isinstance(module_name, str): - module_name = module_name.encode('ascii') - if ffi._windows_unicode: - ffi._apply_windows_unicode(kwds) - if preamble is not None: - embedding = (ffi._embedding is not None) - if embedding: - ffi._apply_embedding_fix(kwds) - if c_file is None: - c_file, parts = _modname_to_file(tmpdir, module_name, - source_extension) - if extradir: - parts = [extradir] + parts - ext_c_file = os.path.join(*parts) - else: - ext_c_file = c_file - # - if target is None: - if embedding: - target = '%s.*' % module_name - else: - target = '*' - # - ext = ffiplatform.get_extension(ext_c_file, module_name, **kwds) - updated = make_c_source(ffi, module_name, preamble, c_file, - verbose=compiler_verbose) - if call_c_compiler: - patchlist = [] - cwd = os.getcwd() - try: - if embedding: - _patch_for_embedding(patchlist) - if target != '*': - _patch_for_target(patchlist, target) - if compiler_verbose: - if tmpdir == '.': - msg = 'the current directory is' - else: - msg = 'setting the current directory to' - print('%s %r' % (msg, os.path.abspath(tmpdir))) - os.chdir(tmpdir) - outputfilename = ffiplatform.compile('.', ext, - compiler_verbose, debug) - finally: - os.chdir(cwd) - _unpatch_meths(patchlist) - return outputfilename - else: - return ext, updated - else: - if c_file is None: - c_file, _ = _modname_to_file(tmpdir, module_name, '.py') - updated = make_py_source(ffi, module_name, c_file, - verbose=compiler_verbose) - if call_c_compiler: - return c_file - else: - return None, updated - -def _verify(ffi, module_name, preamble, *args, **kwds): - # FOR TESTS ONLY - from testing.udir import udir - import imp - assert module_name not in sys.modules, "module name conflict: %r" % ( - module_name,) - kwds.setdefault('tmpdir', str(udir)) - outputfilename = recompile(ffi, module_name, preamble, *args, **kwds) - module = imp.load_dynamic(module_name, outputfilename) - # - # hack hack hack: copy all *bound methods* from module.ffi back to the - # ffi instance. Then calls like ffi.new() will invoke module.ffi.new(). - for name in dir(module.ffi): - if not name.startswith('_'): - attr = getattr(module.ffi, name) - if attr is not getattr(ffi, name, object()): - setattr(ffi, name, attr) - def typeof_disabled(*args, **kwds): - raise NotImplementedError - ffi._typeof = typeof_disabled - for name in dir(ffi): - if not name.startswith('_') and not hasattr(module.ffi, name): - setattr(ffi, name, NotImplemented) - return module.lib diff --git a/website/web/Lib/site-packages/cffi/setuptools_ext.py b/website/web/Lib/site-packages/cffi/setuptools_ext.py deleted file mode 100644 index dd1b946c0..000000000 --- a/website/web/Lib/site-packages/cffi/setuptools_ext.py +++ /dev/null @@ -1,193 +0,0 @@ -import os -import sys - -try: - basestring -except NameError: - # Python 3.x - basestring = str - -def error(msg): - from distutils.errors import DistutilsSetupError - raise DistutilsSetupError(msg) - - -def execfile(filename, glob): - # We use execfile() (here rewritten for Python 3) instead of - # __import__() to load the build script. The problem with - # a normal import is that in some packages, the intermediate - # __init__.py files may already try to import the file that - # we are generating. - with open(filename) as f: - src = f.read() - src += '\n' # Python 2.6 compatibility - code = compile(src, filename, 'exec') - exec(code, glob, glob) - - -def add_cffi_module(dist, mod_spec): - from cffi.api import FFI - - if not isinstance(mod_spec, basestring): - error("argument to 'cffi_modules=...' must be a str or a list of str," - " not %r" % (type(mod_spec).__name__,)) - mod_spec = str(mod_spec) - try: - build_file_name, ffi_var_name = mod_spec.split(':') - except ValueError: - error("%r must be of the form 'path/build.py:ffi_variable'" % - (mod_spec,)) - if not os.path.exists(build_file_name): - ext = '' - rewritten = build_file_name.replace('.', '/') + '.py' - if os.path.exists(rewritten): - ext = ' (rewrite cffi_modules to [%r])' % ( - rewritten + ':' + ffi_var_name,) - error("%r does not name an existing file%s" % (build_file_name, ext)) - - mod_vars = {'__name__': '__cffi__', '__file__': build_file_name} - execfile(build_file_name, mod_vars) - - try: - ffi = mod_vars[ffi_var_name] - except KeyError: - error("%r: object %r not found in module" % (mod_spec, - ffi_var_name)) - if not isinstance(ffi, FFI): - ffi = ffi() # maybe it's a function instead of directly an ffi - if not isinstance(ffi, FFI): - error("%r is not an FFI instance (got %r)" % (mod_spec, - type(ffi).__name__)) - if not hasattr(ffi, '_assigned_source'): - error("%r: the set_source() method was not called" % (mod_spec,)) - module_name, source, source_extension, kwds = ffi._assigned_source - if ffi._windows_unicode: - kwds = kwds.copy() - ffi._apply_windows_unicode(kwds) - - if source is None: - _add_py_module(dist, ffi, module_name) - else: - _add_c_module(dist, ffi, module_name, source, source_extension, kwds) - -def _set_py_limited_api(Extension, kwds): - """ - Add py_limited_api to kwds if setuptools >= 26 is in use. - Do not alter the setting if it already exists. - Setuptools takes care of ignoring the flag on Python 2 and PyPy. - - CPython itself should ignore the flag in a debugging version - (by not listing .abi3.so in the extensions it supports), but - it doesn't so far, creating troubles. That's why we check - for "not hasattr(sys, 'gettotalrefcount')" (the 2.7 compatible equivalent - of 'd' not in sys.abiflags). (http://bugs.python.org/issue28401) - - On Windows, it's better not to use py_limited_api until issue #355 - can be resolved (by having virtualenv copy PYTHON3.DLL). See also - the start of _cffi_include.h. - """ - if ('py_limited_api' not in kwds and not hasattr(sys, 'gettotalrefcount') - and sys.platform != 'win32'): - import setuptools - try: - setuptools_major_version = int(setuptools.__version__.partition('.')[0]) - if setuptools_major_version >= 26: - kwds['py_limited_api'] = True - except ValueError: # certain development versions of setuptools - # If we don't know the version number of setuptools, we - # try to set 'py_limited_api' anyway. At worst, we get a - # warning. - kwds['py_limited_api'] = True - return kwds - -def _add_c_module(dist, ffi, module_name, source, source_extension, kwds): - from distutils.core import Extension - # We are a setuptools extension. Need this build_ext for py_limited_api. - from setuptools.command.build_ext import build_ext - from distutils.dir_util import mkpath - from distutils import log - from cffi import recompiler - - allsources = ['$PLACEHOLDER'] - allsources.extend(kwds.pop('sources', [])) - kwds = _set_py_limited_api(Extension, kwds) - ext = Extension(name=module_name, sources=allsources, **kwds) - - def make_mod(tmpdir, pre_run=None): - c_file = os.path.join(tmpdir, module_name + source_extension) - log.info("generating cffi module %r" % c_file) - mkpath(tmpdir) - # a setuptools-only, API-only hook: called with the "ext" and "ffi" - # arguments just before we turn the ffi into C code. To use it, - # subclass the 'distutils.command.build_ext.build_ext' class and - # add a method 'def pre_run(self, ext, ffi)'. - if pre_run is not None: - pre_run(ext, ffi) - updated = recompiler.make_c_source(ffi, module_name, source, c_file) - if not updated: - log.info("already up-to-date") - return c_file - - if dist.ext_modules is None: - dist.ext_modules = [] - dist.ext_modules.append(ext) - - base_class = dist.cmdclass.get('build_ext', build_ext) - class build_ext_make_mod(base_class): - def run(self): - if ext.sources[0] == '$PLACEHOLDER': - pre_run = getattr(self, 'pre_run', None) - ext.sources[0] = make_mod(self.build_temp, pre_run) - base_class.run(self) - dist.cmdclass['build_ext'] = build_ext_make_mod - # NB. multiple runs here will create multiple 'build_ext_make_mod' - # classes. Even in this case the 'build_ext' command should be - # run once; but just in case, the logic above does nothing if - # called again. - - -def _add_py_module(dist, ffi, module_name): - from distutils.dir_util import mkpath - from distutils.command.build_py import build_py - from distutils.command.build_ext import build_ext - from distutils import log - from cffi import recompiler - - def generate_mod(py_file): - log.info("generating cffi module %r" % py_file) - mkpath(os.path.dirname(py_file)) - updated = recompiler.make_py_source(ffi, module_name, py_file) - if not updated: - log.info("already up-to-date") - - base_class = dist.cmdclass.get('build_py', build_py) - class build_py_make_mod(base_class): - def run(self): - base_class.run(self) - module_path = module_name.split('.') - module_path[-1] += '.py' - generate_mod(os.path.join(self.build_lib, *module_path)) - dist.cmdclass['build_py'] = build_py_make_mod - - # the following is only for "build_ext -i" - base_class_2 = dist.cmdclass.get('build_ext', build_ext) - class build_ext_make_mod(base_class_2): - def run(self): - base_class_2.run(self) - if self.inplace: - # from get_ext_fullpath() in distutils/command/build_ext.py - module_path = module_name.split('.') - package = '.'.join(module_path[:-1]) - build_py = self.get_finalized_command('build_py') - package_dir = build_py.get_package_dir(package) - file_name = module_path[-1] + '.py' - generate_mod(os.path.join(package_dir, file_name)) - dist.cmdclass['build_ext'] = build_ext_make_mod - -def cffi_modules(dist, attr, value): - assert attr == 'cffi_modules' - if isinstance(value, basestring): - value = [value] - - for cffi_module in value: - add_cffi_module(dist, cffi_module) diff --git a/website/web/Lib/site-packages/cffi/vengine_cpy.py b/website/web/Lib/site-packages/cffi/vengine_cpy.py deleted file mode 100644 index 536f11f80..000000000 --- a/website/web/Lib/site-packages/cffi/vengine_cpy.py +++ /dev/null @@ -1,1015 +0,0 @@ -# -# DEPRECATED: implementation for ffi.verify() -# -import sys, imp -from . import model -from .error import VerificationError - - -class VCPythonEngine(object): - _class_key = 'x' - _gen_python_module = True - - def __init__(self, verifier): - self.verifier = verifier - self.ffi = verifier.ffi - self._struct_pending_verification = {} - self._types_of_builtin_functions = {} - - def patch_extension_kwds(self, kwds): - pass - - def find_module(self, module_name, path, so_suffixes): - try: - f, filename, descr = imp.find_module(module_name, path) - except ImportError: - return None - if f is not None: - f.close() - # Note that after a setuptools installation, there are both .py - # and .so files with the same basename. The code here relies on - # imp.find_module() locating the .so in priority. - if descr[0] not in so_suffixes: - return None - return filename - - def collect_types(self): - self._typesdict = {} - self._generate("collecttype") - - def _prnt(self, what=''): - self._f.write(what + '\n') - - def _gettypenum(self, type): - # a KeyError here is a bug. please report it! :-) - return self._typesdict[type] - - def _do_collect_type(self, tp): - if ((not isinstance(tp, model.PrimitiveType) - or tp.name == 'long double') - and tp not in self._typesdict): - num = len(self._typesdict) - self._typesdict[tp] = num - - def write_source_to_f(self): - self.collect_types() - # - # The new module will have a _cffi_setup() function that receives - # objects from the ffi world, and that calls some setup code in - # the module. This setup code is split in several independent - # functions, e.g. one per constant. The functions are "chained" - # by ending in a tail call to each other. - # - # This is further split in two chained lists, depending on if we - # can do it at import-time or if we must wait for _cffi_setup() to - # provide us with the objects. This is needed because we - # need the values of the enum constants in order to build the - # that we may have to pass to _cffi_setup(). - # - # The following two 'chained_list_constants' items contains - # the head of these two chained lists, as a string that gives the - # call to do, if any. - self._chained_list_constants = ['((void)lib,0)', '((void)lib,0)'] - # - prnt = self._prnt - # first paste some standard set of lines that are mostly '#define' - prnt(cffimod_header) - prnt() - # then paste the C source given by the user, verbatim. - prnt(self.verifier.preamble) - prnt() - # - # call generate_cpy_xxx_decl(), for every xxx found from - # ffi._parser._declarations. This generates all the functions. - self._generate("decl") - # - # implement the function _cffi_setup_custom() as calling the - # head of the chained list. - self._generate_setup_custom() - prnt() - # - # produce the method table, including the entries for the - # generated Python->C function wrappers, which are done - # by generate_cpy_function_method(). - prnt('static PyMethodDef _cffi_methods[] = {') - self._generate("method") - prnt(' {"_cffi_setup", _cffi_setup, METH_VARARGS, NULL},') - prnt(' {NULL, NULL, 0, NULL} /* Sentinel */') - prnt('};') - prnt() - # - # standard init. - modname = self.verifier.get_module_name() - constants = self._chained_list_constants[False] - prnt('#if PY_MAJOR_VERSION >= 3') - prnt() - prnt('static struct PyModuleDef _cffi_module_def = {') - prnt(' PyModuleDef_HEAD_INIT,') - prnt(' "%s",' % modname) - prnt(' NULL,') - prnt(' -1,') - prnt(' _cffi_methods,') - prnt(' NULL, NULL, NULL, NULL') - prnt('};') - prnt() - prnt('PyMODINIT_FUNC') - prnt('PyInit_%s(void)' % modname) - prnt('{') - prnt(' PyObject *lib;') - prnt(' lib = PyModule_Create(&_cffi_module_def);') - prnt(' if (lib == NULL)') - prnt(' return NULL;') - prnt(' if (%s < 0 || _cffi_init() < 0) {' % (constants,)) - prnt(' Py_DECREF(lib);') - prnt(' return NULL;') - prnt(' }') - prnt(' return lib;') - prnt('}') - prnt() - prnt('#else') - prnt() - prnt('PyMODINIT_FUNC') - prnt('init%s(void)' % modname) - prnt('{') - prnt(' PyObject *lib;') - prnt(' lib = Py_InitModule("%s", _cffi_methods);' % modname) - prnt(' if (lib == NULL)') - prnt(' return;') - prnt(' if (%s < 0 || _cffi_init() < 0)' % (constants,)) - prnt(' return;') - prnt(' return;') - prnt('}') - prnt() - prnt('#endif') - - def load_library(self, flags=None): - # XXX review all usages of 'self' here! - # import it as a new extension module - imp.acquire_lock() - try: - if hasattr(sys, "getdlopenflags"): - previous_flags = sys.getdlopenflags() - try: - if hasattr(sys, "setdlopenflags") and flags is not None: - sys.setdlopenflags(flags) - module = imp.load_dynamic(self.verifier.get_module_name(), - self.verifier.modulefilename) - except ImportError as e: - error = "importing %r: %s" % (self.verifier.modulefilename, e) - raise VerificationError(error) - finally: - if hasattr(sys, "setdlopenflags"): - sys.setdlopenflags(previous_flags) - finally: - imp.release_lock() - # - # call loading_cpy_struct() to get the struct layout inferred by - # the C compiler - self._load(module, 'loading') - # - # the C code will need the objects. Collect them in - # order in a list. - revmapping = dict([(value, key) - for (key, value) in self._typesdict.items()]) - lst = [revmapping[i] for i in range(len(revmapping))] - lst = list(map(self.ffi._get_cached_btype, lst)) - # - # build the FFILibrary class and instance and call _cffi_setup(). - # this will set up some fields like '_cffi_types', and only then - # it will invoke the chained list of functions that will really - # build (notably) the constant objects, as if they are - # pointers, and store them as attributes on the 'library' object. - class FFILibrary(object): - _cffi_python_module = module - _cffi_ffi = self.ffi - _cffi_dir = [] - def __dir__(self): - return FFILibrary._cffi_dir + list(self.__dict__) - library = FFILibrary() - if module._cffi_setup(lst, VerificationError, library): - import warnings - warnings.warn("reimporting %r might overwrite older definitions" - % (self.verifier.get_module_name())) - # - # finally, call the loaded_cpy_xxx() functions. This will perform - # the final adjustments, like copying the Python->C wrapper - # functions from the module to the 'library' object, and setting - # up the FFILibrary class with properties for the global C variables. - self._load(module, 'loaded', library=library) - module._cffi_original_ffi = self.ffi - module._cffi_types_of_builtin_funcs = self._types_of_builtin_functions - return library - - def _get_declarations(self): - lst = [(key, tp) for (key, (tp, qual)) in - self.ffi._parser._declarations.items()] - lst.sort() - return lst - - def _generate(self, step_name): - for name, tp in self._get_declarations(): - kind, realname = name.split(' ', 1) - try: - method = getattr(self, '_generate_cpy_%s_%s' % (kind, - step_name)) - except AttributeError: - raise VerificationError( - "not implemented in verify(): %r" % name) - try: - method(tp, realname) - except Exception as e: - model.attach_exception_info(e, name) - raise - - def _load(self, module, step_name, **kwds): - for name, tp in self._get_declarations(): - kind, realname = name.split(' ', 1) - method = getattr(self, '_%s_cpy_%s' % (step_name, kind)) - try: - method(tp, realname, module, **kwds) - except Exception as e: - model.attach_exception_info(e, name) - raise - - def _generate_nothing(self, tp, name): - pass - - def _loaded_noop(self, tp, name, module, **kwds): - pass - - # ---------- - - def _convert_funcarg_to_c(self, tp, fromvar, tovar, errcode): - extraarg = '' - if isinstance(tp, model.PrimitiveType): - if tp.is_integer_type() and tp.name != '_Bool': - converter = '_cffi_to_c_int' - extraarg = ', %s' % tp.name - else: - converter = '(%s)_cffi_to_c_%s' % (tp.get_c_name(''), - tp.name.replace(' ', '_')) - errvalue = '-1' - # - elif isinstance(tp, model.PointerType): - self._convert_funcarg_to_c_ptr_or_array(tp, fromvar, - tovar, errcode) - return - # - elif isinstance(tp, (model.StructOrUnion, model.EnumType)): - # a struct (not a struct pointer) as a function argument - self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)' - % (tovar, self._gettypenum(tp), fromvar)) - self._prnt(' %s;' % errcode) - return - # - elif isinstance(tp, model.FunctionPtrType): - converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('') - extraarg = ', _cffi_type(%d)' % self._gettypenum(tp) - errvalue = 'NULL' - # - else: - raise NotImplementedError(tp) - # - self._prnt(' %s = %s(%s%s);' % (tovar, converter, fromvar, extraarg)) - self._prnt(' if (%s == (%s)%s && PyErr_Occurred())' % ( - tovar, tp.get_c_name(''), errvalue)) - self._prnt(' %s;' % errcode) - - def _extra_local_variables(self, tp, localvars): - if isinstance(tp, model.PointerType): - localvars.add('Py_ssize_t datasize') - - def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode): - self._prnt(' datasize = _cffi_prepare_pointer_call_argument(') - self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % ( - self._gettypenum(tp), fromvar, tovar)) - self._prnt(' if (datasize != 0) {') - self._prnt(' if (datasize < 0)') - self._prnt(' %s;' % errcode) - self._prnt(' %s = alloca((size_t)datasize);' % (tovar,)) - self._prnt(' memset((void *)%s, 0, (size_t)datasize);' % (tovar,)) - self._prnt(' if (_cffi_convert_array_from_object(' - '(char *)%s, _cffi_type(%d), %s) < 0)' % ( - tovar, self._gettypenum(tp), fromvar)) - self._prnt(' %s;' % errcode) - self._prnt(' }') - - def _convert_expr_from_c(self, tp, var, context): - if isinstance(tp, model.PrimitiveType): - if tp.is_integer_type() and tp.name != '_Bool': - return '_cffi_from_c_int(%s, %s)' % (var, tp.name) - elif tp.name != 'long double': - return '_cffi_from_c_%s(%s)' % (tp.name.replace(' ', '_'), var) - else: - return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( - var, self._gettypenum(tp)) - elif isinstance(tp, (model.PointerType, model.FunctionPtrType)): - return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( - var, self._gettypenum(tp)) - elif isinstance(tp, model.ArrayType): - return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( - var, self._gettypenum(model.PointerType(tp.item))) - elif isinstance(tp, model.StructOrUnion): - if tp.fldnames is None: - raise TypeError("'%s' is used as %s, but is opaque" % ( - tp._get_c_name(), context)) - return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % ( - var, self._gettypenum(tp)) - elif isinstance(tp, model.EnumType): - return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( - var, self._gettypenum(tp)) - else: - raise NotImplementedError(tp) - - # ---------- - # typedefs: generates no code so far - - _generate_cpy_typedef_collecttype = _generate_nothing - _generate_cpy_typedef_decl = _generate_nothing - _generate_cpy_typedef_method = _generate_nothing - _loading_cpy_typedef = _loaded_noop - _loaded_cpy_typedef = _loaded_noop - - # ---------- - # function declarations - - def _generate_cpy_function_collecttype(self, tp, name): - assert isinstance(tp, model.FunctionPtrType) - if tp.ellipsis: - self._do_collect_type(tp) - else: - # don't call _do_collect_type(tp) in this common case, - # otherwise test_autofilled_struct_as_argument fails - for type in tp.args: - self._do_collect_type(type) - self._do_collect_type(tp.result) - - def _generate_cpy_function_decl(self, tp, name): - assert isinstance(tp, model.FunctionPtrType) - if tp.ellipsis: - # cannot support vararg functions better than this: check for its - # exact type (including the fixed arguments), and build it as a - # constant function pointer (no CPython wrapper) - self._generate_cpy_const(False, name, tp) - return - prnt = self._prnt - numargs = len(tp.args) - if numargs == 0: - argname = 'noarg' - elif numargs == 1: - argname = 'arg0' - else: - argname = 'args' - prnt('static PyObject *') - prnt('_cffi_f_%s(PyObject *self, PyObject *%s)' % (name, argname)) - prnt('{') - # - context = 'argument of %s' % name - for i, type in enumerate(tp.args): - prnt(' %s;' % type.get_c_name(' x%d' % i, context)) - # - localvars = set() - for type in tp.args: - self._extra_local_variables(type, localvars) - for decl in localvars: - prnt(' %s;' % (decl,)) - # - if not isinstance(tp.result, model.VoidType): - result_code = 'result = ' - context = 'result of %s' % name - prnt(' %s;' % tp.result.get_c_name(' result', context)) - else: - result_code = '' - # - if len(tp.args) > 1: - rng = range(len(tp.args)) - for i in rng: - prnt(' PyObject *arg%d;' % i) - prnt() - prnt(' if (!PyArg_ParseTuple(args, "%s:%s", %s))' % ( - 'O' * numargs, name, ', '.join(['&arg%d' % i for i in rng]))) - prnt(' return NULL;') - prnt() - # - for i, type in enumerate(tp.args): - self._convert_funcarg_to_c(type, 'arg%d' % i, 'x%d' % i, - 'return NULL') - prnt() - # - prnt(' Py_BEGIN_ALLOW_THREADS') - prnt(' _cffi_restore_errno();') - prnt(' { %s%s(%s); }' % ( - result_code, name, - ', '.join(['x%d' % i for i in range(len(tp.args))]))) - prnt(' _cffi_save_errno();') - prnt(' Py_END_ALLOW_THREADS') - prnt() - # - prnt(' (void)self; /* unused */') - if numargs == 0: - prnt(' (void)noarg; /* unused */') - if result_code: - prnt(' return %s;' % - self._convert_expr_from_c(tp.result, 'result', 'result type')) - else: - prnt(' Py_INCREF(Py_None);') - prnt(' return Py_None;') - prnt('}') - prnt() - - def _generate_cpy_function_method(self, tp, name): - if tp.ellipsis: - return - numargs = len(tp.args) - if numargs == 0: - meth = 'METH_NOARGS' - elif numargs == 1: - meth = 'METH_O' - else: - meth = 'METH_VARARGS' - self._prnt(' {"%s", _cffi_f_%s, %s, NULL},' % (name, name, meth)) - - _loading_cpy_function = _loaded_noop - - def _loaded_cpy_function(self, tp, name, module, library): - if tp.ellipsis: - return - func = getattr(module, name) - setattr(library, name, func) - self._types_of_builtin_functions[func] = tp - - # ---------- - # named structs - - _generate_cpy_struct_collecttype = _generate_nothing - def _generate_cpy_struct_decl(self, tp, name): - assert name == tp.name - self._generate_struct_or_union_decl(tp, 'struct', name) - def _generate_cpy_struct_method(self, tp, name): - self._generate_struct_or_union_method(tp, 'struct', name) - def _loading_cpy_struct(self, tp, name, module): - self._loading_struct_or_union(tp, 'struct', name, module) - def _loaded_cpy_struct(self, tp, name, module, **kwds): - self._loaded_struct_or_union(tp) - - _generate_cpy_union_collecttype = _generate_nothing - def _generate_cpy_union_decl(self, tp, name): - assert name == tp.name - self._generate_struct_or_union_decl(tp, 'union', name) - def _generate_cpy_union_method(self, tp, name): - self._generate_struct_or_union_method(tp, 'union', name) - def _loading_cpy_union(self, tp, name, module): - self._loading_struct_or_union(tp, 'union', name, module) - def _loaded_cpy_union(self, tp, name, module, **kwds): - self._loaded_struct_or_union(tp) - - def _generate_struct_or_union_decl(self, tp, prefix, name): - if tp.fldnames is None: - return # nothing to do with opaque structs - checkfuncname = '_cffi_check_%s_%s' % (prefix, name) - layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) - cname = ('%s %s' % (prefix, name)).strip() - # - prnt = self._prnt - prnt('static void %s(%s *p)' % (checkfuncname, cname)) - prnt('{') - prnt(' /* only to generate compile-time warnings or errors */') - prnt(' (void)p;') - for fname, ftype, fbitsize, fqual in tp.enumfields(): - if (isinstance(ftype, model.PrimitiveType) - and ftype.is_integer_type()) or fbitsize >= 0: - # accept all integers, but complain on float or double - prnt(' (void)((p->%s) << 1);' % fname) - else: - # only accept exactly the type declared. - try: - prnt(' { %s = &p->%s; (void)tmp; }' % ( - ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual), - fname)) - except VerificationError as e: - prnt(' /* %s */' % str(e)) # cannot verify it, ignore - prnt('}') - prnt('static PyObject *') - prnt('%s(PyObject *self, PyObject *noarg)' % (layoutfuncname,)) - prnt('{') - prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname) - prnt(' static Py_ssize_t nums[] = {') - prnt(' sizeof(%s),' % cname) - prnt(' offsetof(struct _cffi_aligncheck, y),') - for fname, ftype, fbitsize, fqual in tp.enumfields(): - if fbitsize >= 0: - continue # xxx ignore fbitsize for now - prnt(' offsetof(%s, %s),' % (cname, fname)) - if isinstance(ftype, model.ArrayType) and ftype.length is None: - prnt(' 0, /* %s */' % ftype._get_c_name()) - else: - prnt(' sizeof(((%s *)0)->%s),' % (cname, fname)) - prnt(' -1') - prnt(' };') - prnt(' (void)self; /* unused */') - prnt(' (void)noarg; /* unused */') - prnt(' return _cffi_get_struct_layout(nums);') - prnt(' /* the next line is not executed, but compiled */') - prnt(' %s(0);' % (checkfuncname,)) - prnt('}') - prnt() - - def _generate_struct_or_union_method(self, tp, prefix, name): - if tp.fldnames is None: - return # nothing to do with opaque structs - layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) - self._prnt(' {"%s", %s, METH_NOARGS, NULL},' % (layoutfuncname, - layoutfuncname)) - - def _loading_struct_or_union(self, tp, prefix, name, module): - if tp.fldnames is None: - return # nothing to do with opaque structs - layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) - # - function = getattr(module, layoutfuncname) - layout = function() - if isinstance(tp, model.StructOrUnion) and tp.partial: - # use the function()'s sizes and offsets to guide the - # layout of the struct - totalsize = layout[0] - totalalignment = layout[1] - fieldofs = layout[2::2] - fieldsize = layout[3::2] - tp.force_flatten() - assert len(fieldofs) == len(fieldsize) == len(tp.fldnames) - tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment - else: - cname = ('%s %s' % (prefix, name)).strip() - self._struct_pending_verification[tp] = layout, cname - - def _loaded_struct_or_union(self, tp): - if tp.fldnames is None: - return # nothing to do with opaque structs - self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered - - if tp in self._struct_pending_verification: - # check that the layout sizes and offsets match the real ones - def check(realvalue, expectedvalue, msg): - if realvalue != expectedvalue: - raise VerificationError( - "%s (we have %d, but C compiler says %d)" - % (msg, expectedvalue, realvalue)) - ffi = self.ffi - BStruct = ffi._get_cached_btype(tp) - layout, cname = self._struct_pending_verification.pop(tp) - check(layout[0], ffi.sizeof(BStruct), "wrong total size") - check(layout[1], ffi.alignof(BStruct), "wrong total alignment") - i = 2 - for fname, ftype, fbitsize, fqual in tp.enumfields(): - if fbitsize >= 0: - continue # xxx ignore fbitsize for now - check(layout[i], ffi.offsetof(BStruct, fname), - "wrong offset for field %r" % (fname,)) - if layout[i+1] != 0: - BField = ffi._get_cached_btype(ftype) - check(layout[i+1], ffi.sizeof(BField), - "wrong size for field %r" % (fname,)) - i += 2 - assert i == len(layout) - - # ---------- - # 'anonymous' declarations. These are produced for anonymous structs - # or unions; the 'name' is obtained by a typedef. - - _generate_cpy_anonymous_collecttype = _generate_nothing - - def _generate_cpy_anonymous_decl(self, tp, name): - if isinstance(tp, model.EnumType): - self._generate_cpy_enum_decl(tp, name, '') - else: - self._generate_struct_or_union_decl(tp, '', name) - - def _generate_cpy_anonymous_method(self, tp, name): - if not isinstance(tp, model.EnumType): - self._generate_struct_or_union_method(tp, '', name) - - def _loading_cpy_anonymous(self, tp, name, module): - if isinstance(tp, model.EnumType): - self._loading_cpy_enum(tp, name, module) - else: - self._loading_struct_or_union(tp, '', name, module) - - def _loaded_cpy_anonymous(self, tp, name, module, **kwds): - if isinstance(tp, model.EnumType): - self._loaded_cpy_enum(tp, name, module, **kwds) - else: - self._loaded_struct_or_union(tp) - - # ---------- - # constants, likely declared with '#define' - - def _generate_cpy_const(self, is_int, name, tp=None, category='const', - vartp=None, delayed=True, size_too=False, - check_value=None): - prnt = self._prnt - funcname = '_cffi_%s_%s' % (category, name) - prnt('static int %s(PyObject *lib)' % funcname) - prnt('{') - prnt(' PyObject *o;') - prnt(' int res;') - if not is_int: - prnt(' %s;' % (vartp or tp).get_c_name(' i', name)) - else: - assert category == 'const' - # - if check_value is not None: - self._check_int_constant_value(name, check_value) - # - if not is_int: - if category == 'var': - realexpr = '&' + name - else: - realexpr = name - prnt(' i = (%s);' % (realexpr,)) - prnt(' o = %s;' % (self._convert_expr_from_c(tp, 'i', - 'variable type'),)) - assert delayed - else: - prnt(' o = _cffi_from_c_int_const(%s);' % name) - prnt(' if (o == NULL)') - prnt(' return -1;') - if size_too: - prnt(' {') - prnt(' PyObject *o1 = o;') - prnt(' o = Py_BuildValue("On", o1, (Py_ssize_t)sizeof(%s));' - % (name,)) - prnt(' Py_DECREF(o1);') - prnt(' if (o == NULL)') - prnt(' return -1;') - prnt(' }') - prnt(' res = PyObject_SetAttrString(lib, "%s", o);' % name) - prnt(' Py_DECREF(o);') - prnt(' if (res < 0)') - prnt(' return -1;') - prnt(' return %s;' % self._chained_list_constants[delayed]) - self._chained_list_constants[delayed] = funcname + '(lib)' - prnt('}') - prnt() - - def _generate_cpy_constant_collecttype(self, tp, name): - is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() - if not is_int: - self._do_collect_type(tp) - - def _generate_cpy_constant_decl(self, tp, name): - is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() - self._generate_cpy_const(is_int, name, tp) - - _generate_cpy_constant_method = _generate_nothing - _loading_cpy_constant = _loaded_noop - _loaded_cpy_constant = _loaded_noop - - # ---------- - # enums - - def _check_int_constant_value(self, name, value, err_prefix=''): - prnt = self._prnt - if value <= 0: - prnt(' if ((%s) > 0 || (long)(%s) != %dL) {' % ( - name, name, value)) - else: - prnt(' if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {' % ( - name, name, value)) - prnt(' char buf[64];') - prnt(' if ((%s) <= 0)' % name) - prnt(' snprintf(buf, 63, "%%ld", (long)(%s));' % name) - prnt(' else') - prnt(' snprintf(buf, 63, "%%lu", (unsigned long)(%s));' % - name) - prnt(' PyErr_Format(_cffi_VerificationError,') - prnt(' "%s%s has the real value %s, not %s",') - prnt(' "%s", "%s", buf, "%d");' % ( - err_prefix, name, value)) - prnt(' return -1;') - prnt(' }') - - def _enum_funcname(self, prefix, name): - # "$enum_$1" => "___D_enum____D_1" - name = name.replace('$', '___D_') - return '_cffi_e_%s_%s' % (prefix, name) - - def _generate_cpy_enum_decl(self, tp, name, prefix='enum'): - if tp.partial: - for enumerator in tp.enumerators: - self._generate_cpy_const(True, enumerator, delayed=False) - return - # - funcname = self._enum_funcname(prefix, name) - prnt = self._prnt - prnt('static int %s(PyObject *lib)' % funcname) - prnt('{') - for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): - self._check_int_constant_value(enumerator, enumvalue, - "enum %s: " % name) - prnt(' return %s;' % self._chained_list_constants[True]) - self._chained_list_constants[True] = funcname + '(lib)' - prnt('}') - prnt() - - _generate_cpy_enum_collecttype = _generate_nothing - _generate_cpy_enum_method = _generate_nothing - - def _loading_cpy_enum(self, tp, name, module): - if tp.partial: - enumvalues = [getattr(module, enumerator) - for enumerator in tp.enumerators] - tp.enumvalues = tuple(enumvalues) - tp.partial_resolved = True - - def _loaded_cpy_enum(self, tp, name, module, library): - for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): - setattr(library, enumerator, enumvalue) - - # ---------- - # macros: for now only for integers - - def _generate_cpy_macro_decl(self, tp, name): - if tp == '...': - check_value = None - else: - check_value = tp # an integer - self._generate_cpy_const(True, name, check_value=check_value) - - _generate_cpy_macro_collecttype = _generate_nothing - _generate_cpy_macro_method = _generate_nothing - _loading_cpy_macro = _loaded_noop - _loaded_cpy_macro = _loaded_noop - - # ---------- - # global variables - - def _generate_cpy_variable_collecttype(self, tp, name): - if isinstance(tp, model.ArrayType): - tp_ptr = model.PointerType(tp.item) - else: - tp_ptr = model.PointerType(tp) - self._do_collect_type(tp_ptr) - - def _generate_cpy_variable_decl(self, tp, name): - if isinstance(tp, model.ArrayType): - tp_ptr = model.PointerType(tp.item) - self._generate_cpy_const(False, name, tp, vartp=tp_ptr, - size_too = (tp.length == '...')) - else: - tp_ptr = model.PointerType(tp) - self._generate_cpy_const(False, name, tp_ptr, category='var') - - _generate_cpy_variable_method = _generate_nothing - _loading_cpy_variable = _loaded_noop - - def _loaded_cpy_variable(self, tp, name, module, library): - value = getattr(library, name) - if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the - # sense that "a=..." is forbidden - if tp.length == '...': - assert isinstance(value, tuple) - (value, size) = value - BItemType = self.ffi._get_cached_btype(tp.item) - length, rest = divmod(size, self.ffi.sizeof(BItemType)) - if rest != 0: - raise VerificationError( - "bad size: %r does not seem to be an array of %s" % - (name, tp.item)) - tp = tp.resolve_length(length) - # 'value' is a which we have to replace with - # a if the N is actually known - if tp.length is not None: - BArray = self.ffi._get_cached_btype(tp) - value = self.ffi.cast(BArray, value) - setattr(library, name, value) - return - # remove ptr= from the library instance, and replace - # it by a property on the class, which reads/writes into ptr[0]. - ptr = value - delattr(library, name) - def getter(library): - return ptr[0] - def setter(library, value): - ptr[0] = value - setattr(type(library), name, property(getter, setter)) - type(library)._cffi_dir.append(name) - - # ---------- - - def _generate_setup_custom(self): - prnt = self._prnt - prnt('static int _cffi_setup_custom(PyObject *lib)') - prnt('{') - prnt(' return %s;' % self._chained_list_constants[True]) - prnt('}') - -cffimod_header = r''' -#include -#include - -/* this block of #ifs should be kept exactly identical between - c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py - and cffi/_cffi_include.h */ -#if defined(_MSC_VER) -# include /* for alloca() */ -# if _MSC_VER < 1600 /* MSVC < 2010 */ - typedef __int8 int8_t; - typedef __int16 int16_t; - typedef __int32 int32_t; - typedef __int64 int64_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int64 uint64_t; - typedef __int8 int_least8_t; - typedef __int16 int_least16_t; - typedef __int32 int_least32_t; - typedef __int64 int_least64_t; - typedef unsigned __int8 uint_least8_t; - typedef unsigned __int16 uint_least16_t; - typedef unsigned __int32 uint_least32_t; - typedef unsigned __int64 uint_least64_t; - typedef __int8 int_fast8_t; - typedef __int16 int_fast16_t; - typedef __int32 int_fast32_t; - typedef __int64 int_fast64_t; - typedef unsigned __int8 uint_fast8_t; - typedef unsigned __int16 uint_fast16_t; - typedef unsigned __int32 uint_fast32_t; - typedef unsigned __int64 uint_fast64_t; - typedef __int64 intmax_t; - typedef unsigned __int64 uintmax_t; -# else -# include -# endif -# if _MSC_VER < 1800 /* MSVC < 2013 */ -# ifndef __cplusplus - typedef unsigned char _Bool; -# endif -# endif -#else -# include -# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) -# include -# endif -#endif - -#if PY_MAJOR_VERSION < 3 -# undef PyCapsule_CheckExact -# undef PyCapsule_GetPointer -# define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule)) -# define PyCapsule_GetPointer(capsule, name) \ - (PyCObject_AsVoidPtr(capsule)) -#endif - -#if PY_MAJOR_VERSION >= 3 -# define PyInt_FromLong PyLong_FromLong -#endif - -#define _cffi_from_c_double PyFloat_FromDouble -#define _cffi_from_c_float PyFloat_FromDouble -#define _cffi_from_c_long PyInt_FromLong -#define _cffi_from_c_ulong PyLong_FromUnsignedLong -#define _cffi_from_c_longlong PyLong_FromLongLong -#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong -#define _cffi_from_c__Bool PyBool_FromLong - -#define _cffi_to_c_double PyFloat_AsDouble -#define _cffi_to_c_float PyFloat_AsDouble - -#define _cffi_from_c_int_const(x) \ - (((x) > 0) ? \ - ((unsigned long long)(x) <= (unsigned long long)LONG_MAX) ? \ - PyInt_FromLong((long)(x)) : \ - PyLong_FromUnsignedLongLong((unsigned long long)(x)) : \ - ((long long)(x) >= (long long)LONG_MIN) ? \ - PyInt_FromLong((long)(x)) : \ - PyLong_FromLongLong((long long)(x))) - -#define _cffi_from_c_int(x, type) \ - (((type)-1) > 0 ? /* unsigned */ \ - (sizeof(type) < sizeof(long) ? \ - PyInt_FromLong((long)x) : \ - sizeof(type) == sizeof(long) ? \ - PyLong_FromUnsignedLong((unsigned long)x) : \ - PyLong_FromUnsignedLongLong((unsigned long long)x)) : \ - (sizeof(type) <= sizeof(long) ? \ - PyInt_FromLong((long)x) : \ - PyLong_FromLongLong((long long)x))) - -#define _cffi_to_c_int(o, type) \ - ((type)( \ - sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \ - : (type)_cffi_to_c_i8(o)) : \ - sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \ - : (type)_cffi_to_c_i16(o)) : \ - sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \ - : (type)_cffi_to_c_i32(o)) : \ - sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \ - : (type)_cffi_to_c_i64(o)) : \ - (Py_FatalError("unsupported size for type " #type), (type)0))) - -#define _cffi_to_c_i8 \ - ((int(*)(PyObject *))_cffi_exports[1]) -#define _cffi_to_c_u8 \ - ((int(*)(PyObject *))_cffi_exports[2]) -#define _cffi_to_c_i16 \ - ((int(*)(PyObject *))_cffi_exports[3]) -#define _cffi_to_c_u16 \ - ((int(*)(PyObject *))_cffi_exports[4]) -#define _cffi_to_c_i32 \ - ((int(*)(PyObject *))_cffi_exports[5]) -#define _cffi_to_c_u32 \ - ((unsigned int(*)(PyObject *))_cffi_exports[6]) -#define _cffi_to_c_i64 \ - ((long long(*)(PyObject *))_cffi_exports[7]) -#define _cffi_to_c_u64 \ - ((unsigned long long(*)(PyObject *))_cffi_exports[8]) -#define _cffi_to_c_char \ - ((int(*)(PyObject *))_cffi_exports[9]) -#define _cffi_from_c_pointer \ - ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[10]) -#define _cffi_to_c_pointer \ - ((char *(*)(PyObject *, CTypeDescrObject *))_cffi_exports[11]) -#define _cffi_get_struct_layout \ - ((PyObject *(*)(Py_ssize_t[]))_cffi_exports[12]) -#define _cffi_restore_errno \ - ((void(*)(void))_cffi_exports[13]) -#define _cffi_save_errno \ - ((void(*)(void))_cffi_exports[14]) -#define _cffi_from_c_char \ - ((PyObject *(*)(char))_cffi_exports[15]) -#define _cffi_from_c_deref \ - ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[16]) -#define _cffi_to_c \ - ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[17]) -#define _cffi_from_c_struct \ - ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[18]) -#define _cffi_to_c_wchar_t \ - ((wchar_t(*)(PyObject *))_cffi_exports[19]) -#define _cffi_from_c_wchar_t \ - ((PyObject *(*)(wchar_t))_cffi_exports[20]) -#define _cffi_to_c_long_double \ - ((long double(*)(PyObject *))_cffi_exports[21]) -#define _cffi_to_c__Bool \ - ((_Bool(*)(PyObject *))_cffi_exports[22]) -#define _cffi_prepare_pointer_call_argument \ - ((Py_ssize_t(*)(CTypeDescrObject *, PyObject *, char **))_cffi_exports[23]) -#define _cffi_convert_array_from_object \ - ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[24]) -#define _CFFI_NUM_EXPORTS 25 - -typedef struct _ctypedescr CTypeDescrObject; - -static void *_cffi_exports[_CFFI_NUM_EXPORTS]; -static PyObject *_cffi_types, *_cffi_VerificationError; - -static int _cffi_setup_custom(PyObject *lib); /* forward */ - -static PyObject *_cffi_setup(PyObject *self, PyObject *args) -{ - PyObject *library; - int was_alive = (_cffi_types != NULL); - (void)self; /* unused */ - if (!PyArg_ParseTuple(args, "OOO", &_cffi_types, &_cffi_VerificationError, - &library)) - return NULL; - Py_INCREF(_cffi_types); - Py_INCREF(_cffi_VerificationError); - if (_cffi_setup_custom(library) < 0) - return NULL; - return PyBool_FromLong(was_alive); -} - -static int _cffi_init(void) -{ - PyObject *module, *c_api_object = NULL; - - module = PyImport_ImportModule("_cffi_backend"); - if (module == NULL) - goto failure; - - c_api_object = PyObject_GetAttrString(module, "_C_API"); - if (c_api_object == NULL) - goto failure; - if (!PyCapsule_CheckExact(c_api_object)) { - PyErr_SetNone(PyExc_ImportError); - goto failure; - } - memcpy(_cffi_exports, PyCapsule_GetPointer(c_api_object, "cffi"), - _CFFI_NUM_EXPORTS * sizeof(void *)); - - Py_DECREF(module); - Py_DECREF(c_api_object); - return 0; - - failure: - Py_XDECREF(module); - Py_XDECREF(c_api_object); - return -1; -} - -#define _cffi_type(num) ((CTypeDescrObject *)PyList_GET_ITEM(_cffi_types, num)) - -/**********/ -''' diff --git a/website/web/Lib/site-packages/cffi/vengine_gen.py b/website/web/Lib/site-packages/cffi/vengine_gen.py deleted file mode 100644 index a64ff644f..000000000 --- a/website/web/Lib/site-packages/cffi/vengine_gen.py +++ /dev/null @@ -1,675 +0,0 @@ -# -# DEPRECATED: implementation for ffi.verify() -# -import sys, os -import types - -from . import model -from .error import VerificationError - - -class VGenericEngine(object): - _class_key = 'g' - _gen_python_module = False - - def __init__(self, verifier): - self.verifier = verifier - self.ffi = verifier.ffi - self.export_symbols = [] - self._struct_pending_verification = {} - - def patch_extension_kwds(self, kwds): - # add 'export_symbols' to the dictionary. Note that we add the - # list before filling it. When we fill it, it will thus also show - # up in kwds['export_symbols']. - kwds.setdefault('export_symbols', self.export_symbols) - - def find_module(self, module_name, path, so_suffixes): - for so_suffix in so_suffixes: - basename = module_name + so_suffix - if path is None: - path = sys.path - for dirname in path: - filename = os.path.join(dirname, basename) - if os.path.isfile(filename): - return filename - - def collect_types(self): - pass # not needed in the generic engine - - def _prnt(self, what=''): - self._f.write(what + '\n') - - def write_source_to_f(self): - prnt = self._prnt - # first paste some standard set of lines that are mostly '#include' - prnt(cffimod_header) - # then paste the C source given by the user, verbatim. - prnt(self.verifier.preamble) - # - # call generate_gen_xxx_decl(), for every xxx found from - # ffi._parser._declarations. This generates all the functions. - self._generate('decl') - # - # on Windows, distutils insists on putting init_cffi_xyz in - # 'export_symbols', so instead of fighting it, just give up and - # give it one - if sys.platform == 'win32': - if sys.version_info >= (3,): - prefix = 'PyInit_' - else: - prefix = 'init' - modname = self.verifier.get_module_name() - prnt("void %s%s(void) { }\n" % (prefix, modname)) - - def load_library(self, flags=0): - # import it with the CFFI backend - backend = self.ffi._backend - # needs to make a path that contains '/', on Posix - filename = os.path.join(os.curdir, self.verifier.modulefilename) - module = backend.load_library(filename, flags) - # - # call loading_gen_struct() to get the struct layout inferred by - # the C compiler - self._load(module, 'loading') - - # build the FFILibrary class and instance, this is a module subclass - # because modules are expected to have usually-constant-attributes and - # in PyPy this means the JIT is able to treat attributes as constant, - # which we want. - class FFILibrary(types.ModuleType): - _cffi_generic_module = module - _cffi_ffi = self.ffi - _cffi_dir = [] - def __dir__(self): - return FFILibrary._cffi_dir - library = FFILibrary("") - # - # finally, call the loaded_gen_xxx() functions. This will set - # up the 'library' object. - self._load(module, 'loaded', library=library) - return library - - def _get_declarations(self): - lst = [(key, tp) for (key, (tp, qual)) in - self.ffi._parser._declarations.items()] - lst.sort() - return lst - - def _generate(self, step_name): - for name, tp in self._get_declarations(): - kind, realname = name.split(' ', 1) - try: - method = getattr(self, '_generate_gen_%s_%s' % (kind, - step_name)) - except AttributeError: - raise VerificationError( - "not implemented in verify(): %r" % name) - try: - method(tp, realname) - except Exception as e: - model.attach_exception_info(e, name) - raise - - def _load(self, module, step_name, **kwds): - for name, tp in self._get_declarations(): - kind, realname = name.split(' ', 1) - method = getattr(self, '_%s_gen_%s' % (step_name, kind)) - try: - method(tp, realname, module, **kwds) - except Exception as e: - model.attach_exception_info(e, name) - raise - - def _generate_nothing(self, tp, name): - pass - - def _loaded_noop(self, tp, name, module, **kwds): - pass - - # ---------- - # typedefs: generates no code so far - - _generate_gen_typedef_decl = _generate_nothing - _loading_gen_typedef = _loaded_noop - _loaded_gen_typedef = _loaded_noop - - # ---------- - # function declarations - - def _generate_gen_function_decl(self, tp, name): - assert isinstance(tp, model.FunctionPtrType) - if tp.ellipsis: - # cannot support vararg functions better than this: check for its - # exact type (including the fixed arguments), and build it as a - # constant function pointer (no _cffi_f_%s wrapper) - self._generate_gen_const(False, name, tp) - return - prnt = self._prnt - numargs = len(tp.args) - argnames = [] - for i, type in enumerate(tp.args): - indirection = '' - if isinstance(type, model.StructOrUnion): - indirection = '*' - argnames.append('%sx%d' % (indirection, i)) - context = 'argument of %s' % name - arglist = [type.get_c_name(' %s' % arg, context) - for type, arg in zip(tp.args, argnames)] - tpresult = tp.result - if isinstance(tpresult, model.StructOrUnion): - arglist.insert(0, tpresult.get_c_name(' *r', context)) - tpresult = model.void_type - arglist = ', '.join(arglist) or 'void' - wrappername = '_cffi_f_%s' % name - self.export_symbols.append(wrappername) - if tp.abi: - abi = tp.abi + ' ' - else: - abi = '' - funcdecl = ' %s%s(%s)' % (abi, wrappername, arglist) - context = 'result of %s' % name - prnt(tpresult.get_c_name(funcdecl, context)) - prnt('{') - # - if isinstance(tp.result, model.StructOrUnion): - result_code = '*r = ' - elif not isinstance(tp.result, model.VoidType): - result_code = 'return ' - else: - result_code = '' - prnt(' %s%s(%s);' % (result_code, name, ', '.join(argnames))) - prnt('}') - prnt() - - _loading_gen_function = _loaded_noop - - def _loaded_gen_function(self, tp, name, module, library): - assert isinstance(tp, model.FunctionPtrType) - if tp.ellipsis: - newfunction = self._load_constant(False, tp, name, module) - else: - indirections = [] - base_tp = tp - if (any(isinstance(typ, model.StructOrUnion) for typ in tp.args) - or isinstance(tp.result, model.StructOrUnion)): - indirect_args = [] - for i, typ in enumerate(tp.args): - if isinstance(typ, model.StructOrUnion): - typ = model.PointerType(typ) - indirections.append((i, typ)) - indirect_args.append(typ) - indirect_result = tp.result - if isinstance(indirect_result, model.StructOrUnion): - if indirect_result.fldtypes is None: - raise TypeError("'%s' is used as result type, " - "but is opaque" % ( - indirect_result._get_c_name(),)) - indirect_result = model.PointerType(indirect_result) - indirect_args.insert(0, indirect_result) - indirections.insert(0, ("result", indirect_result)) - indirect_result = model.void_type - tp = model.FunctionPtrType(tuple(indirect_args), - indirect_result, tp.ellipsis) - BFunc = self.ffi._get_cached_btype(tp) - wrappername = '_cffi_f_%s' % name - newfunction = module.load_function(BFunc, wrappername) - for i, typ in indirections: - newfunction = self._make_struct_wrapper(newfunction, i, typ, - base_tp) - setattr(library, name, newfunction) - type(library)._cffi_dir.append(name) - - def _make_struct_wrapper(self, oldfunc, i, tp, base_tp): - backend = self.ffi._backend - BType = self.ffi._get_cached_btype(tp) - if i == "result": - ffi = self.ffi - def newfunc(*args): - res = ffi.new(BType) - oldfunc(res, *args) - return res[0] - else: - def newfunc(*args): - args = args[:i] + (backend.newp(BType, args[i]),) + args[i+1:] - return oldfunc(*args) - newfunc._cffi_base_type = base_tp - return newfunc - - # ---------- - # named structs - - def _generate_gen_struct_decl(self, tp, name): - assert name == tp.name - self._generate_struct_or_union_decl(tp, 'struct', name) - - def _loading_gen_struct(self, tp, name, module): - self._loading_struct_or_union(tp, 'struct', name, module) - - def _loaded_gen_struct(self, tp, name, module, **kwds): - self._loaded_struct_or_union(tp) - - def _generate_gen_union_decl(self, tp, name): - assert name == tp.name - self._generate_struct_or_union_decl(tp, 'union', name) - - def _loading_gen_union(self, tp, name, module): - self._loading_struct_or_union(tp, 'union', name, module) - - def _loaded_gen_union(self, tp, name, module, **kwds): - self._loaded_struct_or_union(tp) - - def _generate_struct_or_union_decl(self, tp, prefix, name): - if tp.fldnames is None: - return # nothing to do with opaque structs - checkfuncname = '_cffi_check_%s_%s' % (prefix, name) - layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) - cname = ('%s %s' % (prefix, name)).strip() - # - prnt = self._prnt - prnt('static void %s(%s *p)' % (checkfuncname, cname)) - prnt('{') - prnt(' /* only to generate compile-time warnings or errors */') - prnt(' (void)p;') - for fname, ftype, fbitsize, fqual in tp.enumfields(): - if (isinstance(ftype, model.PrimitiveType) - and ftype.is_integer_type()) or fbitsize >= 0: - # accept all integers, but complain on float or double - prnt(' (void)((p->%s) << 1);' % fname) - else: - # only accept exactly the type declared. - try: - prnt(' { %s = &p->%s; (void)tmp; }' % ( - ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual), - fname)) - except VerificationError as e: - prnt(' /* %s */' % str(e)) # cannot verify it, ignore - prnt('}') - self.export_symbols.append(layoutfuncname) - prnt('intptr_t %s(intptr_t i)' % (layoutfuncname,)) - prnt('{') - prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname) - prnt(' static intptr_t nums[] = {') - prnt(' sizeof(%s),' % cname) - prnt(' offsetof(struct _cffi_aligncheck, y),') - for fname, ftype, fbitsize, fqual in tp.enumfields(): - if fbitsize >= 0: - continue # xxx ignore fbitsize for now - prnt(' offsetof(%s, %s),' % (cname, fname)) - if isinstance(ftype, model.ArrayType) and ftype.length is None: - prnt(' 0, /* %s */' % ftype._get_c_name()) - else: - prnt(' sizeof(((%s *)0)->%s),' % (cname, fname)) - prnt(' -1') - prnt(' };') - prnt(' return nums[i];') - prnt(' /* the next line is not executed, but compiled */') - prnt(' %s(0);' % (checkfuncname,)) - prnt('}') - prnt() - - def _loading_struct_or_union(self, tp, prefix, name, module): - if tp.fldnames is None: - return # nothing to do with opaque structs - layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) - # - BFunc = self.ffi._typeof_locked("intptr_t(*)(intptr_t)")[0] - function = module.load_function(BFunc, layoutfuncname) - layout = [] - num = 0 - while True: - x = function(num) - if x < 0: break - layout.append(x) - num += 1 - if isinstance(tp, model.StructOrUnion) and tp.partial: - # use the function()'s sizes and offsets to guide the - # layout of the struct - totalsize = layout[0] - totalalignment = layout[1] - fieldofs = layout[2::2] - fieldsize = layout[3::2] - tp.force_flatten() - assert len(fieldofs) == len(fieldsize) == len(tp.fldnames) - tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment - else: - cname = ('%s %s' % (prefix, name)).strip() - self._struct_pending_verification[tp] = layout, cname - - def _loaded_struct_or_union(self, tp): - if tp.fldnames is None: - return # nothing to do with opaque structs - self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered - - if tp in self._struct_pending_verification: - # check that the layout sizes and offsets match the real ones - def check(realvalue, expectedvalue, msg): - if realvalue != expectedvalue: - raise VerificationError( - "%s (we have %d, but C compiler says %d)" - % (msg, expectedvalue, realvalue)) - ffi = self.ffi - BStruct = ffi._get_cached_btype(tp) - layout, cname = self._struct_pending_verification.pop(tp) - check(layout[0], ffi.sizeof(BStruct), "wrong total size") - check(layout[1], ffi.alignof(BStruct), "wrong total alignment") - i = 2 - for fname, ftype, fbitsize, fqual in tp.enumfields(): - if fbitsize >= 0: - continue # xxx ignore fbitsize for now - check(layout[i], ffi.offsetof(BStruct, fname), - "wrong offset for field %r" % (fname,)) - if layout[i+1] != 0: - BField = ffi._get_cached_btype(ftype) - check(layout[i+1], ffi.sizeof(BField), - "wrong size for field %r" % (fname,)) - i += 2 - assert i == len(layout) - - # ---------- - # 'anonymous' declarations. These are produced for anonymous structs - # or unions; the 'name' is obtained by a typedef. - - def _generate_gen_anonymous_decl(self, tp, name): - if isinstance(tp, model.EnumType): - self._generate_gen_enum_decl(tp, name, '') - else: - self._generate_struct_or_union_decl(tp, '', name) - - def _loading_gen_anonymous(self, tp, name, module): - if isinstance(tp, model.EnumType): - self._loading_gen_enum(tp, name, module, '') - else: - self._loading_struct_or_union(tp, '', name, module) - - def _loaded_gen_anonymous(self, tp, name, module, **kwds): - if isinstance(tp, model.EnumType): - self._loaded_gen_enum(tp, name, module, **kwds) - else: - self._loaded_struct_or_union(tp) - - # ---------- - # constants, likely declared with '#define' - - def _generate_gen_const(self, is_int, name, tp=None, category='const', - check_value=None): - prnt = self._prnt - funcname = '_cffi_%s_%s' % (category, name) - self.export_symbols.append(funcname) - if check_value is not None: - assert is_int - assert category == 'const' - prnt('int %s(char *out_error)' % funcname) - prnt('{') - self._check_int_constant_value(name, check_value) - prnt(' return 0;') - prnt('}') - elif is_int: - assert category == 'const' - prnt('int %s(long long *out_value)' % funcname) - prnt('{') - prnt(' *out_value = (long long)(%s);' % (name,)) - prnt(' return (%s) <= 0;' % (name,)) - prnt('}') - else: - assert tp is not None - assert check_value is None - if category == 'var': - ampersand = '&' - else: - ampersand = '' - extra = '' - if category == 'const' and isinstance(tp, model.StructOrUnion): - extra = 'const *' - ampersand = '&' - prnt(tp.get_c_name(' %s%s(void)' % (extra, funcname), name)) - prnt('{') - prnt(' return (%s%s);' % (ampersand, name)) - prnt('}') - prnt() - - def _generate_gen_constant_decl(self, tp, name): - is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() - self._generate_gen_const(is_int, name, tp) - - _loading_gen_constant = _loaded_noop - - def _load_constant(self, is_int, tp, name, module, check_value=None): - funcname = '_cffi_const_%s' % name - if check_value is not None: - assert is_int - self._load_known_int_constant(module, funcname) - value = check_value - elif is_int: - BType = self.ffi._typeof_locked("long long*")[0] - BFunc = self.ffi._typeof_locked("int(*)(long long*)")[0] - function = module.load_function(BFunc, funcname) - p = self.ffi.new(BType) - negative = function(p) - value = int(p[0]) - if value < 0 and not negative: - BLongLong = self.ffi._typeof_locked("long long")[0] - value += (1 << (8*self.ffi.sizeof(BLongLong))) - else: - assert check_value is None - fntypeextra = '(*)(void)' - if isinstance(tp, model.StructOrUnion): - fntypeextra = '*' + fntypeextra - BFunc = self.ffi._typeof_locked(tp.get_c_name(fntypeextra, name))[0] - function = module.load_function(BFunc, funcname) - value = function() - if isinstance(tp, model.StructOrUnion): - value = value[0] - return value - - def _loaded_gen_constant(self, tp, name, module, library): - is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() - value = self._load_constant(is_int, tp, name, module) - setattr(library, name, value) - type(library)._cffi_dir.append(name) - - # ---------- - # enums - - def _check_int_constant_value(self, name, value): - prnt = self._prnt - if value <= 0: - prnt(' if ((%s) > 0 || (long)(%s) != %dL) {' % ( - name, name, value)) - else: - prnt(' if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {' % ( - name, name, value)) - prnt(' char buf[64];') - prnt(' if ((%s) <= 0)' % name) - prnt(' sprintf(buf, "%%ld", (long)(%s));' % name) - prnt(' else') - prnt(' sprintf(buf, "%%lu", (unsigned long)(%s));' % - name) - prnt(' sprintf(out_error, "%s has the real value %s, not %s",') - prnt(' "%s", buf, "%d");' % (name[:100], value)) - prnt(' return -1;') - prnt(' }') - - def _load_known_int_constant(self, module, funcname): - BType = self.ffi._typeof_locked("char[]")[0] - BFunc = self.ffi._typeof_locked("int(*)(char*)")[0] - function = module.load_function(BFunc, funcname) - p = self.ffi.new(BType, 256) - if function(p) < 0: - error = self.ffi.string(p) - if sys.version_info >= (3,): - error = str(error, 'utf-8') - raise VerificationError(error) - - def _enum_funcname(self, prefix, name): - # "$enum_$1" => "___D_enum____D_1" - name = name.replace('$', '___D_') - return '_cffi_e_%s_%s' % (prefix, name) - - def _generate_gen_enum_decl(self, tp, name, prefix='enum'): - if tp.partial: - for enumerator in tp.enumerators: - self._generate_gen_const(True, enumerator) - return - # - funcname = self._enum_funcname(prefix, name) - self.export_symbols.append(funcname) - prnt = self._prnt - prnt('int %s(char *out_error)' % funcname) - prnt('{') - for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): - self._check_int_constant_value(enumerator, enumvalue) - prnt(' return 0;') - prnt('}') - prnt() - - def _loading_gen_enum(self, tp, name, module, prefix='enum'): - if tp.partial: - enumvalues = [self._load_constant(True, tp, enumerator, module) - for enumerator in tp.enumerators] - tp.enumvalues = tuple(enumvalues) - tp.partial_resolved = True - else: - funcname = self._enum_funcname(prefix, name) - self._load_known_int_constant(module, funcname) - - def _loaded_gen_enum(self, tp, name, module, library): - for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): - setattr(library, enumerator, enumvalue) - type(library)._cffi_dir.append(enumerator) - - # ---------- - # macros: for now only for integers - - def _generate_gen_macro_decl(self, tp, name): - if tp == '...': - check_value = None - else: - check_value = tp # an integer - self._generate_gen_const(True, name, check_value=check_value) - - _loading_gen_macro = _loaded_noop - - def _loaded_gen_macro(self, tp, name, module, library): - if tp == '...': - check_value = None - else: - check_value = tp # an integer - value = self._load_constant(True, tp, name, module, - check_value=check_value) - setattr(library, name, value) - type(library)._cffi_dir.append(name) - - # ---------- - # global variables - - def _generate_gen_variable_decl(self, tp, name): - if isinstance(tp, model.ArrayType): - if tp.length == '...': - prnt = self._prnt - funcname = '_cffi_sizeof_%s' % (name,) - self.export_symbols.append(funcname) - prnt("size_t %s(void)" % funcname) - prnt("{") - prnt(" return sizeof(%s);" % (name,)) - prnt("}") - tp_ptr = model.PointerType(tp.item) - self._generate_gen_const(False, name, tp_ptr) - else: - tp_ptr = model.PointerType(tp) - self._generate_gen_const(False, name, tp_ptr, category='var') - - _loading_gen_variable = _loaded_noop - - def _loaded_gen_variable(self, tp, name, module, library): - if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the - # sense that "a=..." is forbidden - if tp.length == '...': - funcname = '_cffi_sizeof_%s' % (name,) - BFunc = self.ffi._typeof_locked('size_t(*)(void)')[0] - function = module.load_function(BFunc, funcname) - size = function() - BItemType = self.ffi._get_cached_btype(tp.item) - length, rest = divmod(size, self.ffi.sizeof(BItemType)) - if rest != 0: - raise VerificationError( - "bad size: %r does not seem to be an array of %s" % - (name, tp.item)) - tp = tp.resolve_length(length) - tp_ptr = model.PointerType(tp.item) - value = self._load_constant(False, tp_ptr, name, module) - # 'value' is a which we have to replace with - # a if the N is actually known - if tp.length is not None: - BArray = self.ffi._get_cached_btype(tp) - value = self.ffi.cast(BArray, value) - setattr(library, name, value) - type(library)._cffi_dir.append(name) - return - # remove ptr= from the library instance, and replace - # it by a property on the class, which reads/writes into ptr[0]. - funcname = '_cffi_var_%s' % name - BFunc = self.ffi._typeof_locked(tp.get_c_name('*(*)(void)', name))[0] - function = module.load_function(BFunc, funcname) - ptr = function() - def getter(library): - return ptr[0] - def setter(library, value): - ptr[0] = value - setattr(type(library), name, property(getter, setter)) - type(library)._cffi_dir.append(name) - -cffimod_header = r''' -#include -#include -#include -#include -#include /* XXX for ssize_t on some platforms */ - -/* this block of #ifs should be kept exactly identical between - c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py - and cffi/_cffi_include.h */ -#if defined(_MSC_VER) -# include /* for alloca() */ -# if _MSC_VER < 1600 /* MSVC < 2010 */ - typedef __int8 int8_t; - typedef __int16 int16_t; - typedef __int32 int32_t; - typedef __int64 int64_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int64 uint64_t; - typedef __int8 int_least8_t; - typedef __int16 int_least16_t; - typedef __int32 int_least32_t; - typedef __int64 int_least64_t; - typedef unsigned __int8 uint_least8_t; - typedef unsigned __int16 uint_least16_t; - typedef unsigned __int32 uint_least32_t; - typedef unsigned __int64 uint_least64_t; - typedef __int8 int_fast8_t; - typedef __int16 int_fast16_t; - typedef __int32 int_fast32_t; - typedef __int64 int_fast64_t; - typedef unsigned __int8 uint_fast8_t; - typedef unsigned __int16 uint_fast16_t; - typedef unsigned __int32 uint_fast32_t; - typedef unsigned __int64 uint_fast64_t; - typedef __int64 intmax_t; - typedef unsigned __int64 uintmax_t; -# else -# include -# endif -# if _MSC_VER < 1800 /* MSVC < 2013 */ -# ifndef __cplusplus - typedef unsigned char _Bool; -# endif -# endif -#else -# include -# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) -# include -# endif -#endif -''' diff --git a/website/web/Lib/site-packages/cffi/verifier.py b/website/web/Lib/site-packages/cffi/verifier.py deleted file mode 100644 index 59b78c216..000000000 --- a/website/web/Lib/site-packages/cffi/verifier.py +++ /dev/null @@ -1,306 +0,0 @@ -# -# DEPRECATED: implementation for ffi.verify() -# -import sys, os, binascii, shutil, io -from . import __version_verifier_modules__ -from . import ffiplatform -from .error import VerificationError - -if sys.version_info >= (3, 3): - import importlib.machinery - def _extension_suffixes(): - return importlib.machinery.EXTENSION_SUFFIXES[:] -else: - import imp - def _extension_suffixes(): - return [suffix for suffix, _, type in imp.get_suffixes() - if type == imp.C_EXTENSION] - - -if sys.version_info >= (3,): - NativeIO = io.StringIO -else: - class NativeIO(io.BytesIO): - def write(self, s): - if isinstance(s, unicode): - s = s.encode('ascii') - super(NativeIO, self).write(s) - - -class Verifier(object): - - def __init__(self, ffi, preamble, tmpdir=None, modulename=None, - ext_package=None, tag='', force_generic_engine=False, - source_extension='.c', flags=None, relative_to=None, **kwds): - if ffi._parser._uses_new_feature: - raise VerificationError( - "feature not supported with ffi.verify(), but only " - "with ffi.set_source(): %s" % (ffi._parser._uses_new_feature,)) - self.ffi = ffi - self.preamble = preamble - if not modulename: - flattened_kwds = ffiplatform.flatten(kwds) - vengine_class = _locate_engine_class(ffi, force_generic_engine) - self._vengine = vengine_class(self) - self._vengine.patch_extension_kwds(kwds) - self.flags = flags - self.kwds = self.make_relative_to(kwds, relative_to) - # - if modulename: - if tag: - raise TypeError("can't specify both 'modulename' and 'tag'") - else: - key = '\x00'.join([sys.version[:3], __version_verifier_modules__, - preamble, flattened_kwds] + - ffi._cdefsources) - if sys.version_info >= (3,): - key = key.encode('utf-8') - k1 = hex(binascii.crc32(key[0::2]) & 0xffffffff) - k1 = k1.lstrip('0x').rstrip('L') - k2 = hex(binascii.crc32(key[1::2]) & 0xffffffff) - k2 = k2.lstrip('0').rstrip('L') - modulename = '_cffi_%s_%s%s%s' % (tag, self._vengine._class_key, - k1, k2) - suffix = _get_so_suffixes()[0] - self.tmpdir = tmpdir or _caller_dir_pycache() - self.sourcefilename = os.path.join(self.tmpdir, modulename + source_extension) - self.modulefilename = os.path.join(self.tmpdir, modulename + suffix) - self.ext_package = ext_package - self._has_source = False - self._has_module = False - - def write_source(self, file=None): - """Write the C source code. It is produced in 'self.sourcefilename', - which can be tweaked beforehand.""" - with self.ffi._lock: - if self._has_source and file is None: - raise VerificationError( - "source code already written") - self._write_source(file) - - def compile_module(self): - """Write the C source code (if not done already) and compile it. - This produces a dynamic link library in 'self.modulefilename'.""" - with self.ffi._lock: - if self._has_module: - raise VerificationError("module already compiled") - if not self._has_source: - self._write_source() - self._compile_module() - - def load_library(self): - """Get a C module from this Verifier instance. - Returns an instance of a FFILibrary class that behaves like the - objects returned by ffi.dlopen(), but that delegates all - operations to the C module. If necessary, the C code is written - and compiled first. - """ - with self.ffi._lock: - if not self._has_module: - self._locate_module() - if not self._has_module: - if not self._has_source: - self._write_source() - self._compile_module() - return self._load_library() - - def get_module_name(self): - basename = os.path.basename(self.modulefilename) - # kill both the .so extension and the other .'s, as introduced - # by Python 3: 'basename.cpython-33m.so' - basename = basename.split('.', 1)[0] - # and the _d added in Python 2 debug builds --- but try to be - # conservative and not kill a legitimate _d - if basename.endswith('_d') and hasattr(sys, 'gettotalrefcount'): - basename = basename[:-2] - return basename - - def get_extension(self): - ffiplatform._hack_at_distutils() # backward compatibility hack - if not self._has_source: - with self.ffi._lock: - if not self._has_source: - self._write_source() - sourcename = ffiplatform.maybe_relative_path(self.sourcefilename) - modname = self.get_module_name() - return ffiplatform.get_extension(sourcename, modname, **self.kwds) - - def generates_python_module(self): - return self._vengine._gen_python_module - - def make_relative_to(self, kwds, relative_to): - if relative_to and os.path.dirname(relative_to): - dirname = os.path.dirname(relative_to) - kwds = kwds.copy() - for key in ffiplatform.LIST_OF_FILE_NAMES: - if key in kwds: - lst = kwds[key] - if not isinstance(lst, (list, tuple)): - raise TypeError("keyword '%s' should be a list or tuple" - % (key,)) - lst = [os.path.join(dirname, fn) for fn in lst] - kwds[key] = lst - return kwds - - # ---------- - - def _locate_module(self): - if not os.path.isfile(self.modulefilename): - if self.ext_package: - try: - pkg = __import__(self.ext_package, None, None, ['__doc__']) - except ImportError: - return # cannot import the package itself, give up - # (e.g. it might be called differently before installation) - path = pkg.__path__ - else: - path = None - filename = self._vengine.find_module(self.get_module_name(), path, - _get_so_suffixes()) - if filename is None: - return - self.modulefilename = filename - self._vengine.collect_types() - self._has_module = True - - def _write_source_to(self, file): - self._vengine._f = file - try: - self._vengine.write_source_to_f() - finally: - del self._vengine._f - - def _write_source(self, file=None): - if file is not None: - self._write_source_to(file) - else: - # Write our source file to an in memory file. - f = NativeIO() - self._write_source_to(f) - source_data = f.getvalue() - - # Determine if this matches the current file - if os.path.exists(self.sourcefilename): - with open(self.sourcefilename, "r") as fp: - needs_written = not (fp.read() == source_data) - else: - needs_written = True - - # Actually write the file out if it doesn't match - if needs_written: - _ensure_dir(self.sourcefilename) - with open(self.sourcefilename, "w") as fp: - fp.write(source_data) - - # Set this flag - self._has_source = True - - def _compile_module(self): - # compile this C source - tmpdir = os.path.dirname(self.sourcefilename) - outputfilename = ffiplatform.compile(tmpdir, self.get_extension()) - try: - same = ffiplatform.samefile(outputfilename, self.modulefilename) - except OSError: - same = False - if not same: - _ensure_dir(self.modulefilename) - shutil.move(outputfilename, self.modulefilename) - self._has_module = True - - def _load_library(self): - assert self._has_module - if self.flags is not None: - return self._vengine.load_library(self.flags) - else: - return self._vengine.load_library() - -# ____________________________________________________________ - -_FORCE_GENERIC_ENGINE = False # for tests - -def _locate_engine_class(ffi, force_generic_engine): - if _FORCE_GENERIC_ENGINE: - force_generic_engine = True - if not force_generic_engine: - if '__pypy__' in sys.builtin_module_names: - force_generic_engine = True - else: - try: - import _cffi_backend - except ImportError: - _cffi_backend = '?' - if ffi._backend is not _cffi_backend: - force_generic_engine = True - if force_generic_engine: - from . import vengine_gen - return vengine_gen.VGenericEngine - else: - from . import vengine_cpy - return vengine_cpy.VCPythonEngine - -# ____________________________________________________________ - -_TMPDIR = None - -def _caller_dir_pycache(): - if _TMPDIR: - return _TMPDIR - result = os.environ.get('CFFI_TMPDIR') - if result: - return result - filename = sys._getframe(2).f_code.co_filename - return os.path.abspath(os.path.join(os.path.dirname(filename), - '__pycache__')) - -def set_tmpdir(dirname): - """Set the temporary directory to use instead of __pycache__.""" - global _TMPDIR - _TMPDIR = dirname - -def cleanup_tmpdir(tmpdir=None, keep_so=False): - """Clean up the temporary directory by removing all files in it - called `_cffi_*.{c,so}` as well as the `build` subdirectory.""" - tmpdir = tmpdir or _caller_dir_pycache() - try: - filelist = os.listdir(tmpdir) - except OSError: - return - if keep_so: - suffix = '.c' # only remove .c files - else: - suffix = _get_so_suffixes()[0].lower() - for fn in filelist: - if fn.lower().startswith('_cffi_') and ( - fn.lower().endswith(suffix) or fn.lower().endswith('.c')): - try: - os.unlink(os.path.join(tmpdir, fn)) - except OSError: - pass - clean_dir = [os.path.join(tmpdir, 'build')] - for dir in clean_dir: - try: - for fn in os.listdir(dir): - fn = os.path.join(dir, fn) - if os.path.isdir(fn): - clean_dir.append(fn) - else: - os.unlink(fn) - except OSError: - pass - -def _get_so_suffixes(): - suffixes = _extension_suffixes() - if not suffixes: - # bah, no C_EXTENSION available. Occurs on pypy without cpyext - if sys.platform == 'win32': - suffixes = [".pyd"] - else: - suffixes = [".so"] - - return suffixes - -def _ensure_dir(filename): - dirname = os.path.dirname(filename) - if dirname and not os.path.isdir(dirname): - os.makedirs(dirname) diff --git a/website/web/Lib/site-packages/click-6.7.dist-info/DESCRIPTION.rst b/website/web/Lib/site-packages/click-6.7.dist-info/DESCRIPTION.rst deleted file mode 100644 index e1187231a..000000000 --- a/website/web/Lib/site-packages/click-6.7.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,3 +0,0 @@ -UNKNOWN - - diff --git a/website/web/Lib/site-packages/click-6.7.dist-info/INSTALLER b/website/web/Lib/site-packages/click-6.7.dist-info/INSTALLER deleted file mode 100644 index a1b589e38..000000000 --- a/website/web/Lib/site-packages/click-6.7.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/website/web/Lib/site-packages/click-6.7.dist-info/METADATA b/website/web/Lib/site-packages/click-6.7.dist-info/METADATA deleted file mode 100644 index 1f108853b..000000000 --- a/website/web/Lib/site-packages/click-6.7.dist-info/METADATA +++ /dev/null @@ -1,16 +0,0 @@ -Metadata-Version: 2.0 -Name: click -Version: 6.7 -Summary: A simple wrapper around optparse for powerful command line utilities. -Home-page: http://github.com/mitsuhiko/click -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -License: UNKNOWN -Platform: UNKNOWN -Classifier: License :: OSI Approved :: BSD License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 - -UNKNOWN - - diff --git a/website/web/Lib/site-packages/click-6.7.dist-info/RECORD b/website/web/Lib/site-packages/click-6.7.dist-info/RECORD deleted file mode 100644 index 017e58d38..000000000 --- a/website/web/Lib/site-packages/click-6.7.dist-info/RECORD +++ /dev/null @@ -1,41 +0,0 @@ -click/__init__.py,sha256=k8R00cFKWI8dhDVKQeLBlAdNh1CxerMEDRiGnr32gdw,2858 -click/_bashcomplete.py,sha256=82rMiibtEurdwBq60NHXVCBuGXJHDpblFO9o2YxJDF0,2423 -click/_compat.py,sha256=j59MpzxYGE-fTGj0A5sg8UI8GhHod1XMojiCA0jvbL0,21011 -click/_termui_impl.py,sha256=Ol1JJhvBRw3l8j1WIU0tOWjQtxxmwGE44lFDbzDqzoA,16395 -click/_textwrap.py,sha256=gwS4m7bdQiJnzaDG8osFcRb-5vn4t4l2qSCy-5csCEc,1198 -click/_unicodefun.py,sha256=A3UOzJw6lEZyol2SBg3fNXgweTutaOzkJ61OB7vik3Y,4204 -click/_winconsole.py,sha256=MzG46DEYPoRyx4SO7EIhFuFZHESgooAfJLIukbB6p5c,7790 -click/core.py,sha256=M0nJ6Kkye7XZXYG7HCbkJWSfy14WHV6bQmGLACrOhKw,70254 -click/decorators.py,sha256=y7CX2needh8iRWafj-QS_hGQFsN24eyXAhx5Y2ATwas,10941 -click/exceptions.py,sha256=rOa0pP3PbSy0_AAPOW9irBEM8AJ3BySN-4z2VUwFVo4,6788 -click/formatting.py,sha256=eh-cypTUAhpI3HD-K4ZpR3vCiURIO62xXvKkR3tNUTM,8889 -click/globals.py,sha256=PAgnKvGxq4YuEIldw3lgYOGBLYwsyxnm1IByBX3BFXo,1515 -click/parser.py,sha256=i01xgYuIA6AwQWEXjshwHSwnTR3gUep4FxJIfyW4ta4,15510 -click/termui.py,sha256=Bp99MSWQtyoWe1_7HggDmA77n--3KLxu7NsZMFMaCUo,21008 -click/testing.py,sha256=kJ9mjtJgwNAlkgKcFf9-ISxufmaPDbbuOHVC9WIvKdY,11002 -click/types.py,sha256=ZGb2lmFs5Vwd9loTRIMbGcqhPVOql8mGoBhWBRT6V4E,18864 -click/utils.py,sha256=1jalPlkUU28JReTEQeeSFtbJd-SirYWBNfjtELBKzT4,14916 -click-6.7.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 -click-6.7.dist-info/METADATA,sha256=l6lAyogIUXiHKUK_rWguef-EMcvO5C6bXzFCNCcblbQ,424 -click-6.7.dist-info/RECORD,, -click-6.7.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 -click-6.7.dist-info/metadata.json,sha256=qg0uO6amNHkIkOxnmWX7Xa_DNQMQ62Q6drivuP9Gh1c,571 -click-6.7.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 -click-6.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -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/__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__/__init__.cpython-36.pyc,, diff --git a/website/web/Lib/site-packages/click-6.7.dist-info/WHEEL b/website/web/Lib/site-packages/click-6.7.dist-info/WHEEL deleted file mode 100644 index 7bf9daa1a..000000000 --- a/website/web/Lib/site-packages/click-6.7.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.30.0.a0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/website/web/Lib/site-packages/click-6.7.dist-info/metadata.json b/website/web/Lib/site-packages/click-6.7.dist-info/metadata.json deleted file mode 100644 index 0a4cfb189..000000000 --- a/website/web/Lib/site-packages/click-6.7.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 3"], "extensions": {"python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://github.com/mitsuhiko/click"}}}, "generator": "bdist_wheel (0.30.0.a0)", "metadata_version": "2.0", "name": "click", "summary": "A simple wrapper around optparse for powerful command line utilities.", "version": "6.7"} \ No newline at end of file diff --git a/website/web/Lib/site-packages/click-6.7.dist-info/top_level.txt b/website/web/Lib/site-packages/click-6.7.dist-info/top_level.txt deleted file mode 100644 index dca9a9096..000000000 --- a/website/web/Lib/site-packages/click-6.7.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -click diff --git a/website/web/Lib/site-packages/click/__init__.py b/website/web/Lib/site-packages/click/__init__.py deleted file mode 100644 index 971e55d0a..000000000 --- a/website/web/Lib/site-packages/click/__init__.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding: utf-8 -*- -""" - click - ~~~~~ - - Click is a simple Python module that wraps the stdlib's 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. - - In case optparse ever gets removed from the stdlib, it will be shipped by - this module. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE 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, \ - STRING, INT, FLOAT, BOOL, UUID, UNPROCESSED - -# 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', 'STRING', - 'INT', 'FLOAT', 'BOOL', 'UUID', 'UNPROCESSED', - - # 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__ = '6.7' diff --git a/website/web/Lib/site-packages/click/_bashcomplete.py b/website/web/Lib/site-packages/click/_bashcomplete.py deleted file mode 100644 index d9d26d28b..000000000 --- a/website/web/Lib/site-packages/click/_bashcomplete.py +++ /dev/null @@ -1,83 +0,0 @@ -import os -import re -from .utils import echo -from .parser import split_arg_string -from .core import MultiCommand, Option - - -COMPLETION_SCRIPT = ''' -%(complete_func)s() { - COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \\ - COMP_CWORD=$COMP_CWORD \\ - %(autocomplete_var)s=complete $1 ) ) - return 0 -} - -complete -F %(complete_func)s -o default %(script_names)s -''' - -_invalid_ident_char_re = re.compile(r'[^a-zA-Z0-9_]') - - -def get_completion_script(prog_name, complete_var): - cf_name = _invalid_ident_char_re.sub('', prog_name.replace('-', '_')) - return (COMPLETION_SCRIPT % { - 'complete_func': '_%s_completion' % cf_name, - 'script_names': prog_name, - 'autocomplete_var': complete_var, - }).strip() + ';' - - -def resolve_ctx(cli, prog_name, args): - ctx = cli.make_context(prog_name, args, resilient_parsing=True) - while ctx.protected_args + ctx.args and isinstance(ctx.command, MultiCommand): - a = ctx.protected_args + ctx.args - cmd = ctx.command.get_command(ctx, a[0]) - if cmd is None: - return None - ctx = cmd.make_context(a[0], a[1:], parent=ctx, resilient_parsing=True) - return ctx - - -def get_choices(cli, prog_name, args, incomplete): - ctx = resolve_ctx(cli, prog_name, args) - if ctx is None: - return - - choices = [] - if incomplete and not incomplete[:1].isalnum(): - for param in ctx.command.params: - if not isinstance(param, Option): - continue - choices.extend(param.opts) - choices.extend(param.secondary_opts) - elif isinstance(ctx.command, MultiCommand): - choices.extend(ctx.command.list_commands(ctx)) - - for item in choices: - if item.startswith(incomplete): - yield item - - -def do_complete(cli, prog_name): - 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) - - return True - - -def bashcomplete(cli, prog_name, complete_var, complete_instr): - if complete_instr == 'source': - echo(get_completion_script(prog_name, complete_var)) - return True - elif complete_instr == 'complete': - return do_complete(cli, prog_name) - return False diff --git a/website/web/Lib/site-packages/click/_compat.py b/website/web/Lib/site-packages/click/_compat.py deleted file mode 100644 index 2b43412c4..000000000 --- a/website/web/Lib/site-packages/click/_compat.py +++ /dev/null @@ -1,648 +0,0 @@ -import re -import io -import os -import sys -import codecs -from weakref import WeakKeyDictionary - - -PY2 = sys.version_info[0] == 2 -WIN = sys.platform.startswith('win') -DEFAULT_COLUMNS = 80 - - -_ansi_re = re.compile('\033\[((?:\d|;)*)([a-zA-Z])') - - -def get_filesystem_encoding(): - return sys.getfilesystemencoding() or sys.getdefaultencoding() - - -def _make_text_stream(stream, encoding, errors): - if encoding is None: - encoding = get_best_encoding(stream) - if errors is None: - errors = 'replace' - return _NonClosingTextIOWrapper(stream, encoding, errors, - line_buffering=True) - - -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, **extra): - self._stream = stream = _FixupStream(stream) - 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. - """ - - def __init__(self, stream): - self._stream = stream - - 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): - 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): - 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) - 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. - try: - import msvcrt - except ImportError: - set_binary_mode = lambda x: x - else: - def set_binary_mode(f): - try: - fileno = f.fileno() - except Exception: - pass - else: - msvcrt.setmode(fileno, os.O_BINARY) - 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(): - return set_binary_mode(sys.stdout) - - def get_binary_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) - - 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 _make_text_stream(sys.stdout, encoding, errors) - - 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 _make_text_stream(sys.stderr, encoding, errors) - - 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,) - 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): - 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) - - def _force_correct_text_writer(text_writer, encoding, errors): - 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) - - 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) - - 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) - - 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) - - 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 'w' in mode: - 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, 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 - - 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 - - -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: - 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/website/web/Lib/site-packages/click/_termui_impl.py b/website/web/Lib/site-packages/click/_termui_impl.py deleted file mode 100644 index 7cfd3d5c4..000000000 --- a/website/web/Lib/site-packages/click/_termui_impl.py +++ /dev/null @@ -1,547 +0,0 @@ -""" - 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: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import os -import sys -import time -import math -from ._compat import _default_text_stdout, range_type, PY2, isatty, \ - open_stream, strip_ansi, term_len, get_best_encoding, WIN -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, long)) 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 - - 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 - - def render_finish(self): - if self.is_hidden: - 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 = self.eta + 1 - 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_progress_line(self): - show_percent = self.show_percent - - info_bits = [] - 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) - if show_percent is None: - show_percent = not self.show_pos - else: - if 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) - - 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': bar, - 'info': self.info_sep.join(info_bits) - }).rstrip() - - def render_progress(self): - from .termui import get_terminal_size - nl = False - - if self.is_hidden: - buf = [self.label] - nl = True - else: - 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: - self._last_line = line - echo(line, file=self.file, color=self.color, nl=nl) - 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 = self.avg[-6:] + [-(self.start - time.time()) / (self.pos)] - - 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 next(self): - if self.is_hidden: - return next(self.iter) - try: - rv = next(self.iter) - self.current_item = rv - except StopIteration: - self.finish() - self.render_progress() - raise StopIteration() - else: - self.update(1) - return rv - - if not PY2: - __next__ = next - del next - - -def pager(text, 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, text, color) - pager_cmd = (os.environ.get('PAGER', None) or '').strip() - if pager_cmd: - if WIN: - return _tempfilepager(text, pager_cmd, color) - return _pipepager(text, pager_cmd, color) - if os.environ.get('TERM') in ('dumb', 'emacs'): - return _nullpager(stdout, text, color) - if WIN or sys.platform.startswith('os2'): - return _tempfilepager(text, 'more <', color) - if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0: - return _pipepager(text, '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(text, 'more', color) - return _nullpager(stdout, text, color) - finally: - os.unlink(filename) - - -def _pipepager(text, 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 - - if not color: - text = strip_ansi(text) - - c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, - env=env) - encoding = get_best_encoding(c.stdin) - try: - c.stdin.write(text.encode(encoding, 'replace')) - c.stdin.close() - except (IOError, KeyboardInterrupt): - pass - - # 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(text, cmd, color): - """Page through text by invoking a program on a temporary file.""" - import tempfile - filename = tempfile.mktemp() - 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, text, color): - """Simply print unformatted text. This is the ultimate fallback.""" - 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) - - 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 == '\x03': - raise KeyboardInterrupt() - if ch == '\x04': - raise EOFError() - - -if WIN: - import msvcrt - - def getchar(echo): - rv = msvcrt.getch() - if echo: - msvcrt.putchar(rv) - _translate_ch_to_exc(rv) - if PY2: - enc = getattr(sys.stdin, 'encoding', None) - if enc is not None: - rv = rv.decode(enc, 'replace') - else: - rv = rv.decode('cp1252', 'replace') - return rv -else: - import tty - import termios - - def getchar(echo): - 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) - ch = os.read(fd, 32) - if echo and isatty(sys.stdout): - sys.stdout.write(ch) - finally: - termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) - sys.stdout.flush() - if f is not None: - f.close() - except termios.error: - pass - _translate_ch_to_exc(ch) - return ch.decode(get_best_encoding(sys.stdin), 'replace') diff --git a/website/web/Lib/site-packages/click/_textwrap.py b/website/web/Lib/site-packages/click/_textwrap.py deleted file mode 100644 index 7e776031e..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/click/_unicodefun.py b/website/web/Lib/site-packages/click/_unicodefun.py deleted file mode 100644 index 9e17a384e..000000000 --- a/website/web/Lib/site-packages/click/_unicodefun.py +++ /dev/null @@ -1,118 +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__ - 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 ' - 'http://click.pocoo.org/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 - rv = subprocess.Popen(['locale', '-a'], stdout=subprocess.PIPE, - stderr=subprocess.PIPE).communicate()[0] - 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 where\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 http://click.pocoo.org/python3/' - 'for mitigation steps.' + extra) diff --git a/website/web/Lib/site-packages/click/_winconsole.py b/website/web/Lib/site-packages/click/_winconsole.py deleted file mode 100644 index 9aed94216..000000000 --- a/website/web/Lib/site-packages/click/_winconsole.py +++ /dev/null @@ -1,273 +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 click._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, - ) - - -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( - _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( - _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') - 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/website/web/Lib/site-packages/click/core.py b/website/web/Lib/site-packages/click/core.py deleted file mode 100644 index 745645147..000000000 --- a/website/web/Lib/site-packages/click/core.py +++ /dev/null @@ -1,1744 +0,0 @@ -import errno -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 make_str, make_default_short_help, echo, get_os_args -from .exceptions import ClickException, UsageError, BadParameter, Abort, \ - MissingParameter -from .termui import prompt, confirm -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 -from ._unicodefun import _check_for_unicode_literals, _verify_python3_env - - -_missing = object() - - -SUBCOMMAND_METAVAR = 'COMMAND [ARGS]...' -SUBCOMMANDS_METAVAR = 'COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...' - - -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): - sys.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"). This restriction was supposed to ' - 'be lifted in 6.0 but the fix was flawed. This ' - 'will be fixed in Click 7.0' % ( - 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. 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. - 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: - self.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 utiltiies 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.""" - sys.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 of 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 - 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.exit(1) - else: - raise - 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. - """ - - 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): - 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 [] - self.help = help - self.epilog = epilog - self.options_metavar = options_metavar - if short_help is None and help: - short_help = make_default_short_help(help) - self.short_help = short_help - self.add_help_option = add_help_option - - 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) - parser.allow_interspersed_args = ctx.allow_interspersed_args - parser.ignore_unknown_options = ctx.ignore_unknown_options - 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 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(): - formatter.write_text(self.help) - - 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. - """ - 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. - """ - rows = [] - 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 - - help = cmd.short_help or '' - 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: - 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): - """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): - 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 - - @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 = ctx.lookup_default(self.name) - if value is None: - value = self.value_from_envvar(ctx) - 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: - 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 [] - - -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. - :param prompt: if set to `True` or a non empty string then the user will - be prompted for input if not set. 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_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, **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 - - # 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 - - # 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])) - name = possible_names[-1][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): - 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.default is not None and self.show_default: - extra.append('default: %s' % ( - ', '.join('%s' % d for d in self.default) - if isinstance(self.default, (list, tuple)) - else self.default, )) - 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, - hide_input=self.hide_input, - 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.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() - elif len(decls) == 2: - name, arg = decls - else: - raise TypeError('Arguments take exactly one or two ' - 'parameter declarations, got %d' % len(decls)) - return name, [arg], [] - - def get_usage_pieces(self, ctx): - return [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/website/web/Lib/site-packages/click/decorators.py b/website/web/Lib/site-packages/click/decorators.py deleted file mode 100644 index 989345265..000000000 --- a/website/web/Lib/site-packages/click/decorators.py +++ /dev/null @@ -1,304 +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[1:], **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(), - callback=f, params=params, **attrs) - - -def command(name=None, cls=None, **attrs): - """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. - :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): - if 'help' in attrs: - attrs['help'] = inspect.cleandoc(attrs['help']) - OptionClass = attrs.pop('cls', Option) - _param_memo(f, OptionClass(param_decls, **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: - module = sys._getframe(1).f_globals.get('__name__') - 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/website/web/Lib/site-packages/click/exceptions.py b/website/web/Lib/site-packages/click/exceptions.py deleted file mode 100644 index 74a4542bb..000000000 --- a/website/web/Lib/site-packages/click/exceptions.py +++ /dev/null @@ -1,201 +0,0 @@ -from ._compat import PY2, filename_to_ui, get_text_stderr -from .utils import echo - - -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): - if PY2: - if message is not None: - message = message.encode('utf-8') - Exception.__init__(self, message) - self.message = message - - def format_message(self): - return self.message - - 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 - - def show(self, file=None): - if file is None: - file = get_text_stderr() - color = None - if self.ctx is not None: - color = self.ctx.color - echo(self.ctx.get_usage() + '\n', 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.opts or [self.param.human_readable_name] - else: - return 'Invalid value: %s' % self.message - if isinstance(param_hint, (tuple, list)): - param_hint = ' / '.join('"%s"' % x for x in 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.opts or [self.param.human_readable_name] - else: - param_hint = None - if isinstance(param_hint, (tuple, list)): - param_hint = ' / '.join('"%s"' % x for x in 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 - """ - - def __init__(self, message, ctx=None): - UsageError.__init__(self, message, ctx) - - -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.""" diff --git a/website/web/Lib/site-packages/click/formatting.py b/website/web/Lib/site-packages/click/formatting.py deleted file mode 100644 index a3d6a4d38..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/click/globals.py b/website/web/Lib/site-packages/click/globals.py deleted file mode 100644 index 14338e6bb..000000000 --- a/website/web/Lib/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 it's 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/website/web/Lib/site-packages/click/parser.py b/website/web/Lib/site-packages/click/parser.py deleted file mode 100644 index 9775c9ff9..000000000 --- a/website/web/Lib/site-packages/click/parser.py +++ /dev/null @@ -1,426 +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('%s option requires an argument' % opt) - raise BadOptionUsage('%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) - - 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('%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) - 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/website/web/Lib/site-packages/click/termui.py b/website/web/Lib/site-packages/click/termui.py deleted file mode 100644 index d9fba5232..000000000 --- a/website/web/Lib/site-packages/click/termui.py +++ /dev/null @@ -1,539 +0,0 @@ -import os -import sys -import struct - -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 -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', 'red', 'green', 'yellow', 'blue', 'magenta', - 'cyan', 'white', 'reset') -_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): - prompt = text - 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): - """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:: 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. - """ - 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) - - while 1: - while 1: - value = prompt_func(prompt) - if value: - break - # If a default is set and used, then the confirmation - # prompt is always skipped because that's the only thing - # that really makes sense. - elif default is not None: - 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 - - if get_winterm_size is not None: - return get_winterm_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, 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: 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 not isinstance(text, string_types): - text = text_type(text) - from ._termui_impl import pager - return pager(text + '\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) - * ``reset`` (reset the color code only) - - .. versionadded:: 2.0 - - :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.index(fg) + 30)) - except ValueError: - raise TypeError('Unknown color %r' % fg) - if bg: - try: - bits.append('\033[%dm' % (_ansi_colors.index(bg) + 40)) - except ValueError: - 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(text, 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 - """ - return echo(style(text, **styles), 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('http://click.pocoo.org/') - 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. - - .. 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 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/website/web/Lib/site-packages/click/testing.py b/website/web/Lib/site-packages/click/testing.py deleted file mode 100644 index 4416c7741..000000000 --- a/website/web/Lib/site-packages/click/testing.py +++ /dev/null @@ -1,322 +0,0 @@ -import os -import sys -import shutil -import tempfile -import contextlib - -from ._compat import iteritems, 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. -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, output_bytes, exit_code, exception, - exc_info=None): - #: The runner that created the result - self.runner = runner - #: The output as bytes. - self.output_bytes = output_bytes - #: The exit code as integer. - self.exit_code = exit_code - #: The exception that happend if one did. - self.exception = exception - #: The traceback - self.exc_info = exc_info - - @property - def output(self): - """The output as unicode string.""" - return self.output_bytes.decode(self.runner.charset, 'replace') \ - .replace('\r\n', '\n') - - def __repr__(self): - return '' % ( - 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. - """ - - def __init__(self, charset=None, env=None, echo_stdin=False): - if charset is None: - charset = 'utf-8' - self.charset = charset - self.env = env or {} - self.echo_stdin = echo_stdin - - 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: - sys.stdout = sys.stderr = bytes_output = StringIO() - if self.echo_stdin: - input = EchoingStdin(input, bytes_output) - else: - bytes_output = io.BytesIO() - if self.echo_stdin: - input = EchoingStdin(input, bytes_output) - input = io.TextIOWrapper(input, encoding=self.charset) - sys.stdout = sys.stderr = io.TextIOWrapper( - bytes_output, encoding=self.charset) - - 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 - 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, **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 - :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 out: - exception = None - exit_code = 0 - - try: - cli.main(args=args or (), - prog_name=self.get_default_prog_name(cli), **extra) - except SystemExit as e: - if e.code != 0: - exception = e - - exc_info = sys.exc_info() - - exit_code = e.code - 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() - output = out.getvalue() - - return Result(runner=self, - output_bytes=output, - 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/website/web/Lib/site-packages/click/types.py b/website/web/Lib/site-packages/click/types.py deleted file mode 100644 index 36390026d..000000000 --- a/website/web/Lib/site-packages/click/types.py +++ /dev/null @@ -1,550 +0,0 @@ -import os -import stat - -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. - - See :ref:`choice-opts` for an example. - """ - name = 'choice' - - def __init__(self, choices): - self.choices = choices - - def get_metavar(self, param): - return '[%s]' % '|'.join(self.choices) - - def get_missing_message(self, param): - return 'Choose from %s.' % ', '.join(self.choices) - - def convert(self, value, param, ctx): - # Exact match - if value in self.choices: - return value - - # Match through normalization - if ctx is not None and \ - ctx.token_normalize_func is not None: - value = ctx.token_normalize_func(value) - for choice in self.choices: - if ctx.token_normalize_func(choice) == value: - return choice - - self.fail('invalid choice: %s. (choose from %s)' % - (value, ', '.join(self.choices)), param, ctx) - - def __repr__(self): - return 'Choice(%r)' % list(self.choices) - - -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 BoolParamType(ParamType): - name = 'boolean' - - def convert(self, value, param, ctx): - if isinstance(value, bool): - return bool(value) - value = value.lower() - if value in ('true', '1', 'yes', 'y'): - return True - elif value in ('false', '0', 'no', 'n'): - return False - self.fail('%s is not a valid boolean' % value, param, ctx) - - def __repr__(self): - return 'BOOL' - - -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 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. - - 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. - :param allow_dash: If this is set to `True`, a single dash to indicate - standard streams is permitted. - :param 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' - if 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/website/web/Lib/site-packages/click/utils.py b/website/web/Lib/site-packages/click/utils.py deleted file mode 100644 index eee626d3f..000000000 --- a/website/web/Lib/site-packages/click/utils.py +++ /dev/null @@ -1,415 +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): - 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 as 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: http://pypi.python.org/pypi/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)) diff --git a/website/web/Lib/site-packages/easy_install.py b/website/web/Lib/site-packages/easy_install.py deleted file mode 100644 index d87e98403..000000000 --- a/website/web/Lib/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/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/PKG-INFO b/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/PKG-INFO deleted file mode 100644 index 3893027ae..000000000 --- a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/PKG-INFO +++ /dev/null @@ -1,102 +0,0 @@ -Metadata-Version: 1.1 -Name: emoji -Version: 0.4.5 -Summary: Emoji for Python -Home-page: https://github.com/carpedm20/emoji/ -Author: Taehoon Kim and Kevin Wurster -Author-email: carpedm20@gmail.com and wursterk@gmail.com -License: New BSD -Description: Emoji - ===== - - Emoji for Python. This project was inspired by `kyokomi `__. - - - Example - ------- - - The entire set of Emoji codes as defined by the `unicode consortium `__ - is supported in addition to a bunch of `aliases `__. By - default only the official list is enabled but doing ``emoji.emojize(use_aliases=True)`` enables - both the full list and aliases. - - .. code-block:: python - - >> import emoji - >> print(emoji.emojize('Python is :thumbs_up_sign:')) - Python is 👍 - >> print(emoji.emojize('Python is :thumbsup:', use_aliases=True)) - Python is 👍 - - - Installation - ------------ - - Via pip: - - .. code-block:: console - - $ pip install emoji --upgrade - - From master branch: - - .. code-block:: console - - $ git clone https://github.com/carpedm20/emoji.git - $ cd emoji - $ python setup.py install - - - Developing - ---------- - - .. code-block:: console - - $ git clone https://github.com/carpedm20/emoji.git - $ cd emoji - $ pip install -e .\[dev\] - $ nosetests - - The ``utils/get-codes-from-unicode-consortium.py`` may help when updating - ``unicode_codes.py`` but is not guaranteed to work. Generally speaking it - scrapes a table on the Unicode Consortium's website with - `BeautifulSoup `_ and prints the - contents to ``stdout`` in a more useful format. - - - Link - ---- - - `Emoji Cheat Sheet `__ - - `Official unicode list `__ - - - Authors - ------- - - Taehoon Kim / `@carpedm20 `__ - - Kevin Wurster / `@geowurster `__ -Keywords: emoji -Platform: UNKNOWN -Classifier: Development Status :: 4 - Beta -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Information Technology -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -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.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Multimedia :: Graphics :: Presentation -Classifier: Topic :: Software Development :: Libraries :: Python Modules diff --git a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/SOURCES.txt b/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/SOURCES.txt deleted file mode 100644 index 75c89c4a2..000000000 --- a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/SOURCES.txt +++ /dev/null @@ -1,18 +0,0 @@ -CHANGES.md -LICENSE.txt -MANIFEST.in -README.rst -setup.cfg -setup.py -emoji/__init__.py -emoji/core.py -emoji/unicode_codes.py -emoji.egg-info/PKG-INFO -emoji.egg-info/SOURCES.txt -emoji.egg-info/dependency_links.txt -emoji.egg-info/requires.txt -emoji.egg-info/top_level.txt -emoji.egg-info/zip-safe -tests/__init__.py -tests/test_core.py -tests/test_unicode_codes.py \ No newline at end of file diff --git a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/dependency_links.txt b/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/dependency_links.txt deleted file mode 100644 index 8b1378917..000000000 --- a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/installed-files.txt b/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/installed-files.txt deleted file mode 100644 index 09a795385..000000000 --- a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/installed-files.txt +++ /dev/null @@ -1,12 +0,0 @@ -..\emoji\core.py -..\emoji\unicode_codes.py -..\emoji\__init__.py -..\emoji\__pycache__\core.cpython-36.pyc -..\emoji\__pycache__\unicode_codes.cpython-36.pyc -..\emoji\__pycache__\__init__.cpython-36.pyc -dependency_links.txt -PKG-INFO -requires.txt -SOURCES.txt -top_level.txt -zip-safe diff --git a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/requires.txt b/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/requires.txt deleted file mode 100644 index 93e2a63b9..000000000 --- a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/requires.txt +++ /dev/null @@ -1,5 +0,0 @@ - -[dev] -nose -coverage -coveralls diff --git a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/top_level.txt b/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/top_level.txt deleted file mode 100644 index 3a917a9c5..000000000 --- a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -emoji diff --git a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/zip-safe b/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/zip-safe deleted file mode 100644 index 8b1378917..000000000 --- a/website/web/Lib/site-packages/emoji-0.4.5-py3.6.egg-info/zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/website/web/Lib/site-packages/emoji/__init__.py b/website/web/Lib/site-packages/emoji/__init__.py deleted file mode 100644 index 1bf6a8c3f..000000000 --- a/website/web/Lib/site-packages/emoji/__init__.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: UTF-8 -*- - - -""" -emoji for Python -~~~~~~~~~~~~~~~~ - -emoji terminal output for Python. - - >>> import emoji - >>> print(emoji.emojize('Python is :thumbsup:', use_aliases=True)) - Python is 👍 - >> print(emoji.emojize('Python is :thumbs_up_sign:')) - Python is 👍 -""" - - -from emoji.core import emojize -from emoji.core import demojize -from emoji.core import get_emoji_regexp -from emoji.unicode_codes import EMOJI_ALIAS_UNICODE -from emoji.unicode_codes import EMOJI_UNICODE -from emoji.unicode_codes import UNICODE_EMOJI -from emoji.unicode_codes import UNICODE_EMOJI_ALIAS - - -__version__ = '0.4.5' -__author__ = 'Taehoon Kim and Kevin Wurster' -__email__ = 'carpedm20@gmail.com and wursterk@gmail.com' -__source__ = 'https://github.com/carpedm20/emoji/' -__license__ = ''' -New BSD License - -Copyright (c) 2014-2015, Taehoon Kim and Kevin Wurster -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. - -* The names of its 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 HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -''' diff --git a/website/web/Lib/site-packages/emoji/core.py b/website/web/Lib/site-packages/emoji/core.py deleted file mode 100644 index 28cd12058..000000000 --- a/website/web/Lib/site-packages/emoji/core.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: UTF-8 -*- - - -""" -emoji.core -~~~~~~~~~~ - -Core components for emoji. - -""" - - -import re -import sys - -from emoji import unicode_codes - - -__all__ = ['emojize', 'demojize', 'get_emoji_regexp'] - - -PY2 = sys.version_info[0] is 2 - -_EMOJI_REGEXP = None -_DEFAULT_DELIMITER = ":" - -def emojize(string, use_aliases=False, delimiters=(_DEFAULT_DELIMITER,_DEFAULT_DELIMITER)): - - """Replace emoji names in a string with unicode codes. - - :param string: String contains emoji names. - :param use_aliases: (optional) Enable emoji aliases. See ``emoji.UNICODE_EMOJI_ALIAS``. - :param delimiters: (optional) Use delimiters other than _DEFAULT_DELIMITER - >>> import emoji - >>> print(emoji.emojize("Python is fun :thumbsup:", use_aliases=True)) - Python is fun 👍 - >>> print(emoji.emojize("Python is fun :thumbs_up_sign:")) - Python is fun 👍 - >>> print(emoji.emojize("Python is fun __thumbs_up_sign__", delimiters = ("__", "__"))) - Python is fun 👍 - """ - - pattern = re.compile(u'(%s[a-zA-Z0-9\+\-_&.ô’Åéãíç()!#*]+%s)' % delimiters) - - def replace(match): - mg = match.group(1).replace(delimiters[0], _DEFAULT_DELIMITER).replace(delimiters[1], _DEFAULT_DELIMITER) - if use_aliases: - return unicode_codes.EMOJI_ALIAS_UNICODE.get(mg, mg) - else: - return unicode_codes.EMOJI_UNICODE.get(mg, mg) - - return pattern.sub(replace, string) - - -def demojize(string, delimiters=(_DEFAULT_DELIMITER,_DEFAULT_DELIMITER)): - - """Replace unicode emoji in a string with emoji shortcodes. Useful for storage. - - :param string: String contains unicode characters. MUST BE UNICODE. - :param delimiters: (optional) User delimiters other than _DEFAULT_DELIMITER - >>> import emoji - >>> print(emoji.emojize("Python is fun :thumbs_up_sign:")) - Python is fun 👍 - >>> print(emoji.demojize(u"Python is fun 👍")) - Python is fun :thumbs_up_sign: - >>> print(emoji.demojize("Unicode is tricky 😯".decode('utf-8'))) - Unicode is tricky :hushed_face: - >>> print(emoji.demojize("Unicode is tricky 😯".decode('utf-8'), delimiters=(" __", "__ "))) - Unicode is tricky :hushed_face: - """ - - def replace(match): - val = unicode_codes.UNICODE_EMOJI.get(match.group(0), match.group(0)) - return delimiters[0] + val[1:-1] + delimiters[1] - - return get_emoji_regexp().sub(replace, string) - - -def get_emoji_regexp(): - - """Returns compiled regular expression that matches emojis defined in - ``emoji.UNICODE_EMOJI_ALIAS``. The regular expression is only compiled once. - """ - - global _EMOJI_REGEXP - # Build emoji regexp once - if _EMOJI_REGEXP is None: - # Sort emojis by length to make sure mulit-character emojis are - # matched first - emojis = sorted(unicode_codes.EMOJI_UNICODE.values(), key=len, - reverse=True) - pattern = u'(' + u'|'.join(re.escape(u) for u in emojis) + u')' - _EMOJI_REGEXP = re.compile(pattern) - return _EMOJI_REGEXP diff --git a/website/web/Lib/site-packages/emoji/unicode_codes.py b/website/web/Lib/site-packages/emoji/unicode_codes.py deleted file mode 100644 index 37c941d26..000000000 --- a/website/web/Lib/site-packages/emoji/unicode_codes.py +++ /dev/null @@ -1,3711 +0,0 @@ -# -*- coding: UTF-8 -*- - - -""" -Data literal storing emoji names and unicode codes -""" - - -__all__ = ['EMOJI_UNICODE', 'UNICODE_EMOJI', 'EMOJI_ALIAS_UNICODE', 'UNICODE_EMOJI_ALIAS'] - - -EMOJI_UNICODE = { - u':1st_place_medal:': u'\U0001F947', - u':2nd_place_medal:': u'\U0001F948', - u':3rd_place_medal:': u'\U0001F949', - u':AB_button_(blood_type):': u'\U0001F18E', - u':ATM_sign:': u'\U0001F3E7', - u':A_button_(blood_type):': u'\U0001F170', - u':Afghanistan:': u'\U0001F1E6 \U0001F1EB', - u':Albania:': u'\U0001F1E6 \U0001F1F1', - u':Algeria:': u'\U0001F1E9 \U0001F1FF', - u':American_Samoa:': u'\U0001F1E6 \U0001F1F8', - u':Andorra:': u'\U0001F1E6 \U0001F1E9', - u':Angola:': u'\U0001F1E6 \U0001F1F4', - u':Anguilla:': u'\U0001F1E6 \U0001F1EE', - u':Antarctica:': u'\U0001F1E6 \U0001F1F6', - u':Antigua_&_Barbuda:': u'\U0001F1E6 \U0001F1EC', - u':Aquarius:': u'\U00002652', - u':Argentina:': u'\U0001F1E6 \U0001F1F7', - u':Aries:': u'\U00002648', - u':Armenia:': u'\U0001F1E6 \U0001F1F2', - u':Aruba:': u'\U0001F1E6 \U0001F1FC', - u':Ascension_Island:': u'\U0001F1E6 \U0001F1E8', - u':Australia:': u'\U0001F1E6 \U0001F1FA', - u':Austria:': u'\U0001F1E6 \U0001F1F9', - u':Azerbaijan:': u'\U0001F1E6 \U0001F1FF', - u':BACK_arrow:': u'\U0001F519', - u':B_button_(blood_type):': u'\U0001F171', - u':Bahamas:': u'\U0001F1E7 \U0001F1F8', - u':Bahrain:': u'\U0001F1E7 \U0001F1ED', - u':Bangladesh:': u'\U0001F1E7 \U0001F1E9', - u':Barbados:': u'\U0001F1E7 \U0001F1E7', - u':Belarus:': u'\U0001F1E7 \U0001F1FE', - u':Belgium:': u'\U0001F1E7 \U0001F1EA', - u':Belize:': u'\U0001F1E7 \U0001F1FF', - u':Benin:': u'\U0001F1E7 \U0001F1EF', - u':Bermuda:': u'\U0001F1E7 \U0001F1F2', - u':Bhutan:': u'\U0001F1E7 \U0001F1F9', - u':Bolivia:': u'\U0001F1E7 \U0001F1F4', - u':Bosnia_&_Herzegovina:': u'\U0001F1E7 \U0001F1E6', - u':Botswana:': u'\U0001F1E7 \U0001F1FC', - u':Bouvet_Island:': u'\U0001F1E7 \U0001F1FB', - u':Brazil:': u'\U0001F1E7 \U0001F1F7', - u':British_Indian_Ocean_Territory:': u'\U0001F1EE \U0001F1F4', - u':British_Virgin_Islands:': u'\U0001F1FB \U0001F1EC', - u':Brunei:': u'\U0001F1E7 \U0001F1F3', - u':Bulgaria:': u'\U0001F1E7 \U0001F1EC', - u':Burkina_Faso:': u'\U0001F1E7 \U0001F1EB', - u':Burundi:': u'\U0001F1E7 \U0001F1EE', - u':CL_button:': u'\U0001F191', - u':COOL_button:': u'\U0001F192', - u':Cambodia:': u'\U0001F1F0 \U0001F1ED', - u':Cameroon:': u'\U0001F1E8 \U0001F1F2', - u':Canada:': u'\U0001F1E8 \U0001F1E6', - u':Canary_Islands:': u'\U0001F1EE \U0001F1E8', - u':Cancer:': u'\U0000264B', - u':Cape_Verde:': u'\U0001F1E8 \U0001F1FB', - u':Capricorn:': u'\U00002651', - u':Caribbean_Netherlands:': u'\U0001F1E7 \U0001F1F6', - u':Cayman_Islands:': u'\U0001F1F0 \U0001F1FE', - u':Central_African_Republic:': u'\U0001F1E8 \U0001F1EB', - u':Ceuta_&_Melilla:': u'\U0001F1EA \U0001F1E6', - u':Chad:': u'\U0001F1F9 \U0001F1E9', - u':Chile:': u'\U0001F1E8 \U0001F1F1', - u':China:': u'\U0001F1E8 \U0001F1F3', - u':Christmas_Island:': u'\U0001F1E8 \U0001F1FD', - u':Christmas_tree:': u'\U0001F384', - u':Clipperton_Island:': u'\U0001F1E8 \U0001F1F5', - u':Cocos_(Keeling)_Islands:': u'\U0001F1E8 \U0001F1E8', - u':Colombia:': u'\U0001F1E8 \U0001F1F4', - u':Comoros:': u'\U0001F1F0 \U0001F1F2', - u':Congo_-_Brazzaville:': u'\U0001F1E8 \U0001F1EC', - u':Congo_-_Kinshasa:': u'\U0001F1E8 \U0001F1E9', - u':Cook_Islands:': u'\U0001F1E8 \U0001F1F0', - u':Costa_Rica:': u'\U0001F1E8 \U0001F1F7', - u':Croatia:': u'\U0001F1ED \U0001F1F7', - u':Cuba:': u'\U0001F1E8 \U0001F1FA', - u':Curaçao:': u'\U0001F1E8 \U0001F1FC', - u':Cyprus:': u'\U0001F1E8 \U0001F1FE', - u':Czech_Republic:': u'\U0001F1E8 \U0001F1FF', - u':Côte_d’Ivoire:': u'\U0001F1E8 \U0001F1EE', - u':Denmark:': u'\U0001F1E9 \U0001F1F0', - u':Diego_Garcia:': u'\U0001F1E9 \U0001F1EC', - u':Djibouti:': u'\U0001F1E9 \U0001F1EF', - u':Dominica:': u'\U0001F1E9 \U0001F1F2', - u':Dominican_Republic:': u'\U0001F1E9 \U0001F1F4', - u':END_arrow:': u'\U0001F51A', - u':Ecuador:': u'\U0001F1EA \U0001F1E8', - u':Egypt:': u'\U0001F1EA \U0001F1EC', - u':El_Salvador:': u'\U0001F1F8 \U0001F1FB', - u':Equatorial_Guinea:': u'\U0001F1EC \U0001F1F6', - u':Eritrea:': u'\U0001F1EA \U0001F1F7', - u':Estonia:': u'\U0001F1EA \U0001F1EA', - u':Ethiopia:': u'\U0001F1EA \U0001F1F9', - u':European_Union:': u'\U0001F1EA \U0001F1FA', - u':FREE_button:': u'\U0001F193', - u':Falkland_Islands:': u'\U0001F1EB \U0001F1F0', - u':Faroe_Islands:': u'\U0001F1EB \U0001F1F4', - u':Fiji:': u'\U0001F1EB \U0001F1EF', - u':Finland:': u'\U0001F1EB \U0001F1EE', - u':France:': u'\U0001F1EB \U0001F1F7', - u':French_Guiana:': u'\U0001F1EC \U0001F1EB', - u':French_Polynesia:': u'\U0001F1F5 \U0001F1EB', - u':French_Southern_Territories:': u'\U0001F1F9 \U0001F1EB', - u':Gabon:': u'\U0001F1EC \U0001F1E6', - u':Gambia:': u'\U0001F1EC \U0001F1F2', - u':Gemini:': u'\U0000264A', - u':Georgia:': u'\U0001F1EC \U0001F1EA', - u':Germany:': u'\U0001F1E9 \U0001F1EA', - u':Ghana:': u'\U0001F1EC \U0001F1ED', - u':Gibraltar:': u'\U0001F1EC \U0001F1EE', - u':Greece:': u'\U0001F1EC \U0001F1F7', - u':Greenland:': u'\U0001F1EC \U0001F1F1', - u':Grenada:': u'\U0001F1EC \U0001F1E9', - u':Guadeloupe:': u'\U0001F1EC \U0001F1F5', - u':Guam:': u'\U0001F1EC \U0001F1FA', - u':Guatemala:': u'\U0001F1EC \U0001F1F9', - u':Guernsey:': u'\U0001F1EC \U0001F1EC', - u':Guinea:': u'\U0001F1EC \U0001F1F3', - u':Guinea-Bissau:': u'\U0001F1EC \U0001F1FC', - u':Guyana:': u'\U0001F1EC \U0001F1FE', - u':Haiti:': u'\U0001F1ED \U0001F1F9', - u':Heard_&_McDonald_Islands:': u'\U0001F1ED \U0001F1F2', - u':Honduras:': u'\U0001F1ED \U0001F1F3', - u':Hong_Kong_SAR_China:': u'\U0001F1ED \U0001F1F0', - u':Hungary:': u'\U0001F1ED \U0001F1FA', - u':ID_button:': u'\U0001F194', - u':Iceland:': u'\U0001F1EE \U0001F1F8', - u':India:': u'\U0001F1EE \U0001F1F3', - u':Indonesia:': u'\U0001F1EE \U0001F1E9', - u':Iran:': u'\U0001F1EE \U0001F1F7', - u':Iraq:': u'\U0001F1EE \U0001F1F6', - u':Ireland:': u'\U0001F1EE \U0001F1EA', - u':Isle_of_Man:': u'\U0001F1EE \U0001F1F2', - u':Israel:': u'\U0001F1EE \U0001F1F1', - u':Italy:': u'\U0001F1EE \U0001F1F9', - u':Jamaica:': u'\U0001F1EF \U0001F1F2', - u':Japan:': u'\U0001F1EF \U0001F1F5', - u':Japanese_acceptable_button:': u'\U0001F251', - u':Japanese_application_button:': u'\U0001F238', - u':Japanese_bargain_button:': u'\U0001F250', - u':Japanese_castle:': u'\U0001F3EF', - u':Japanese_congratulations_button:': u'\U00003297', - u':Japanese_discount_button:': u'\U0001F239', - u':Japanese_dolls:': u'\U0001F38E', - u':Japanese_free_of_charge_button:': u'\U0001F21A', - u':Japanese_here_button:': u'\U0001F201', - u':Japanese_monthly_amount_button:': u'\U0001F237', - u':Japanese_no_vacancy_button:': u'\U0001F235', - u':Japanese_not_free_of_charge_button:': u'\U0001F236', - u':Japanese_open_for_business_button:': u'\U0001F23A', - u':Japanese_passing_grade_button:': u'\U0001F234', - u':Japanese_post_office:': u'\U0001F3E3', - u':Japanese_prohibited_button:': u'\U0001F232', - u':Japanese_reserved_button:': u'\U0001F22F', - u':Japanese_secret_button:': u'\U00003299', - u':Japanese_service_charge_button:': u'\U0001F202', - u':Japanese_symbol_for_beginner:': u'\U0001F530', - u':Japanese_vacancy_button:': u'\U0001F233', - u':Jersey:': u'\U0001F1EF \U0001F1EA', - u':Jordan:': u'\U0001F1EF \U0001F1F4', - u':Kazakhstan:': u'\U0001F1F0 \U0001F1FF', - u':Kenya:': u'\U0001F1F0 \U0001F1EA', - u':Kiribati:': u'\U0001F1F0 \U0001F1EE', - u':Kosovo:': u'\U0001F1FD \U0001F1F0', - u':Kuwait:': u'\U0001F1F0 \U0001F1FC', - u':Kyrgyzstan:': u'\U0001F1F0 \U0001F1EC', - u':Laos:': u'\U0001F1F1 \U0001F1E6', - u':Latvia:': u'\U0001F1F1 \U0001F1FB', - u':Lebanon:': u'\U0001F1F1 \U0001F1E7', - u':Leo:': u'\U0000264C', - u':Lesotho:': u'\U0001F1F1 \U0001F1F8', - u':Liberia:': u'\U0001F1F1 \U0001F1F7', - u':Libra:': u'\U0000264E', - u':Libya:': u'\U0001F1F1 \U0001F1FE', - u':Liechtenstein:': u'\U0001F1F1 \U0001F1EE', - u':Lithuania:': u'\U0001F1F1 \U0001F1F9', - u':Luxembourg:': u'\U0001F1F1 \U0001F1FA', - u':Macau_SAR_China:': u'\U0001F1F2 \U0001F1F4', - u':Macedonia:': u'\U0001F1F2 \U0001F1F0', - u':Madagascar:': u'\U0001F1F2 \U0001F1EC', - u':Malawi:': u'\U0001F1F2 \U0001F1FC', - u':Malaysia:': u'\U0001F1F2 \U0001F1FE', - u':Maldives:': u'\U0001F1F2 \U0001F1FB', - u':Mali:': u'\U0001F1F2 \U0001F1F1', - u':Malta:': u'\U0001F1F2 \U0001F1F9', - u':Marshall_Islands:': u'\U0001F1F2 \U0001F1ED', - u':Martinique:': u'\U0001F1F2 \U0001F1F6', - u':Mauritania:': u'\U0001F1F2 \U0001F1F7', - u':Mauritius:': u'\U0001F1F2 \U0001F1FA', - u':Mayotte:': u'\U0001F1FE \U0001F1F9', - u':Mexico:': u'\U0001F1F2 \U0001F1FD', - u':Micronesia:': u'\U0001F1EB \U0001F1F2', - u':Moldova:': u'\U0001F1F2 \U0001F1E9', - u':Monaco:': u'\U0001F1F2 \U0001F1E8', - u':Mongolia:': u'\U0001F1F2 \U0001F1F3', - u':Montenegro:': u'\U0001F1F2 \U0001F1EA', - u':Montserrat:': u'\U0001F1F2 \U0001F1F8', - u':Morocco:': u'\U0001F1F2 \U0001F1E6', - u':Mozambique:': u'\U0001F1F2 \U0001F1FF', - u':Mrs._Claus:': u'\U0001F936', - u':Mrs._Claus_dark_skin_tone:': u'\U0001F936 \U0001F3FF', - u':Mrs._Claus_light_skin_tone:': u'\U0001F936 \U0001F3FB', - u':Mrs._Claus_medium-dark_skin_tone:': u'\U0001F936 \U0001F3FE', - u':Mrs._Claus_medium-light_skin_tone:': u'\U0001F936 \U0001F3FC', - u':Mrs._Claus_medium_skin_tone:': u'\U0001F936 \U0001F3FD', - u':Myanmar_(Burma):': u'\U0001F1F2 \U0001F1F2', - u':NEW_button:': u'\U0001F195', - u':NG_button:': u'\U0001F196', - u':Namibia:': u'\U0001F1F3 \U0001F1E6', - u':Nauru:': u'\U0001F1F3 \U0001F1F7', - u':Nepal:': u'\U0001F1F3 \U0001F1F5', - u':Netherlands:': u'\U0001F1F3 \U0001F1F1', - u':New_Caledonia:': u'\U0001F1F3 \U0001F1E8', - u':New_Zealand:': u'\U0001F1F3 \U0001F1FF', - u':Nicaragua:': u'\U0001F1F3 \U0001F1EE', - u':Niger:': u'\U0001F1F3 \U0001F1EA', - u':Nigeria:': u'\U0001F1F3 \U0001F1EC', - u':Niue:': u'\U0001F1F3 \U0001F1FA', - u':Norfolk_Island:': u'\U0001F1F3 \U0001F1EB', - u':North_Korea:': u'\U0001F1F0 \U0001F1F5', - u':Northern_Mariana_Islands:': u'\U0001F1F2 \U0001F1F5', - u':Norway:': u'\U0001F1F3 \U0001F1F4', - u':OK_button:': u'\U0001F197', - u':OK_hand:': u'\U0001F44C', - u':OK_hand_dark_skin_tone:': u'\U0001F44C \U0001F3FF', - u':OK_hand_light_skin_tone:': u'\U0001F44C \U0001F3FB', - u':OK_hand_medium-dark_skin_tone:': u'\U0001F44C \U0001F3FE', - u':OK_hand_medium-light_skin_tone:': u'\U0001F44C \U0001F3FC', - u':OK_hand_medium_skin_tone:': u'\U0001F44C \U0001F3FD', - u':ON!_arrow:': u'\U0001F51B', - u':O_button_(blood_type):': u'\U0001F17E', - u':Oman:': u'\U0001F1F4 \U0001F1F2', - u':Ophiuchus:': u'\U000026CE', - u':P_button:': u'\U0001F17F', - u':Pakistan:': u'\U0001F1F5 \U0001F1F0', - u':Palau:': u'\U0001F1F5 \U0001F1FC', - u':Palestinian_Territories:': u'\U0001F1F5 \U0001F1F8', - u':Panama:': u'\U0001F1F5 \U0001F1E6', - u':Papua_New_Guinea:': u'\U0001F1F5 \U0001F1EC', - u':Paraguay:': u'\U0001F1F5 \U0001F1FE', - u':Peru:': u'\U0001F1F5 \U0001F1EA', - u':Philippines:': u'\U0001F1F5 \U0001F1ED', - u':Pisces:': u'\U00002653', - u':Pitcairn_Islands:': u'\U0001F1F5 \U0001F1F3', - u':Poland:': u'\U0001F1F5 \U0001F1F1', - u':Portugal:': u'\U0001F1F5 \U0001F1F9', - u':Puerto_Rico:': u'\U0001F1F5 \U0001F1F7', - u':Qatar:': u'\U0001F1F6 \U0001F1E6', - u':Romania:': u'\U0001F1F7 \U0001F1F4', - u':Russia:': u'\U0001F1F7 \U0001F1FA', - u':Rwanda:': u'\U0001F1F7 \U0001F1FC', - u':Réunion:': u'\U0001F1F7 \U0001F1EA', - u':SOON_arrow:': u'\U0001F51C', - u':SOS_button:': u'\U0001F198', - u':Sagittarius:': u'\U00002650', - u':Samoa:': u'\U0001F1FC \U0001F1F8', - u':San_Marino:': u'\U0001F1F8 \U0001F1F2', - u':Santa_Claus:': u'\U0001F385', - u':Santa_Claus_dark_skin_tone:': u'\U0001F385 \U0001F3FF', - u':Santa_Claus_light_skin_tone:': u'\U0001F385 \U0001F3FB', - u':Santa_Claus_medium-dark_skin_tone:': u'\U0001F385 \U0001F3FE', - u':Santa_Claus_medium-light_skin_tone:': u'\U0001F385 \U0001F3FC', - u':Santa_Claus_medium_skin_tone:': u'\U0001F385 \U0001F3FD', - u':Saudi_Arabia:': u'\U0001F1F8 \U0001F1E6', - u':Scorpius:': u'\U0000264F', - u':Senegal:': u'\U0001F1F8 \U0001F1F3', - u':Serbia:': u'\U0001F1F7 \U0001F1F8', - u':Seychelles:': u'\U0001F1F8 \U0001F1E8', - u':Sierra_Leone:': u'\U0001F1F8 \U0001F1F1', - u':Singapore:': u'\U0001F1F8 \U0001F1EC', - u':Sint_Maarten:': u'\U0001F1F8 \U0001F1FD', - u':Slovakia:': u'\U0001F1F8 \U0001F1F0', - u':Slovenia:': u'\U0001F1F8 \U0001F1EE', - u':Solomon_Islands:': u'\U0001F1F8 \U0001F1E7', - u':Somalia:': u'\U0001F1F8 \U0001F1F4', - u':South_Africa:': u'\U0001F1FF \U0001F1E6', - u':South_Georgia_&_South_Sandwich_Islands:': u'\U0001F1EC \U0001F1F8', - u':South_Korea:': u'\U0001F1F0 \U0001F1F7', - u':South_Sudan:': u'\U0001F1F8 \U0001F1F8', - u':Spain:': u'\U0001F1EA \U0001F1F8', - u':Sri_Lanka:': u'\U0001F1F1 \U0001F1F0', - u':St._Barthélemy:': u'\U0001F1E7 \U0001F1F1', - u':St._Helena:': u'\U0001F1F8 \U0001F1ED', - u':St._Kitts_&_Nevis:': u'\U0001F1F0 \U0001F1F3', - u':St._Lucia:': u'\U0001F1F1 \U0001F1E8', - u':St._Martin:': u'\U0001F1F2 \U0001F1EB', - u':St._Pierre_&_Miquelon:': u'\U0001F1F5 \U0001F1F2', - u':St._Vincent_&_Grenadines:': u'\U0001F1FB \U0001F1E8', - u':Statue_of_Liberty:': u'\U0001F5FD', - u':Sudan:': u'\U0001F1F8 \U0001F1E9', - u':Suriname:': u'\U0001F1F8 \U0001F1F7', - u':Svalbard_&_Jan_Mayen:': u'\U0001F1F8 \U0001F1EF', - u':Swaziland:': u'\U0001F1F8 \U0001F1FF', - u':Sweden:': u'\U0001F1F8 \U0001F1EA', - u':Switzerland:': u'\U0001F1E8 \U0001F1ED', - u':Syria:': u'\U0001F1F8 \U0001F1FE', - u':São_Tomé_&_Príncipe:': u'\U0001F1F8 \U0001F1F9', - u':TOP_arrow:': u'\U0001F51D', - u':Taiwan:': u'\U0001F1F9 \U0001F1FC', - u':Tajikistan:': u'\U0001F1F9 \U0001F1EF', - u':Tanzania:': u'\U0001F1F9 \U0001F1FF', - u':Taurus:': u'\U00002649', - u':Thailand:': u'\U0001F1F9 \U0001F1ED', - u':Timor-Leste:': u'\U0001F1F9 \U0001F1F1', - u':Togo:': u'\U0001F1F9 \U0001F1EC', - u':Tokelau:': u'\U0001F1F9 \U0001F1F0', - u':Tokyo_tower:': u'\U0001F5FC', - u':Tonga:': u'\U0001F1F9 \U0001F1F4', - u':Trinidad_&_Tobago:': u'\U0001F1F9 \U0001F1F9', - u':Tristan_da_Cunha:': u'\U0001F1F9 \U0001F1E6', - u':Tunisia:': u'\U0001F1F9 \U0001F1F3', - u':Turkey:': u'\U0001F1F9 \U0001F1F7', - u':Turkmenistan:': u'\U0001F1F9 \U0001F1F2', - u':Turks_&_Caicos_Islands:': u'\U0001F1F9 \U0001F1E8', - u':Tuvalu:': u'\U0001F1F9 \U0001F1FB', - u':U.S._Outlying_Islands:': u'\U0001F1FA \U0001F1F2', - u':U.S._Virgin_Islands:': u'\U0001F1FB \U0001F1EE', - u':UP!_button:': u'\U0001F199', - u':Uganda:': u'\U0001F1FA \U0001F1EC', - u':Ukraine:': u'\U0001F1FA \U0001F1E6', - u':United_Arab_Emirates:': u'\U0001F1E6 \U0001F1EA', - u':United_Kingdom:': u'\U0001F1EC \U0001F1E7', - u':United_Nations:': u'\U0001F1FA \U0001F1F3', - u':United_States:': u'\U0001F1FA \U0001F1F8', - u':Uruguay:': u'\U0001F1FA \U0001F1FE', - u':Uzbekistan:': u'\U0001F1FA \U0001F1FF', - u':VS_button:': u'\U0001F19A', - u':Vanuatu:': u'\U0001F1FB \U0001F1FA', - u':Vatican_City:': u'\U0001F1FB \U0001F1E6', - u':Venezuela:': u'\U0001F1FB \U0001F1EA', - u':Vietnam:': u'\U0001F1FB \U0001F1F3', - u':Virgo:': u'\U0000264D', - u':Wallis_&_Futuna:': u'\U0001F1FC \U0001F1EB', - u':Western_Sahara:': u'\U0001F1EA \U0001F1ED', - u':Yemen:': u'\U0001F1FE \U0001F1EA', - u':Zambia:': u'\U0001F1FF \U0001F1F2', - u':Zimbabwe:': u'\U0001F1FF \U0001F1FC', - u':admission_tickets:': u'\U0001F39F', - u':aerial_tramway:': u'\U0001F6A1', - u':airplane:': u'\U00002708', - u':airplane_arrival:': u'\U0001F6EC', - u':airplane_departure:': u'\U0001F6EB', - u':alarm_clock:': u'\U000023F0', - u':alembic:': u'\U00002697', - u':alien:': u'\U0001F47D', - u':alien_monster:': u'\U0001F47E', - u':ambulance:': u'\U0001F691', - u':american_football:': u'\U0001F3C8', - u':amphora:': u'\U0001F3FA', - u':anchor:': u'\U00002693', - u':anger_symbol:': u'\U0001F4A2', - u':angry_face:': u'\U0001F620', - u':angry_face_with_horns:': u'\U0001F47F', - u':anguished_face:': u'\U0001F627', - u':ant:': u'\U0001F41C', - u':antenna_bars:': u'\U0001F4F6', - u':anticlockwise_arrows_button:': u'\U0001F504', - u':articulated_lorry:': u'\U0001F69B', - u':artist_palette:': u'\U0001F3A8', - u':astonished_face:': u'\U0001F632', - u':atom_symbol:': u'\U0000269B', - u':automobile:': u'\U0001F697', - u':avocado:': u'\U0001F951', - u':baby:': u'\U0001F476', - u':baby_angel:': u'\U0001F47C', - u':baby_angel_dark_skin_tone:': u'\U0001F47C \U0001F3FF', - u':baby_angel_light_skin_tone:': u'\U0001F47C \U0001F3FB', - u':baby_angel_medium-dark_skin_tone:': u'\U0001F47C \U0001F3FE', - u':baby_angel_medium-light_skin_tone:': u'\U0001F47C \U0001F3FC', - u':baby_angel_medium_skin_tone:': u'\U0001F47C \U0001F3FD', - u':baby_bottle:': u'\U0001F37C', - u':baby_chick:': u'\U0001F424', - u':baby_dark_skin_tone:': u'\U0001F476 \U0001F3FF', - u':baby_light_skin_tone:': u'\U0001F476 \U0001F3FB', - u':baby_medium-dark_skin_tone:': u'\U0001F476 \U0001F3FE', - u':baby_medium-light_skin_tone:': u'\U0001F476 \U0001F3FC', - u':baby_medium_skin_tone:': u'\U0001F476 \U0001F3FD', - u':baby_symbol:': u'\U0001F6BC', - u':backhand_index_pointing_down:': u'\U0001F447', - u':backhand_index_pointing_down_dark_skin_tone:': u'\U0001F447 \U0001F3FF', - u':backhand_index_pointing_down_light_skin_tone:': u'\U0001F447 \U0001F3FB', - u':backhand_index_pointing_down_medium-dark_skin_tone:': u'\U0001F447 \U0001F3FE', - u':backhand_index_pointing_down_medium-light_skin_tone:': u'\U0001F447 \U0001F3FC', - u':backhand_index_pointing_down_medium_skin_tone:': u'\U0001F447 \U0001F3FD', - u':backhand_index_pointing_left:': u'\U0001F448', - u':backhand_index_pointing_left_dark_skin_tone:': u'\U0001F448 \U0001F3FF', - u':backhand_index_pointing_left_light_skin_tone:': u'\U0001F448 \U0001F3FB', - u':backhand_index_pointing_left_medium-dark_skin_tone:': u'\U0001F448 \U0001F3FE', - u':backhand_index_pointing_left_medium-light_skin_tone:': u'\U0001F448 \U0001F3FC', - u':backhand_index_pointing_left_medium_skin_tone:': u'\U0001F448 \U0001F3FD', - u':backhand_index_pointing_right:': u'\U0001F449', - u':backhand_index_pointing_right_dark_skin_tone:': u'\U0001F449 \U0001F3FF', - u':backhand_index_pointing_right_light_skin_tone:': u'\U0001F449 \U0001F3FB', - u':backhand_index_pointing_right_medium-dark_skin_tone:': u'\U0001F449 \U0001F3FE', - u':backhand_index_pointing_right_medium-light_skin_tone:': u'\U0001F449 \U0001F3FC', - u':backhand_index_pointing_right_medium_skin_tone:': u'\U0001F449 \U0001F3FD', - u':backhand_index_pointing_up:': u'\U0001F446', - u':backhand_index_pointing_up_dark_skin_tone:': u'\U0001F446 \U0001F3FF', - u':backhand_index_pointing_up_light_skin_tone:': u'\U0001F446 \U0001F3FB', - u':backhand_index_pointing_up_medium-dark_skin_tone:': u'\U0001F446 \U0001F3FE', - u':backhand_index_pointing_up_medium-light_skin_tone:': u'\U0001F446 \U0001F3FC', - u':backhand_index_pointing_up_medium_skin_tone:': u'\U0001F446 \U0001F3FD', - u':bacon:': u'\U0001F953', - u':badminton:': u'\U0001F3F8', - u':baggage_claim:': u'\U0001F6C4', - u':baguette_bread:': u'\U0001F956', - u':balance_scale:': u'\U00002696', - u':balloon:': u'\U0001F388', - u':ballot_box_with_ballot:': u'\U0001F5F3', - u':ballot_box_with_check:': u'\U00002611', - u':banana:': u'\U0001F34C', - u':bank:': u'\U0001F3E6', - u':bar_chart:': u'\U0001F4CA', - u':barber_pole:': u'\U0001F488', - u':baseball:': u'\U000026BE', - u':basketball:': u'\U0001F3C0', - u':bat:': u'\U0001F987', - u':bathtub:': u'\U0001F6C1', - u':battery:': u'\U0001F50B', - u':beach_with_umbrella:': u'\U0001F3D6', - u':bear_face:': u'\U0001F43B', - u':beating_heart:': u'\U0001F493', - u':bed:': u'\U0001F6CF', - u':beer_mug:': u'\U0001F37A', - u':bell:': u'\U0001F514', - u':bell_with_slash:': u'\U0001F515', - u':bellhop_bell:': u'\U0001F6CE', - u':bento_box:': u'\U0001F371', - u':bicycle:': u'\U0001F6B2', - u':bikini:': u'\U0001F459', - u':biohazard:': u'\U00002623', - u':bird:': u'\U0001F426', - u':birthday_cake:': u'\U0001F382', - u':black_circle:': u'\U000026AB', - u':black_flag:': u'\U0001F3F4', - u':black_heart:': u'\U0001F5A4', - u':black_large_square:': u'\U00002B1B', - u':black_medium-small_square:': u'\U000025FE', - u':black_medium_square:': u'\U000025FC', - u':black_nib:': u'\U00002712', - u':black_small_square:': u'\U000025AA', - u':black_square_button:': u'\U0001F532', - u':blond-haired_man:': u'\U0001F471 \U0000200D \U00002642 \U0000FE0F', - u':blond-haired_man_dark_skin_tone:': u'\U0001F471 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':blond-haired_man_light_skin_tone:': u'\U0001F471 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':blond-haired_man_medium-dark_skin_tone:': u'\U0001F471 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':blond-haired_man_medium-light_skin_tone:': u'\U0001F471 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':blond-haired_man_medium_skin_tone:': u'\U0001F471 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':blond-haired_person:': u'\U0001F471', - u':blond-haired_person_dark_skin_tone:': u'\U0001F471 \U0001F3FF', - u':blond-haired_person_light_skin_tone:': u'\U0001F471 \U0001F3FB', - u':blond-haired_person_medium-dark_skin_tone:': u'\U0001F471 \U0001F3FE', - u':blond-haired_person_medium-light_skin_tone:': u'\U0001F471 \U0001F3FC', - u':blond-haired_person_medium_skin_tone:': u'\U0001F471 \U0001F3FD', - u':blond-haired_woman:': u'\U0001F471 \U0000200D \U00002640 \U0000FE0F', - u':blond-haired_woman_dark_skin_tone:': u'\U0001F471 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':blond-haired_woman_light_skin_tone:': u'\U0001F471 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':blond-haired_woman_medium-dark_skin_tone:': u'\U0001F471 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':blond-haired_woman_medium-light_skin_tone:': u'\U0001F471 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':blond-haired_woman_medium_skin_tone:': u'\U0001F471 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':blossom:': u'\U0001F33C', - u':blowfish:': u'\U0001F421', - u':blue_book:': u'\U0001F4D8', - u':blue_circle:': u'\U0001F535', - u':blue_heart:': u'\U0001F499', - u':boar:': u'\U0001F417', - u':bomb:': u'\U0001F4A3', - u':bookmark:': u'\U0001F516', - u':bookmark_tabs:': u'\U0001F4D1', - u':books:': u'\U0001F4DA', - u':bottle_with_popping_cork:': u'\U0001F37E', - u':bouquet:': u'\U0001F490', - u':bow_and_arrow:': u'\U0001F3F9', - u':bowling:': u'\U0001F3B3', - u':boxing_glove:': u'\U0001F94A', - u':boy:': u'\U0001F466', - u':boy_dark_skin_tone:': u'\U0001F466 \U0001F3FF', - u':boy_light_skin_tone:': u'\U0001F466 \U0001F3FB', - u':boy_medium-dark_skin_tone:': u'\U0001F466 \U0001F3FE', - u':boy_medium-light_skin_tone:': u'\U0001F466 \U0001F3FC', - u':boy_medium_skin_tone:': u'\U0001F466 \U0001F3FD', - u':bread:': u'\U0001F35E', - u':bride_with_veil:': u'\U0001F470', - u':bride_with_veil_dark_skin_tone:': u'\U0001F470 \U0001F3FF', - u':bride_with_veil_light_skin_tone:': u'\U0001F470 \U0001F3FB', - u':bride_with_veil_medium-dark_skin_tone:': u'\U0001F470 \U0001F3FE', - u':bride_with_veil_medium-light_skin_tone:': u'\U0001F470 \U0001F3FC', - u':bride_with_veil_medium_skin_tone:': u'\U0001F470 \U0001F3FD', - u':bridge_at_night:': u'\U0001F309', - u':briefcase:': u'\U0001F4BC', - u':bright_button:': u'\U0001F506', - u':broken_heart:': u'\U0001F494', - u':bug:': u'\U0001F41B', - u':building_construction:': u'\U0001F3D7', - u':burrito:': u'\U0001F32F', - u':bus:': u'\U0001F68C', - u':bus_stop:': u'\U0001F68F', - u':bust_in_silhouette:': u'\U0001F464', - u':busts_in_silhouette:': u'\U0001F465', - u':butterfly:': u'\U0001F98B', - u':cactus:': u'\U0001F335', - u':calendar:': u'\U0001F4C5', - u':call_me_hand:': u'\U0001F919', - u':call_me_hand_dark_skin_tone:': u'\U0001F919 \U0001F3FF', - u':call_me_hand_light_skin_tone:': u'\U0001F919 \U0001F3FB', - u':call_me_hand_medium-dark_skin_tone:': u'\U0001F919 \U0001F3FE', - u':call_me_hand_medium-light_skin_tone:': u'\U0001F919 \U0001F3FC', - u':call_me_hand_medium_skin_tone:': u'\U0001F919 \U0001F3FD', - u':camel:': u'\U0001F42A', - u':camera:': u'\U0001F4F7', - u':camera_with_flash:': u'\U0001F4F8', - u':camping:': u'\U0001F3D5', - u':candle:': u'\U0001F56F', - u':candy:': u'\U0001F36C', - u':canoe:': u'\U0001F6F6', - u':card_file_box:': u'\U0001F5C3', - u':card_index:': u'\U0001F4C7', - u':card_index_dividers:': u'\U0001F5C2', - u':carousel_horse:': u'\U0001F3A0', - u':carp_streamer:': u'\U0001F38F', - u':carrot:': u'\U0001F955', - u':castle:': u'\U0001F3F0', - u':cat:': u'\U0001F408', - u':cat_face:': u'\U0001F431', - u':cat_face_with_tears_of_joy:': u'\U0001F639', - u':cat_face_with_wry_smile:': u'\U0001F63C', - u':chains:': u'\U000026D3', - u':chart_decreasing:': u'\U0001F4C9', - u':chart_increasing:': u'\U0001F4C8', - u':chart_increasing_with_yen:': u'\U0001F4B9', - u':cheese_wedge:': u'\U0001F9C0', - u':chequered_flag:': u'\U0001F3C1', - u':cherries:': u'\U0001F352', - u':cherry_blossom:': u'\U0001F338', - u':chestnut:': u'\U0001F330', - u':chicken:': u'\U0001F414', - u':children_crossing:': u'\U0001F6B8', - u':chipmunk:': u'\U0001F43F', - u':chocolate_bar:': u'\U0001F36B', - u':church:': u'\U000026EA', - u':cigarette:': u'\U0001F6AC', - u':cinema:': u'\U0001F3A6', - u':circled_M:': u'\U000024C2', - u':circus_tent:': u'\U0001F3AA', - u':cityscape:': u'\U0001F3D9', - u':cityscape_at_dusk:': u'\U0001F306', - u':clamp:': u'\U0001F5DC', - u':clapper_board:': u'\U0001F3AC', - u':clapping_hands:': u'\U0001F44F', - u':clapping_hands_dark_skin_tone:': u'\U0001F44F \U0001F3FF', - u':clapping_hands_light_skin_tone:': u'\U0001F44F \U0001F3FB', - u':clapping_hands_medium-dark_skin_tone:': u'\U0001F44F \U0001F3FE', - u':clapping_hands_medium-light_skin_tone:': u'\U0001F44F \U0001F3FC', - u':clapping_hands_medium_skin_tone:': u'\U0001F44F \U0001F3FD', - u':classical_building:': u'\U0001F3DB', - u':clinking_beer_mugs:': u'\U0001F37B', - u':clinking_glasses:': u'\U0001F942', - u':clipboard:': u'\U0001F4CB', - u':clockwise_vertical_arrows:': u'\U0001F503', - u':closed_book:': u'\U0001F4D5', - u':closed_mailbox_with_lowered_flag:': u'\U0001F4EA', - u':closed_mailbox_with_raised_flag:': u'\U0001F4EB', - u':closed_umbrella:': u'\U0001F302', - u':cloud:': u'\U00002601', - u':cloud_with_lightning:': u'\U0001F329', - u':cloud_with_lightning_and_rain:': u'\U000026C8', - u':cloud_with_rain:': u'\U0001F327', - u':cloud_with_snow:': u'\U0001F328', - u':clown_face:': u'\U0001F921', - u':club_suit:': u'\U00002663', - u':clutch_bag:': u'\U0001F45D', - u':cocktail_glass:': u'\U0001F378', - u':coffin:': u'\U000026B0', - u':collision:': u'\U0001F4A5', - u':comet:': u'\U00002604', - u':computer_disk:': u'\U0001F4BD', - u':computer_mouse:': u'\U0001F5B1', - u':confetti_ball:': u'\U0001F38A', - u':confounded_face:': u'\U0001F616', - u':confused_face:': u'\U0001F615', - u':construction:': u'\U0001F6A7', - u':construction_worker:': u'\U0001F477', - u':construction_worker_dark_skin_tone:': u'\U0001F477 \U0001F3FF', - u':construction_worker_light_skin_tone:': u'\U0001F477 \U0001F3FB', - u':construction_worker_medium-dark_skin_tone:': u'\U0001F477 \U0001F3FE', - u':construction_worker_medium-light_skin_tone:': u'\U0001F477 \U0001F3FC', - u':construction_worker_medium_skin_tone:': u'\U0001F477 \U0001F3FD', - u':control_knobs:': u'\U0001F39B', - u':convenience_store:': u'\U0001F3EA', - u':cooked_rice:': u'\U0001F35A', - u':cookie:': u'\U0001F36A', - u':cooking:': u'\U0001F373', - u':copyright:': u'\U000000A9', - u':couch_and_lamp:': u'\U0001F6CB', - u':couple_with_heart:': u'\U0001F491', - u':couple_with_heart_man_man:': u'\U0001F468 \U0000200D \U00002764 \U0000FE0F \U0000200D \U0001F468', - u':couple_with_heart_woman_man:': u'\U0001F469 \U0000200D \U00002764 \U0000FE0F \U0000200D \U0001F468', - u':couple_with_heart_woman_woman:': u'\U0001F469 \U0000200D \U00002764 \U0000FE0F \U0000200D \U0001F469', - u':cow:': u'\U0001F404', - u':cow_face:': u'\U0001F42E', - u':cowboy_hat_face:': u'\U0001F920', - u':crab:': u'\U0001F980', - u':crayon:': u'\U0001F58D', - u':credit_card:': u'\U0001F4B3', - u':crescent_moon:': u'\U0001F319', - u':cricket:': u'\U0001F3CF', - u':crocodile:': u'\U0001F40A', - u':croissant:': u'\U0001F950', - u':cross_mark:': u'\U0000274C', - u':cross_mark_button:': u'\U0000274E', - u':crossed_fingers:': u'\U0001F91E', - u':crossed_fingers_dark_skin_tone:': u'\U0001F91E \U0001F3FF', - u':crossed_fingers_light_skin_tone:': u'\U0001F91E \U0001F3FB', - u':crossed_fingers_medium-dark_skin_tone:': u'\U0001F91E \U0001F3FE', - u':crossed_fingers_medium-light_skin_tone:': u'\U0001F91E \U0001F3FC', - u':crossed_fingers_medium_skin_tone:': u'\U0001F91E \U0001F3FD', - u':crossed_flags:': u'\U0001F38C', - u':crossed_swords:': u'\U00002694', - u':crown:': u'\U0001F451', - u':crying_cat_face:': u'\U0001F63F', - u':crying_face:': u'\U0001F622', - u':crystal_ball:': u'\U0001F52E', - u':cucumber:': u'\U0001F952', - u':curly_loop:': u'\U000027B0', - u':currency_exchange:': u'\U0001F4B1', - u':curry_rice:': u'\U0001F35B', - u':custard:': u'\U0001F36E', - u':customs:': u'\U0001F6C3', - u':cyclone:': u'\U0001F300', - u':dagger:': u'\U0001F5E1', - u':dango:': u'\U0001F361', - u':dark_skin_tone:': u'\U0001F3FF', - u':dashing_away:': u'\U0001F4A8', - u':deciduous_tree:': u'\U0001F333', - u':deer:': u'\U0001F98C', - u':delivery_truck:': u'\U0001F69A', - u':department_store:': u'\U0001F3EC', - u':derelict_house:': u'\U0001F3DA', - u':desert:': u'\U0001F3DC', - u':desert_island:': u'\U0001F3DD', - u':desktop_computer:': u'\U0001F5A5', - u':detective:': u'\U0001F575', - u':detective_dark_skin_tone:': u'\U0001F575 \U0001F3FF', - u':detective_light_skin_tone:': u'\U0001F575 \U0001F3FB', - u':detective_medium-dark_skin_tone:': u'\U0001F575 \U0001F3FE', - u':detective_medium-light_skin_tone:': u'\U0001F575 \U0001F3FC', - u':detective_medium_skin_tone:': u'\U0001F575 \U0001F3FD', - u':diamond_suit:': u'\U00002666', - u':diamond_with_a_dot:': u'\U0001F4A0', - u':dim_button:': u'\U0001F505', - u':direct_hit:': u'\U0001F3AF', - u':disappointed_but_relieved_face:': u'\U0001F625', - u':disappointed_face:': u'\U0001F61E', - u':dizzy:': u'\U0001F4AB', - u':dizzy_face:': u'\U0001F635', - u':dog:': u'\U0001F415', - u':dog_face:': u'\U0001F436', - u':dollar_banknote:': u'\U0001F4B5', - u':dolphin:': u'\U0001F42C', - u':door:': u'\U0001F6AA', - u':dotted_six-pointed_star:': u'\U0001F52F', - u':double_curly_loop:': u'\U000027BF', - u':double_exclamation_mark:': u'\U0000203C', - u':doughnut:': u'\U0001F369', - u':dove:': u'\U0001F54A', - u':down-left_arrow:': u'\U00002199', - u':down-right_arrow:': u'\U00002198', - u':down_arrow:': u'\U00002B07', - u':down_button:': u'\U0001F53D', - u':dragon:': u'\U0001F409', - u':dragon_face:': u'\U0001F432', - u':dress:': u'\U0001F457', - u':drooling_face:': u'\U0001F924', - u':droplet:': u'\U0001F4A7', - u':drum:': u'\U0001F941', - u':duck:': u'\U0001F986', - u':dvd:': u'\U0001F4C0', - u':e-mail:': u'\U0001F4E7', - u':eagle:': u'\U0001F985', - u':ear:': u'\U0001F442', - u':ear_dark_skin_tone:': u'\U0001F442 \U0001F3FF', - u':ear_light_skin_tone:': u'\U0001F442 \U0001F3FB', - u':ear_medium-dark_skin_tone:': u'\U0001F442 \U0001F3FE', - u':ear_medium-light_skin_tone:': u'\U0001F442 \U0001F3FC', - u':ear_medium_skin_tone:': u'\U0001F442 \U0001F3FD', - u':ear_of_corn:': u'\U0001F33D', - u':egg:': u'\U0001F95A', - u':eggplant:': u'\U0001F346', - u':eight-pointed_star:': u'\U00002734', - u':eight-spoked_asterisk:': u'\U00002733', - u':eight-thirty:': u'\U0001F563', - u':eight_o’clock:': u'\U0001F557', - u':eject_button:': u'\U000023CF', - u':electric_plug:': u'\U0001F50C', - u':elephant:': u'\U0001F418', - u':eleven-thirty:': u'\U0001F566', - u':eleven_o’clock:': u'\U0001F55A', - u':envelope:': u'\U00002709', - u':envelope_with_arrow:': u'\U0001F4E9', - u':euro_banknote:': u'\U0001F4B6', - u':evergreen_tree:': u'\U0001F332', - u':exclamation_mark:': u'\U00002757', - u':exclamation_question_mark:': u'\U00002049', - u':expressionless_face:': u'\U0001F611', - u':eye:': u'\U0001F441', - u':eye_in_speech_bubble:': u'\U0001F441 \U0000FE0F \U0000200D \U0001F5E8 \U0000FE0F', - u':eyes:': u'\U0001F440', - u':face_blowing_a_kiss:': u'\U0001F618', - u':face_savouring_delicious_food:': u'\U0001F60B', - u':face_screaming_in_fear:': u'\U0001F631', - u':face_with_cold_sweat:': u'\U0001F613', - u':face_with_head-bandage:': u'\U0001F915', - u':face_with_medical_mask:': u'\U0001F637', - u':face_with_open_mouth:': u'\U0001F62E', - u':face_with_open_mouth_&_cold_sweat:': u'\U0001F630', - u':face_with_rolling_eyes:': u'\U0001F644', - u':face_with_steam_from_nose:': u'\U0001F624', - u':face_with_stuck-out_tongue:': u'\U0001F61B', - u':face_with_stuck-out_tongue_&_closed_eyes:': u'\U0001F61D', - u':face_with_stuck-out_tongue_&_winking_eye:': u'\U0001F61C', - u':face_with_tears_of_joy:': u'\U0001F602', - u':face_with_thermometer:': u'\U0001F912', - u':face_without_mouth:': u'\U0001F636', - u':factory:': u'\U0001F3ED', - u':fallen_leaf:': u'\U0001F342', - u':family:': u'\U0001F46A', - u':family_man_boy:': u'\U0001F468 \U0000200D \U0001F466', - u':family_man_boy_boy:': u'\U0001F468 \U0000200D \U0001F466 \U0000200D \U0001F466', - u':family_man_girl:': u'\U0001F468 \U0000200D \U0001F467', - u':family_man_girl_boy:': u'\U0001F468 \U0000200D \U0001F467 \U0000200D \U0001F466', - u':family_man_girl_girl:': u'\U0001F468 \U0000200D \U0001F467 \U0000200D \U0001F467', - u':family_man_man_boy:': u'\U0001F468 \U0000200D \U0001F468 \U0000200D \U0001F466', - u':family_man_man_boy_boy:': u'\U0001F468 \U0000200D \U0001F468 \U0000200D \U0001F466 \U0000200D \U0001F466', - u':family_man_man_girl:': u'\U0001F468 \U0000200D \U0001F468 \U0000200D \U0001F467', - u':family_man_man_girl_boy:': u'\U0001F468 \U0000200D \U0001F468 \U0000200D \U0001F467 \U0000200D \U0001F466', - u':family_man_man_girl_girl:': u'\U0001F468 \U0000200D \U0001F468 \U0000200D \U0001F467 \U0000200D \U0001F467', - u':family_man_woman_boy:': u'\U0001F468 \U0000200D \U0001F469 \U0000200D \U0001F466', - u':family_man_woman_boy_boy:': u'\U0001F468 \U0000200D \U0001F469 \U0000200D \U0001F466 \U0000200D \U0001F466', - u':family_man_woman_girl:': u'\U0001F468 \U0000200D \U0001F469 \U0000200D \U0001F467', - u':family_man_woman_girl_boy:': u'\U0001F468 \U0000200D \U0001F469 \U0000200D \U0001F467 \U0000200D \U0001F466', - u':family_man_woman_girl_girl:': u'\U0001F468 \U0000200D \U0001F469 \U0000200D \U0001F467 \U0000200D \U0001F467', - u':family_woman_boy:': u'\U0001F469 \U0000200D \U0001F466', - u':family_woman_boy_boy:': u'\U0001F469 \U0000200D \U0001F466 \U0000200D \U0001F466', - u':family_woman_girl:': u'\U0001F469 \U0000200D \U0001F467', - u':family_woman_girl_boy:': u'\U0001F469 \U0000200D \U0001F467 \U0000200D \U0001F466', - u':family_woman_girl_girl:': u'\U0001F469 \U0000200D \U0001F467 \U0000200D \U0001F467', - u':family_woman_woman_boy:': u'\U0001F469 \U0000200D \U0001F469 \U0000200D \U0001F466', - u':family_woman_woman_boy_boy:': u'\U0001F469 \U0000200D \U0001F469 \U0000200D \U0001F466 \U0000200D \U0001F466', - u':family_woman_woman_girl:': u'\U0001F469 \U0000200D \U0001F469 \U0000200D \U0001F467', - u':family_woman_woman_girl_boy:': u'\U0001F469 \U0000200D \U0001F469 \U0000200D \U0001F467 \U0000200D \U0001F466', - u':family_woman_woman_girl_girl:': u'\U0001F469 \U0000200D \U0001F469 \U0000200D \U0001F467 \U0000200D \U0001F467', - u':fast-forward_button:': u'\U000023E9', - u':fast_down_button:': u'\U000023EC', - u':fast_reverse_button:': u'\U000023EA', - u':fast_up_button:': u'\U000023EB', - u':fax_machine:': u'\U0001F4E0', - u':fearful_face:': u'\U0001F628', - u':female_sign:': u'\U00002640', - u':ferris_wheel:': u'\U0001F3A1', - u':ferry:': u'\U000026F4', - u':field_hockey:': u'\U0001F3D1', - u':file_cabinet:': u'\U0001F5C4', - u':file_folder:': u'\U0001F4C1', - u':film_frames:': u'\U0001F39E', - u':film_projector:': u'\U0001F4FD', - u':fire:': u'\U0001F525', - u':fire_engine:': u'\U0001F692', - u':fireworks:': u'\U0001F386', - u':first_quarter_moon:': u'\U0001F313', - u':first_quarter_moon_with_face:': u'\U0001F31B', - u':fish:': u'\U0001F41F', - u':fish_cake_with_swirl:': u'\U0001F365', - u':fishing_pole:': u'\U0001F3A3', - u':five-thirty:': u'\U0001F560', - u':five_o’clock:': u'\U0001F554', - u':flag_in_hole:': u'\U000026F3', - u':flashlight:': u'\U0001F526', - u':fleur-de-lis:': u'\U0000269C', - u':flexed_biceps:': u'\U0001F4AA', - u':flexed_biceps_dark_skin_tone:': u'\U0001F4AA \U0001F3FF', - u':flexed_biceps_light_skin_tone:': u'\U0001F4AA \U0001F3FB', - u':flexed_biceps_medium-dark_skin_tone:': u'\U0001F4AA \U0001F3FE', - u':flexed_biceps_medium-light_skin_tone:': u'\U0001F4AA \U0001F3FC', - u':flexed_biceps_medium_skin_tone:': u'\U0001F4AA \U0001F3FD', - u':floppy_disk:': u'\U0001F4BE', - u':flower_playing_cards:': u'\U0001F3B4', - u':flushed_face:': u'\U0001F633', - u':fog:': u'\U0001F32B', - u':foggy:': u'\U0001F301', - u':folded_hands:': u'\U0001F64F', - u':folded_hands_dark_skin_tone:': u'\U0001F64F \U0001F3FF', - u':folded_hands_light_skin_tone:': u'\U0001F64F \U0001F3FB', - u':folded_hands_medium-dark_skin_tone:': u'\U0001F64F \U0001F3FE', - u':folded_hands_medium-light_skin_tone:': u'\U0001F64F \U0001F3FC', - u':folded_hands_medium_skin_tone:': u'\U0001F64F \U0001F3FD', - u':footprints:': u'\U0001F463', - u':fork_and_knife:': u'\U0001F374', - u':fork_and_knife_with_plate:': u'\U0001F37D', - u':fountain:': u'\U000026F2', - u':fountain_pen:': u'\U0001F58B', - u':four-thirty:': u'\U0001F55F', - u':four_leaf_clover:': u'\U0001F340', - u':four_o’clock:': u'\U0001F553', - u':fox_face:': u'\U0001F98A', - u':framed_picture:': u'\U0001F5BC', - u':french_fries:': u'\U0001F35F', - u':fried_shrimp:': u'\U0001F364', - u':frog_face:': u'\U0001F438', - u':front-facing_baby_chick:': u'\U0001F425', - u':frowning_face:': u'\U00002639', - u':frowning_face_with_open_mouth:': u'\U0001F626', - u':fuel_pump:': u'\U000026FD', - u':full_moon:': u'\U0001F315', - u':full_moon_with_face:': u'\U0001F31D', - u':funeral_urn:': u'\U000026B1', - u':game_die:': u'\U0001F3B2', - u':gear:': u'\U00002699', - u':gem_stone:': u'\U0001F48E', - u':ghost:': u'\U0001F47B', - u':girl:': u'\U0001F467', - u':girl_dark_skin_tone:': u'\U0001F467 \U0001F3FF', - u':girl_light_skin_tone:': u'\U0001F467 \U0001F3FB', - u':girl_medium-dark_skin_tone:': u'\U0001F467 \U0001F3FE', - u':girl_medium-light_skin_tone:': u'\U0001F467 \U0001F3FC', - u':girl_medium_skin_tone:': u'\U0001F467 \U0001F3FD', - u':glass_of_milk:': u'\U0001F95B', - u':glasses:': u'\U0001F453', - u':globe_showing_Americas:': u'\U0001F30E', - u':globe_showing_Asia-Australia:': u'\U0001F30F', - u':globe_showing_Europe-Africa:': u'\U0001F30D', - u':globe_with_meridians:': u'\U0001F310', - u':glowing_star:': u'\U0001F31F', - u':goal_net:': u'\U0001F945', - u':goat:': u'\U0001F410', - u':goblin:': u'\U0001F47A', - u':gorilla:': u'\U0001F98D', - u':graduation_cap:': u'\U0001F393', - u':grapes:': u'\U0001F347', - u':green_apple:': u'\U0001F34F', - u':green_book:': u'\U0001F4D7', - u':green_heart:': u'\U0001F49A', - u':green_salad:': u'\U0001F957', - u':grimacing_face:': u'\U0001F62C', - u':grinning_cat_face_with_smiling_eyes:': u'\U0001F638', - u':grinning_face:': u'\U0001F600', - u':grinning_face_with_smiling_eyes:': u'\U0001F601', - u':growing_heart:': u'\U0001F497', - u':guard:': u'\U0001F482', - u':guard_dark_skin_tone:': u'\U0001F482 \U0001F3FF', - u':guard_light_skin_tone:': u'\U0001F482 \U0001F3FB', - u':guard_medium-dark_skin_tone:': u'\U0001F482 \U0001F3FE', - u':guard_medium-light_skin_tone:': u'\U0001F482 \U0001F3FC', - u':guard_medium_skin_tone:': u'\U0001F482 \U0001F3FD', - u':guitar:': u'\U0001F3B8', - u':hamburger:': u'\U0001F354', - u':hammer:': u'\U0001F528', - u':hammer_and_pick:': u'\U00002692', - u':hammer_and_wrench:': u'\U0001F6E0', - u':hamster_face:': u'\U0001F439', - u':handbag:': u'\U0001F45C', - u':handshake:': u'\U0001F91D', - u':hatching_chick:': u'\U0001F423', - u':headphone:': u'\U0001F3A7', - u':hear-no-evil_monkey:': u'\U0001F649', - u':heart_decoration:': u'\U0001F49F', - u':heart_suit:': u'\U00002665', - u':heart_with_arrow:': u'\U0001F498', - u':heart_with_ribbon:': u'\U0001F49D', - u':heavy_check_mark:': u'\U00002714', - u':heavy_division_sign:': u'\U00002797', - u':heavy_dollar_sign:': u'\U0001F4B2', - u':heavy_heart_exclamation:': u'\U00002763', - u':heavy_large_circle:': u'\U00002B55', - u':heavy_minus_sign:': u'\U00002796', - u':heavy_multiplication_x:': u'\U00002716', - u':heavy_plus_sign:': u'\U00002795', - u':helicopter:': u'\U0001F681', - u':herb:': u'\U0001F33F', - u':hibiscus:': u'\U0001F33A', - u':high-heeled_shoe:': u'\U0001F460', - u':high-speed_train:': u'\U0001F684', - u':high-speed_train_with_bullet_nose:': u'\U0001F685', - u':high_voltage:': u'\U000026A1', - u':hole:': u'\U0001F573', - u':honey_pot:': u'\U0001F36F', - u':honeybee:': u'\U0001F41D', - u':horizontal_traffic_light:': u'\U0001F6A5', - u':horse:': u'\U0001F40E', - u':horse_face:': u'\U0001F434', - u':horse_racing:': u'\U0001F3C7', - u':horse_racing_dark_skin_tone:': u'\U0001F3C7 \U0001F3FF', - u':horse_racing_light_skin_tone:': u'\U0001F3C7 \U0001F3FB', - u':horse_racing_medium-dark_skin_tone:': u'\U0001F3C7 \U0001F3FE', - u':horse_racing_medium-light_skin_tone:': u'\U0001F3C7 \U0001F3FC', - u':horse_racing_medium_skin_tone:': u'\U0001F3C7 \U0001F3FD', - u':hospital:': u'\U0001F3E5', - u':hot_beverage:': u'\U00002615', - u':hot_dog:': u'\U0001F32D', - u':hot_pepper:': u'\U0001F336', - u':hot_springs:': u'\U00002668', - u':hotel:': u'\U0001F3E8', - u':hourglass:': u'\U0000231B', - u':hourglass_with_flowing_sand:': u'\U000023F3', - u':house:': u'\U0001F3E0', - u':house_with_garden:': u'\U0001F3E1', - u':hugging_face:': u'\U0001F917', - u':hundred_points:': u'\U0001F4AF', - u':hushed_face:': u'\U0001F62F', - u':ice_cream:': u'\U0001F368', - u':ice_hockey:': u'\U0001F3D2', - u':ice_skate:': u'\U000026F8', - u':inbox_tray:': u'\U0001F4E5', - u':incoming_envelope:': u'\U0001F4E8', - u':index_pointing_up:': u'\U0000261D', - u':index_pointing_up_dark_skin_tone:': u'\U0000261D \U0001F3FF', - u':index_pointing_up_light_skin_tone:': u'\U0000261D \U0001F3FB', - u':index_pointing_up_medium-dark_skin_tone:': u'\U0000261D \U0001F3FE', - u':index_pointing_up_medium-light_skin_tone:': u'\U0000261D \U0001F3FC', - u':index_pointing_up_medium_skin_tone:': u'\U0000261D \U0001F3FD', - u':information:': u'\U00002139', - u':input_latin_letters:': u'\U0001F524', - u':input_latin_lowercase:': u'\U0001F521', - u':input_latin_uppercase:': u'\U0001F520', - u':input_numbers:': u'\U0001F522', - u':input_symbols:': u'\U0001F523', - u':jack-o-lantern:': u'\U0001F383', - u':jeans:': u'\U0001F456', - u':joker:': u'\U0001F0CF', - u':joystick:': u'\U0001F579', - u':kaaba:': u'\U0001F54B', - u':key:': u'\U0001F511', - u':keyboard:': u'\U00002328', - u':keycap_#:': u'\U00000023 \U0000FE0F \U000020E3', - u':keycap_*:': u'\U0000002A \U0000FE0F \U000020E3', - u':keycap_0:': u'\U00000030 \U0000FE0F \U000020E3', - u':keycap_1:': u'\U00000031 \U0000FE0F \U000020E3', - u':keycap_10:': u'\U0001F51F', - u':keycap_2:': u'\U00000032 \U0000FE0F \U000020E3', - u':keycap_3:': u'\U00000033 \U0000FE0F \U000020E3', - u':keycap_4:': u'\U00000034 \U0000FE0F \U000020E3', - u':keycap_5:': u'\U00000035 \U0000FE0F \U000020E3', - u':keycap_6:': u'\U00000036 \U0000FE0F \U000020E3', - u':keycap_7:': u'\U00000037 \U0000FE0F \U000020E3', - u':keycap_8:': u'\U00000038 \U0000FE0F \U000020E3', - u':keycap_9:': u'\U00000039 \U0000FE0F \U000020E3', - u':kick_scooter:': u'\U0001F6F4', - u':kimono:': u'\U0001F458', - u':kiss:': u'\U0001F48F', - u':kiss_man_man:': u'\U0001F468 \U0000200D \U00002764 \U0000FE0F \U0000200D \U0001F48B \U0000200D \U0001F468', - u':kiss_mark:': u'\U0001F48B', - u':kiss_woman_man:': u'\U0001F469 \U0000200D \U00002764 \U0000FE0F \U0000200D \U0001F48B \U0000200D \U0001F468', - u':kiss_woman_woman:': u'\U0001F469 \U0000200D \U00002764 \U0000FE0F \U0000200D \U0001F48B \U0000200D \U0001F469', - u':kissing_cat_face_with_closed_eyes:': u'\U0001F63D', - u':kissing_face:': u'\U0001F617', - u':kissing_face_with_closed_eyes:': u'\U0001F61A', - u':kissing_face_with_smiling_eyes:': u'\U0001F619', - u':kitchen_knife:': u'\U0001F52A', - u':kiwi_fruit:': u'\U0001F95D', - u':koala:': u'\U0001F428', - u':label:': u'\U0001F3F7', - u':lady_beetle:': u'\U0001F41E', - u':laptop_computer:': u'\U0001F4BB', - u':large_blue_diamond:': u'\U0001F537', - u':large_orange_diamond:': u'\U0001F536', - u':last_quarter_moon:': u'\U0001F317', - u':last_quarter_moon_with_face:': u'\U0001F31C', - u':last_track_button:': u'\U000023EE', - u':latin_cross:': u'\U0000271D', - u':leaf_fluttering_in_wind:': u'\U0001F343', - u':ledger:': u'\U0001F4D2', - u':left-facing_fist:': u'\U0001F91B', - u':left-facing_fist_dark_skin_tone:': u'\U0001F91B \U0001F3FF', - u':left-facing_fist_light_skin_tone:': u'\U0001F91B \U0001F3FB', - u':left-facing_fist_medium-dark_skin_tone:': u'\U0001F91B \U0001F3FE', - u':left-facing_fist_medium-light_skin_tone:': u'\U0001F91B \U0001F3FC', - u':left-facing_fist_medium_skin_tone:': u'\U0001F91B \U0001F3FD', - u':left-pointing_magnifying_glass:': u'\U0001F50D', - u':left-right_arrow:': u'\U00002194', - u':left_arrow:': u'\U00002B05', - u':left_arrow_curving_right:': u'\U000021AA', - u':left_luggage:': u'\U0001F6C5', - u':left_speech_bubble:': u'\U0001F5E8', - u':lemon:': u'\U0001F34B', - u':leopard:': u'\U0001F406', - u':level_slider:': u'\U0001F39A', - u':light_bulb:': u'\U0001F4A1', - u':light_rail:': u'\U0001F688', - u':light_skin_tone:': u'\U0001F3FB', - u':link:': u'\U0001F517', - u':linked_paperclips:': u'\U0001F587', - u':lion_face:': u'\U0001F981', - u':lipstick:': u'\U0001F484', - u':litter_in_bin_sign:': u'\U0001F6AE', - u':lizard:': u'\U0001F98E', - u':locked:': u'\U0001F512', - u':locked_with_key:': u'\U0001F510', - u':locked_with_pen:': u'\U0001F50F', - u':locomotive:': u'\U0001F682', - u':lollipop:': u'\U0001F36D', - u':loudly_crying_face:': u'\U0001F62D', - u':loudspeaker:': u'\U0001F4E2', - u':love_hotel:': u'\U0001F3E9', - u':love_letter:': u'\U0001F48C', - u':lying_face:': u'\U0001F925', - u':mahjong_red_dragon:': u'\U0001F004', - u':male_sign:': u'\U00002642', - u':man:': u'\U0001F468', - u':man_and_woman_holding_hands:': u'\U0001F46B', - u':man_artist:': u'\U0001F468 \U0000200D \U0001F3A8', - u':man_artist_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F3A8', - u':man_artist_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F3A8', - u':man_artist_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F3A8', - u':man_artist_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F3A8', - u':man_artist_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F3A8', - u':man_astronaut:': u'\U0001F468 \U0000200D \U0001F680', - u':man_astronaut_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F680', - u':man_astronaut_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F680', - u':man_astronaut_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F680', - u':man_astronaut_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F680', - u':man_astronaut_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F680', - u':man_biking:': u'\U0001F6B4 \U0000200D \U00002642 \U0000FE0F', - u':man_biking_dark_skin_tone:': u'\U0001F6B4 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_biking_light_skin_tone:': u'\U0001F6B4 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_biking_medium-dark_skin_tone:': u'\U0001F6B4 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_biking_medium-light_skin_tone:': u'\U0001F6B4 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_biking_medium_skin_tone:': u'\U0001F6B4 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_bouncing_ball:': u'\U000026F9 \U0000FE0F \U0000200D \U00002642 \U0000FE0F', - u':man_bouncing_ball_dark_skin_tone:': u'\U000026F9 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_bouncing_ball_light_skin_tone:': u'\U000026F9 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_bouncing_ball_medium-dark_skin_tone:': u'\U000026F9 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_bouncing_ball_medium-light_skin_tone:': u'\U000026F9 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_bouncing_ball_medium_skin_tone:': u'\U000026F9 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_bowing:': u'\U0001F647 \U0000200D \U00002642 \U0000FE0F', - u':man_bowing_dark_skin_tone:': u'\U0001F647 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_bowing_light_skin_tone:': u'\U0001F647 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_bowing_medium-dark_skin_tone:': u'\U0001F647 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_bowing_medium-light_skin_tone:': u'\U0001F647 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_bowing_medium_skin_tone:': u'\U0001F647 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_cartwheeling:': u'\U0001F938 \U0000200D \U00002642 \U0000FE0F', - u':man_cartwheeling_dark_skin_tone:': u'\U0001F938 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_cartwheeling_light_skin_tone:': u'\U0001F938 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_cartwheeling_medium-dark_skin_tone:': u'\U0001F938 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_cartwheeling_medium-light_skin_tone:': u'\U0001F938 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_cartwheeling_medium_skin_tone:': u'\U0001F938 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_construction_worker:': u'\U0001F477 \U0000200D \U00002642 \U0000FE0F', - u':man_construction_worker_dark_skin_tone:': u'\U0001F477 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_construction_worker_light_skin_tone:': u'\U0001F477 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_construction_worker_medium-dark_skin_tone:': u'\U0001F477 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_construction_worker_medium-light_skin_tone:': u'\U0001F477 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_construction_worker_medium_skin_tone:': u'\U0001F477 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_cook:': u'\U0001F468 \U0000200D \U0001F373', - u':man_cook_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F373', - u':man_cook_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F373', - u':man_cook_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F373', - u':man_cook_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F373', - u':man_cook_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F373', - u':man_dancing:': u'\U0001F57A', - u':man_dancing_dark_skin_tone:': u'\U0001F57A \U0001F3FF', - u':man_dancing_light_skin_tone:': u'\U0001F57A \U0001F3FB', - u':man_dancing_medium-dark_skin_tone:': u'\U0001F57A \U0001F3FE', - u':man_dancing_medium-light_skin_tone:': u'\U0001F57A \U0001F3FC', - u':man_dancing_medium_skin_tone:': u'\U0001F57A \U0001F3FD', - u':man_dark_skin_tone:': u'\U0001F468 \U0001F3FF', - u':man_detective:': u'\U0001F575 \U0000FE0F \U0000200D \U00002642 \U0000FE0F', - u':man_detective_dark_skin_tone:': u'\U0001F575 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_detective_light_skin_tone:': u'\U0001F575 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_detective_medium-dark_skin_tone:': u'\U0001F575 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_detective_medium-light_skin_tone:': u'\U0001F575 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_detective_medium_skin_tone:': u'\U0001F575 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_facepalming:': u'\U0001F926 \U0000200D \U00002642 \U0000FE0F', - u':man_facepalming_dark_skin_tone:': u'\U0001F926 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_facepalming_light_skin_tone:': u'\U0001F926 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_facepalming_medium-dark_skin_tone:': u'\U0001F926 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_facepalming_medium-light_skin_tone:': u'\U0001F926 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_facepalming_medium_skin_tone:': u'\U0001F926 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_factory_worker:': u'\U0001F468 \U0000200D \U0001F3ED', - u':man_factory_worker_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F3ED', - u':man_factory_worker_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F3ED', - u':man_factory_worker_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F3ED', - u':man_factory_worker_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F3ED', - u':man_factory_worker_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F3ED', - u':man_farmer:': u'\U0001F468 \U0000200D \U0001F33E', - u':man_farmer_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F33E', - u':man_farmer_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F33E', - u':man_farmer_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F33E', - u':man_farmer_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F33E', - u':man_farmer_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F33E', - u':man_firefighter:': u'\U0001F468 \U0000200D \U0001F692', - u':man_firefighter_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F692', - u':man_firefighter_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F692', - u':man_firefighter_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F692', - u':man_firefighter_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F692', - u':man_firefighter_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F692', - u':man_frowning:': u'\U0001F64D \U0000200D \U00002642 \U0000FE0F', - u':man_frowning_dark_skin_tone:': u'\U0001F64D \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_frowning_light_skin_tone:': u'\U0001F64D \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_frowning_medium-dark_skin_tone:': u'\U0001F64D \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_frowning_medium-light_skin_tone:': u'\U0001F64D \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_frowning_medium_skin_tone:': u'\U0001F64D \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_gesturing_NO:': u'\U0001F645 \U0000200D \U00002642 \U0000FE0F', - u':man_gesturing_NO_dark_skin_tone:': u'\U0001F645 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_gesturing_NO_light_skin_tone:': u'\U0001F645 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_gesturing_NO_medium-dark_skin_tone:': u'\U0001F645 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_gesturing_NO_medium-light_skin_tone:': u'\U0001F645 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_gesturing_NO_medium_skin_tone:': u'\U0001F645 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_gesturing_OK:': u'\U0001F646 \U0000200D \U00002642 \U0000FE0F', - u':man_gesturing_OK_dark_skin_tone:': u'\U0001F646 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_gesturing_OK_light_skin_tone:': u'\U0001F646 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_gesturing_OK_medium-dark_skin_tone:': u'\U0001F646 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_gesturing_OK_medium-light_skin_tone:': u'\U0001F646 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_gesturing_OK_medium_skin_tone:': u'\U0001F646 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_getting_haircut:': u'\U0001F487 \U0000200D \U00002642 \U0000FE0F', - u':man_getting_haircut_dark_skin_tone:': u'\U0001F487 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_getting_haircut_light_skin_tone:': u'\U0001F487 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_getting_haircut_medium-dark_skin_tone:': u'\U0001F487 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_getting_haircut_medium-light_skin_tone:': u'\U0001F487 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_getting_haircut_medium_skin_tone:': u'\U0001F487 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_getting_massage:': u'\U0001F486 \U0000200D \U00002642 \U0000FE0F', - u':man_getting_massage_dark_skin_tone:': u'\U0001F486 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_getting_massage_light_skin_tone:': u'\U0001F486 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_getting_massage_medium-dark_skin_tone:': u'\U0001F486 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_getting_massage_medium-light_skin_tone:': u'\U0001F486 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_getting_massage_medium_skin_tone:': u'\U0001F486 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_golfing:': u'\U0001F3CC \U0000FE0F \U0000200D \U00002642 \U0000FE0F', - u':man_golfing_dark_skin_tone:': u'\U0001F3CC \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_golfing_light_skin_tone:': u'\U0001F3CC \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_golfing_medium-dark_skin_tone:': u'\U0001F3CC \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_golfing_medium-light_skin_tone:': u'\U0001F3CC \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_golfing_medium_skin_tone:': u'\U0001F3CC \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_guard:': u'\U0001F482 \U0000200D \U00002642 \U0000FE0F', - u':man_guard_dark_skin_tone:': u'\U0001F482 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_guard_light_skin_tone:': u'\U0001F482 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_guard_medium-dark_skin_tone:': u'\U0001F482 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_guard_medium-light_skin_tone:': u'\U0001F482 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_guard_medium_skin_tone:': u'\U0001F482 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_health_worker:': u'\U0001F468 \U0000200D \U00002695 \U0000FE0F', - u':man_health_worker_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U00002695 \U0000FE0F', - u':man_health_worker_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U00002695 \U0000FE0F', - u':man_health_worker_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U00002695 \U0000FE0F', - u':man_health_worker_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U00002695 \U0000FE0F', - u':man_health_worker_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U00002695 \U0000FE0F', - u':man_in_business_suit_levitating:': u'\U0001F574', - u':man_in_business_suit_levitating_dark_skin_tone:': u'\U0001F574 \U0001F3FF', - u':man_in_business_suit_levitating_light_skin_tone:': u'\U0001F574 \U0001F3FB', - u':man_in_business_suit_levitating_medium-dark_skin_tone:': u'\U0001F574 \U0001F3FE', - u':man_in_business_suit_levitating_medium-light_skin_tone:': u'\U0001F574 \U0001F3FC', - u':man_in_business_suit_levitating_medium_skin_tone:': u'\U0001F574 \U0001F3FD', - u':man_in_tuxedo:': u'\U0001F935', - u':man_in_tuxedo_dark_skin_tone:': u'\U0001F935 \U0001F3FF', - u':man_in_tuxedo_light_skin_tone:': u'\U0001F935 \U0001F3FB', - u':man_in_tuxedo_medium-dark_skin_tone:': u'\U0001F935 \U0001F3FE', - u':man_in_tuxedo_medium-light_skin_tone:': u'\U0001F935 \U0001F3FC', - u':man_in_tuxedo_medium_skin_tone:': u'\U0001F935 \U0001F3FD', - u':man_judge:': u'\U0001F468 \U0000200D \U00002696 \U0000FE0F', - u':man_judge_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U00002696 \U0000FE0F', - u':man_judge_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U00002696 \U0000FE0F', - u':man_judge_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U00002696 \U0000FE0F', - u':man_judge_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U00002696 \U0000FE0F', - u':man_judge_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U00002696 \U0000FE0F', - u':man_juggling:': u'\U0001F939 \U0000200D \U00002642 \U0000FE0F', - u':man_juggling_dark_skin_tone:': u'\U0001F939 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_juggling_light_skin_tone:': u'\U0001F939 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_juggling_medium-dark_skin_tone:': u'\U0001F939 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_juggling_medium-light_skin_tone:': u'\U0001F939 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_juggling_medium_skin_tone:': u'\U0001F939 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_lifting_weights:': u'\U0001F3CB \U0000FE0F \U0000200D \U00002642 \U0000FE0F', - u':man_lifting_weights_dark_skin_tone:': u'\U0001F3CB \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_lifting_weights_light_skin_tone:': u'\U0001F3CB \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_lifting_weights_medium-dark_skin_tone:': u'\U0001F3CB \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_lifting_weights_medium-light_skin_tone:': u'\U0001F3CB \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_lifting_weights_medium_skin_tone:': u'\U0001F3CB \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_light_skin_tone:': u'\U0001F468 \U0001F3FB', - u':man_mechanic:': u'\U0001F468 \U0000200D \U0001F527', - u':man_mechanic_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F527', - u':man_mechanic_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F527', - u':man_mechanic_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F527', - u':man_mechanic_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F527', - u':man_mechanic_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F527', - u':man_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE', - u':man_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC', - u':man_medium_skin_tone:': u'\U0001F468 \U0001F3FD', - u':man_mountain_biking:': u'\U0001F6B5 \U0000200D \U00002642 \U0000FE0F', - u':man_mountain_biking_dark_skin_tone:': u'\U0001F6B5 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_mountain_biking_light_skin_tone:': u'\U0001F6B5 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_mountain_biking_medium-dark_skin_tone:': u'\U0001F6B5 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_mountain_biking_medium-light_skin_tone:': u'\U0001F6B5 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_mountain_biking_medium_skin_tone:': u'\U0001F6B5 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_office_worker:': u'\U0001F468 \U0000200D \U0001F4BC', - u':man_office_worker_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F4BC', - u':man_office_worker_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F4BC', - u':man_office_worker_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F4BC', - u':man_office_worker_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F4BC', - u':man_office_worker_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F4BC', - u':man_pilot:': u'\U0001F468 \U0000200D \U00002708 \U0000FE0F', - u':man_pilot_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U00002708 \U0000FE0F', - u':man_pilot_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U00002708 \U0000FE0F', - u':man_pilot_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U00002708 \U0000FE0F', - u':man_pilot_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U00002708 \U0000FE0F', - u':man_pilot_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U00002708 \U0000FE0F', - u':man_playing_handball:': u'\U0001F93E \U0000200D \U00002642 \U0000FE0F', - u':man_playing_handball_dark_skin_tone:': u'\U0001F93E \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_playing_handball_light_skin_tone:': u'\U0001F93E \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_playing_handball_medium-dark_skin_tone:': u'\U0001F93E \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_playing_handball_medium-light_skin_tone:': u'\U0001F93E \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_playing_handball_medium_skin_tone:': u'\U0001F93E \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_playing_water_polo:': u'\U0001F93D \U0000200D \U00002642 \U0000FE0F', - u':man_playing_water_polo_dark_skin_tone:': u'\U0001F93D \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_playing_water_polo_light_skin_tone:': u'\U0001F93D \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_playing_water_polo_medium-dark_skin_tone:': u'\U0001F93D \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_playing_water_polo_medium-light_skin_tone:': u'\U0001F93D \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_playing_water_polo_medium_skin_tone:': u'\U0001F93D \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_police_officer:': u'\U0001F46E \U0000200D \U00002642 \U0000FE0F', - u':man_police_officer_dark_skin_tone:': u'\U0001F46E \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_police_officer_light_skin_tone:': u'\U0001F46E \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_police_officer_medium-dark_skin_tone:': u'\U0001F46E \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_police_officer_medium-light_skin_tone:': u'\U0001F46E \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_police_officer_medium_skin_tone:': u'\U0001F46E \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_pouting:': u'\U0001F64E \U0000200D \U00002642 \U0000FE0F', - u':man_pouting_dark_skin_tone:': u'\U0001F64E \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_pouting_light_skin_tone:': u'\U0001F64E \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_pouting_medium-dark_skin_tone:': u'\U0001F64E \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_pouting_medium-light_skin_tone:': u'\U0001F64E \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_pouting_medium_skin_tone:': u'\U0001F64E \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_raising_hand:': u'\U0001F64B \U0000200D \U00002642 \U0000FE0F', - u':man_raising_hand_dark_skin_tone:': u'\U0001F64B \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_raising_hand_light_skin_tone:': u'\U0001F64B \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_raising_hand_medium-dark_skin_tone:': u'\U0001F64B \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_raising_hand_medium-light_skin_tone:': u'\U0001F64B \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_raising_hand_medium_skin_tone:': u'\U0001F64B \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_rowing_boat:': u'\U0001F6A3 \U0000200D \U00002642 \U0000FE0F', - u':man_rowing_boat_dark_skin_tone:': u'\U0001F6A3 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_rowing_boat_light_skin_tone:': u'\U0001F6A3 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_rowing_boat_medium-dark_skin_tone:': u'\U0001F6A3 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_rowing_boat_medium-light_skin_tone:': u'\U0001F6A3 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_rowing_boat_medium_skin_tone:': u'\U0001F6A3 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_running:': u'\U0001F3C3 \U0000200D \U00002642 \U0000FE0F', - u':man_running_dark_skin_tone:': u'\U0001F3C3 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_running_light_skin_tone:': u'\U0001F3C3 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_running_medium-dark_skin_tone:': u'\U0001F3C3 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_running_medium-light_skin_tone:': u'\U0001F3C3 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_running_medium_skin_tone:': u'\U0001F3C3 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_scientist:': u'\U0001F468 \U0000200D \U0001F52C', - u':man_scientist_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F52C', - u':man_scientist_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F52C', - u':man_scientist_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F52C', - u':man_scientist_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F52C', - u':man_scientist_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F52C', - u':man_shrugging:': u'\U0001F937 \U0000200D \U00002642 \U0000FE0F', - u':man_shrugging_dark_skin_tone:': u'\U0001F937 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_shrugging_light_skin_tone:': u'\U0001F937 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_shrugging_medium-dark_skin_tone:': u'\U0001F937 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_shrugging_medium-light_skin_tone:': u'\U0001F937 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_shrugging_medium_skin_tone:': u'\U0001F937 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_singer:': u'\U0001F468 \U0000200D \U0001F3A4', - u':man_singer_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F3A4', - u':man_singer_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F3A4', - u':man_singer_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F3A4', - u':man_singer_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F3A4', - u':man_singer_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F3A4', - u':man_student:': u'\U0001F468 \U0000200D \U0001F393', - u':man_student_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F393', - u':man_student_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F393', - u':man_student_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F393', - u':man_student_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F393', - u':man_student_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F393', - u':man_surfing:': u'\U0001F3C4 \U0000200D \U00002642 \U0000FE0F', - u':man_surfing_dark_skin_tone:': u'\U0001F3C4 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_surfing_light_skin_tone:': u'\U0001F3C4 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_surfing_medium-dark_skin_tone:': u'\U0001F3C4 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_surfing_medium-light_skin_tone:': u'\U0001F3C4 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_surfing_medium_skin_tone:': u'\U0001F3C4 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_swimming:': u'\U0001F3CA \U0000200D \U00002642 \U0000FE0F', - u':man_swimming_dark_skin_tone:': u'\U0001F3CA \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_swimming_light_skin_tone:': u'\U0001F3CA \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_swimming_medium-dark_skin_tone:': u'\U0001F3CA \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_swimming_medium-light_skin_tone:': u'\U0001F3CA \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_swimming_medium_skin_tone:': u'\U0001F3CA \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_teacher:': u'\U0001F468 \U0000200D \U0001F3EB', - u':man_teacher_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F3EB', - u':man_teacher_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F3EB', - u':man_teacher_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F3EB', - u':man_teacher_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F3EB', - u':man_teacher_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F3EB', - u':man_technologist:': u'\U0001F468 \U0000200D \U0001F4BB', - u':man_technologist_dark_skin_tone:': u'\U0001F468 \U0001F3FF \U0000200D \U0001F4BB', - u':man_technologist_light_skin_tone:': u'\U0001F468 \U0001F3FB \U0000200D \U0001F4BB', - u':man_technologist_medium-dark_skin_tone:': u'\U0001F468 \U0001F3FE \U0000200D \U0001F4BB', - u':man_technologist_medium-light_skin_tone:': u'\U0001F468 \U0001F3FC \U0000200D \U0001F4BB', - u':man_technologist_medium_skin_tone:': u'\U0001F468 \U0001F3FD \U0000200D \U0001F4BB', - u':man_tipping_hand:': u'\U0001F481 \U0000200D \U00002642 \U0000FE0F', - u':man_tipping_hand_dark_skin_tone:': u'\U0001F481 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_tipping_hand_light_skin_tone:': u'\U0001F481 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_tipping_hand_medium-dark_skin_tone:': u'\U0001F481 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_tipping_hand_medium-light_skin_tone:': u'\U0001F481 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_tipping_hand_medium_skin_tone:': u'\U0001F481 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_walking:': u'\U0001F6B6 \U0000200D \U00002642 \U0000FE0F', - u':man_walking_dark_skin_tone:': u'\U0001F6B6 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_walking_light_skin_tone:': u'\U0001F6B6 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_walking_medium-dark_skin_tone:': u'\U0001F6B6 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_walking_medium-light_skin_tone:': u'\U0001F6B6 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_walking_medium_skin_tone:': u'\U0001F6B6 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_wearing_turban:': u'\U0001F473 \U0000200D \U00002642 \U0000FE0F', - u':man_wearing_turban_dark_skin_tone:': u'\U0001F473 \U0001F3FF \U0000200D \U00002642 \U0000FE0F', - u':man_wearing_turban_light_skin_tone:': u'\U0001F473 \U0001F3FB \U0000200D \U00002642 \U0000FE0F', - u':man_wearing_turban_medium-dark_skin_tone:': u'\U0001F473 \U0001F3FE \U0000200D \U00002642 \U0000FE0F', - u':man_wearing_turban_medium-light_skin_tone:': u'\U0001F473 \U0001F3FC \U0000200D \U00002642 \U0000FE0F', - u':man_wearing_turban_medium_skin_tone:': u'\U0001F473 \U0001F3FD \U0000200D \U00002642 \U0000FE0F', - u':man_with_Chinese_cap:': u'\U0001F472', - u':man_with_Chinese_cap_dark_skin_tone:': u'\U0001F472 \U0001F3FF', - u':man_with_Chinese_cap_light_skin_tone:': u'\U0001F472 \U0001F3FB', - u':man_with_Chinese_cap_medium-dark_skin_tone:': u'\U0001F472 \U0001F3FE', - u':man_with_Chinese_cap_medium-light_skin_tone:': u'\U0001F472 \U0001F3FC', - u':man_with_Chinese_cap_medium_skin_tone:': u'\U0001F472 \U0001F3FD', - u':mantelpiece_clock:': u'\U0001F570', - u':man’s_shoe:': u'\U0001F45E', - u':map_of_Japan:': u'\U0001F5FE', - u':maple_leaf:': u'\U0001F341', - u':martial_arts_uniform:': u'\U0001F94B', - u':meat_on_bone:': u'\U0001F356', - u':medical_symbol:': u'\U00002695', - u':medium-dark_skin_tone:': u'\U0001F3FE', - u':medium-light_skin_tone:': u'\U0001F3FC', - u':medium_skin_tone:': u'\U0001F3FD', - u':megaphone:': u'\U0001F4E3', - u':melon:': u'\U0001F348', - u':memo:': u'\U0001F4DD', - u':men_with_bunny_ears_partying:': u'\U0001F46F \U0000200D \U00002642 \U0000FE0F', - u':men_wrestling:': u'\U0001F93C \U0000200D \U00002642 \U0000FE0F', - u':menorah:': u'\U0001F54E', - u':men’s_room:': u'\U0001F6B9', - u':metro:': u'\U0001F687', - u':microphone:': u'\U0001F3A4', - u':microscope:': u'\U0001F52C', - u':middle_finger:': u'\U0001F595', - u':middle_finger_dark_skin_tone:': u'\U0001F595 \U0001F3FF', - u':middle_finger_light_skin_tone:': u'\U0001F595 \U0001F3FB', - u':middle_finger_medium-dark_skin_tone:': u'\U0001F595 \U0001F3FE', - u':middle_finger_medium-light_skin_tone:': u'\U0001F595 \U0001F3FC', - u':middle_finger_medium_skin_tone:': u'\U0001F595 \U0001F3FD', - u':military_medal:': u'\U0001F396', - u':milky_way:': u'\U0001F30C', - u':minibus:': u'\U0001F690', - u':moai:': u'\U0001F5FF', - u':mobile_phone:': u'\U0001F4F1', - u':mobile_phone_off:': u'\U0001F4F4', - u':mobile_phone_with_arrow:': u'\U0001F4F2', - u':money-mouth_face:': u'\U0001F911', - u':money_bag:': u'\U0001F4B0', - u':money_with_wings:': u'\U0001F4B8', - u':monkey:': u'\U0001F412', - u':monkey_face:': u'\U0001F435', - u':monorail:': u'\U0001F69D', - u':moon_viewing_ceremony:': u'\U0001F391', - u':mosque:': u'\U0001F54C', - u':motor_boat:': u'\U0001F6E5', - u':motor_scooter:': u'\U0001F6F5', - u':motorcycle:': u'\U0001F3CD', - u':motorway:': u'\U0001F6E3', - u':mount_fuji:': u'\U0001F5FB', - u':mountain:': u'\U000026F0', - u':mountain_cableway:': u'\U0001F6A0', - u':mountain_railway:': u'\U0001F69E', - u':mouse:': u'\U0001F401', - u':mouse_face:': u'\U0001F42D', - u':mouth:': u'\U0001F444', - u':movie_camera:': u'\U0001F3A5', - u':mushroom:': u'\U0001F344', - u':musical_keyboard:': u'\U0001F3B9', - u':musical_note:': u'\U0001F3B5', - u':musical_notes:': u'\U0001F3B6', - u':musical_score:': u'\U0001F3BC', - u':muted_speaker:': u'\U0001F507', - u':nail_polish:': u'\U0001F485', - u':nail_polish_dark_skin_tone:': u'\U0001F485 \U0001F3FF', - u':nail_polish_light_skin_tone:': u'\U0001F485 \U0001F3FB', - u':nail_polish_medium-dark_skin_tone:': u'\U0001F485 \U0001F3FE', - u':nail_polish_medium-light_skin_tone:': u'\U0001F485 \U0001F3FC', - u':nail_polish_medium_skin_tone:': u'\U0001F485 \U0001F3FD', - u':name_badge:': u'\U0001F4DB', - u':national_park:': u'\U0001F3DE', - u':nauseated_face:': u'\U0001F922', - u':necktie:': u'\U0001F454', - u':nerd_face:': u'\U0001F913', - u':neutral_face:': u'\U0001F610', - u':new_moon:': u'\U0001F311', - u':new_moon_face:': u'\U0001F31A', - u':newspaper:': u'\U0001F4F0', - u':next_track_button:': u'\U000023ED', - u':night_with_stars:': u'\U0001F303', - u':nine-thirty:': u'\U0001F564', - u':nine_o’clock:': u'\U0001F558', - u':no_bicycles:': u'\U0001F6B3', - u':no_entry:': u'\U000026D4', - u':no_littering:': u'\U0001F6AF', - u':no_mobile_phones:': u'\U0001F4F5', - u':no_one_under_eighteen:': u'\U0001F51E', - u':no_pedestrians:': u'\U0001F6B7', - u':no_smoking:': u'\U0001F6AD', - u':non-potable_water:': u'\U0001F6B1', - u':nose:': u'\U0001F443', - u':nose_dark_skin_tone:': u'\U0001F443 \U0001F3FF', - u':nose_light_skin_tone:': u'\U0001F443 \U0001F3FB', - u':nose_medium-dark_skin_tone:': u'\U0001F443 \U0001F3FE', - u':nose_medium-light_skin_tone:': u'\U0001F443 \U0001F3FC', - u':nose_medium_skin_tone:': u'\U0001F443 \U0001F3FD', - u':notebook:': u'\U0001F4D3', - u':notebook_with_decorative_cover:': u'\U0001F4D4', - u':nut_and_bolt:': u'\U0001F529', - u':octopus:': u'\U0001F419', - u':oden:': u'\U0001F362', - u':office_building:': u'\U0001F3E2', - u':ogre:': u'\U0001F479', - u':oil_drum:': u'\U0001F6E2', - u':old_key:': u'\U0001F5DD', - u':old_man:': u'\U0001F474', - u':old_man_dark_skin_tone:': u'\U0001F474 \U0001F3FF', - u':old_man_light_skin_tone:': u'\U0001F474 \U0001F3FB', - u':old_man_medium-dark_skin_tone:': u'\U0001F474 \U0001F3FE', - u':old_man_medium-light_skin_tone:': u'\U0001F474 \U0001F3FC', - u':old_man_medium_skin_tone:': u'\U0001F474 \U0001F3FD', - u':old_woman:': u'\U0001F475', - u':old_woman_dark_skin_tone:': u'\U0001F475 \U0001F3FF', - u':old_woman_light_skin_tone:': u'\U0001F475 \U0001F3FB', - u':old_woman_medium-dark_skin_tone:': u'\U0001F475 \U0001F3FE', - u':old_woman_medium-light_skin_tone:': u'\U0001F475 \U0001F3FC', - u':old_woman_medium_skin_tone:': u'\U0001F475 \U0001F3FD', - u':om:': u'\U0001F549', - u':oncoming_automobile:': u'\U0001F698', - u':oncoming_bus:': u'\U0001F68D', - u':oncoming_fist:': u'\U0001F44A', - u':oncoming_fist_dark_skin_tone:': u'\U0001F44A \U0001F3FF', - u':oncoming_fist_light_skin_tone:': u'\U0001F44A \U0001F3FB', - u':oncoming_fist_medium-dark_skin_tone:': u'\U0001F44A \U0001F3FE', - u':oncoming_fist_medium-light_skin_tone:': u'\U0001F44A \U0001F3FC', - u':oncoming_fist_medium_skin_tone:': u'\U0001F44A \U0001F3FD', - u':oncoming_police_car:': u'\U0001F694', - u':oncoming_taxi:': u'\U0001F696', - u':one-thirty:': u'\U0001F55C', - u':one_o’clock:': u'\U0001F550', - u':open_book:': u'\U0001F4D6', - u':open_file_folder:': u'\U0001F4C2', - u':open_hands:': u'\U0001F450', - u':open_hands_dark_skin_tone:': u'\U0001F450 \U0001F3FF', - u':open_hands_light_skin_tone:': u'\U0001F450 \U0001F3FB', - u':open_hands_medium-dark_skin_tone:': u'\U0001F450 \U0001F3FE', - u':open_hands_medium-light_skin_tone:': u'\U0001F450 \U0001F3FC', - u':open_hands_medium_skin_tone:': u'\U0001F450 \U0001F3FD', - u':open_mailbox_with_lowered_flag:': u'\U0001F4ED', - u':open_mailbox_with_raised_flag:': u'\U0001F4EC', - u':optical_disk:': u'\U0001F4BF', - u':orange_book:': u'\U0001F4D9', - u':orthodox_cross:': u'\U00002626', - u':outbox_tray:': u'\U0001F4E4', - u':owl:': u'\U0001F989', - u':ox:': u'\U0001F402', - u':package:': u'\U0001F4E6', - u':page_facing_up:': u'\U0001F4C4', - u':page_with_curl:': u'\U0001F4C3', - u':pager:': u'\U0001F4DF', - u':paintbrush:': u'\U0001F58C', - u':palm_tree:': u'\U0001F334', - u':pancakes:': u'\U0001F95E', - u':panda_face:': u'\U0001F43C', - u':paperclip:': u'\U0001F4CE', - u':part_alternation_mark:': u'\U0000303D', - u':party_popper:': u'\U0001F389', - u':passenger_ship:': u'\U0001F6F3', - u':passport_control:': u'\U0001F6C2', - u':pause_button:': u'\U000023F8', - u':paw_prints:': u'\U0001F43E', - u':peace_symbol:': u'\U0000262E', - u':peach:': u'\U0001F351', - u':peanuts:': u'\U0001F95C', - u':pear:': u'\U0001F350', - u':pen:': u'\U0001F58A', - u':pencil:': u'\U0000270F', - u':penguin:': u'\U0001F427', - u':pensive_face:': u'\U0001F614', - u':people_with_bunny_ears_partying:': u'\U0001F46F', - u':people_wrestling:': u'\U0001F93C', - u':performing_arts:': u'\U0001F3AD', - u':persevering_face:': u'\U0001F623', - u':person_biking:': u'\U0001F6B4', - u':person_biking_dark_skin_tone:': u'\U0001F6B4 \U0001F3FF', - u':person_biking_light_skin_tone:': u'\U0001F6B4 \U0001F3FB', - u':person_biking_medium-dark_skin_tone:': u'\U0001F6B4 \U0001F3FE', - u':person_biking_medium-light_skin_tone:': u'\U0001F6B4 \U0001F3FC', - u':person_biking_medium_skin_tone:': u'\U0001F6B4 \U0001F3FD', - u':person_bouncing_ball:': u'\U000026F9', - u':person_bouncing_ball_dark_skin_tone:': u'\U000026F9 \U0001F3FF', - u':person_bouncing_ball_light_skin_tone:': u'\U000026F9 \U0001F3FB', - u':person_bouncing_ball_medium-dark_skin_tone:': u'\U000026F9 \U0001F3FE', - u':person_bouncing_ball_medium-light_skin_tone:': u'\U000026F9 \U0001F3FC', - u':person_bouncing_ball_medium_skin_tone:': u'\U000026F9 \U0001F3FD', - u':person_bowing:': u'\U0001F647', - u':person_bowing_dark_skin_tone:': u'\U0001F647 \U0001F3FF', - u':person_bowing_light_skin_tone:': u'\U0001F647 \U0001F3FB', - u':person_bowing_medium-dark_skin_tone:': u'\U0001F647 \U0001F3FE', - u':person_bowing_medium-light_skin_tone:': u'\U0001F647 \U0001F3FC', - u':person_bowing_medium_skin_tone:': u'\U0001F647 \U0001F3FD', - u':person_cartwheeling:': u'\U0001F938', - u':person_cartwheeling_dark_skin_tone:': u'\U0001F938 \U0001F3FF', - u':person_cartwheeling_light_skin_tone:': u'\U0001F938 \U0001F3FB', - u':person_cartwheeling_medium-dark_skin_tone:': u'\U0001F938 \U0001F3FE', - u':person_cartwheeling_medium-light_skin_tone:': u'\U0001F938 \U0001F3FC', - u':person_cartwheeling_medium_skin_tone:': u'\U0001F938 \U0001F3FD', - u':person_facepalming:': u'\U0001F926', - u':person_facepalming_dark_skin_tone:': u'\U0001F926 \U0001F3FF', - u':person_facepalming_light_skin_tone:': u'\U0001F926 \U0001F3FB', - u':person_facepalming_medium-dark_skin_tone:': u'\U0001F926 \U0001F3FE', - u':person_facepalming_medium-light_skin_tone:': u'\U0001F926 \U0001F3FC', - u':person_facepalming_medium_skin_tone:': u'\U0001F926 \U0001F3FD', - u':person_fencing:': u'\U0001F93A', - u':person_frowning:': u'\U0001F64D', - u':person_frowning_dark_skin_tone:': u'\U0001F64D \U0001F3FF', - u':person_frowning_light_skin_tone:': u'\U0001F64D \U0001F3FB', - u':person_frowning_medium-dark_skin_tone:': u'\U0001F64D \U0001F3FE', - u':person_frowning_medium-light_skin_tone:': u'\U0001F64D \U0001F3FC', - u':person_frowning_medium_skin_tone:': u'\U0001F64D \U0001F3FD', - u':person_gesturing_NO:': u'\U0001F645', - u':person_gesturing_NO_dark_skin_tone:': u'\U0001F645 \U0001F3FF', - u':person_gesturing_NO_light_skin_tone:': u'\U0001F645 \U0001F3FB', - u':person_gesturing_NO_medium-dark_skin_tone:': u'\U0001F645 \U0001F3FE', - u':person_gesturing_NO_medium-light_skin_tone:': u'\U0001F645 \U0001F3FC', - u':person_gesturing_NO_medium_skin_tone:': u'\U0001F645 \U0001F3FD', - u':person_gesturing_OK:': u'\U0001F646', - u':person_gesturing_OK_dark_skin_tone:': u'\U0001F646 \U0001F3FF', - u':person_gesturing_OK_light_skin_tone:': u'\U0001F646 \U0001F3FB', - u':person_gesturing_OK_medium-dark_skin_tone:': u'\U0001F646 \U0001F3FE', - u':person_gesturing_OK_medium-light_skin_tone:': u'\U0001F646 \U0001F3FC', - u':person_gesturing_OK_medium_skin_tone:': u'\U0001F646 \U0001F3FD', - u':person_getting_haircut:': u'\U0001F487', - u':person_getting_haircut_dark_skin_tone:': u'\U0001F487 \U0001F3FF', - u':person_getting_haircut_light_skin_tone:': u'\U0001F487 \U0001F3FB', - u':person_getting_haircut_medium-dark_skin_tone:': u'\U0001F487 \U0001F3FE', - u':person_getting_haircut_medium-light_skin_tone:': u'\U0001F487 \U0001F3FC', - u':person_getting_haircut_medium_skin_tone:': u'\U0001F487 \U0001F3FD', - u':person_getting_massage:': u'\U0001F486', - u':person_getting_massage_dark_skin_tone:': u'\U0001F486 \U0001F3FF', - u':person_getting_massage_light_skin_tone:': u'\U0001F486 \U0001F3FB', - u':person_getting_massage_medium-dark_skin_tone:': u'\U0001F486 \U0001F3FE', - u':person_getting_massage_medium-light_skin_tone:': u'\U0001F486 \U0001F3FC', - u':person_getting_massage_medium_skin_tone:': u'\U0001F486 \U0001F3FD', - u':person_golfing:': u'\U0001F3CC', - u':person_golfing_dark_skin_tone:': u'\U0001F3CC \U0001F3FF', - u':person_golfing_light_skin_tone:': u'\U0001F3CC \U0001F3FB', - u':person_golfing_medium-dark_skin_tone:': u'\U0001F3CC \U0001F3FE', - u':person_golfing_medium-light_skin_tone:': u'\U0001F3CC \U0001F3FC', - u':person_golfing_medium_skin_tone:': u'\U0001F3CC \U0001F3FD', - u':person_in_bed:': u'\U0001F6CC', - u':person_in_bed_dark_skin_tone:': u'\U0001F6CC \U0001F3FF', - u':person_in_bed_light_skin_tone:': u'\U0001F6CC \U0001F3FB', - u':person_in_bed_medium-dark_skin_tone:': u'\U0001F6CC \U0001F3FE', - u':person_in_bed_medium-light_skin_tone:': u'\U0001F6CC \U0001F3FC', - u':person_in_bed_medium_skin_tone:': u'\U0001F6CC \U0001F3FD', - u':person_juggling:': u'\U0001F939', - u':person_juggling_dark_skin_tone:': u'\U0001F939 \U0001F3FF', - u':person_juggling_light_skin_tone:': u'\U0001F939 \U0001F3FB', - u':person_juggling_medium-dark_skin_tone:': u'\U0001F939 \U0001F3FE', - u':person_juggling_medium-light_skin_tone:': u'\U0001F939 \U0001F3FC', - u':person_juggling_medium_skin_tone:': u'\U0001F939 \U0001F3FD', - u':person_lifting_weights:': u'\U0001F3CB', - u':person_lifting_weights_dark_skin_tone:': u'\U0001F3CB \U0001F3FF', - u':person_lifting_weights_light_skin_tone:': u'\U0001F3CB \U0001F3FB', - u':person_lifting_weights_medium-dark_skin_tone:': u'\U0001F3CB \U0001F3FE', - u':person_lifting_weights_medium-light_skin_tone:': u'\U0001F3CB \U0001F3FC', - u':person_lifting_weights_medium_skin_tone:': u'\U0001F3CB \U0001F3FD', - u':person_mountain_biking:': u'\U0001F6B5', - u':person_mountain_biking_dark_skin_tone:': u'\U0001F6B5 \U0001F3FF', - u':person_mountain_biking_light_skin_tone:': u'\U0001F6B5 \U0001F3FB', - u':person_mountain_biking_medium-dark_skin_tone:': u'\U0001F6B5 \U0001F3FE', - u':person_mountain_biking_medium-light_skin_tone:': u'\U0001F6B5 \U0001F3FC', - u':person_mountain_biking_medium_skin_tone:': u'\U0001F6B5 \U0001F3FD', - u':person_playing_handball:': u'\U0001F93E', - u':person_playing_handball_dark_skin_tone:': u'\U0001F93E \U0001F3FF', - u':person_playing_handball_light_skin_tone:': u'\U0001F93E \U0001F3FB', - u':person_playing_handball_medium-dark_skin_tone:': u'\U0001F93E \U0001F3FE', - u':person_playing_handball_medium-light_skin_tone:': u'\U0001F93E \U0001F3FC', - u':person_playing_handball_medium_skin_tone:': u'\U0001F93E \U0001F3FD', - u':person_playing_water_polo:': u'\U0001F93D', - u':person_playing_water_polo_dark_skin_tone:': u'\U0001F93D \U0001F3FF', - u':person_playing_water_polo_light_skin_tone:': u'\U0001F93D \U0001F3FB', - u':person_playing_water_polo_medium-dark_skin_tone:': u'\U0001F93D \U0001F3FE', - u':person_playing_water_polo_medium-light_skin_tone:': u'\U0001F93D \U0001F3FC', - u':person_playing_water_polo_medium_skin_tone:': u'\U0001F93D \U0001F3FD', - u':person_pouting:': u'\U0001F64E', - u':person_pouting_dark_skin_tone:': u'\U0001F64E \U0001F3FF', - u':person_pouting_light_skin_tone:': u'\U0001F64E \U0001F3FB', - u':person_pouting_medium-dark_skin_tone:': u'\U0001F64E \U0001F3FE', - u':person_pouting_medium-light_skin_tone:': u'\U0001F64E \U0001F3FC', - u':person_pouting_medium_skin_tone:': u'\U0001F64E \U0001F3FD', - u':person_raising_hand:': u'\U0001F64B', - u':person_raising_hand_dark_skin_tone:': u'\U0001F64B \U0001F3FF', - u':person_raising_hand_light_skin_tone:': u'\U0001F64B \U0001F3FB', - u':person_raising_hand_medium-dark_skin_tone:': u'\U0001F64B \U0001F3FE', - u':person_raising_hand_medium-light_skin_tone:': u'\U0001F64B \U0001F3FC', - u':person_raising_hand_medium_skin_tone:': u'\U0001F64B \U0001F3FD', - u':person_rowing_boat:': u'\U0001F6A3', - u':person_rowing_boat_dark_skin_tone:': u'\U0001F6A3 \U0001F3FF', - u':person_rowing_boat_light_skin_tone:': u'\U0001F6A3 \U0001F3FB', - u':person_rowing_boat_medium-dark_skin_tone:': u'\U0001F6A3 \U0001F3FE', - u':person_rowing_boat_medium-light_skin_tone:': u'\U0001F6A3 \U0001F3FC', - u':person_rowing_boat_medium_skin_tone:': u'\U0001F6A3 \U0001F3FD', - u':person_running:': u'\U0001F3C3', - u':person_running_dark_skin_tone:': u'\U0001F3C3 \U0001F3FF', - u':person_running_light_skin_tone:': u'\U0001F3C3 \U0001F3FB', - u':person_running_medium-dark_skin_tone:': u'\U0001F3C3 \U0001F3FE', - u':person_running_medium-light_skin_tone:': u'\U0001F3C3 \U0001F3FC', - u':person_running_medium_skin_tone:': u'\U0001F3C3 \U0001F3FD', - u':person_shrugging:': u'\U0001F937', - u':person_shrugging_dark_skin_tone:': u'\U0001F937 \U0001F3FF', - u':person_shrugging_light_skin_tone:': u'\U0001F937 \U0001F3FB', - u':person_shrugging_medium-dark_skin_tone:': u'\U0001F937 \U0001F3FE', - u':person_shrugging_medium-light_skin_tone:': u'\U0001F937 \U0001F3FC', - u':person_shrugging_medium_skin_tone:': u'\U0001F937 \U0001F3FD', - u':person_surfing:': u'\U0001F3C4', - u':person_surfing_dark_skin_tone:': u'\U0001F3C4 \U0001F3FF', - u':person_surfing_light_skin_tone:': u'\U0001F3C4 \U0001F3FB', - u':person_surfing_medium-dark_skin_tone:': u'\U0001F3C4 \U0001F3FE', - u':person_surfing_medium-light_skin_tone:': u'\U0001F3C4 \U0001F3FC', - u':person_surfing_medium_skin_tone:': u'\U0001F3C4 \U0001F3FD', - u':person_swimming:': u'\U0001F3CA', - u':person_swimming_dark_skin_tone:': u'\U0001F3CA \U0001F3FF', - u':person_swimming_light_skin_tone:': u'\U0001F3CA \U0001F3FB', - u':person_swimming_medium-dark_skin_tone:': u'\U0001F3CA \U0001F3FE', - u':person_swimming_medium-light_skin_tone:': u'\U0001F3CA \U0001F3FC', - u':person_swimming_medium_skin_tone:': u'\U0001F3CA \U0001F3FD', - u':person_taking_bath:': u'\U0001F6C0', - u':person_taking_bath_dark_skin_tone:': u'\U0001F6C0 \U0001F3FF', - u':person_taking_bath_light_skin_tone:': u'\U0001F6C0 \U0001F3FB', - u':person_taking_bath_medium-dark_skin_tone:': u'\U0001F6C0 \U0001F3FE', - u':person_taking_bath_medium-light_skin_tone:': u'\U0001F6C0 \U0001F3FC', - u':person_taking_bath_medium_skin_tone:': u'\U0001F6C0 \U0001F3FD', - u':person_tipping_hand:': u'\U0001F481', - u':person_tipping_hand_dark_skin_tone:': u'\U0001F481 \U0001F3FF', - u':person_tipping_hand_light_skin_tone:': u'\U0001F481 \U0001F3FB', - u':person_tipping_hand_medium-dark_skin_tone:': u'\U0001F481 \U0001F3FE', - u':person_tipping_hand_medium-light_skin_tone:': u'\U0001F481 \U0001F3FC', - u':person_tipping_hand_medium_skin_tone:': u'\U0001F481 \U0001F3FD', - u':person_walking:': u'\U0001F6B6', - u':person_walking_dark_skin_tone:': u'\U0001F6B6 \U0001F3FF', - u':person_walking_light_skin_tone:': u'\U0001F6B6 \U0001F3FB', - u':person_walking_medium-dark_skin_tone:': u'\U0001F6B6 \U0001F3FE', - u':person_walking_medium-light_skin_tone:': u'\U0001F6B6 \U0001F3FC', - u':person_walking_medium_skin_tone:': u'\U0001F6B6 \U0001F3FD', - u':person_wearing_turban:': u'\U0001F473', - u':person_wearing_turban_dark_skin_tone:': u'\U0001F473 \U0001F3FF', - u':person_wearing_turban_light_skin_tone:': u'\U0001F473 \U0001F3FB', - u':person_wearing_turban_medium-dark_skin_tone:': u'\U0001F473 \U0001F3FE', - u':person_wearing_turban_medium-light_skin_tone:': u'\U0001F473 \U0001F3FC', - u':person_wearing_turban_medium_skin_tone:': u'\U0001F473 \U0001F3FD', - u':pick:': u'\U000026CF', - u':pig:': u'\U0001F416', - u':pig_face:': u'\U0001F437', - u':pig_nose:': u'\U0001F43D', - u':pile_of_poo:': u'\U0001F4A9', - u':pill:': u'\U0001F48A', - u':pine_decoration:': u'\U0001F38D', - u':pineapple:': u'\U0001F34D', - u':ping_pong:': u'\U0001F3D3', - u':pistol:': u'\U0001F52B', - u':pizza:': u'\U0001F355', - u':place_of_worship:': u'\U0001F6D0', - u':play_button:': u'\U000025B6', - u':play_or_pause_button:': u'\U000023EF', - u':police_car:': u'\U0001F693', - u':police_car_light:': u'\U0001F6A8', - u':police_officer:': u'\U0001F46E', - u':police_officer_dark_skin_tone:': u'\U0001F46E \U0001F3FF', - u':police_officer_light_skin_tone:': u'\U0001F46E \U0001F3FB', - u':police_officer_medium-dark_skin_tone:': u'\U0001F46E \U0001F3FE', - u':police_officer_medium-light_skin_tone:': u'\U0001F46E \U0001F3FC', - u':police_officer_medium_skin_tone:': u'\U0001F46E \U0001F3FD', - u':poodle:': u'\U0001F429', - u':pool_8_ball:': u'\U0001F3B1', - u':popcorn:': u'\U0001F37F', - u':post_office:': u'\U0001F3E4', - u':postal_horn:': u'\U0001F4EF', - u':postbox:': u'\U0001F4EE', - u':pot_of_food:': u'\U0001F372', - u':potable_water:': u'\U0001F6B0', - u':potato:': u'\U0001F954', - u':poultry_leg:': u'\U0001F357', - u':pound_banknote:': u'\U0001F4B7', - u':pouting_cat_face:': u'\U0001F63E', - u':pouting_face:': u'\U0001F621', - u':prayer_beads:': u'\U0001F4FF', - u':pregnant_woman:': u'\U0001F930', - u':pregnant_woman_dark_skin_tone:': u'\U0001F930 \U0001F3FF', - u':pregnant_woman_light_skin_tone:': u'\U0001F930 \U0001F3FB', - u':pregnant_woman_medium-dark_skin_tone:': u'\U0001F930 \U0001F3FE', - u':pregnant_woman_medium-light_skin_tone:': u'\U0001F930 \U0001F3FC', - u':pregnant_woman_medium_skin_tone:': u'\U0001F930 \U0001F3FD', - u':prince:': u'\U0001F934', - u':prince_dark_skin_tone:': u'\U0001F934 \U0001F3FF', - u':prince_light_skin_tone:': u'\U0001F934 \U0001F3FB', - u':prince_medium-dark_skin_tone:': u'\U0001F934 \U0001F3FE', - u':prince_medium-light_skin_tone:': u'\U0001F934 \U0001F3FC', - u':prince_medium_skin_tone:': u'\U0001F934 \U0001F3FD', - u':princess:': u'\U0001F478', - u':princess_dark_skin_tone:': u'\U0001F478 \U0001F3FF', - u':princess_light_skin_tone:': u'\U0001F478 \U0001F3FB', - u':princess_medium-dark_skin_tone:': u'\U0001F478 \U0001F3FE', - u':princess_medium-light_skin_tone:': u'\U0001F478 \U0001F3FC', - u':princess_medium_skin_tone:': u'\U0001F478 \U0001F3FD', - u':printer:': u'\U0001F5A8', - u':prohibited:': u'\U0001F6AB', - u':purple_heart:': u'\U0001F49C', - u':purse:': u'\U0001F45B', - u':pushpin:': u'\U0001F4CC', - u':question_mark:': u'\U00002753', - u':rabbit:': u'\U0001F407', - u':rabbit_face:': u'\U0001F430', - u':racing_car:': u'\U0001F3CE', - u':radio:': u'\U0001F4FB', - u':radio_button:': u'\U0001F518', - u':radioactive:': u'\U00002622', - u':railway_car:': u'\U0001F683', - u':railway_track:': u'\U0001F6E4', - u':rainbow:': u'\U0001F308', - u':rainbow_flag:': u'\U0001F3F3 \U0000FE0F \U0000200D \U0001F308', - u':raised_back_of_hand:': u'\U0001F91A', - u':raised_back_of_hand_dark_skin_tone:': u'\U0001F91A \U0001F3FF', - u':raised_back_of_hand_light_skin_tone:': u'\U0001F91A \U0001F3FB', - u':raised_back_of_hand_medium-dark_skin_tone:': u'\U0001F91A \U0001F3FE', - u':raised_back_of_hand_medium-light_skin_tone:': u'\U0001F91A \U0001F3FC', - u':raised_back_of_hand_medium_skin_tone:': u'\U0001F91A \U0001F3FD', - u':raised_fist:': u'\U0000270A', - u':raised_fist_dark_skin_tone:': u'\U0000270A \U0001F3FF', - u':raised_fist_light_skin_tone:': u'\U0000270A \U0001F3FB', - u':raised_fist_medium-dark_skin_tone:': u'\U0000270A \U0001F3FE', - u':raised_fist_medium-light_skin_tone:': u'\U0000270A \U0001F3FC', - u':raised_fist_medium_skin_tone:': u'\U0000270A \U0001F3FD', - u':raised_hand:': u'\U0000270B', - u':raised_hand_dark_skin_tone:': u'\U0000270B \U0001F3FF', - u':raised_hand_light_skin_tone:': u'\U0000270B \U0001F3FB', - u':raised_hand_medium-dark_skin_tone:': u'\U0000270B \U0001F3FE', - u':raised_hand_medium-light_skin_tone:': u'\U0000270B \U0001F3FC', - u':raised_hand_medium_skin_tone:': u'\U0000270B \U0001F3FD', - u':raised_hand_with_fingers_splayed:': u'\U0001F590', - u':raised_hand_with_fingers_splayed_dark_skin_tone:': u'\U0001F590 \U0001F3FF', - u':raised_hand_with_fingers_splayed_light_skin_tone:': u'\U0001F590 \U0001F3FB', - u':raised_hand_with_fingers_splayed_medium-dark_skin_tone:': u'\U0001F590 \U0001F3FE', - u':raised_hand_with_fingers_splayed_medium-light_skin_tone:': u'\U0001F590 \U0001F3FC', - u':raised_hand_with_fingers_splayed_medium_skin_tone:': u'\U0001F590 \U0001F3FD', - u':raising_hands:': u'\U0001F64C', - u':raising_hands_dark_skin_tone:': u'\U0001F64C \U0001F3FF', - u':raising_hands_light_skin_tone:': u'\U0001F64C \U0001F3FB', - u':raising_hands_medium-dark_skin_tone:': u'\U0001F64C \U0001F3FE', - u':raising_hands_medium-light_skin_tone:': u'\U0001F64C \U0001F3FC', - u':raising_hands_medium_skin_tone:': u'\U0001F64C \U0001F3FD', - u':ram:': u'\U0001F40F', - u':rat:': u'\U0001F400', - u':record_button:': u'\U000023FA', - u':recycling_symbol:': u'\U0000267B', - u':red_apple:': u'\U0001F34E', - u':red_circle:': u'\U0001F534', - u':red_heart:': u'\U00002764', - u':red_paper_lantern:': u'\U0001F3EE', - u':red_triangle_pointed_down:': u'\U0001F53B', - u':red_triangle_pointed_up:': u'\U0001F53A', - u':registered:': u'\U000000AE', - u':relieved_face:': u'\U0001F60C', - u':reminder_ribbon:': u'\U0001F397', - u':repeat_button:': u'\U0001F501', - u':repeat_single_button:': u'\U0001F502', - u':rescue_worker’s_helmet:': u'\U000026D1', - u':restroom:': u'\U0001F6BB', - u':reverse_button:': u'\U000025C0', - u':revolving_hearts:': u'\U0001F49E', - u':rhinoceros:': u'\U0001F98F', - u':ribbon:': u'\U0001F380', - u':rice_ball:': u'\U0001F359', - u':rice_cracker:': u'\U0001F358', - u':right-facing_fist:': u'\U0001F91C', - u':right-facing_fist_dark_skin_tone:': u'\U0001F91C \U0001F3FF', - u':right-facing_fist_light_skin_tone:': u'\U0001F91C \U0001F3FB', - u':right-facing_fist_medium-dark_skin_tone:': u'\U0001F91C \U0001F3FE', - u':right-facing_fist_medium-light_skin_tone:': u'\U0001F91C \U0001F3FC', - u':right-facing_fist_medium_skin_tone:': u'\U0001F91C \U0001F3FD', - u':right-pointing_magnifying_glass:': u'\U0001F50E', - u':right_anger_bubble:': u'\U0001F5EF', - u':right_arrow:': u'\U000027A1', - u':right_arrow_curving_down:': u'\U00002935', - u':right_arrow_curving_left:': u'\U000021A9', - u':right_arrow_curving_up:': u'\U00002934', - u':ring:': u'\U0001F48D', - u':roasted_sweet_potato:': u'\U0001F360', - u':robot_face:': u'\U0001F916', - u':rocket:': u'\U0001F680', - u':rolled-up_newspaper:': u'\U0001F5DE', - u':roller_coaster:': u'\U0001F3A2', - u':rolling_on_the_floor_laughing:': u'\U0001F923', - u':rooster:': u'\U0001F413', - u':rose:': u'\U0001F339', - u':rosette:': u'\U0001F3F5', - u':round_pushpin:': u'\U0001F4CD', - u':rugby_football:': u'\U0001F3C9', - u':running_shirt:': u'\U0001F3BD', - u':running_shoe:': u'\U0001F45F', - u':sailboat:': u'\U000026F5', - u':sake:': u'\U0001F376', - u':satellite:': u'\U0001F6F0', - u':satellite_antenna:': u'\U0001F4E1', - u':saxophone:': u'\U0001F3B7', - u':school:': u'\U0001F3EB', - u':school_backpack:': u'\U0001F392', - u':scissors:': u'\U00002702', - u':scorpion:': u'\U0001F982', - u':scroll:': u'\U0001F4DC', - u':seat:': u'\U0001F4BA', - u':see-no-evil_monkey:': u'\U0001F648', - u':seedling:': u'\U0001F331', - u':selfie:': u'\U0001F933', - u':selfie_dark_skin_tone:': u'\U0001F933 \U0001F3FF', - u':selfie_light_skin_tone:': u'\U0001F933 \U0001F3FB', - u':selfie_medium-dark_skin_tone:': u'\U0001F933 \U0001F3FE', - u':selfie_medium-light_skin_tone:': u'\U0001F933 \U0001F3FC', - u':selfie_medium_skin_tone:': u'\U0001F933 \U0001F3FD', - u':seven-thirty:': u'\U0001F562', - u':seven_o’clock:': u'\U0001F556', - u':shallow_pan_of_food:': u'\U0001F958', - u':shamrock:': u'\U00002618', - u':shark:': u'\U0001F988', - u':shaved_ice:': u'\U0001F367', - u':sheaf_of_rice:': u'\U0001F33E', - u':sheep:': u'\U0001F411', - u':shield:': u'\U0001F6E1', - u':shinto_shrine:': u'\U000026E9', - u':ship:': u'\U0001F6A2', - u':shooting_star:': u'\U0001F320', - u':shopping_bags:': u'\U0001F6CD', - u':shopping_cart:': u'\U0001F6D2', - u':shortcake:': u'\U0001F370', - u':shower:': u'\U0001F6BF', - u':shrimp:': u'\U0001F990', - u':shuffle_tracks_button:': u'\U0001F500', - u':sign_of_the_horns:': u'\U0001F918', - u':sign_of_the_horns_dark_skin_tone:': u'\U0001F918 \U0001F3FF', - u':sign_of_the_horns_light_skin_tone:': u'\U0001F918 \U0001F3FB', - u':sign_of_the_horns_medium-dark_skin_tone:': u'\U0001F918 \U0001F3FE', - u':sign_of_the_horns_medium-light_skin_tone:': u'\U0001F918 \U0001F3FC', - u':sign_of_the_horns_medium_skin_tone:': u'\U0001F918 \U0001F3FD', - u':six-thirty:': u'\U0001F561', - u':six_o’clock:': u'\U0001F555', - u':skier:': u'\U000026F7', - u':skis:': u'\U0001F3BF', - u':skull:': u'\U0001F480', - u':skull_and_crossbones:': u'\U00002620', - u':sleeping_face:': u'\U0001F634', - u':sleepy_face:': u'\U0001F62A', - u':slightly_frowning_face:': u'\U0001F641', - u':slightly_smiling_face:': u'\U0001F642', - u':slot_machine:': u'\U0001F3B0', - u':small_airplane:': u'\U0001F6E9', - u':small_blue_diamond:': u'\U0001F539', - u':small_orange_diamond:': u'\U0001F538', - u':smiling_cat_face_with_heart-eyes:': u'\U0001F63B', - u':smiling_cat_face_with_open_mouth:': u'\U0001F63A', - u':smiling_face:': u'\U0000263A', - u':smiling_face_with_halo:': u'\U0001F607', - u':smiling_face_with_heart-eyes:': u'\U0001F60D', - u':smiling_face_with_horns:': u'\U0001F608', - u':smiling_face_with_open_mouth:': u'\U0001F603', - u':smiling_face_with_open_mouth_&_closed_eyes:': u'\U0001F606', - u':smiling_face_with_open_mouth_&_cold_sweat:': u'\U0001F605', - u':smiling_face_with_open_mouth_&_smiling_eyes:': u'\U0001F604', - u':smiling_face_with_smiling_eyes:': u'\U0001F60A', - u':smiling_face_with_sunglasses:': u'\U0001F60E', - u':smirking_face:': u'\U0001F60F', - u':snail:': u'\U0001F40C', - u':snake:': u'\U0001F40D', - u':sneezing_face:': u'\U0001F927', - u':snow-capped_mountain:': u'\U0001F3D4', - u':snowboarder:': u'\U0001F3C2', - u':snowboarder_dark_skin_tone:': u'\U0001F3C2 \U0001F3FF', - u':snowboarder_light_skin_tone:': u'\U0001F3C2 \U0001F3FB', - u':snowboarder_medium-dark_skin_tone:': u'\U0001F3C2 \U0001F3FE', - u':snowboarder_medium-light_skin_tone:': u'\U0001F3C2 \U0001F3FC', - u':snowboarder_medium_skin_tone:': u'\U0001F3C2 \U0001F3FD', - u':snowflake:': u'\U00002744', - u':snowman:': u'\U00002603', - u':snowman_without_snow:': u'\U000026C4', - u':soccer_ball:': u'\U000026BD', - u':soft_ice_cream:': u'\U0001F366', - u':spade_suit:': u'\U00002660', - u':spaghetti:': u'\U0001F35D', - u':sparkle:': u'\U00002747', - u':sparkler:': u'\U0001F387', - u':sparkles:': u'\U00002728', - u':sparkling_heart:': u'\U0001F496', - u':speak-no-evil_monkey:': u'\U0001F64A', - u':speaker_high_volume:': u'\U0001F50A', - u':speaker_low_volume:': u'\U0001F508', - u':speaker_medium_volume:': u'\U0001F509', - u':speaking_head:': u'\U0001F5E3', - u':speech_balloon:': u'\U0001F4AC', - u':speedboat:': u'\U0001F6A4', - u':spider:': u'\U0001F577', - u':spider_web:': u'\U0001F578', - u':spiral_calendar:': u'\U0001F5D3', - u':spiral_notepad:': u'\U0001F5D2', - u':spiral_shell:': u'\U0001F41A', - u':spoon:': u'\U0001F944', - u':sport_utility_vehicle:': u'\U0001F699', - u':sports_medal:': u'\U0001F3C5', - u':spouting_whale:': u'\U0001F433', - u':squid:': u'\U0001F991', - u':stadium:': u'\U0001F3DF', - u':star_and_crescent:': u'\U0000262A', - u':star_of_David:': u'\U00002721', - u':station:': u'\U0001F689', - u':steaming_bowl:': u'\U0001F35C', - u':stop_button:': u'\U000023F9', - u':stop_sign:': u'\U0001F6D1', - u':stopwatch:': u'\U000023F1', - u':straight_ruler:': u'\U0001F4CF', - u':strawberry:': u'\U0001F353', - u':studio_microphone:': u'\U0001F399', - u':stuffed_flatbread:': u'\U0001F959', - u':sun:': u'\U00002600', - u':sun_behind_cloud:': u'\U000026C5', - u':sun_behind_large_cloud:': u'\U0001F325', - u':sun_behind_rain_cloud:': u'\U0001F326', - u':sun_behind_small_cloud:': u'\U0001F324', - u':sun_with_face:': u'\U0001F31E', - u':sunflower:': u'\U0001F33B', - u':sunglasses:': u'\U0001F576', - u':sunrise:': u'\U0001F305', - u':sunrise_over_mountains:': u'\U0001F304', - u':sunset:': u'\U0001F307', - u':sushi:': u'\U0001F363', - u':suspension_railway:': u'\U0001F69F', - u':sweat_droplets:': u'\U0001F4A6', - u':synagogue:': u'\U0001F54D', - u':syringe:': u'\U0001F489', - u':t-shirt:': u'\U0001F455', - u':taco:': u'\U0001F32E', - u':tanabata_tree:': u'\U0001F38B', - u':tangerine:': u'\U0001F34A', - u':taxi:': u'\U0001F695', - u':teacup_without_handle:': u'\U0001F375', - u':tear-off_calendar:': u'\U0001F4C6', - u':telephone:': u'\U0000260E', - u':telephone_receiver:': u'\U0001F4DE', - u':telescope:': u'\U0001F52D', - u':television:': u'\U0001F4FA', - u':ten-thirty:': u'\U0001F565', - u':ten_o’clock:': u'\U0001F559', - u':tennis:': u'\U0001F3BE', - u':tent:': u'\U000026FA', - u':thermometer:': u'\U0001F321', - u':thinking_face:': u'\U0001F914', - u':thought_balloon:': u'\U0001F4AD', - u':three-thirty:': u'\U0001F55E', - u':three_o’clock:': u'\U0001F552', - u':thumbs_down:': u'\U0001F44E', - u':thumbs_down_dark_skin_tone:': u'\U0001F44E \U0001F3FF', - u':thumbs_down_light_skin_tone:': u'\U0001F44E \U0001F3FB', - u':thumbs_down_medium-dark_skin_tone:': u'\U0001F44E \U0001F3FE', - u':thumbs_down_medium-light_skin_tone:': u'\U0001F44E \U0001F3FC', - u':thumbs_down_medium_skin_tone:': u'\U0001F44E \U0001F3FD', - u':thumbs_up:': u'\U0001F44D', - u':thumbs_up_dark_skin_tone:': u'\U0001F44D \U0001F3FF', - u':thumbs_up_light_skin_tone:': u'\U0001F44D \U0001F3FB', - u':thumbs_up_medium-dark_skin_tone:': u'\U0001F44D \U0001F3FE', - u':thumbs_up_medium-light_skin_tone:': u'\U0001F44D \U0001F3FC', - u':thumbs_up_medium_skin_tone:': u'\U0001F44D \U0001F3FD', - u':ticket:': u'\U0001F3AB', - u':tiger:': u'\U0001F405', - u':tiger_face:': u'\U0001F42F', - u':timer_clock:': u'\U000023F2', - u':tired_face:': u'\U0001F62B', - u':toilet:': u'\U0001F6BD', - u':tomato:': u'\U0001F345', - u':tongue:': u'\U0001F445', - u':top_hat:': u'\U0001F3A9', - u':tornado:': u'\U0001F32A', - u':trackball:': u'\U0001F5B2', - u':tractor:': u'\U0001F69C', - u':trade_mark:': u'\U00002122', - u':train:': u'\U0001F686', - u':tram:': u'\U0001F68A', - u':tram_car:': u'\U0001F68B', - u':triangular_flag:': u'\U0001F6A9', - u':triangular_ruler:': u'\U0001F4D0', - u':trident_emblem:': u'\U0001F531', - u':trolleybus:': u'\U0001F68E', - u':trophy:': u'\U0001F3C6', - u':tropical_drink:': u'\U0001F379', - u':tropical_fish:': u'\U0001F420', - u':trumpet:': u'\U0001F3BA', - u':tulip:': u'\U0001F337', - u':tumbler_glass:': u'\U0001F943', - u':turkey:': u'\U0001F983', - u':turtle:': u'\U0001F422', - u':twelve-thirty:': u'\U0001F567', - u':twelve_o’clock:': u'\U0001F55B', - u':two-hump_camel:': u'\U0001F42B', - u':two-thirty:': u'\U0001F55D', - u':two_hearts:': u'\U0001F495', - u':two_men_holding_hands:': u'\U0001F46C', - u':two_o’clock:': u'\U0001F551', - u':two_women_holding_hands:': u'\U0001F46D', - u':umbrella:': u'\U00002602', - u':umbrella_on_ground:': u'\U000026F1', - u':umbrella_with_rain_drops:': u'\U00002614', - u':unamused_face:': u'\U0001F612', - u':unicorn_face:': u'\U0001F984', - u':unlocked:': u'\U0001F513', - u':up-down_arrow:': u'\U00002195', - u':up-left_arrow:': u'\U00002196', - u':up-right_arrow:': u'\U00002197', - u':up_arrow:': u'\U00002B06', - u':up_button:': u'\U0001F53C', - u':upside-down_face:': u'\U0001F643', - u':vertical_traffic_light:': u'\U0001F6A6', - u':vibration_mode:': u'\U0001F4F3', - u':victory_hand:': u'\U0000270C', - u':victory_hand_dark_skin_tone:': u'\U0000270C \U0001F3FF', - u':victory_hand_light_skin_tone:': u'\U0000270C \U0001F3FB', - u':victory_hand_medium-dark_skin_tone:': u'\U0000270C \U0001F3FE', - u':victory_hand_medium-light_skin_tone:': u'\U0000270C \U0001F3FC', - u':victory_hand_medium_skin_tone:': u'\U0000270C \U0001F3FD', - u':video_camera:': u'\U0001F4F9', - u':video_game:': u'\U0001F3AE', - u':videocassette:': u'\U0001F4FC', - u':violin:': u'\U0001F3BB', - u':volcano:': u'\U0001F30B', - u':volleyball:': u'\U0001F3D0', - u':vulcan_salute:': u'\U0001F596', - u':vulcan_salute_dark_skin_tone:': u'\U0001F596 \U0001F3FF', - u':vulcan_salute_light_skin_tone:': u'\U0001F596 \U0001F3FB', - u':vulcan_salute_medium-dark_skin_tone:': u'\U0001F596 \U0001F3FE', - u':vulcan_salute_medium-light_skin_tone:': u'\U0001F596 \U0001F3FC', - u':vulcan_salute_medium_skin_tone:': u'\U0001F596 \U0001F3FD', - u':waning_crescent_moon:': u'\U0001F318', - u':waning_gibbous_moon:': u'\U0001F316', - u':warning:': u'\U000026A0', - u':wastebasket:': u'\U0001F5D1', - u':watch:': u'\U0000231A', - u':water_buffalo:': u'\U0001F403', - u':water_closet:': u'\U0001F6BE', - u':water_wave:': u'\U0001F30A', - u':watermelon:': u'\U0001F349', - u':waving_hand:': u'\U0001F44B', - u':waving_hand_dark_skin_tone:': u'\U0001F44B \U0001F3FF', - u':waving_hand_light_skin_tone:': u'\U0001F44B \U0001F3FB', - u':waving_hand_medium-dark_skin_tone:': u'\U0001F44B \U0001F3FE', - u':waving_hand_medium-light_skin_tone:': u'\U0001F44B \U0001F3FC', - u':waving_hand_medium_skin_tone:': u'\U0001F44B \U0001F3FD', - u':wavy_dash:': u'\U00003030', - u':waxing_crescent_moon:': u'\U0001F312', - u':waxing_gibbous_moon:': u'\U0001F314', - u':weary_cat_face:': u'\U0001F640', - u':weary_face:': u'\U0001F629', - u':wedding:': u'\U0001F492', - u':whale:': u'\U0001F40B', - u':wheel_of_dharma:': u'\U00002638', - u':wheelchair_symbol:': u'\U0000267F', - u':white_circle:': u'\U000026AA', - u':white_exclamation_mark:': u'\U00002755', - u':white_flag:': u'\U0001F3F3', - u':white_flower:': u'\U0001F4AE', - u':white_heavy_check_mark:': u'\U00002705', - u':white_large_square:': u'\U00002B1C', - u':white_medium-small_square:': u'\U000025FD', - u':white_medium_square:': u'\U000025FB', - u':white_medium_star:': u'\U00002B50', - u':white_question_mark:': u'\U00002754', - u':white_small_square:': u'\U000025AB', - u':white_square_button:': u'\U0001F533', - u':wilted_flower:': u'\U0001F940', - u':wind_chime:': u'\U0001F390', - u':wind_face:': u'\U0001F32C', - u':wine_glass:': u'\U0001F377', - u':winking_face:': u'\U0001F609', - u':wolf_face:': u'\U0001F43A', - u':woman:': u'\U0001F469', - u':woman_artist:': u'\U0001F469 \U0000200D \U0001F3A8', - u':woman_artist_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F3A8', - u':woman_artist_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F3A8', - u':woman_artist_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F3A8', - u':woman_artist_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F3A8', - u':woman_artist_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F3A8', - u':woman_astronaut:': u'\U0001F469 \U0000200D \U0001F680', - u':woman_astronaut_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F680', - u':woman_astronaut_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F680', - u':woman_astronaut_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F680', - u':woman_astronaut_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F680', - u':woman_astronaut_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F680', - u':woman_biking:': u'\U0001F6B4 \U0000200D \U00002640 \U0000FE0F', - u':woman_biking_dark_skin_tone:': u'\U0001F6B4 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_biking_light_skin_tone:': u'\U0001F6B4 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_biking_medium-dark_skin_tone:': u'\U0001F6B4 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_biking_medium-light_skin_tone:': u'\U0001F6B4 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_biking_medium_skin_tone:': u'\U0001F6B4 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_bouncing_ball:': u'\U000026F9 \U0000FE0F \U0000200D \U00002640 \U0000FE0F', - u':woman_bouncing_ball_dark_skin_tone:': u'\U000026F9 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_bouncing_ball_light_skin_tone:': u'\U000026F9 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_bouncing_ball_medium-dark_skin_tone:': u'\U000026F9 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_bouncing_ball_medium-light_skin_tone:': u'\U000026F9 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_bouncing_ball_medium_skin_tone:': u'\U000026F9 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_bowing:': u'\U0001F647 \U0000200D \U00002640 \U0000FE0F', - u':woman_bowing_dark_skin_tone:': u'\U0001F647 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_bowing_light_skin_tone:': u'\U0001F647 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_bowing_medium-dark_skin_tone:': u'\U0001F647 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_bowing_medium-light_skin_tone:': u'\U0001F647 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_bowing_medium_skin_tone:': u'\U0001F647 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_cartwheeling:': u'\U0001F938 \U0000200D \U00002640 \U0000FE0F', - u':woman_cartwheeling_dark_skin_tone:': u'\U0001F938 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_cartwheeling_light_skin_tone:': u'\U0001F938 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_cartwheeling_medium-dark_skin_tone:': u'\U0001F938 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_cartwheeling_medium-light_skin_tone:': u'\U0001F938 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_cartwheeling_medium_skin_tone:': u'\U0001F938 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_construction_worker:': u'\U0001F477 \U0000200D \U00002640 \U0000FE0F', - u':woman_construction_worker_dark_skin_tone:': u'\U0001F477 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_construction_worker_light_skin_tone:': u'\U0001F477 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_construction_worker_medium-dark_skin_tone:': u'\U0001F477 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_construction_worker_medium-light_skin_tone:': u'\U0001F477 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_construction_worker_medium_skin_tone:': u'\U0001F477 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_cook:': u'\U0001F469 \U0000200D \U0001F373', - u':woman_cook_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F373', - u':woman_cook_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F373', - u':woman_cook_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F373', - u':woman_cook_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F373', - u':woman_cook_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F373', - u':woman_dancing:': u'\U0001F483', - u':woman_dancing_dark_skin_tone:': u'\U0001F483 \U0001F3FF', - u':woman_dancing_light_skin_tone:': u'\U0001F483 \U0001F3FB', - u':woman_dancing_medium-dark_skin_tone:': u'\U0001F483 \U0001F3FE', - u':woman_dancing_medium-light_skin_tone:': u'\U0001F483 \U0001F3FC', - u':woman_dancing_medium_skin_tone:': u'\U0001F483 \U0001F3FD', - u':woman_dark_skin_tone:': u'\U0001F469 \U0001F3FF', - u':woman_detective:': u'\U0001F575 \U0000FE0F \U0000200D \U00002640 \U0000FE0F', - u':woman_detective_dark_skin_tone:': u'\U0001F575 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_detective_light_skin_tone:': u'\U0001F575 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_detective_medium-dark_skin_tone:': u'\U0001F575 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_detective_medium-light_skin_tone:': u'\U0001F575 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_detective_medium_skin_tone:': u'\U0001F575 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_facepalming:': u'\U0001F926 \U0000200D \U00002640 \U0000FE0F', - u':woman_facepalming_dark_skin_tone:': u'\U0001F926 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_facepalming_light_skin_tone:': u'\U0001F926 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_facepalming_medium-dark_skin_tone:': u'\U0001F926 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_facepalming_medium-light_skin_tone:': u'\U0001F926 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_facepalming_medium_skin_tone:': u'\U0001F926 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_factory_worker:': u'\U0001F469 \U0000200D \U0001F3ED', - u':woman_factory_worker_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F3ED', - u':woman_factory_worker_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F3ED', - u':woman_factory_worker_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F3ED', - u':woman_factory_worker_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F3ED', - u':woman_factory_worker_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F3ED', - u':woman_farmer:': u'\U0001F469 \U0000200D \U0001F33E', - u':woman_farmer_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F33E', - u':woman_farmer_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F33E', - u':woman_farmer_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F33E', - u':woman_farmer_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F33E', - u':woman_farmer_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F33E', - u':woman_firefighter:': u'\U0001F469 \U0000200D \U0001F692', - u':woman_firefighter_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F692', - u':woman_firefighter_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F692', - u':woman_firefighter_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F692', - u':woman_firefighter_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F692', - u':woman_firefighter_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F692', - u':woman_frowning:': u'\U0001F64D \U0000200D \U00002640 \U0000FE0F', - u':woman_frowning_dark_skin_tone:': u'\U0001F64D \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_frowning_light_skin_tone:': u'\U0001F64D \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_frowning_medium-dark_skin_tone:': u'\U0001F64D \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_frowning_medium-light_skin_tone:': u'\U0001F64D \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_frowning_medium_skin_tone:': u'\U0001F64D \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_gesturing_NO:': u'\U0001F645 \U0000200D \U00002640 \U0000FE0F', - u':woman_gesturing_NO_dark_skin_tone:': u'\U0001F645 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_gesturing_NO_light_skin_tone:': u'\U0001F645 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_gesturing_NO_medium-dark_skin_tone:': u'\U0001F645 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_gesturing_NO_medium-light_skin_tone:': u'\U0001F645 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_gesturing_NO_medium_skin_tone:': u'\U0001F645 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_gesturing_OK:': u'\U0001F646 \U0000200D \U00002640 \U0000FE0F', - u':woman_gesturing_OK_dark_skin_tone:': u'\U0001F646 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_gesturing_OK_light_skin_tone:': u'\U0001F646 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_gesturing_OK_medium-dark_skin_tone:': u'\U0001F646 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_gesturing_OK_medium-light_skin_tone:': u'\U0001F646 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_gesturing_OK_medium_skin_tone:': u'\U0001F646 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_getting_haircut:': u'\U0001F487 \U0000200D \U00002640 \U0000FE0F', - u':woman_getting_haircut_dark_skin_tone:': u'\U0001F487 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_getting_haircut_light_skin_tone:': u'\U0001F487 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_getting_haircut_medium-dark_skin_tone:': u'\U0001F487 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_getting_haircut_medium-light_skin_tone:': u'\U0001F487 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_getting_haircut_medium_skin_tone:': u'\U0001F487 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_getting_massage:': u'\U0001F486 \U0000200D \U00002640 \U0000FE0F', - u':woman_getting_massage_dark_skin_tone:': u'\U0001F486 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_getting_massage_light_skin_tone:': u'\U0001F486 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_getting_massage_medium-dark_skin_tone:': u'\U0001F486 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_getting_massage_medium-light_skin_tone:': u'\U0001F486 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_getting_massage_medium_skin_tone:': u'\U0001F486 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_golfing:': u'\U0001F3CC \U0000FE0F \U0000200D \U00002640 \U0000FE0F', - u':woman_golfing_dark_skin_tone:': u'\U0001F3CC \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_golfing_light_skin_tone:': u'\U0001F3CC \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_golfing_medium-dark_skin_tone:': u'\U0001F3CC \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_golfing_medium-light_skin_tone:': u'\U0001F3CC \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_golfing_medium_skin_tone:': u'\U0001F3CC \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_guard:': u'\U0001F482 \U0000200D \U00002640 \U0000FE0F', - u':woman_guard_dark_skin_tone:': u'\U0001F482 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_guard_light_skin_tone:': u'\U0001F482 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_guard_medium-dark_skin_tone:': u'\U0001F482 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_guard_medium-light_skin_tone:': u'\U0001F482 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_guard_medium_skin_tone:': u'\U0001F482 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_health_worker:': u'\U0001F469 \U0000200D \U00002695 \U0000FE0F', - u':woman_health_worker_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U00002695 \U0000FE0F', - u':woman_health_worker_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U00002695 \U0000FE0F', - u':woman_health_worker_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U00002695 \U0000FE0F', - u':woman_health_worker_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U00002695 \U0000FE0F', - u':woman_health_worker_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U00002695 \U0000FE0F', - u':woman_judge:': u'\U0001F469 \U0000200D \U00002696 \U0000FE0F', - u':woman_judge_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U00002696 \U0000FE0F', - u':woman_judge_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U00002696 \U0000FE0F', - u':woman_judge_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U00002696 \U0000FE0F', - u':woman_judge_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U00002696 \U0000FE0F', - u':woman_judge_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U00002696 \U0000FE0F', - u':woman_juggling:': u'\U0001F939 \U0000200D \U00002640 \U0000FE0F', - u':woman_juggling_dark_skin_tone:': u'\U0001F939 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_juggling_light_skin_tone:': u'\U0001F939 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_juggling_medium-dark_skin_tone:': u'\U0001F939 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_juggling_medium-light_skin_tone:': u'\U0001F939 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_juggling_medium_skin_tone:': u'\U0001F939 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_lifting_weights:': u'\U0001F3CB \U0000FE0F \U0000200D \U00002640 \U0000FE0F', - u':woman_lifting_weights_dark_skin_tone:': u'\U0001F3CB \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_lifting_weights_light_skin_tone:': u'\U0001F3CB \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_lifting_weights_medium-dark_skin_tone:': u'\U0001F3CB \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_lifting_weights_medium-light_skin_tone:': u'\U0001F3CB \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_lifting_weights_medium_skin_tone:': u'\U0001F3CB \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_light_skin_tone:': u'\U0001F469 \U0001F3FB', - u':woman_mechanic:': u'\U0001F469 \U0000200D \U0001F527', - u':woman_mechanic_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F527', - u':woman_mechanic_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F527', - u':woman_mechanic_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F527', - u':woman_mechanic_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F527', - u':woman_mechanic_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F527', - u':woman_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE', - u':woman_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC', - u':woman_medium_skin_tone:': u'\U0001F469 \U0001F3FD', - u':woman_mountain_biking:': u'\U0001F6B5 \U0000200D \U00002640 \U0000FE0F', - u':woman_mountain_biking_dark_skin_tone:': u'\U0001F6B5 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_mountain_biking_light_skin_tone:': u'\U0001F6B5 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_mountain_biking_medium-dark_skin_tone:': u'\U0001F6B5 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_mountain_biking_medium-light_skin_tone:': u'\U0001F6B5 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_mountain_biking_medium_skin_tone:': u'\U0001F6B5 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_office_worker:': u'\U0001F469 \U0000200D \U0001F4BC', - u':woman_office_worker_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F4BC', - u':woman_office_worker_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F4BC', - u':woman_office_worker_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F4BC', - u':woman_office_worker_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F4BC', - u':woman_office_worker_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F4BC', - u':woman_pilot:': u'\U0001F469 \U0000200D \U00002708 \U0000FE0F', - u':woman_pilot_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U00002708 \U0000FE0F', - u':woman_pilot_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U00002708 \U0000FE0F', - u':woman_pilot_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U00002708 \U0000FE0F', - u':woman_pilot_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U00002708 \U0000FE0F', - u':woman_pilot_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U00002708 \U0000FE0F', - u':woman_playing_handball:': u'\U0001F93E \U0000200D \U00002640 \U0000FE0F', - u':woman_playing_handball_dark_skin_tone:': u'\U0001F93E \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_playing_handball_light_skin_tone:': u'\U0001F93E \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_playing_handball_medium-dark_skin_tone:': u'\U0001F93E \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_playing_handball_medium-light_skin_tone:': u'\U0001F93E \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_playing_handball_medium_skin_tone:': u'\U0001F93E \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_playing_water_polo:': u'\U0001F93D \U0000200D \U00002640 \U0000FE0F', - u':woman_playing_water_polo_dark_skin_tone:': u'\U0001F93D \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_playing_water_polo_light_skin_tone:': u'\U0001F93D \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_playing_water_polo_medium-dark_skin_tone:': u'\U0001F93D \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_playing_water_polo_medium-light_skin_tone:': u'\U0001F93D \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_playing_water_polo_medium_skin_tone:': u'\U0001F93D \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_police_officer:': u'\U0001F46E \U0000200D \U00002640 \U0000FE0F', - u':woman_police_officer_dark_skin_tone:': u'\U0001F46E \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_police_officer_light_skin_tone:': u'\U0001F46E \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_police_officer_medium-dark_skin_tone:': u'\U0001F46E \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_police_officer_medium-light_skin_tone:': u'\U0001F46E \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_police_officer_medium_skin_tone:': u'\U0001F46E \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_pouting:': u'\U0001F64E \U0000200D \U00002640 \U0000FE0F', - u':woman_pouting_dark_skin_tone:': u'\U0001F64E \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_pouting_light_skin_tone:': u'\U0001F64E \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_pouting_medium-dark_skin_tone:': u'\U0001F64E \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_pouting_medium-light_skin_tone:': u'\U0001F64E \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_pouting_medium_skin_tone:': u'\U0001F64E \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_raising_hand:': u'\U0001F64B \U0000200D \U00002640 \U0000FE0F', - u':woman_raising_hand_dark_skin_tone:': u'\U0001F64B \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_raising_hand_light_skin_tone:': u'\U0001F64B \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_raising_hand_medium-dark_skin_tone:': u'\U0001F64B \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_raising_hand_medium-light_skin_tone:': u'\U0001F64B \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_raising_hand_medium_skin_tone:': u'\U0001F64B \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_rowing_boat:': u'\U0001F6A3 \U0000200D \U00002640 \U0000FE0F', - u':woman_rowing_boat_dark_skin_tone:': u'\U0001F6A3 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_rowing_boat_light_skin_tone:': u'\U0001F6A3 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_rowing_boat_medium-dark_skin_tone:': u'\U0001F6A3 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_rowing_boat_medium-light_skin_tone:': u'\U0001F6A3 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_rowing_boat_medium_skin_tone:': u'\U0001F6A3 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_running:': u'\U0001F3C3 \U0000200D \U00002640 \U0000FE0F', - u':woman_running_dark_skin_tone:': u'\U0001F3C3 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_running_light_skin_tone:': u'\U0001F3C3 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_running_medium-dark_skin_tone:': u'\U0001F3C3 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_running_medium-light_skin_tone:': u'\U0001F3C3 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_running_medium_skin_tone:': u'\U0001F3C3 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_scientist:': u'\U0001F469 \U0000200D \U0001F52C', - u':woman_scientist_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F52C', - u':woman_scientist_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F52C', - u':woman_scientist_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F52C', - u':woman_scientist_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F52C', - u':woman_scientist_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F52C', - u':woman_shrugging:': u'\U0001F937 \U0000200D \U00002640 \U0000FE0F', - u':woman_shrugging_dark_skin_tone:': u'\U0001F937 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_shrugging_light_skin_tone:': u'\U0001F937 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_shrugging_medium-dark_skin_tone:': u'\U0001F937 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_shrugging_medium-light_skin_tone:': u'\U0001F937 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_shrugging_medium_skin_tone:': u'\U0001F937 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_singer:': u'\U0001F469 \U0000200D \U0001F3A4', - u':woman_singer_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F3A4', - u':woman_singer_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F3A4', - u':woman_singer_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F3A4', - u':woman_singer_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F3A4', - u':woman_singer_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F3A4', - u':woman_student:': u'\U0001F469 \U0000200D \U0001F393', - u':woman_student_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F393', - u':woman_student_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F393', - u':woman_student_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F393', - u':woman_student_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F393', - u':woman_student_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F393', - u':woman_surfing:': u'\U0001F3C4 \U0000200D \U00002640 \U0000FE0F', - u':woman_surfing_dark_skin_tone:': u'\U0001F3C4 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_surfing_light_skin_tone:': u'\U0001F3C4 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_surfing_medium-dark_skin_tone:': u'\U0001F3C4 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_surfing_medium-light_skin_tone:': u'\U0001F3C4 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_surfing_medium_skin_tone:': u'\U0001F3C4 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_swimming:': u'\U0001F3CA \U0000200D \U00002640 \U0000FE0F', - u':woman_swimming_dark_skin_tone:': u'\U0001F3CA \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_swimming_light_skin_tone:': u'\U0001F3CA \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_swimming_medium-dark_skin_tone:': u'\U0001F3CA \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_swimming_medium-light_skin_tone:': u'\U0001F3CA \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_swimming_medium_skin_tone:': u'\U0001F3CA \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_teacher:': u'\U0001F469 \U0000200D \U0001F3EB', - u':woman_teacher_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F3EB', - u':woman_teacher_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F3EB', - u':woman_teacher_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F3EB', - u':woman_teacher_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F3EB', - u':woman_teacher_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F3EB', - u':woman_technologist:': u'\U0001F469 \U0000200D \U0001F4BB', - u':woman_technologist_dark_skin_tone:': u'\U0001F469 \U0001F3FF \U0000200D \U0001F4BB', - u':woman_technologist_light_skin_tone:': u'\U0001F469 \U0001F3FB \U0000200D \U0001F4BB', - u':woman_technologist_medium-dark_skin_tone:': u'\U0001F469 \U0001F3FE \U0000200D \U0001F4BB', - u':woman_technologist_medium-light_skin_tone:': u'\U0001F469 \U0001F3FC \U0000200D \U0001F4BB', - u':woman_technologist_medium_skin_tone:': u'\U0001F469 \U0001F3FD \U0000200D \U0001F4BB', - u':woman_tipping_hand:': u'\U0001F481 \U0000200D \U00002640 \U0000FE0F', - u':woman_tipping_hand_dark_skin_tone:': u'\U0001F481 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_tipping_hand_light_skin_tone:': u'\U0001F481 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_tipping_hand_medium-dark_skin_tone:': u'\U0001F481 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_tipping_hand_medium-light_skin_tone:': u'\U0001F481 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_tipping_hand_medium_skin_tone:': u'\U0001F481 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_walking:': u'\U0001F6B6 \U0000200D \U00002640 \U0000FE0F', - u':woman_walking_dark_skin_tone:': u'\U0001F6B6 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_walking_light_skin_tone:': u'\U0001F6B6 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_walking_medium-dark_skin_tone:': u'\U0001F6B6 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_walking_medium-light_skin_tone:': u'\U0001F6B6 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_walking_medium_skin_tone:': u'\U0001F6B6 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman_wearing_turban:': u'\U0001F473 \U0000200D \U00002640 \U0000FE0F', - u':woman_wearing_turban_dark_skin_tone:': u'\U0001F473 \U0001F3FF \U0000200D \U00002640 \U0000FE0F', - u':woman_wearing_turban_light_skin_tone:': u'\U0001F473 \U0001F3FB \U0000200D \U00002640 \U0000FE0F', - u':woman_wearing_turban_medium-dark_skin_tone:': u'\U0001F473 \U0001F3FE \U0000200D \U00002640 \U0000FE0F', - u':woman_wearing_turban_medium-light_skin_tone:': u'\U0001F473 \U0001F3FC \U0000200D \U00002640 \U0000FE0F', - u':woman_wearing_turban_medium_skin_tone:': u'\U0001F473 \U0001F3FD \U0000200D \U00002640 \U0000FE0F', - u':woman’s_boot:': u'\U0001F462', - u':woman’s_clothes:': u'\U0001F45A', - u':woman’s_hat:': u'\U0001F452', - u':woman’s_sandal:': u'\U0001F461', - u':women_with_bunny_ears_partying:': u'\U0001F46F \U0000200D \U00002640 \U0000FE0F', - u':women_wrestling:': u'\U0001F93C \U0000200D \U00002640 \U0000FE0F', - u':women’s_room:': u'\U0001F6BA', - u':world_map:': u'\U0001F5FA', - u':worried_face:': u'\U0001F61F', - u':wrapped_gift:': u'\U0001F381', - u':wrench:': u'\U0001F527', - u':writing_hand:': u'\U0000270D', - u':writing_hand_dark_skin_tone:': u'\U0000270D \U0001F3FF', - u':writing_hand_light_skin_tone:': u'\U0000270D \U0001F3FB', - u':writing_hand_medium-dark_skin_tone:': u'\U0000270D \U0001F3FE', - u':writing_hand_medium-light_skin_tone:': u'\U0000270D \U0001F3FC', - u':writing_hand_medium_skin_tone:': u'\U0000270D \U0001F3FD', - u':yellow_heart:': u'\U0001F49B', - u':yen_banknote:': u'\U0001F4B4', - u':yin_yang:': u'\U0000262F', - u':zipper-mouth_face:': u'\U0001F910', - u':zzz:': u'\U0001F4A4', - u':Åland_Islands:': u'\U0001F1E6 \U0001F1FD', -} - -EMOJI_ALIAS_UNICODE = dict(EMOJI_UNICODE.items(), **{ - u':admission_tickets:': u'\U0001F39F', - u':aerial_tramway:': u'\U0001F6A1', - u':airplane:': u'\U00002708', - u':airplane_arriving:': u'\U0001F6EC', - u':airplane_departure:': u'\U0001F6EB', - u':alarm_clock:': u'\U000023F0', - u':alembic:': u'\U00002697', - u':space_invader:': u'\U0001F47E', - u':ambulance:': u'\U0001F691', - u':football:': u'\U0001F3C8', - u':amphora:': u'\U0001F3FA', - u':anchor:': u'\U00002693', - u':anger:': u'\U0001F4A2', - u':angry:': u'\U0001F620', - u':anguished:': u'\U0001F627', - u':ant:': u'\U0001F41C', - u':signal_strength:': u'\U0001F4F6', - u':arrows_counterclockwise:': u'\U0001F504', - u':aquarius:': u'\U00002652', - u':aries:': u'\U00002648', - u':arrow_heading_down:': u'\U00002935', - u':arrow_heading_up:': u'\U00002934', - u':articulated_lorry:': u'\U0001F69B', - u':art:': u'\U0001F3A8', - u':astonished:': u'\U0001F632', - u':athletic_shoe:': u'\U0001F45F', - u':atom_symbol:': u'\U0000269B', - u':eggplant:': u'\U0001F346', - u':atm:': u'\U0001F3E7', - u':car:': u'\U0001F697', - u':red_car:': u'\U0001F697', - u':baby:': u'\U0001F476', - u':angel:': u'\U0001F47C', - u':baby_bottle:': u'\U0001F37C', - u':baby_chick:': u'\U0001F424', - u':baby_symbol:': u'\U0001F6BC', - u':back:': u'\U0001F519', - u':camel:': u'\U0001F42B', - u':badminton_racquet_and_shuttlecock:': u'\U0001F3F8', - u':baggage_claim:': u'\U0001F6C4', - u':balloon:': u'\U0001F388', - u':ballot_box_with_ballot:': u'\U0001F5F3', - u':ballot_box_with_check:': u'\U00002611', - u':banana:': u'\U0001F34C', - u':bank:': u'\U0001F3E6', - u':dollar:': u'\U0001F4B5', - u':euro:': u'\U0001F4B6', - u':pound:': u'\U0001F4B7', - u':yen:': u'\U0001F4B4', - u':bar_chart:': u'\U0001F4CA', - u':barber:': u'\U0001F488', - u':baseball:': u'\U000026BE', - u':basketball:': u'\U0001F3C0', - u':bath:': u'\U0001F6C0', - u':bathtub:': u'\U0001F6C1', - u':battery:': u'\U0001F50B', - u':beach_with_umbrella:': u'\U0001F3D6', - u':bear:': u'\U0001F43B', - u':heartbeat:': u'\U0001F493', - u':bed:': u'\U0001F6CF', - u':beer:': u'\U0001F37A', - u':bell:': u'\U0001F514', - u':no_bell:': u'\U0001F515', - u':bellhop_bell:': u'\U0001F6CE', - u':bento:': u'\U0001F371', - u':bike:': u'\U0001F6B2', - u':bicyclist:': u'\U0001F6B4', - u':bikini:': u'\U0001F459', - u':8ball:': u'\U0001F3B1', - u':biohazard_sign:': u'\U00002623', - u':bird:': u'\U0001F426', - u':birthday:': u'\U0001F382', - u':black_circle_for_record:': u'\U000023FA', - u':clubs:': u'\U00002663', - u':diamonds:': u'\U00002666', - u':arrow_double_down:': u'\U000023EC', - u':hearts:': u'\U00002665', - u':black_large_square:': u'\U00002B1B', - u':rewind:': u'\U000023EA', - u':black_left__pointing_double_triangle_with_vertical_bar:': u'\U000023EE', - u':arrow_backward:': u'\U000025C0', - u':black_medium_small_square:': u'\U000025FE', - u':black_medium_square:': u'\U000025FC', - u':black_nib:': u'\U00002712', - u':question:': u'\U00002753', - u':fast_forward:': u'\U000023E9', - u':black_right__pointing_double_triangle_with_vertical_bar:': u'\U000023ED', - u':arrow_forward:': u'\U000025B6', - u':black_right__pointing_triangle_with_double_vertical_bar:': u'\U000023EF', - u':arrow_right:': u'\U000027A1', - u':scissors:': u'\U00002702', - u':black_small_square:': u'\U000025AA', - u':spades:': u'\U00002660', - u':black_square_button:': u'\U0001F532', - u':black_square_for_stop:': u'\U000023F9', - u':sunny:': u'\U00002600', - u':phone:': u'\U0000260E', - u':telephone:': u'\U0000260E', - u':recycle:': u'\U0000267B', - u':arrow_double_up:': u'\U000023EB', - u':blossom:': u'\U0001F33C', - u':blowfish:': u'\U0001F421', - u':blue_book:': u'\U0001F4D8', - u':blue_heart:': u'\U0001F499', - u':boar:': u'\U0001F417', - u':bomb:': u'\U0001F4A3', - u':bookmark:': u'\U0001F516', - u':bookmark_tabs:': u'\U0001F4D1', - u':books:': u'\U0001F4DA', - u':bottle_with_popping_cork:': u'\U0001F37E', - u':bouquet:': u'\U0001F490', - u':bow_and_arrow:': u'\U0001F3F9', - u':bowling:': u'\U0001F3B3', - u':boy:': u'\U0001F466', - u':bread:': u'\U0001F35E', - u':bride_with_veil:': u'\U0001F470', - u':bridge_at_night:': u'\U0001F309', - u':briefcase:': u'\U0001F4BC', - u':broken_heart:': u'\U0001F494', - u':bug:': u'\U0001F41B', - u':building_construction:': u'\U0001F3D7', - u':burrito:': u'\U0001F32F', - u':bus:': u'\U0001F68C', - u':busstop:': u'\U0001F68F', - u':bust_in_silhouette:': u'\U0001F464', - u':busts_in_silhouette:': u'\U0001F465', - u':cactus:': u'\U0001F335', - u':date:': u'\U0001F4C5', - u':camera:': u'\U0001F4F7', - u':camera_with_flash:': u'\U0001F4F8', - u':camping:': u'\U0001F3D5', - u':cancer:': u'\U0000264B', - u':candle:': u'\U0001F56F', - u':candy:': u'\U0001F36C', - u':capricorn:': u'\U00002651', - u':card_file_box:': u'\U0001F5C3', - u':card_index:': u'\U0001F4C7', - u':card_index_dividers:': u'\U0001F5C2', - u':carousel_horse:': u'\U0001F3A0', - u':flags:': u'\U0001F38F', - u':cat2:': u'\U0001F408', - u':cat:': u'\U0001F431', - u':joy_cat:': u'\U0001F639', - u':smirk_cat:': u'\U0001F63C', - u':chains:': u'\U000026D3', - u':chart_with_downwards_trend:': u'\U0001F4C9', - u':chart_with_upwards_trend:': u'\U0001F4C8', - u':chart:': u'\U0001F4B9', - u':mega:': u'\U0001F4E3', - u':cheese_wedge:': u'\U0001F9C0', - u':checkered_flag:': u'\U0001F3C1', - u':cherries:': u'\U0001F352', - u':cherry_blossom:': u'\U0001F338', - u':chestnut:': u'\U0001F330', - u':chicken:': u'\U0001F414', - u':children_crossing:': u'\U0001F6B8', - u':chipmunk:': u'\U0001F43F', - u':chocolate_bar:': u'\U0001F36B', - u':christmas_tree:': u'\U0001F384', - u':church:': u'\U000026EA', - u':cinema:': u'\U0001F3A6', - u':accept:': u'\U0001F251', - u':ideograph_advantage:': u'\U0001F250', - u':congratulations:': u'\U00003297', - u':secret:': u'\U00003299', - u':m:': u'\U000024C2', - u':circus_tent:': u'\U0001F3AA', - u':cityscape:': u'\U0001F3D9', - u':city_sunset:': u'\U0001F306', - u':clapper:': u'\U0001F3AC', - u':clap:': u'\U0001F44F', - u':classical_building:': u'\U0001F3DB', - u':beers:': u'\U0001F37B', - u':clipboard:': u'\U0001F4CB', - u':clock830:': u'\U0001F563', - u':clock8:': u'\U0001F557', - u':clock1130:': u'\U0001F566', - u':clock11:': u'\U0001F55A', - u':clock530:': u'\U0001F560', - u':clock5:': u'\U0001F554', - u':clock430:': u'\U0001F55F', - u':clock4:': u'\U0001F553', - u':clock930:': u'\U0001F564', - u':clock9:': u'\U0001F558', - u':clock130:': u'\U0001F55C', - u':clock1:': u'\U0001F550', - u':clock730:': u'\U0001F562', - u':clock7:': u'\U0001F556', - u':clock630:': u'\U0001F561', - u':clock6:': u'\U0001F555', - u':clock1030:': u'\U0001F565', - u':clock10:': u'\U0001F559', - u':clock330:': u'\U0001F55E', - u':clock3:': u'\U0001F552', - u':clock1230:': u'\U0001F567', - u':clock12:': u'\U0001F55B', - u':clock230:': u'\U0001F55D', - u':clock2:': u'\U0001F551', - u':arrows_clockwise:': u'\U0001F503', - u':repeat:': u'\U0001F501', - u':repeat_one:': u'\U0001F502', - u':closed_book:': u'\U0001F4D5', - u':closed_lock_with_key:': u'\U0001F510', - u':mailbox_closed:': u'\U0001F4EA', - u':mailbox:': u'\U0001F4EB', - u':closed_umbrella:': u'\U0001F302', - u':cloud:': u'\U00002601', - u':cloud_with_lightning:': u'\U0001F329', - u':cloud_with_rain:': u'\U0001F327', - u':cloud_with_snow:': u'\U0001F328', - u':cloud_with_tornado:': u'\U0001F32A', - u':cocktail:': u'\U0001F378', - u':coffin:': u'\U000026B0', - u':boom:': u'\U0001F4A5', - u':collision:': u'\U0001F4A5', - u':comet:': u'\U00002604', - u':compression:': u'\U0001F5DC', - u':confetti_ball:': u'\U0001F38A', - u':confounded:': u'\U0001F616', - u':confused:': u'\U0001F615', - u':construction:': u'\U0001F6A7', - u':construction_worker:': u'\U0001F477', - u':control_knobs:': u'\U0001F39B', - u':convenience_store:': u'\U0001F3EA', - u':rice:': u'\U0001F35A', - u':cookie:': u'\U0001F36A', - u':egg:': u'\U0001F373', - u':copyright:': u'\U000000A9', - u':couch_and_lamp:': u'\U0001F6CB', - u':couple_with_heart:': u'\U0001F491', - u':cow2:': u'\U0001F404', - u':cow:': u'\U0001F42E', - u':crab:': u'\U0001F980', - u':credit_card:': u'\U0001F4B3', - u':crescent_moon:': u'\U0001F319', - u':cricket_bat_and_ball:': u'\U0001F3CF', - u':crocodile:': u'\U0001F40A', - u':x:': u'\U0000274C', - u':crossed_flags:': u'\U0001F38C', - u':crossed_swords:': u'\U00002694', - u':crown:': u'\U0001F451', - u':crying_cat_face:': u'\U0001F63F', - u':cry:': u'\U0001F622', - u':crystal_ball:': u'\U0001F52E', - u':curly_loop:': u'\U000027B0', - u':currency_exchange:': u'\U0001F4B1', - u':curry:': u'\U0001F35B', - u':custard:': u'\U0001F36E', - u':customs:': u'\U0001F6C3', - u':cyclone:': u'\U0001F300', - u':dagger_knife:': u'\U0001F5E1', - u':dancer:': u'\U0001F483', - u':dango:': u'\U0001F361', - u':dark_sunglasses:': u'\U0001F576', - u':dash:': u'\U0001F4A8', - u':deciduous_tree:': u'\U0001F333', - u':truck:': u'\U0001F69A', - u':department_store:': u'\U0001F3EC', - u':derelict_house_building:': u'\U0001F3DA', - u':desert:': u'\U0001F3DC', - u':desert_island:': u'\U0001F3DD', - u':desktop_computer:': u'\U0001F5A5', - u':diamond_shape_with_a_dot_inside:': u'\U0001F4A0', - u':dart:': u'\U0001F3AF', - u':disappointed_relieved:': u'\U0001F625', - u':disappointed:': u'\U0001F61E', - u':dizzy_face:': u'\U0001F635', - u':dizzy:': u'\U0001F4AB', - u':do_not_litter:': u'\U0001F6AF', - u':dog2:': u'\U0001F415', - u':dog:': u'\U0001F436', - u':dolphin:': u'\U0001F42C', - u':flipper:': u'\U0001F42C', - u':door:': u'\U0001F6AA', - u':loop:': u'\U000027BF', - u':bangbang:': u'\U0000203C', - u':double_vertical_bar:': u'\U000023F8', - u':doughnut:': u'\U0001F369', - u':dove_of_peace:': u'\U0001F54A', - u':small_red_triangle_down:': u'\U0001F53B', - u':arrow_down_small:': u'\U0001F53D', - u':arrow_down:': u'\U00002B07', - u':dragon:': u'\U0001F409', - u':dragon_face:': u'\U0001F432', - u':dress:': u'\U0001F457', - u':dromedary_camel:': u'\U0001F42A', - u':droplet:': u'\U0001F4A7', - u':dvd:': u'\U0001F4C0', - u':e__mail:': u'\U0001F4E7', - u':ear:': u'\U0001F442', - u':corn:': u'\U0001F33D', - u':ear_of_rice:': u'\U0001F33E', - u':earth_americas:': u'\U0001F30E', - u':earth_asia:': u'\U0001F30F', - u':earth_africa:': u'\U0001F30D', - u':eight_pointed_black_star:': u'\U00002734', - u':eight_spoked_asterisk:': u'\U00002733', - u':eject_symbol:': u'\U000023CF', - u':bulb:': u'\U0001F4A1', - u':electric_plug:': u'\U0001F50C', - u':flashlight:': u'\U0001F526', - u':elephant:': u'\U0001F418', - u':emoji_modifier_fitzpatrick_type__1__2:': u'\U0001F3FB', - u':emoji_modifier_fitzpatrick_type__3:': u'\U0001F3FC', - u':emoji_modifier_fitzpatrick_type__4:': u'\U0001F3FD', - u':emoji_modifier_fitzpatrick_type__5:': u'\U0001F3FE', - u':emoji_modifier_fitzpatrick_type__6:': u'\U0001F3FF', - u':end:': u'\U0001F51A', - u':email:': u'\U00002709', - u':envelope:': u'\U00002709', - u':envelope_with_arrow:': u'\U0001F4E9', - u':european_castle:': u'\U0001F3F0', - u':european_post_office:': u'\U0001F3E4', - u':evergreen_tree:': u'\U0001F332', - u':interrobang:': u'\U00002049', - u':expressionless:': u'\U0001F611', - u':alien:': u'\U0001F47D', - u':eye:': u'\U0001F441', - u':eyeglasses:': u'\U0001F453', - u':eyes:': u'\U0001F440', - u':massage:': u'\U0001F486', - u':yum:': u'\U0001F60B', - u':scream:': u'\U0001F631', - u':kissing_heart:': u'\U0001F618', - u':sweat:': u'\U0001F613', - u':face_with_head__bandage:': u'\U0001F915', - u':triumph:': u'\U0001F624', - u':mask:': u'\U0001F637', - u':no_good:': u'\U0001F645', - u':ok_woman:': u'\U0001F646', - u':open_mouth:': u'\U0001F62E', - u':cold_sweat:': u'\U0001F630', - u':face_with_rolling_eyes:': u'\U0001F644', - u':stuck_out_tongue:': u'\U0001F61B', - u':stuck_out_tongue_closed_eyes:': u'\U0001F61D', - u':stuck_out_tongue_winking_eye:': u'\U0001F61C', - u':joy:': u'\U0001F602', - u':face_with_thermometer:': u'\U0001F912', - u':no_mouth:': u'\U0001F636', - u':factory:': u'\U0001F3ED', - u':fallen_leaf:': u'\U0001F342', - u':family:': u'\U0001F46A', - u':santa:': u'\U0001F385', - u':fax:': u'\U0001F4E0', - u':fearful:': u'\U0001F628', - u':ferris_wheel:': u'\U0001F3A1', - u':ferry:': u'\U000026F4', - u':field_hockey_stick_and_ball:': u'\U0001F3D1', - u':file_cabinet:': u'\U0001F5C4', - u':file_folder:': u'\U0001F4C1', - u':film_frames:': u'\U0001F39E', - u':film_projector:': u'\U0001F4FD', - u':fire:': u'\U0001F525', - u':fire_engine:': u'\U0001F692', - u':sparkler:': u'\U0001F387', - u':fireworks:': u'\U0001F386', - u':first_quarter_moon:': u'\U0001F313', - u':first_quarter_moon_with_face:': u'\U0001F31B', - u':fish:': u'\U0001F41F', - u':fish_cake:': u'\U0001F365', - u':fishing_pole_and_fish:': u'\U0001F3A3', - u':facepunch:': u'\U0001F44A', - u':punch:': u'\U0001F44A', - u':flag_for_Afghanistan:': u'\U0001F1E6 \U0001F1EB', - u':flag_for_Albania:': u'\U0001F1E6 \U0001F1F1', - u':flag_for_Algeria:': u'\U0001F1E9 \U0001F1FF', - u':flag_for_American_Samoa:': u'\U0001F1E6 \U0001F1F8', - u':flag_for_Andorra:': u'\U0001F1E6 \U0001F1E9', - u':flag_for_Angola:': u'\U0001F1E6 \U0001F1F4', - u':flag_for_Anguilla:': u'\U0001F1E6 \U0001F1EE', - u':flag_for_Antarctica:': u'\U0001F1E6 \U0001F1F6', - u':flag_for_Antigua_&_Barbuda:': u'\U0001F1E6 \U0001F1EC', - u':flag_for_Argentina:': u'\U0001F1E6 \U0001F1F7', - u':flag_for_Armenia:': u'\U0001F1E6 \U0001F1F2', - u':flag_for_Aruba:': u'\U0001F1E6 \U0001F1FC', - u':flag_for_Ascension_Island:': u'\U0001F1E6 \U0001F1E8', - u':flag_for_Australia:': u'\U0001F1E6 \U0001F1FA', - u':flag_for_Austria:': u'\U0001F1E6 \U0001F1F9', - u':flag_for_Azerbaijan:': u'\U0001F1E6 \U0001F1FF', - u':flag_for_Bahamas:': u'\U0001F1E7 \U0001F1F8', - u':flag_for_Bahrain:': u'\U0001F1E7 \U0001F1ED', - u':flag_for_Bangladesh:': u'\U0001F1E7 \U0001F1E9', - u':flag_for_Barbados:': u'\U0001F1E7 \U0001F1E7', - u':flag_for_Belarus:': u'\U0001F1E7 \U0001F1FE', - u':flag_for_Belgium:': u'\U0001F1E7 \U0001F1EA', - u':flag_for_Belize:': u'\U0001F1E7 \U0001F1FF', - u':flag_for_Benin:': u'\U0001F1E7 \U0001F1EF', - u':flag_for_Bermuda:': u'\U0001F1E7 \U0001F1F2', - u':flag_for_Bhutan:': u'\U0001F1E7 \U0001F1F9', - u':flag_for_Bolivia:': u'\U0001F1E7 \U0001F1F4', - u':flag_for_Bosnia_&_Herzegovina:': u'\U0001F1E7 \U0001F1E6', - u':flag_for_Botswana:': u'\U0001F1E7 \U0001F1FC', - u':flag_for_Bouvet_Island:': u'\U0001F1E7 \U0001F1FB', - u':flag_for_Brazil:': u'\U0001F1E7 \U0001F1F7', - u':flag_for_British_Indian_Ocean_Territory:': u'\U0001F1EE \U0001F1F4', - u':flag_for_British_Virgin_Islands:': u'\U0001F1FB \U0001F1EC', - u':flag_for_Brunei:': u'\U0001F1E7 \U0001F1F3', - u':flag_for_Bulgaria:': u'\U0001F1E7 \U0001F1EC', - u':flag_for_Burkina_Faso:': u'\U0001F1E7 \U0001F1EB', - u':flag_for_Burundi:': u'\U0001F1E7 \U0001F1EE', - u':flag_for_Cambodia:': u'\U0001F1F0 \U0001F1ED', - u':flag_for_Cameroon:': u'\U0001F1E8 \U0001F1F2', - u':flag_for_Canada:': u'\U0001F1E8 \U0001F1E6', - u':flag_for_Canary_Islands:': u'\U0001F1EE \U0001F1E8', - u':flag_for_Cape_Verde:': u'\U0001F1E8 \U0001F1FB', - u':flag_for_Caribbean_Netherlands:': u'\U0001F1E7 \U0001F1F6', - u':flag_for_Cayman_Islands:': u'\U0001F1F0 \U0001F1FE', - u':flag_for_Central_African_Republic:': u'\U0001F1E8 \U0001F1EB', - u':flag_for_Ceuta_&_Melilla:': u'\U0001F1EA \U0001F1E6', - u':flag_for_Chad:': u'\U0001F1F9 \U0001F1E9', - u':flag_for_Chile:': u'\U0001F1E8 \U0001F1F1', - u':flag_for_China:': u'\U0001F1E8 \U0001F1F3', - u':flag_for_Christmas_Island:': u'\U0001F1E8 \U0001F1FD', - u':flag_for_Clipperton_Island:': u'\U0001F1E8 \U0001F1F5', - u':flag_for_Cocos__Islands:': u'\U0001F1E8 \U0001F1E8', - u':flag_for_Colombia:': u'\U0001F1E8 \U0001F1F4', - u':flag_for_Comoros:': u'\U0001F1F0 \U0001F1F2', - u':flag_for_Congo____Brazzaville:': u'\U0001F1E8 \U0001F1EC', - u':flag_for_Congo____Kinshasa:': u'\U0001F1E8 \U0001F1E9', - u':flag_for_Cook_Islands:': u'\U0001F1E8 \U0001F1F0', - u':flag_for_Costa_Rica:': u'\U0001F1E8 \U0001F1F7', - u':flag_for_Croatia:': u'\U0001F1ED \U0001F1F7', - u':flag_for_Cuba:': u'\U0001F1E8 \U0001F1FA', - u':flag_for_Curaçao:': u'\U0001F1E8 \U0001F1FC', - u':flag_for_Cyprus:': u'\U0001F1E8 \U0001F1FE', - u':flag_for_Czech_Republic:': u'\U0001F1E8 \U0001F1FF', - u':flag_for_Côte_d’Ivoire:': u'\U0001F1E8 \U0001F1EE', - u':flag_for_Denmark:': u'\U0001F1E9 \U0001F1F0', - u':flag_for_Diego_Garcia:': u'\U0001F1E9 \U0001F1EC', - u':flag_for_Djibouti:': u'\U0001F1E9 \U0001F1EF', - u':flag_for_Dominica:': u'\U0001F1E9 \U0001F1F2', - u':flag_for_Dominican_Republic:': u'\U0001F1E9 \U0001F1F4', - u':flag_for_Ecuador:': u'\U0001F1EA \U0001F1E8', - u':flag_for_Egypt:': u'\U0001F1EA \U0001F1EC', - u':flag_for_El_Salvador:': u'\U0001F1F8 \U0001F1FB', - u':flag_for_Equatorial_Guinea:': u'\U0001F1EC \U0001F1F6', - u':flag_for_Eritrea:': u'\U0001F1EA \U0001F1F7', - u':flag_for_Estonia:': u'\U0001F1EA \U0001F1EA', - u':flag_for_Ethiopia:': u'\U0001F1EA \U0001F1F9', - u':flag_for_European_Union:': u'\U0001F1EA \U0001F1FA', - u':flag_for_Falkland_Islands:': u'\U0001F1EB \U0001F1F0', - u':flag_for_Faroe_Islands:': u'\U0001F1EB \U0001F1F4', - u':flag_for_Fiji:': u'\U0001F1EB \U0001F1EF', - u':flag_for_Finland:': u'\U0001F1EB \U0001F1EE', - u':flag_for_France:': u'\U0001F1EB \U0001F1F7', - u':flag_for_French_Guiana:': u'\U0001F1EC \U0001F1EB', - u':flag_for_French_Polynesia:': u'\U0001F1F5 \U0001F1EB', - u':flag_for_French_Southern_Territories:': u'\U0001F1F9 \U0001F1EB', - u':flag_for_Gabon:': u'\U0001F1EC \U0001F1E6', - u':flag_for_Gambia:': u'\U0001F1EC \U0001F1F2', - u':flag_for_Georgia:': u'\U0001F1EC \U0001F1EA', - u':flag_for_Germany:': u'\U0001F1E9 \U0001F1EA', - u':flag_for_Ghana:': u'\U0001F1EC \U0001F1ED', - u':flag_for_Gibraltar:': u'\U0001F1EC \U0001F1EE', - u':flag_for_Greece:': u'\U0001F1EC \U0001F1F7', - u':flag_for_Greenland:': u'\U0001F1EC \U0001F1F1', - u':flag_for_Grenada:': u'\U0001F1EC \U0001F1E9', - u':flag_for_Guadeloupe:': u'\U0001F1EC \U0001F1F5', - u':flag_for_Guam:': u'\U0001F1EC \U0001F1FA', - u':flag_for_Guatemala:': u'\U0001F1EC \U0001F1F9', - u':flag_for_Guernsey:': u'\U0001F1EC \U0001F1EC', - u':flag_for_Guinea:': u'\U0001F1EC \U0001F1F3', - u':flag_for_Guinea__Bissau:': u'\U0001F1EC \U0001F1FC', - u':flag_for_Guyana:': u'\U0001F1EC \U0001F1FE', - u':flag_for_Haiti:': u'\U0001F1ED \U0001F1F9', - u':flag_for_Heard_&_McDonald_Islands:': u'\U0001F1ED \U0001F1F2', - u':flag_for_Honduras:': u'\U0001F1ED \U0001F1F3', - u':flag_for_Hong_Kong:': u'\U0001F1ED \U0001F1F0', - u':flag_for_Hungary:': u'\U0001F1ED \U0001F1FA', - u':flag_for_Iceland:': u'\U0001F1EE \U0001F1F8', - u':flag_for_India:': u'\U0001F1EE \U0001F1F3', - u':flag_for_Indonesia:': u'\U0001F1EE \U0001F1E9', - u':flag_for_Iran:': u'\U0001F1EE \U0001F1F7', - u':flag_for_Iraq:': u'\U0001F1EE \U0001F1F6', - u':flag_for_Ireland:': u'\U0001F1EE \U0001F1EA', - u':flag_for_Isle_of_Man:': u'\U0001F1EE \U0001F1F2', - u':flag_for_Israel:': u'\U0001F1EE \U0001F1F1', - u':flag_for_Italy:': u'\U0001F1EE \U0001F1F9', - u':flag_for_Jamaica:': u'\U0001F1EF \U0001F1F2', - u':flag_for_Japan:': u'\U0001F1EF \U0001F1F5', - u':flag_for_Jersey:': u'\U0001F1EF \U0001F1EA', - u':flag_for_Jordan:': u'\U0001F1EF \U0001F1F4', - u':flag_for_Kazakhstan:': u'\U0001F1F0 \U0001F1FF', - u':flag_for_Kenya:': u'\U0001F1F0 \U0001F1EA', - u':flag_for_Kiribati:': u'\U0001F1F0 \U0001F1EE', - u':flag_for_Kosovo:': u'\U0001F1FD \U0001F1F0', - u':flag_for_Kuwait:': u'\U0001F1F0 \U0001F1FC', - u':flag_for_Kyrgyzstan:': u'\U0001F1F0 \U0001F1EC', - u':flag_for_Laos:': u'\U0001F1F1 \U0001F1E6', - u':flag_for_Latvia:': u'\U0001F1F1 \U0001F1FB', - u':flag_for_Lebanon:': u'\U0001F1F1 \U0001F1E7', - u':flag_for_Lesotho:': u'\U0001F1F1 \U0001F1F8', - u':flag_for_Liberia:': u'\U0001F1F1 \U0001F1F7', - u':flag_for_Libya:': u'\U0001F1F1 \U0001F1FE', - u':flag_for_Liechtenstein:': u'\U0001F1F1 \U0001F1EE', - u':flag_for_Lithuania:': u'\U0001F1F1 \U0001F1F9', - u':flag_for_Luxembourg:': u'\U0001F1F1 \U0001F1FA', - u':flag_for_Macau:': u'\U0001F1F2 \U0001F1F4', - u':flag_for_Macedonia:': u'\U0001F1F2 \U0001F1F0', - u':flag_for_Madagascar:': u'\U0001F1F2 \U0001F1EC', - u':flag_for_Malawi:': u'\U0001F1F2 \U0001F1FC', - u':flag_for_Malaysia:': u'\U0001F1F2 \U0001F1FE', - u':flag_for_Maldives:': u'\U0001F1F2 \U0001F1FB', - u':flag_for_Mali:': u'\U0001F1F2 \U0001F1F1', - u':flag_for_Malta:': u'\U0001F1F2 \U0001F1F9', - u':flag_for_Marshall_Islands:': u'\U0001F1F2 \U0001F1ED', - u':flag_for_Martinique:': u'\U0001F1F2 \U0001F1F6', - u':flag_for_Mauritania:': u'\U0001F1F2 \U0001F1F7', - u':flag_for_Mauritius:': u'\U0001F1F2 \U0001F1FA', - u':flag_for_Mayotte:': u'\U0001F1FE \U0001F1F9', - u':flag_for_Mexico:': u'\U0001F1F2 \U0001F1FD', - u':flag_for_Micronesia:': u'\U0001F1EB \U0001F1F2', - u':flag_for_Moldova:': u'\U0001F1F2 \U0001F1E9', - u':flag_for_Monaco:': u'\U0001F1F2 \U0001F1E8', - u':flag_for_Mongolia:': u'\U0001F1F2 \U0001F1F3', - u':flag_for_Montenegro:': u'\U0001F1F2 \U0001F1EA', - u':flag_for_Montserrat:': u'\U0001F1F2 \U0001F1F8', - u':flag_for_Morocco:': u'\U0001F1F2 \U0001F1E6', - u':flag_for_Mozambique:': u'\U0001F1F2 \U0001F1FF', - u':flag_for_Myanmar:': u'\U0001F1F2 \U0001F1F2', - u':flag_for_Namibia:': u'\U0001F1F3 \U0001F1E6', - u':flag_for_Nauru:': u'\U0001F1F3 \U0001F1F7', - u':flag_for_Nepal:': u'\U0001F1F3 \U0001F1F5', - u':flag_for_Netherlands:': u'\U0001F1F3 \U0001F1F1', - u':flag_for_New_Caledonia:': u'\U0001F1F3 \U0001F1E8', - u':flag_for_New_Zealand:': u'\U0001F1F3 \U0001F1FF', - u':flag_for_Nicaragua:': u'\U0001F1F3 \U0001F1EE', - u':flag_for_Niger:': u'\U0001F1F3 \U0001F1EA', - u':flag_for_Nigeria:': u'\U0001F1F3 \U0001F1EC', - u':flag_for_Niue:': u'\U0001F1F3 \U0001F1FA', - u':flag_for_Norfolk_Island:': u'\U0001F1F3 \U0001F1EB', - u':flag_for_North_Korea:': u'\U0001F1F0 \U0001F1F5', - u':flag_for_Northern_Mariana_Islands:': u'\U0001F1F2 \U0001F1F5', - u':flag_for_Norway:': u'\U0001F1F3 \U0001F1F4', - u':flag_for_Oman:': u'\U0001F1F4 \U0001F1F2', - u':flag_for_Pakistan:': u'\U0001F1F5 \U0001F1F0', - u':flag_for_Palau:': u'\U0001F1F5 \U0001F1FC', - u':flag_for_Palestinian_Territories:': u'\U0001F1F5 \U0001F1F8', - u':flag_for_Panama:': u'\U0001F1F5 \U0001F1E6', - u':flag_for_Papua_New_Guinea:': u'\U0001F1F5 \U0001F1EC', - u':flag_for_Paraguay:': u'\U0001F1F5 \U0001F1FE', - u':flag_for_Peru:': u'\U0001F1F5 \U0001F1EA', - u':flag_for_Philippines:': u'\U0001F1F5 \U0001F1ED', - u':flag_for_Pitcairn_Islands:': u'\U0001F1F5 \U0001F1F3', - u':flag_for_Poland:': u'\U0001F1F5 \U0001F1F1', - u':flag_for_Portugal:': u'\U0001F1F5 \U0001F1F9', - u':flag_for_Puerto_Rico:': u'\U0001F1F5 \U0001F1F7', - u':flag_for_Qatar:': u'\U0001F1F6 \U0001F1E6', - u':flag_for_Romania:': u'\U0001F1F7 \U0001F1F4', - u':flag_for_Russia:': u'\U0001F1F7 \U0001F1FA', - u':flag_for_Rwanda:': u'\U0001F1F7 \U0001F1FC', - u':flag_for_Réunion:': u'\U0001F1F7 \U0001F1EA', - u':flag_for_Samoa:': u'\U0001F1FC \U0001F1F8', - u':flag_for_San_Marino:': u'\U0001F1F8 \U0001F1F2', - u':flag_for_Saudi_Arabia:': u'\U0001F1F8 \U0001F1E6', - u':flag_for_Senegal:': u'\U0001F1F8 \U0001F1F3', - u':flag_for_Serbia:': u'\U0001F1F7 \U0001F1F8', - u':flag_for_Seychelles:': u'\U0001F1F8 \U0001F1E8', - u':flag_for_Sierra_Leone:': u'\U0001F1F8 \U0001F1F1', - u':flag_for_Singapore:': u'\U0001F1F8 \U0001F1EC', - u':flag_for_Sint_Maarten:': u'\U0001F1F8 \U0001F1FD', - u':flag_for_Slovakia:': u'\U0001F1F8 \U0001F1F0', - u':flag_for_Slovenia:': u'\U0001F1F8 \U0001F1EE', - u':flag_for_Solomon_Islands:': u'\U0001F1F8 \U0001F1E7', - u':flag_for_Somalia:': u'\U0001F1F8 \U0001F1F4', - u':flag_for_South_Africa:': u'\U0001F1FF \U0001F1E6', - u':flag_for_South_Georgia_&_South_Sandwich_Islands:': u'\U0001F1EC \U0001F1F8', - u':flag_for_South_Korea:': u'\U0001F1F0 \U0001F1F7', - u':flag_for_South_Sudan:': u'\U0001F1F8 \U0001F1F8', - u':flag_for_Spain:': u'\U0001F1EA \U0001F1F8', - u':flag_for_Sri_Lanka:': u'\U0001F1F1 \U0001F1F0', - u':flag_for_St._Barthélemy:': u'\U0001F1E7 \U0001F1F1', - u':flag_for_St._Helena:': u'\U0001F1F8 \U0001F1ED', - u':flag_for_St._Kitts_&_Nevis:': u'\U0001F1F0 \U0001F1F3', - u':flag_for_St._Lucia:': u'\U0001F1F1 \U0001F1E8', - u':flag_for_St._Martin:': u'\U0001F1F2 \U0001F1EB', - u':flag_for_St._Pierre_&_Miquelon:': u'\U0001F1F5 \U0001F1F2', - u':flag_for_St._Vincent_&_Grenadines:': u'\U0001F1FB \U0001F1E8', - u':flag_for_Sudan:': u'\U0001F1F8 \U0001F1E9', - u':flag_for_Suriname:': u'\U0001F1F8 \U0001F1F7', - u':flag_for_Svalbard_&_Jan_Mayen:': u'\U0001F1F8 \U0001F1EF', - u':flag_for_Swaziland:': u'\U0001F1F8 \U0001F1FF', - u':flag_for_Sweden:': u'\U0001F1F8 \U0001F1EA', - u':flag_for_Switzerland:': u'\U0001F1E8 \U0001F1ED', - u':flag_for_Syria:': u'\U0001F1F8 \U0001F1FE', - u':flag_for_São_Tomé_&_Príncipe:': u'\U0001F1F8 \U0001F1F9', - u':flag_for_Taiwan:': u'\U0001F1F9 \U0001F1FC', - u':flag_for_Tajikistan:': u'\U0001F1F9 \U0001F1EF', - u':flag_for_Tanzania:': u'\U0001F1F9 \U0001F1FF', - u':flag_for_Thailand:': u'\U0001F1F9 \U0001F1ED', - u':flag_for_Timor__Leste:': u'\U0001F1F9 \U0001F1F1', - u':flag_for_Togo:': u'\U0001F1F9 \U0001F1EC', - u':flag_for_Tokelau:': u'\U0001F1F9 \U0001F1F0', - u':flag_for_Tonga:': u'\U0001F1F9 \U0001F1F4', - u':flag_for_Trinidad_&_Tobago:': u'\U0001F1F9 \U0001F1F9', - u':flag_for_Tristan_da_Cunha:': u'\U0001F1F9 \U0001F1E6', - u':flag_for_Tunisia:': u'\U0001F1F9 \U0001F1F3', - u':flag_for_Turkey:': u'\U0001F1F9 \U0001F1F7', - u':flag_for_Turkmenistan:': u'\U0001F1F9 \U0001F1F2', - u':flag_for_Turks_&_Caicos_Islands:': u'\U0001F1F9 \U0001F1E8', - u':flag_for_Tuvalu:': u'\U0001F1F9 \U0001F1FB', - u':flag_for_U.S._Outlying_Islands:': u'\U0001F1FA \U0001F1F2', - u':flag_for_U.S._Virgin_Islands:': u'\U0001F1FB \U0001F1EE', - u':flag_for_Uganda:': u'\U0001F1FA \U0001F1EC', - u':flag_for_Ukraine:': u'\U0001F1FA \U0001F1E6', - u':flag_for_United_Arab_Emirates:': u'\U0001F1E6 \U0001F1EA', - u':flag_for_United_Kingdom:': u'\U0001F1EC \U0001F1E7', - u':flag_for_United_States:': u'\U0001F1FA \U0001F1F8', - u':flag_for_Uruguay:': u'\U0001F1FA \U0001F1FE', - u':flag_for_Uzbekistan:': u'\U0001F1FA \U0001F1FF', - u':flag_for_Vanuatu:': u'\U0001F1FB \U0001F1FA', - u':flag_for_Vatican_City:': u'\U0001F1FB \U0001F1E6', - u':flag_for_Venezuela:': u'\U0001F1FB \U0001F1EA', - u':flag_for_Vietnam:': u'\U0001F1FB \U0001F1F3', - u':flag_for_Wallis_&_Futuna:': u'\U0001F1FC \U0001F1EB', - u':flag_for_Western_Sahara:': u'\U0001F1EA \U0001F1ED', - u':flag_for_Yemen:': u'\U0001F1FE \U0001F1EA', - u':flag_for_Zambia:': u'\U0001F1FF \U0001F1F2', - u':flag_for_Zimbabwe:': u'\U0001F1FF \U0001F1FC', - u':flag_for_Åland_Islands:': u'\U0001F1E6 \U0001F1FD', - u':golf:': u'\U000026F3', - u':fleur__de__lis:': u'\U0000269C', - u':muscle:': u'\U0001F4AA', - u':floppy_disk:': u'\U0001F4BE', - u':flower_playing_cards:': u'\U0001F3B4', - u':flushed:': u'\U0001F633', - u':fog:': u'\U0001F32B', - u':foggy:': u'\U0001F301', - u':footprints:': u'\U0001F463', - u':fork_and_knife:': u'\U0001F374', - u':fork_and_knife_with_plate:': u'\U0001F37D', - u':fountain:': u'\U000026F2', - u':four_leaf_clover:': u'\U0001F340', - u':frame_with_picture:': u'\U0001F5BC', - u':fries:': u'\U0001F35F', - u':fried_shrimp:': u'\U0001F364', - u':frog:': u'\U0001F438', - u':hatched_chick:': u'\U0001F425', - u':frowning:': u'\U0001F626', - u':fuelpump:': u'\U000026FD', - u':full_moon:': u'\U0001F315', - u':full_moon_with_face:': u'\U0001F31D', - u':funeral_urn:': u'\U000026B1', - u':game_die:': u'\U0001F3B2', - u':gear:': u'\U00002699', - u':gem:': u'\U0001F48E', - u':gemini:': u'\U0000264A', - u':ghost:': u'\U0001F47B', - u':girl:': u'\U0001F467', - u':globe_with_meridians:': u'\U0001F310', - u':star2:': u'\U0001F31F', - u':goat:': u'\U0001F410', - u':golfer:': u'\U0001F3CC', - u':mortar_board:': u'\U0001F393', - u':grapes:': u'\U0001F347', - u':green_apple:': u'\U0001F34F', - u':green_book:': u'\U0001F4D7', - u':green_heart:': u'\U0001F49A', - u':grimacing:': u'\U0001F62C', - u':smile_cat:': u'\U0001F638', - u':grinning:': u'\U0001F600', - u':grin:': u'\U0001F601', - u':heartpulse:': u'\U0001F497', - u':guardsman:': u'\U0001F482', - u':guitar:': u'\U0001F3B8', - u':haircut:': u'\U0001F487', - u':hamburger:': u'\U0001F354', - u':hammer:': u'\U0001F528', - u':hammer_and_pick:': u'\U00002692', - u':hammer_and_wrench:': u'\U0001F6E0', - u':hamster:': u'\U0001F439', - u':handbag:': u'\U0001F45C', - u':raising_hand:': u'\U0001F64B', - u':hatching_chick:': u'\U0001F423', - u':headphones:': u'\U0001F3A7', - u':hear_no_evil:': u'\U0001F649', - u':heart_decoration:': u'\U0001F49F', - u':cupid:': u'\U0001F498', - u':gift_heart:': u'\U0001F49D', - u':heart:': u'\U00002764', - u':heavy_check_mark:': u'\U00002714', - u':heavy_division_sign:': u'\U00002797', - u':heavy_dollar_sign:': u'\U0001F4B2', - u':exclamation:': u'\U00002757', - u':heavy_exclamation_mark:': u'\U00002757', - u':heavy_heart_exclamation_mark_ornament:': u'\U00002763', - u':o:': u'\U00002B55', - u':heavy_minus_sign:': u'\U00002796', - u':heavy_multiplication_x:': u'\U00002716', - u':heavy_plus_sign:': u'\U00002795', - u':helicopter:': u'\U0001F681', - u':helm_symbol:': u'\U00002388', - u':helmet_with_white_cross:': u'\U000026D1', - u':herb:': u'\U0001F33F', - u':hibiscus:': u'\U0001F33A', - u':high_heel:': u'\U0001F460', - u':bullettrain_side:': u'\U0001F684', - u':bullettrain_front:': u'\U0001F685', - u':high_brightness:': u'\U0001F506', - u':zap:': u'\U000026A1', - u':hocho:': u'\U0001F52A', - u':knife:': u'\U0001F52A', - u':hole:': u'\U0001F573', - u':honey_pot:': u'\U0001F36F', - u':bee:': u'\U0001F41D', - u':traffic_light:': u'\U0001F6A5', - u':racehorse:': u'\U0001F40E', - u':horse:': u'\U0001F434', - u':horse_racing:': u'\U0001F3C7', - u':hospital:': u'\U0001F3E5', - u':coffee:': u'\U00002615', - u':hot_dog:': u'\U0001F32D', - u':hot_pepper:': u'\U0001F336', - u':hotsprings:': u'\U00002668', - u':hotel:': u'\U0001F3E8', - u':hourglass:': u'\U0000231B', - u':hourglass_flowing_sand:': u'\U000023F3', - u':house:': u'\U0001F3E0', - u':house_buildings:': u'\U0001F3D8', - u':house_with_garden:': u'\U0001F3E1', - u':hugging_face:': u'\U0001F917', - u':100:': u'\U0001F4AF', - u':hushed:': u'\U0001F62F', - u':ice_cream:': u'\U0001F368', - u':ice_hockey_stick_and_puck:': u'\U0001F3D2', - u':ice_skate:': u'\U000026F8', - u':imp:': u'\U0001F47F', - u':inbox_tray:': u'\U0001F4E5', - u':incoming_envelope:': u'\U0001F4E8', - u':information_desk_person:': u'\U0001F481', - u':information_source:': u'\U00002139', - u':capital_abcd:': u'\U0001F520', - u':abc:': u'\U0001F524', - u':abcd:': u'\U0001F521', - u':1234:': u'\U0001F522', - u':symbols:': u'\U0001F523', - u':izakaya_lantern:': u'\U0001F3EE', - u':lantern:': u'\U0001F3EE', - u':jack_o_lantern:': u'\U0001F383', - u':japanese_castle:': u'\U0001F3EF', - u':dolls:': u'\U0001F38E', - u':japanese_goblin:': u'\U0001F47A', - u':japanese_ogre:': u'\U0001F479', - u':post_office:': u'\U0001F3E3', - u':beginner:': u'\U0001F530', - u':jeans:': u'\U0001F456', - u':joystick:': u'\U0001F579', - u':kaaba:': u'\U0001F54B', - u':key:': u'\U0001F511', - u':keyboard:': u'\U00002328', - u':keycap_asterisk:': u'\U0000002A \U000020E3', - u':keycap_digit_eight:': u'\U00000038 \U000020E3', - u':keycap_digit_five:': u'\U00000035 \U000020E3', - u':keycap_digit_four:': u'\U00000034 \U000020E3', - u':keycap_digit_nine:': u'\U00000039 \U000020E3', - u':keycap_digit_one:': u'\U00000031 \U000020E3', - u':keycap_digit_seven:': u'\U00000037 \U000020E3', - u':keycap_digit_six:': u'\U00000036 \U000020E3', - u':keycap_digit_three:': u'\U00000033 \U000020E3', - u':keycap_digit_two:': u'\U00000032 \U000020E3', - u':keycap_digit_zero:': u'\U00000030 \U000020E3', - u':keycap_number_sign:': u'\U00000023 \U000020E3', - u':keycap_ten:': u'\U0001F51F', - u':kimono:': u'\U0001F458', - u':couplekiss:': u'\U0001F48F', - u':kiss:': u'\U0001F48B', - u':kissing_cat:': u'\U0001F63D', - u':kissing:': u'\U0001F617', - u':kissing_closed_eyes:': u'\U0001F61A', - u':kissing_smiling_eyes:': u'\U0001F619', - u':koala:': u'\U0001F428', - u':label:': u'\U0001F3F7', - u':beetle:': u'\U0001F41E', - u':large_blue_circle:': u'\U0001F535', - u':large_blue_diamond:': u'\U0001F537', - u':large_orange_diamond:': u'\U0001F536', - u':red_circle:': u'\U0001F534', - u':last_quarter_moon:': u'\U0001F317', - u':last_quarter_moon_with_face:': u'\U0001F31C', - u':latin_cross:': u'\U0000271D', - u':leaves:': u'\U0001F343', - u':ledger:': u'\U0001F4D2', - u':mag:': u'\U0001F50D', - u':left_luggage:': u'\U0001F6C5', - u':left_right_arrow:': u'\U00002194', - u':leftwards_arrow_with_hook:': u'\U000021A9', - u':arrow_left:': u'\U00002B05', - u':lemon:': u'\U0001F34B', - u':leo:': u'\U0000264C', - u':leopard:': u'\U0001F406', - u':level_slider:': u'\U0001F39A', - u':libra:': u'\U0000264E', - u':light_rail:': u'\U0001F688', - u':link:': u'\U0001F517', - u':linked_paperclips:': u'\U0001F587', - u':lion_face:': u'\U0001F981', - u':lipstick:': u'\U0001F484', - u':lock:': u'\U0001F512', - u':lock_with_ink_pen:': u'\U0001F50F', - u':lollipop:': u'\U0001F36D', - u':sob:': u'\U0001F62D', - u':love_hotel:': u'\U0001F3E9', - u':love_letter:': u'\U0001F48C', - u':low_brightness:': u'\U0001F505', - u':lower_left_ballpoint_pen:': u'\U0001F58A', - u':lower_left_crayon:': u'\U0001F58D', - u':lower_left_fountain_pen:': u'\U0001F58B', - u':lower_left_paintbrush:': u'\U0001F58C', - u':mahjong:': u'\U0001F004', - u':man:': u'\U0001F468', - u':couple:': u'\U0001F46B', - u':man_in_business_suit_levitating:': u'\U0001F574', - u':man_with_gua_pi_mao:': u'\U0001F472', - u':man_with_turban:': u'\U0001F473', - u':mans_shoe:': u'\U0001F45E', - u':shoe:': u'\U0001F45E', - u':mantelpiece_clock:': u'\U0001F570', - u':maple_leaf:': u'\U0001F341', - u':meat_on_bone:': u'\U0001F356', - u':black_circle:': u'\U000026AB', - u':white_circle:': u'\U000026AA', - u':melon:': u'\U0001F348', - u':memo:': u'\U0001F4DD', - u':pencil:': u'\U0001F4DD', - u':menorah_with_nine_branches:': u'\U0001F54E', - u':mens:': u'\U0001F6B9', - u':metro:': u'\U0001F687', - u':microphone:': u'\U0001F3A4', - u':microscope:': u'\U0001F52C', - u':military_medal:': u'\U0001F396', - u':milky_way:': u'\U0001F30C', - u':minibus:': u'\U0001F690', - u':minidisc:': u'\U0001F4BD', - u':iphone:': u'\U0001F4F1', - u':mobile_phone_off:': u'\U0001F4F4', - u':calling:': u'\U0001F4F2', - u':money__mouth_face:': u'\U0001F911', - u':moneybag:': u'\U0001F4B0', - u':money_with_wings:': u'\U0001F4B8', - u':monkey:': u'\U0001F412', - u':monkey_face:': u'\U0001F435', - u':monorail:': u'\U0001F69D', - u':rice_scene:': u'\U0001F391', - u':mosque:': u'\U0001F54C', - u':motor_boat:': u'\U0001F6E5', - u':motorway:': u'\U0001F6E3', - u':mount_fuji:': u'\U0001F5FB', - u':mountain:': u'\U000026F0', - u':mountain_bicyclist:': u'\U0001F6B5', - u':mountain_cableway:': u'\U0001F6A0', - u':mountain_railway:': u'\U0001F69E', - u':mouse2:': u'\U0001F401', - u':mouse:': u'\U0001F42D', - u':lips:': u'\U0001F444', - u':movie_camera:': u'\U0001F3A5', - u':moyai:': u'\U0001F5FF', - u':notes:': u'\U0001F3B6', - u':mushroom:': u'\U0001F344', - u':musical_keyboard:': u'\U0001F3B9', - u':musical_note:': u'\U0001F3B5', - u':musical_score:': u'\U0001F3BC', - u':nail_care:': u'\U0001F485', - u':name_badge:': u'\U0001F4DB', - u':national_park:': u'\U0001F3DE', - u':necktie:': u'\U0001F454', - u':ab:': u'\U0001F18E', - u':negative_squared_cross_mark:': u'\U0000274E', - u':a:': u'\U0001F170', - u':b:': u'\U0001F171', - u':o2:': u'\U0001F17E', - u':parking:': u'\U0001F17F', - u':nerd_face:': u'\U0001F913', - u':neutral_face:': u'\U0001F610', - u':new_moon:': u'\U0001F311', - u':honeybee:': u'\U0001F41D', - u':new_moon_with_face:': u'\U0001F31A', - u':newspaper:': u'\U0001F4F0', - u':night_with_stars:': u'\U0001F303', - u':no_bicycles:': u'\U0001F6B3', - u':no_entry:': u'\U000026D4', - u':no_entry_sign:': u'\U0001F6AB', - u':no_mobile_phones:': u'\U0001F4F5', - u':underage:': u'\U0001F51E', - u':no_pedestrians:': u'\U0001F6B7', - u':no_smoking:': u'\U0001F6AD', - u':non__potable_water:': u'\U0001F6B1', - u':arrow_upper_right:': u'\U00002197', - u':arrow_upper_left:': u'\U00002196', - u':nose:': u'\U0001F443', - u':notebook:': u'\U0001F4D3', - u':notebook_with_decorative_cover:': u'\U0001F4D4', - u':nut_and_bolt:': u'\U0001F529', - u':octopus:': u'\U0001F419', - u':oden:': u'\U0001F362', - u':office:': u'\U0001F3E2', - u':oil_drum:': u'\U0001F6E2', - u':ok_hand:': u'\U0001F44C', - u':old_key:': u'\U0001F5DD', - u':older_man:': u'\U0001F474', - u':older_woman:': u'\U0001F475', - u':om_symbol:': u'\U0001F549', - u':on:': u'\U0001F51B', - u':oncoming_automobile:': u'\U0001F698', - u':oncoming_bus:': u'\U0001F68D', - u':oncoming_police_car:': u'\U0001F694', - u':oncoming_taxi:': u'\U0001F696', - u':book:': u'\U0001F4D6', - u':open_book:': u'\U0001F4D6', - u':open_file_folder:': u'\U0001F4C2', - u':open_hands:': u'\U0001F450', - u':unlock:': u'\U0001F513', - u':mailbox_with_no_mail:': u'\U0001F4ED', - u':mailbox_with_mail:': u'\U0001F4EC', - u':ophiuchus:': u'\U000026CE', - u':cd:': u'\U0001F4BF', - u':orange_book:': u'\U0001F4D9', - u':orthodox_cross:': u'\U00002626', - u':outbox_tray:': u'\U0001F4E4', - u':ox:': u'\U0001F402', - u':package:': u'\U0001F4E6', - u':page_facing_up:': u'\U0001F4C4', - u':page_with_curl:': u'\U0001F4C3', - u':pager:': u'\U0001F4DF', - u':palm_tree:': u'\U0001F334', - u':panda_face:': u'\U0001F43C', - u':paperclip:': u'\U0001F4CE', - u':part_alternation_mark:': u'\U0000303D', - u':tada:': u'\U0001F389', - u':passenger_ship:': u'\U0001F6F3', - u':passport_control:': u'\U0001F6C2', - u':feet:': u'\U0001F43E', - u':paw_prints:': u'\U0001F43E', - u':peace_symbol:': u'\U0000262E', - u':peach:': u'\U0001F351', - u':pear:': u'\U0001F350', - u':walking:': u'\U0001F6B6', - u':pencil2:': u'\U0000270F', - u':penguin:': u'\U0001F427', - u':pensive:': u'\U0001F614', - u':performing_arts:': u'\U0001F3AD', - u':persevere:': u'\U0001F623', - u':bow:': u'\U0001F647', - u':person_frowning:': u'\U0001F64D', - u':raised_hands:': u'\U0001F64C', - u':person_with_ball:': u'\U000026F9', - u':person_with_blond_hair:': u'\U0001F471', - u':pray:': u'\U0001F64F', - u':person_with_pouting_face:': u'\U0001F64E', - u':computer:': u'\U0001F4BB', - u':pick:': u'\U000026CF', - u':pig2:': u'\U0001F416', - u':pig:': u'\U0001F437', - u':pig_nose:': u'\U0001F43D', - u':hankey:': u'\U0001F4A9', - u':poop:': u'\U0001F4A9', - u':shit:': u'\U0001F4A9', - u':pill:': u'\U0001F48A', - u':bamboo:': u'\U0001F38D', - u':pineapple:': u'\U0001F34D', - u':pisces:': u'\U00002653', - u':gun:': u'\U0001F52B', - u':place_of_worship:': u'\U0001F6D0', - u':black_joker:': u'\U0001F0CF', - u':police_car:': u'\U0001F693', - u':rotating_light:': u'\U0001F6A8', - u':cop:': u'\U0001F46E', - u':poodle:': u'\U0001F429', - u':popcorn:': u'\U0001F37F', - u':postal_horn:': u'\U0001F4EF', - u':postbox:': u'\U0001F4EE', - u':stew:': u'\U0001F372', - u':potable_water:': u'\U0001F6B0', - u':pouch:': u'\U0001F45D', - u':poultry_leg:': u'\U0001F357', - u':pouting_cat:': u'\U0001F63E', - u':rage:': u'\U0001F621', - u':prayer_beads:': u'\U0001F4FF', - u':princess:': u'\U0001F478', - u':printer:': u'\U0001F5A8', - u':loudspeaker:': u'\U0001F4E2', - u':purple_heart:': u'\U0001F49C', - u':purse:': u'\U0001F45B', - u':pushpin:': u'\U0001F4CC', - u':put_litter_in_its_place:': u'\U0001F6AE', - u':rabbit2:': u'\U0001F407', - u':rabbit:': u'\U0001F430', - u':racing_car:': u'\U0001F3CE', - u':racing_motorcycle:': u'\U0001F3CD', - u':radio:': u'\U0001F4FB', - u':radio_button:': u'\U0001F518', - u':radioactive_sign:': u'\U00002622', - u':railway_car:': u'\U0001F683', - u':railway_track:': u'\U0001F6E4', - u':rainbow:': u'\U0001F308', - u':fist:': u'\U0000270A', - u':hand:': u'\U0000270B', - u':raised_hand:': u'\U0000270B', - u':raised_hand_with_fingers_splayed:': u'\U0001F590', - u':raised_hand_with_part_between_middle_and_ring_fingers:': u'\U0001F596', - u':ram:': u'\U0001F40F', - u':rat:': u'\U0001F400', - u':blue_car:': u'\U0001F699', - u':apple:': u'\U0001F34E', - u':registered:': u'\U000000AE', - u':relieved:': u'\U0001F60C', - u':reminder_ribbon:': u'\U0001F397', - u':restroom:': u'\U0001F6BB', - u':reversed_hand_with_middle_finger_extended:': u'\U0001F595', - u':revolving_hearts:': u'\U0001F49E', - u':ribbon:': u'\U0001F380', - u':rice_ball:': u'\U0001F359', - u':rice_cracker:': u'\U0001F358', - u':mag_right:': u'\U0001F50E', - u':right_anger_bubble:': u'\U0001F5EF', - u':arrow_right_hook:': u'\U000021AA', - u':ring:': u'\U0001F48D', - u':sweet_potato:': u'\U0001F360', - u':robot_face:': u'\U0001F916', - u':rocket:': u'\U0001F680', - u':rolled__up_newspaper:': u'\U0001F5DE', - u':roller_coaster:': u'\U0001F3A2', - u':rooster:': u'\U0001F413', - u':rose:': u'\U0001F339', - u':rosette:': u'\U0001F3F5', - u':round_pushpin:': u'\U0001F4CD', - u':rowboat:': u'\U0001F6A3', - u':rugby_football:': u'\U0001F3C9', - u':runner:': u'\U0001F3C3', - u':running:': u'\U0001F3C3', - u':running_shirt_with_sash:': u'\U0001F3BD', - u':sagittarius:': u'\U00002650', - u':boat:': u'\U000026F5', - u':sailboat:': u'\U000026F5', - u':sake:': u'\U0001F376', - u':satellite:': u'\U0001F4E1', - u':saxophone:': u'\U0001F3B7', - u':scales:': u'\U00002696', - u':school:': u'\U0001F3EB', - u':school_satchel:': u'\U0001F392', - u':scorpion:': u'\U0001F982', - u':scorpius:': u'\U0000264F', - u':scroll:': u'\U0001F4DC', - u':seat:': u'\U0001F4BA', - u':see_no_evil:': u'\U0001F648', - u':seedling:': u'\U0001F331', - u':shamrock:': u'\U00002618', - u':shaved_ice:': u'\U0001F367', - u':sheep:': u'\U0001F411', - u':shield:': u'\U0001F6E1', - u':shinto_shrine:': u'\U000026E9', - u':ship:': u'\U0001F6A2', - u':stars:': u'\U0001F320', - u':shopping_bags:': u'\U0001F6CD', - u':cake:': u'\U0001F370', - u':shower:': u'\U0001F6BF', - u':sign_of_the_horns:': u'\U0001F918', - u':japan:': u'\U0001F5FE', - u':six_pointed_star:': u'\U0001F52F', - u':ski:': u'\U0001F3BF', - u':skier:': u'\U000026F7', - u':skull:': u'\U0001F480', - u':skull_and_crossbones:': u'\U00002620', - u':sleeping_accommodation:': u'\U0001F6CC', - u':sleeping:': u'\U0001F634', - u':zzz:': u'\U0001F4A4', - u':sleepy:': u'\U0001F62A', - u':sleuth_or_spy:': u'\U0001F575', - u':pizza:': u'\U0001F355', - u':slightly_frowning_face:': u'\U0001F641', - u':slightly_smiling_face:': u'\U0001F642', - u':slot_machine:': u'\U0001F3B0', - u':small_airplane:': u'\U0001F6E9', - u':small_blue_diamond:': u'\U0001F539', - u':small_orange_diamond:': u'\U0001F538', - u':heart_eyes_cat:': u'\U0001F63B', - u':smiley_cat:': u'\U0001F63A', - u':innocent:': u'\U0001F607', - u':heart_eyes:': u'\U0001F60D', - u':smiling_imp:': u'\U0001F608', - u':smiley:': u'\U0001F603', - u':sweat_smile:': u'\U0001F605', - u':smile:': u'\U0001F604', - u':laughing:': u'\U0001F606', - u':satisfied:': u'\U0001F606', - u':blush:': u'\U0001F60A', - u':sunglasses:': u'\U0001F60E', - u':smirk:': u'\U0001F60F', - u':smoking:': u'\U0001F6AC', - u':snail:': u'\U0001F40C', - u':snake:': u'\U0001F40D', - u':snow_capped_mountain:': u'\U0001F3D4', - u':snowboarder:': u'\U0001F3C2', - u':snowflake:': u'\U00002744', - u':snowman:': u'\U00002603', - u':soccer:': u'\U000026BD', - u':icecream:': u'\U0001F366', - u':soon:': u'\U0001F51C', - u':arrow_lower_right:': u'\U00002198', - u':arrow_lower_left:': u'\U00002199', - u':spaghetti:': u'\U0001F35D', - u':sparkle:': u'\U00002747', - u':sparkles:': u'\U00002728', - u':sparkling_heart:': u'\U0001F496', - u':speak_no_evil:': u'\U0001F64A', - u':speaker:': u'\U0001F508', - u':mute:': u'\U0001F507', - u':sound:': u'\U0001F509', - u':loud_sound:': u'\U0001F50A', - u':speaking_head_in_silhouette:': u'\U0001F5E3', - u':speech_balloon:': u'\U0001F4AC', - u':speedboat:': u'\U0001F6A4', - u':spider:': u'\U0001F577', - u':spider_web:': u'\U0001F578', - u':spiral_calendar_pad:': u'\U0001F5D3', - u':spiral_note_pad:': u'\U0001F5D2', - u':shell:': u'\U0001F41A', - u':sweat_drops:': u'\U0001F4A6', - u':sports_medal:': u'\U0001F3C5', - u':whale:': u'\U0001F433', - u':u5272:': u'\U0001F239', - u':u5408:': u'\U0001F234', - u':u55b6:': u'\U0001F23A', - u':u6307:': u'\U0001F22F', - u':u6708:': u'\U0001F237', - u':u6709:': u'\U0001F236', - u':u6e80:': u'\U0001F235', - u':u7121:': u'\U0001F21A', - u':u7533:': u'\U0001F238', - u':u7981:': u'\U0001F232', - u':u7a7a:': u'\U0001F233', - u':cl:': u'\U0001F191', - u':cool:': u'\U0001F192', - u':free:': u'\U0001F193', - u':id:': u'\U0001F194', - u':koko:': u'\U0001F201', - u':sa:': u'\U0001F202', - u':new:': u'\U0001F195', - u':ng:': u'\U0001F196', - u':ok:': u'\U0001F197', - u':sos:': u'\U0001F198', - u':up:': u'\U0001F199', - u':vs:': u'\U0001F19A', - u':stadium:': u'\U0001F3DF', - u':star_and_crescent:': u'\U0000262A', - u':star_of_david:': u'\U00002721', - u':station:': u'\U0001F689', - u':statue_of_liberty:': u'\U0001F5FD', - u':steam_locomotive:': u'\U0001F682', - u':ramen:': u'\U0001F35C', - u':stopwatch:': u'\U000023F1', - u':straight_ruler:': u'\U0001F4CF', - u':strawberry:': u'\U0001F353', - u':studio_microphone:': u'\U0001F399', - u':partly_sunny:': u'\U000026C5', - u':sun_with_face:': u'\U0001F31E', - u':sunflower:': u'\U0001F33B', - u':sunrise:': u'\U0001F305', - u':sunrise_over_mountains:': u'\U0001F304', - u':city_sunrise:': u'\U0001F307', - u':surfer:': u'\U0001F3C4', - u':sushi:': u'\U0001F363', - u':suspension_railway:': u'\U0001F69F', - u':swimmer:': u'\U0001F3CA', - u':synagogue:': u'\U0001F54D', - u':syringe:': u'\U0001F489', - u':shirt:': u'\U0001F455', - u':tshirt:': u'\U0001F455', - u':table_tennis_paddle_and_ball:': u'\U0001F3D3', - u':taco:': u'\U0001F32E', - u':tanabata_tree:': u'\U0001F38B', - u':tangerine:': u'\U0001F34A', - u':taurus:': u'\U00002649', - u':taxi:': u'\U0001F695', - u':tea:': u'\U0001F375', - u':calendar:': u'\U0001F4C6', - u':telephone_receiver:': u'\U0001F4DE', - u':telescope:': u'\U0001F52D', - u':tv:': u'\U0001F4FA', - u':tennis:': u'\U0001F3BE', - u':tent:': u'\U000026FA', - u':thermometer:': u'\U0001F321', - u':thinking_face:': u'\U0001F914', - u':thought_balloon:': u'\U0001F4AD', - u':three_button_mouse:': u'\U0001F5B1', - u':+1:': u'\U0001F44D', - u':thumbsup:': u'\U0001F44D', - u':__1:': u'\U0001F44E', - u':thumbsdown:': u'\U0001F44E', - u':thunder_cloud_and_rain:': u'\U000026C8', - u':ticket:': u'\U0001F3AB', - u':tiger2:': u'\U0001F405', - u':tiger:': u'\U0001F42F', - u':timer_clock:': u'\U000023F2', - u':tired_face:': u'\U0001F62B', - u':toilet:': u'\U0001F6BD', - u':tokyo_tower:': u'\U0001F5FC', - u':tomato:': u'\U0001F345', - u':tongue:': u'\U0001F445', - u':tophat:': u'\U0001F3A9', - u':top:': u'\U0001F51D', - u':trackball:': u'\U0001F5B2', - u':tractor:': u'\U0001F69C', - u':tm:': u'\U00002122', - u':train2:': u'\U0001F686', - u':tram:': u'\U0001F68A', - u':train:': u'\U0001F68B', - u':triangular_flag_on_post:': u'\U0001F6A9', - u':triangular_ruler:': u'\U0001F4D0', - u':trident:': u'\U0001F531', - u':trolleybus:': u'\U0001F68E', - u':trophy:': u'\U0001F3C6', - u':tropical_drink:': u'\U0001F379', - u':tropical_fish:': u'\U0001F420', - u':trumpet:': u'\U0001F3BA', - u':tulip:': u'\U0001F337', - u':turkey:': u'\U0001F983', - u':turtle:': u'\U0001F422', - u':twisted_rightwards_arrows:': u'\U0001F500', - u':two_hearts:': u'\U0001F495', - u':two_men_holding_hands:': u'\U0001F46C', - u':two_women_holding_hands:': u'\U0001F46D', - u':umbrella:': u'\U00002602', - u':umbrella_on_ground:': u'\U000026F1', - u':unamused:': u'\U0001F612', - u':unicorn_face:': u'\U0001F984', - u':small_red_triangle:': u'\U0001F53A', - u':arrow_up_small:': u'\U0001F53C', - u':arrow_up_down:': u'\U00002195', - u':upside__down_face:': u'\U0001F643', - u':arrow_up:': u'\U00002B06', - u':vertical_traffic_light:': u'\U0001F6A6', - u':vibration_mode:': u'\U0001F4F3', - u':v:': u'\U0000270C', - u':video_camera:': u'\U0001F4F9', - u':video_game:': u'\U0001F3AE', - u':vhs:': u'\U0001F4FC', - u':violin:': u'\U0001F3BB', - u':virgo:': u'\U0000264D', - u':volcano:': u'\U0001F30B', - u':volleyball:': u'\U0001F3D0', - u':waning_crescent_moon:': u'\U0001F318', - u':waning_gibbous_moon:': u'\U0001F316', - u':warning:': u'\U000026A0', - u':wastebasket:': u'\U0001F5D1', - u':watch:': u'\U0000231A', - u':water_buffalo:': u'\U0001F403', - u':wc:': u'\U0001F6BE', - u':ocean:': u'\U0001F30A', - u':watermelon:': u'\U0001F349', - u':waving_black_flag:': u'\U0001F3F4', - u':wave:': u'\U0001F44B', - u':waving_white_flag:': u'\U0001F3F3', - u':wavy_dash:': u'\U00003030', - u':waxing_crescent_moon:': u'\U0001F312', - u':moon:': u'\U0001F314', - u':waxing_gibbous_moon:': u'\U0001F314', - u':scream_cat:': u'\U0001F640', - u':weary:': u'\U0001F629', - u':wedding:': u'\U0001F492', - u':weight_lifter:': u'\U0001F3CB', - u':whale2:': u'\U0001F40B', - u':wheel_of_dharma:': u'\U00002638', - u':wheelchair:': u'\U0000267F', - u':point_down:': u'\U0001F447', - u':grey_exclamation:': u'\U00002755', - u':white_flower:': u'\U0001F4AE', - u':white_frowning_face:': u'\U00002639', - u':white_check_mark:': u'\U00002705', - u':white_large_square:': u'\U00002B1C', - u':point_left:': u'\U0001F448', - u':white_medium_small_square:': u'\U000025FD', - u':white_medium_square:': u'\U000025FB', - u':star:': u'\U00002B50', - u':grey_question:': u'\U00002754', - u':point_right:': u'\U0001F449', - u':white_small_square:': u'\U000025AB', - u':relaxed:': u'\U0000263A', - u':white_square_button:': u'\U0001F533', - u':white_sun_behind_cloud:': u'\U0001F325', - u':white_sun_behind_cloud_with_rain:': u'\U0001F326', - u':white_sun_with_small_cloud:': u'\U0001F324', - u':point_up_2:': u'\U0001F446', - u':point_up:': u'\U0000261D', - u':wind_blowing_face:': u'\U0001F32C', - u':wind_chime:': u'\U0001F390', - u':wine_glass:': u'\U0001F377', - u':wink:': u'\U0001F609', - u':wolf:': u'\U0001F43A', - u':woman:': u'\U0001F469', - u':dancers:': u'\U0001F46F', - u':boot:': u'\U0001F462', - u':womans_clothes:': u'\U0001F45A', - u':womans_hat:': u'\U0001F452', - u':sandal:': u'\U0001F461', - u':womens:': u'\U0001F6BA', - u':world_map:': u'\U0001F5FA', - u':worried:': u'\U0001F61F', - u':gift:': u'\U0001F381', - u':wrench:': u'\U0001F527', - u':writing_hand:': u'\U0000270D', - u':yellow_heart:': u'\U0001F49B', - u':yin_yang:': u'\U0000262F', - u':zipper__mouth_face:': u'\U0001F910' -}) - - -UNICODE_EMOJI = {v: k for k, v in EMOJI_UNICODE.items()} -UNICODE_EMOJI_ALIAS = {v: k for k, v in EMOJI_ALIAS_UNICODE.items()} diff --git a/website/web/Lib/site-packages/flask/__init__.py b/website/web/Lib/site-packages/flask/__init__.py deleted file mode 100644 index a9a873fac..000000000 --- a/website/web/Lib/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: (c) 2015 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -__version__ = '0.12.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/website/web/Lib/site-packages/flask/__main__.py b/website/web/Lib/site-packages/flask/__main__.py deleted file mode 100644 index cbefccd27..000000000 --- a/website/web/Lib/site-packages/flask/__main__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.__main__ - ~~~~~~~~~~~~~~ - - Alias for flask.run for the command line. - - :copyright: (c) 2015 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - - -if __name__ == '__main__': - from .cli import main - main(as_module=True) diff --git a/website/web/Lib/site-packages/flask/_compat.py b/website/web/Lib/site-packages/flask/_compat.py deleted file mode 100644 index 071628fc1..000000000 --- a/website/web/Lib/site-packages/flask/_compat.py +++ /dev/null @@ -1,96 +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: (c) 2015 by Armin Ronacher. - :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 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 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/website/web/Lib/site-packages/flask/app.py b/website/web/Lib/site-packages/flask/app.py deleted file mode 100644 index 1404e17e7..000000000 --- a/website/web/Lib/site-packages/flask/app.py +++ /dev/null @@ -1,2003 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.app - ~~~~~~~~~ - - This module implements the central WSGI application object. - - :copyright: (c) 2015 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import os -import sys -from threading import Lock -from datetime import timedelta -from itertools import chain -from functools import update_wrapper - -from werkzeug.datastructures import ImmutableDict -from werkzeug.routing import Map, Rule, RequestRedirect, BuildError -from werkzeug.exceptions import HTTPException, InternalServerError, \ - MethodNotAllowed, BadRequest, default_exceptions - -from .helpers import _PackageBoundObject, url_for, get_flashed_messages, \ - locked_cached_property, _endpoint_from_view_func, find_package, \ - get_debug_flag -from . import json, cli -from .wrappers import Request, Response -from .config import ConfigAttribute, Config -from .ctx import RequestContext, AppContext, _AppCtxGlobals -from .globals import _request_ctx_stack, request, session, g -from .sessions import SecureCookieSessionInterface -from .templating import DispatchingJinjaLoader, Environment, \ - _default_template_ctx_processor -from .signals import request_started, request_finished, got_request_exception, \ - request_tearing_down, appcontext_tearing_down -from ._compat import reraise, string_types, text_type, integer_types - -# a lock used for logger initialization -_logger_lock = Lock() - -# 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. - - :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 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 - - # Backwards compatibility support - def _get_request_globals_class(self): - return self.app_ctx_globals_class - def _set_request_globals_class(self, value): - from warnings import warn - warn(DeprecationWarning('request_globals_class attribute is now ' - 'called app_ctx_globals_class')) - self.app_ctx_globals_class = value - request_globals_class = property(_get_request_globals_class, - _set_request_globals_class) - del _get_request_globals_class, _set_request_globals_class - - #: 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 debug flag. Set this to ``True`` to enable debugging of the - #: application. In debug mode the debugger will kick in when an unhandled - #: exception occurs and the integrated server will automatically reload - #: the application if changes in the code are detected. - #: - #: This attribute can also be configured from the config with the ``DEBUG`` - #: configuration key. Defaults to ``False``. - debug = ConfigAttribute('DEBUG') - - #: 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 unittest 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 - #: ``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 name of the logger to use. By default the logger name is the - #: package name passed to the constructor. - #: - #: .. versionadded:: 0.4 - logger_name = ConfigAttribute('LOGGER_NAME') - - #: 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({ - 'DEBUG': get_debug_flag(default=False), - 'TESTING': False, - 'PROPAGATE_EXCEPTIONS': None, - 'PRESERVE_CONTEXT_ON_EXCEPTION': None, - 'SECRET_KEY': None, - 'PERMANENT_SESSION_LIFETIME': timedelta(days=31), - 'USE_X_SENDFILE': False, - 'LOGGER_NAME': None, - 'LOGGER_HANDLER_POLICY': 'always', - 'SERVER_NAME': None, - 'APPLICATION_ROOT': None, - 'SESSION_COOKIE_NAME': 'session', - 'SESSION_COOKIE_DOMAIN': None, - 'SESSION_COOKIE_PATH': None, - 'SESSION_COOKIE_HTTPONLY': True, - 'SESSION_COOKIE_SECURE': False, - 'SESSION_REFRESH_EACH_REQUEST': True, - 'MAX_CONTENT_LENGTH': None, - 'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12), - 'TRAP_BAD_REQUEST_ERRORS': False, - 'TRAP_HTTP_EXCEPTIONS': False, - 'EXPLAIN_TEMPLATE_LOADING': False, - 'PREFERRED_URL_SCHEME': 'http', - 'JSON_AS_ASCII': True, - 'JSON_SORT_KEYS': True, - 'JSONIFY_PRETTYPRINT_REGULAR': True, - 'JSONIFY_MIMETYPE': 'application/json', - 'TEMPLATES_AUTO_RELOAD': None, - }) - - #: 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 session interface to use. By default an instance of - #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. - #: - #: .. versionadded:: 0.8 - session_interface = SecureCookieSessionInterface() - - def __init__(self, import_name, static_path=None, static_url_path=None, - static_folder='static', 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_path is not None: - from warnings import warn - warn(DeprecationWarning('static_path is now called ' - 'static_url_path'), stacklevel=2) - static_url_path = static_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) - - # Prepare the deferred setup of the logger. - self._logger = None - self.logger_name = self.import_name - - #: 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 = {} - - # support for the now deprecated `error_handlers` attribute. The - # :attr:`error_handler_spec` shall be used now. - self._error_handlers = {} - - #: 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 a error handler, use the :meth:`errorhandler` - #: decorator. - self.error_handler_spec = {None: self._error_handlers} - - #: 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 should be called at the - #: beginning of the 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 open database connections or - #: getting hold of the currently logged in user. To register a - #: function here, use the :meth:`before_request` decorator. - self.before_request_funcs = {} - - #: A lists of functions that should be called at the beginning of the - #: first request to this instance. To register a function here, 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 can be used as URL - #: value processor functions. Whenever a URL is built these functions - #: are called to modify the dictionary of values in place. 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 - #: - #: .. 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() - - # tracks internally if the application already handled at least one - # request. - self._got_first_request = False - self._before_request_lock = Lock() - - # register the static folder for the application. Do that even - # if the folder does not exist. First of all it might be created - # while the server is running (usually happens during development) - # but also because google appengine stores static files somewhere - # else when mapped with the .yml file. - if self.has_static_folder: - self.add_url_rule(self.static_url_path + '/', - endpoint='static', - 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) - - def _get_error_handlers(self): - from warnings import warn - warn(DeprecationWarning('error_handlers is deprecated, use the ' - 'new error_handler_spec attribute instead.'), stacklevel=1) - return self._error_handlers - def _set_error_handlers(self, value): - self._error_handlers = value - self.error_handler_spec[None] = value - error_handlers = property(_get_error_handlers, _set_error_handlers) - del _get_error_handlers, _set_error_handlers - - @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 - - @property - def logger(self): - """A :class:`logging.Logger` object for this application. The - default configuration is to log to stderr if the application is - in debug mode. This logger can be used to (surprise) log messages. - Here some examples:: - - app.logger.debug('A value for debugging') - app.logger.warning('A warning occurred (%d apples)', 42) - app.logger.error('An error occurred') - - .. versionadded:: 0.3 - """ - if self._logger and self._logger.name == self.logger_name: - return self._logger - with _logger_lock: - if self._logger and self._logger.name == self.logger_name: - return self._logger - from flask.logging import create_logger - self._logger = rv = create_logger(self) - return rv - - @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 - return self.config_class(root_path, self.default_config) - - 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 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: - if self.config['TEMPLATES_AUTO_RELOAD'] is not None: - options['auto_reload'] = self.config['TEMPLATES_AUTO_RELOAD'] - else: - options['auto_reload'] = self.debug - 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 init_jinja_globals(self): - """Deprecated. Used to initialize the Jinja2 globals. - - .. versionadded:: 0.5 - .. versionchanged:: 0.7 - This method is deprecated with 0.7. Override - :meth:`create_jinja_environment` instead. - """ - - 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 - - def run(self, host=None, port=None, debug=None, **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. - - .. versionchanged:: 0.10 - The default port is now picked from the ``SERVER_NAME`` variable. - - :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'``. - :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 options: the options to be forwarded to the underlying - Werkzeug server. See - :func:`werkzeug.serving.run_simple` for more - information. - """ - from werkzeug.serving import run_simple - if host is None: - host = '127.0.0.1' - if port is None: - server_name = self.config['SERVER_NAME'] - if server_name and ':' in server_name: - port = int(server_name.rsplit(':', 1)[1]) - else: - port = 5000 - if debug is not None: - self.debug = bool(debug) - options.setdefault('use_reloader', self.debug) - options.setdefault('use_debugger', self.debug) - 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 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`. - - :param request: an instance of :attr:`request_class`. - """ - 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`. - - :param session: the session to be saved (a - :class:`~werkzeug.contrib.securecookie.SecureCookie` - object) - :param response: an instance of :attr:`response_class` - """ - 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`. - - .. versionadded:: 0.7 - """ - return self.session_interface.make_null_session(self) - - @setupmethod - def register_blueprint(self, blueprint, **options): - """Registers a blueprint on the application. - - .. versionadded:: 0.7 - """ - first_registration = False - if blueprint.name in self.blueprints: - assert self.blueprints[blueprint.name] is blueprint, \ - 'A blueprint\'s name collision occurred between %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, **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 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. - 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): - """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 - - You can also register a function as error handler without using - the :meth:`errorhandler` decorator. The following example is - equivalent to the one above:: - - def page_not_found(error): - return 'This page does not exist', 404 - app.error_handler_spec[None][404] = page_not_found - - Setting error handlers via assignments to :attr:`error_handler_spec` - however is discouraged as it requires fiddling with nested dictionaries - and the special case for arbitrary exception types. - - The first ``None`` refers to the active blueprint. If the error - handler should be application wide ``None`` shall be used. - - .. 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 - - 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)) - - exc_class, code = self._get_exc_class_and_code(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. - - The function will be called without any arguments. - If the function returns a non-None value, it's 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 a 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 exception it will - be passed an error object. - - 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): - """Registers a function as URL value preprocessor for all view - functions of the application. It's called before the view functions - are called and can modify the url values provided. - """ - 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): - """Finds a registered error handler for the request’s blueprint. - Otherwise falls back to the app, returns None if not a suitable - handler is found. - """ - exc_class, code = self._get_exc_class_and_code(type(e)) - - def find_handler(handler_map): - if not handler_map: - return - for cls in exc_class.__mro__: - handler = handler_map.get(cls) - if handler is not None: - # cache for next time exc_class is raised - handler_map[exc_class] = handler - return handler - - # try blueprint handlers - handler = find_handler(self.error_handler_spec - .get(request.blueprint, {}) - .get(code)) - if handler is not None: - return handler - - # fall back to app handlers - return find_handler(self.error_handler_spec[None].get(code)) - - 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. - - .. versionadded:: 0.8 - """ - if self.config['TRAP_HTTP_EXCEPTIONS']: - return True - if self.config['TRAP_BAD_REQUEST_ERRORS']: - 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. - - .. versionadded:: 0.7 - """ - exc_type, exc_value, tb = sys.exc_info() - assert exc_value is e - - # ensure not to trash sys.exc_info() at that point in case someone - # wants the traceback preserved in handle_http_exception. Of course - # we cannot prevent users from trashing it themselves in a custom - # trap_http_exception method so that's their fault then. - - if isinstance(e, 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): - """Converts the return value from a view function to a real - response object that is an instance of :attr:`response_class`. - - The following types are allowed for `rv`: - - .. tabularcolumns:: |p{3.5cm}|p{9.5cm}| - - ======================= =========================================== - :attr:`response_class` the object is returned unchanged - :class:`str` a response object is created with the - string as body - :class:`unicode` a response object is created with the - string encoded to utf-8 as body - a WSGI function the function is called as WSGI application - and buffered as response object - :class:`tuple` A tuple in the form ``(response, status, - headers)`` or ``(response, headers)`` - where `response` is any of the - types defined here, `status` is a string - or an integer and `headers` is a list or - a dictionary with header values. - ======================= =========================================== - - :param rv: the return value from the view function - - .. versionchanged:: 0.9 - Previously a tuple was interpreted as the arguments for the - response object. - """ - status_or_headers = headers = None - if isinstance(rv, tuple): - rv, status_or_headers, headers = rv + (None,) * (3 - len(rv)) - - if rv is None: - raise ValueError('View function did not return a response') - - if isinstance(status_or_headers, (dict, list)): - headers, status_or_headers = status_or_headers, None - - if not isinstance(rv, self.response_class): - # When we create a response object directly, we let the constructor - # set the headers and status. We do this because there can be - # some extra logic involved when creating these objects with - # specific values (like default content type selection). - if isinstance(rv, (text_type, bytes, bytearray)): - rv = self.response_class(rv, headers=headers, - status=status_or_headers) - headers = status_or_headers = None - else: - rv = self.response_class.force_type(rv, request.environ) - - if status_or_headers is not None: - if isinstance(status_or_headers, string_types): - rv.status = status_or_headers - else: - rv.status_code = status_or_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. - """ - if request is not None: - return self.url_map.bind_to_environ(request.environ, - server_name=self.config['SERVER_NAME']) - # 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'] or '/', - 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 actual request dispatching and will - call each :meth:`before_request` decorated function, passing no - arguments. - If any of these functions returns a value, it's handled as - if it was the return value from the view and further - request handling is stopped. - - This also triggers the :meth:`url_value_preprocessor` functions before - the actual :meth:`before_request` functions are called. - """ - 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.save_session(ctx.session, response) - return response - - def do_teardown_request(self, exc=_sentinel): - """Called after the actual request dispatching and will - call every as :meth:`teardown_request` decorated function. This is - not actually called by the :class:`Flask` object itself but is always - triggered when the request context is popped. That way we have a - tighter control over certain resources under testing environments. - - .. versionchanged:: 0.9 - Added the `exc` argument. Previously this was always using the - current exception information. - """ - 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 when an application context is popped. This works pretty - much the same as :meth:`do_teardown_request` but for the application - context. - - .. 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): - """Binds the application only. For as long as the application is bound - to the current context the :data:`flask.current_app` points to that - application. An application context is automatically created when a - request context is pushed if necessary. - - Example usage:: - - with app.app_context(): - ... - - .. versionadded:: 0.9 - """ - return AppContext(self) - - def request_context(self, environ): - """Creates a :class:`~flask.ctx.RequestContext` from the given - environment and binds it to the current context. This must be used in - combination with the ``with`` statement because the request is only bound - to the current context for the duration of the ``with`` block. - - Example usage:: - - with app.request_context(environ): - do_something_with(request) - - The object returned can also be used without the ``with`` statement - which is useful for working in the shell. The example above is - doing exactly the same as this code:: - - ctx = app.request_context(environ) - ctx.push() - try: - do_something_with(request) - finally: - ctx.pop() - - .. versionchanged:: 0.3 - Added support for non-with statement usage and ``with`` statement - is now passed the ctx object. - - :param environ: a WSGI environment - """ - return RequestContext(self, environ) - - def test_request_context(self, *args, **kwargs): - """Creates a WSGI environment from the given values (see - :class:`werkzeug.test.EnvironBuilder` for more information, this - function accepts the same arguments). - """ - 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 - `__call__` so that middlewares can be applied without losing a - reference to the class. So 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 - The behavior of the before and after request callbacks was changed - under error conditions and a new callback was added that will - always execute at the end of the request, independent on if an - error occurred or not. 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) - ctx.push() - error = None - try: - try: - 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): - """Shortcut for :attr:`wsgi_app`.""" - return self.wsgi_app(environ, start_response) - - def __repr__(self): - return '<%s %r>' % ( - self.__class__.__name__, - self.name, - ) diff --git a/website/web/Lib/site-packages/flask/blueprints.py b/website/web/Lib/site-packages/flask/blueprints.py deleted file mode 100644 index 586a1b0b1..000000000 --- a/website/web/Lib/site-packages/flask/blueprints.py +++ /dev/null @@ -1,413 +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: (c) 2015 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -from functools import update_wrapper - -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: - rule = self.url_prefix + rule - 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 - - 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 a blueprint - on the application. This can be overridden to customize the register - behavior. Keyword arguments from - :func:`~flask.Flask.register_blueprint` are directly forwarded to this - method in the `options` dictionary. - """ - 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" - 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/website/web/Lib/site-packages/flask/cli.py b/website/web/Lib/site-packages/flask/cli.py deleted file mode 100644 index 074ee7687..000000000 --- a/website/web/Lib/site-packages/flask/cli.py +++ /dev/null @@ -1,517 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.cli - ~~~~~~~~~ - - A simple command line application to run flask apps. - - :copyright: (c) 2015 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -import os -import sys -from threading import Lock, Thread -from functools import update_wrapper - -import click - -from ._compat import iteritems, reraise -from .helpers import get_debug_flag -from . import __version__ - -class NoAppException(click.UsageError): - """Raised if an application cannot be found or loaded.""" - - -def find_best_app(module): - """Given a module instance this tries to find the best possible - application in the module or raises an exception. - """ - from . import Flask - - # Search for the most common names first. - for attr_name in 'app', 'application': - app = getattr(module, attr_name, None) - if app is not None and 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] - raise NoAppException('Failed to find application in module "%s". Are ' - 'you sure it contains a Flask application? Maybe ' - 'you wrapped it in a WSGI middleware or you are ' - 'using a factory function.' % module.__name__) - - -def prepare_exec_for_file(filename): - """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. - """ - module = [] - - # Chop off file extensions or package markers - if os.path.split(filename)[1] == '__init__.py': - filename = os.path.dirname(filename) - elif filename.endswith('.py'): - filename = filename[:-3] - else: - raise NoAppException('The file provided (%s) does exist but is not a ' - 'valid Python file. This means that it cannot ' - 'be used as application. Please change the ' - 'extension to .py' % filename) - filename = os.path.realpath(filename) - - dirpath = filename - while 1: - dirpath, extra = os.path.split(dirpath) - module.append(extra) - if not os.path.isfile(os.path.join(dirpath, '__init__.py')): - break - - sys.path.insert(0, dirpath) - return '.'.join(module[::-1]) - - -def locate_app(app_id): - """Attempts to locate the application.""" - __traceback_hide__ = True - if ':' in app_id: - module, app_obj = app_id.split(':', 1) - else: - module = app_id - app_obj = None - - try: - __import__(module) - 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 - else: - raise NoAppException('The file/path provided (%s) does not appear' - ' to exist. Please verify the path is ' - 'correct. If app is not on PYTHONPATH, ' - 'ensure the extension is .py' % module) - - mod = sys.modules[module] - if app_obj is None: - app = find_best_app(mod) - else: - app = getattr(mod, app_obj, None) - if app is None: - raise RuntimeError('Failed to find application in module "%s"' - % module) - - return app - - -def find_default_import_path(): - app = os.environ.get('FLASK_APP') - if app is None: - return - if os.path.isfile(app): - return prepare_exec_for_file(app) - return app - - -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): - if create_app is None: - if app_import_path is None: - app_import_path = find_default_import_path() - self.app_import_path = app_import_path - else: - app_import_path = None - - #: Optionally the import path for the Flask application. - self.app_import_path = app_import_path - #: Optionally a function that is passed the script info to create - #: the instance of the application. - self.create_app = create_app - #: A dictionary with arbitrary data that can be associated with - #: this script info. - self.data = {} - 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 - if self.create_app is not None: - rv = self.create_app(self) - else: - if not self.app_import_path: - raise NoAppException( - 'Could not locate Flask application. You did not provide ' - 'the FLASK_APP environment variable.\n\nFor more ' - 'information see ' - 'http://flask.pocoo.org/docs/latest/quickstart/') - rv = locate_app(self.app_import_path) - debug = get_debug_flag() - if debug is not None: - rv.debug = debug - self._loaded_app = rv - return rv - - -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. - """ - - def __init__(self, add_default_commands=True, create_app=None, - add_version_option=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 - - if add_default_commands: - self.add_command(run_command) - self.add_command(shell_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. - pass - return sorted(rv) - - def main(self, *args, **kwargs): - 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 AppGroup.main(self, *args, **kwargs) - - -@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('--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=False, - help='Enable or disable multithreading.') -@pass_script_info -def run_command(info, host, port, reload, debugger, eager_loading, - with_threads): - """Runs a local development server for the Flask application. - - This local server is recommended for development purposes only but it - can also be used for simple intranet deployments. By default it will - not support any sort of concurrency at all to simplify debugging. This - can be changed with the --with-threads option which will enable basic - multithreading. - - The reloader and debugger are by default enabled if the debug flag of - Flask is enabled and disabled otherwise. - """ - from werkzeug.serving import run_simple - - debug = get_debug_flag() - if reload is None: - reload = bool(debug) - if debugger is None: - debugger = bool(debug) - if eager_loading is None: - eager_loading = not reload - - app = DispatchingApp(info.load_app, use_eager_loading=eager_loading) - - # Extra startup messages. This depends a bit on Werkzeug internals to - # not double execute when the reloader kicks in. - if os.environ.get('WERKZEUG_RUN_MAIN') != 'true': - # If we have an import path we can print it out now which can help - # people understand what's being served. If we do not have an - # import path because the app was loaded through a callback then - # we won't print anything. - if info.app_import_path is not None: - print(' * Serving Flask app "%s"' % info.app_import_path) - if debug is not None: - print(' * Forcing debug mode %s' % (debug and 'on' or 'off')) - - run_simple(host, port, app, use_reloader=reload, - use_debugger=debugger, threaded=with_threads) - - -@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 configuring 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.debug and ' [debug]' or '', - 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) - - -cli = FlaskGroup(help="""\ -This shell command acts as general utility script for Flask applications. - -It loads the application configured (through the FLASK_APP environment -variable) and then provides commands either provided by the application or -Flask itself. - -The most useful commands are the "run" and "shell" command. - -Example usage: - -\b - %(prefix)s%(cmd)s FLASK_APP=hello.py - %(prefix)s%(cmd)s FLASK_DEBUG=1 - %(prefix)sflask run -""" % { - 'cmd': os.name == 'posix' and 'export' or 'set', - 'prefix': os.name == 'posix' and '$ ' or '', -}) - - -def main(as_module=False): - this_module = __package__ + '.cli' - args = sys.argv[1:] - - if as_module: - if sys.version_info >= (2, 7): - name = 'python -m ' + this_module.rsplit('.', 1)[0] - else: - name = 'python -m ' + this_module - - # This module is always executed as "python -m flask.run" and as such - # we need to ensure that we restore the actual command line so that - # the reloader can properly operate. - sys.argv = ['-m', this_module] + sys.argv[1:] - else: - name = None - - cli.main(args=args, prog_name=name) - - -if __name__ == '__main__': - main(as_module=True) diff --git a/website/web/Lib/site-packages/flask/config.py b/website/web/Lib/site-packages/flask/config.py deleted file mode 100644 index 697add719..000000000 --- a/website/web/Lib/site-packages/flask/config.py +++ /dev/null @@ -1,263 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.config - ~~~~~~~~~~~~ - - Implements the configuration related objects. - - :copyright: (c) 2015 by Armin Ronacher. - :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): - 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/website/web/Lib/site-packages/flask/ctx.py b/website/web/Lib/site-packages/flask/ctx.py deleted file mode 100644 index 480d9c5c4..000000000 --- a/website/web/Lib/site-packages/flask/ctx.py +++ /dev/null @@ -1,410 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.ctx - ~~~~~~~~~ - - Implements the objects required to keep the context. - - :copyright: (c) 2015 by Armin Ronacher. - :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.""" - - def get(self, name, default=None): - return self.__dict__.get(name, default) - - def pop(self, name, default=_sentinel): - if default is _sentinel: - return self.__dict__.pop(name) - else: - return self.__dict__.pop(name, default) - - def setdefault(self, name, default=None): - 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 (e.g. code that access database information - # stored on `g` instead of the appcontext). - self.session = self.app.open_session(self.request) - if self.session is None: - self.session = self.app.make_null_session() - - 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/website/web/Lib/site-packages/flask/debughelpers.py b/website/web/Lib/site-packages/flask/debughelpers.py deleted file mode 100644 index 90710dd35..000000000 --- a/website/web/Lib/site-packages/flask/debughelpers.py +++ /dev/null @@ -1,155 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.debughelpers - ~~~~~~~~~~~~~~~~~~ - - Various helpers to make the development experience better. - - :copyright: (c) 2015 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -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)) diff --git a/website/web/Lib/site-packages/flask/ext/__init__.py b/website/web/Lib/site-packages/flask/ext/__init__.py deleted file mode 100644 index 051f44ac4..000000000 --- a/website/web/Lib/site-packages/flask/ext/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.ext - ~~~~~~~~~ - - Redirect imports for extensions. This module basically makes it possible - for us to transition from flaskext.foo to flask_foo without having to - force all extensions to upgrade at the same time. - - When a user does ``from flask.ext.foo import bar`` it will attempt to - import ``from flask_foo import bar`` first and when that fails it will - try to import ``from flaskext.foo import bar``. - - We're switching from namespace packages because it was just too painful for - everybody involved. - - :copyright: (c) 2015 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - - -def setup(): - from ..exthook import ExtensionImporter - importer = ExtensionImporter(['flask_%s', 'flaskext.%s'], __name__) - importer.install() - - -setup() -del setup diff --git a/website/web/Lib/site-packages/flask/exthook.py b/website/web/Lib/site-packages/flask/exthook.py deleted file mode 100644 index d88428027..000000000 --- a/website/web/Lib/site-packages/flask/exthook.py +++ /dev/null @@ -1,143 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.exthook - ~~~~~~~~~~~~~ - - Redirect imports for extensions. This module basically makes it possible - for us to transition from flaskext.foo to flask_foo without having to - force all extensions to upgrade at the same time. - - When a user does ``from flask.ext.foo import bar`` it will attempt to - import ``from flask_foo import bar`` first and when that fails it will - try to import ``from flaskext.foo import bar``. - - We're switching from namespace packages because it was just too painful for - everybody involved. - - This is used by `flask.ext`. - - :copyright: (c) 2015 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import sys -import os -import warnings -from ._compat import reraise - - -class ExtDeprecationWarning(DeprecationWarning): - pass - -warnings.simplefilter('always', ExtDeprecationWarning) - - -class ExtensionImporter(object): - """This importer redirects imports from this submodule to other locations. - This makes it possible to transition from the old flaskext.name to the - newer flask_name without people having a hard time. - """ - - def __init__(self, module_choices, wrapper_module): - self.module_choices = module_choices - self.wrapper_module = wrapper_module - self.prefix = wrapper_module + '.' - self.prefix_cutoff = wrapper_module.count('.') + 1 - - def __eq__(self, other): - return self.__class__.__module__ == other.__class__.__module__ and \ - self.__class__.__name__ == other.__class__.__name__ and \ - self.wrapper_module == other.wrapper_module and \ - self.module_choices == other.module_choices - - def __ne__(self, other): - return not self.__eq__(other) - - def install(self): - sys.meta_path[:] = [x for x in sys.meta_path if self != x] + [self] - - def find_module(self, fullname, path=None): - if fullname.startswith(self.prefix) and \ - fullname != 'flask.ext.ExtDeprecationWarning': - return self - - def load_module(self, fullname): - if fullname in sys.modules: - return sys.modules[fullname] - - modname = fullname.split('.', self.prefix_cutoff)[self.prefix_cutoff] - - warnings.warn( - "Importing flask.ext.{x} is deprecated, use flask_{x} instead." - .format(x=modname), ExtDeprecationWarning, stacklevel=2 - ) - - for path in self.module_choices: - realname = path % modname - try: - __import__(realname) - except ImportError: - exc_type, exc_value, tb = sys.exc_info() - # since we only establish the entry in sys.modules at the - # very this seems to be redundant, but if recursive imports - # happen we will call into the move import a second time. - # On the second invocation we still don't have an entry for - # fullname in sys.modules, but we will end up with the same - # fake module name and that import will succeed since this - # one already has a temporary entry in the modules dict. - # Since this one "succeeded" temporarily that second - # invocation now will have created a fullname entry in - # sys.modules which we have to kill. - sys.modules.pop(fullname, None) - - # If it's an important traceback we reraise it, otherwise - # we swallow it and try the next choice. The skipped frame - # is the one from __import__ above which we don't care about - if self.is_important_traceback(realname, tb): - reraise(exc_type, exc_value, tb.tb_next) - continue - module = sys.modules[fullname] = sys.modules[realname] - if '.' not in modname: - setattr(sys.modules[self.wrapper_module], modname, module) - - if realname.startswith('flaskext.'): - warnings.warn( - "Detected extension named flaskext.{x}, please rename it " - "to flask_{x}. The old form is deprecated." - .format(x=modname), ExtDeprecationWarning - ) - - return module - raise ImportError('No module named %s' % fullname) - - def is_important_traceback(self, important_module, tb): - """Walks a traceback's frames and checks if any of the frames - originated in the given important module. If that is the case then we - were able to import the module itself but apparently something went - wrong when the module was imported. (Eg: import of an import failed). - """ - while tb is not None: - if self.is_important_frame(important_module, tb): - return True - tb = tb.tb_next - return False - - def is_important_frame(self, important_module, tb): - """Checks a single frame if it's important.""" - g = tb.tb_frame.f_globals - if '__name__' not in g: - return False - - module_name = g['__name__'] - - # Python 2.7 Behavior. Modules are cleaned up late so the - # name shows up properly here. Success! - if module_name == important_module: - return True - - # Some python versions will clean up modules so early that the - # module name at that point is no longer set. Try guessing from - # the filename then. - filename = os.path.abspath(tb.tb_frame.f_code.co_filename) - test_string = os.path.sep + important_module.replace('.', os.path.sep) - return test_string + '.py' in filename or \ - test_string + os.path.sep + '__init__.py' in filename diff --git a/website/web/Lib/site-packages/flask/globals.py b/website/web/Lib/site-packages/flask/globals.py deleted file mode 100644 index 0b70a3ef9..000000000 --- a/website/web/Lib/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: (c) 2015 by Armin Ronacher. - :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 a 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/website/web/Lib/site-packages/flask/helpers.py b/website/web/Lib/site-packages/flask/helpers.py deleted file mode 100644 index 4bb1d1c91..000000000 --- a/website/web/Lib/site-packages/flask/helpers.py +++ /dev/null @@ -1,966 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.helpers - ~~~~~~~~~~~~~ - - Implements various helpers. - - :copyright: (c) 2015 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -import os -import sys -import pkgutil -import posixpath -import mimetypes -from time import time -from zlib import adler32 -from threading import RLock -from werkzeug.routing import BuildError -from functools import update_wrapper - -try: - from werkzeug.urls import url_quote -except ImportError: - from urlparse import quote as url_quote - -from werkzeug.datastructures import Headers, Range -from werkzeug.exceptions import BadRequest, NotFound, \ - RequestedRangeNotSatisfiable - -# this was moved in 0.7 -try: - from werkzeug.wsgi import wrap_file -except ImportError: - from werkzeug.utils 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 - - -# 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_debug_flag(default=None): - val = os.environ.get('FLASK_DEBUG') - if not val: - return default - return val not 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 not reqctx.request._is_old_module: - if endpoint[:1] == '.': - if blueprint_name is not None: - endpoint = blueprint_name + endpoint - else: - endpoint = endpoint[1:] - else: - # TODO: get rid of this deprecated functionality in 1.0 - if '.' not in endpoint: - if blueprint_name is not None: - endpoint = blueprint_name + '.' + endpoint - elif endpoint.startswith('.'): - 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 - 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 - # 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. - - :param filename_or_fp: the filename of the file to send in `latin-1`. - 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') - headers.add('Content-Disposition', 'attachment', - filename=attachment_filename) - - 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: - if callable(getattr(Range, 'to_content_range_header', None)): - # Werkzeug supports Range Requests - # Remove this test when support for Werkzeug <0.12 is dropped - try: - rv = rv.make_conditional(request, accept_ranges=True, - complete_length=fsize) - except RequestedRangeNotSatisfiable: - file.close() - raise - else: - rv = rv.make_conditional(request) - # 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): - - def __init__(self, import_name, template_folder=None, root_path=None): - #: The name of the package or module. Do not change this once - #: it was set by the constructor. - self.import_name = import_name - - #: location of the templates. ``None`` if templates should not be - #: exposed. - self.template_folder = template_folder - - if root_path is None: - root_path = get_root_path(self.import_name) - - #: Where is the app root located? - 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) - 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 diff --git a/website/web/Lib/site-packages/flask/json.py b/website/web/Lib/site-packages/flask/json.py deleted file mode 100644 index 16e0c2956..000000000 --- a/website/web/Lib/site-packages/flask/json.py +++ /dev/null @@ -1,269 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flask.jsonimpl - ~~~~~~~~~~~~~~ - - Implementation helpers for the JSON support in Flask. - - :copyright: (c) 2015 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import io -import uuid -from datetime import date -from .globals import current_app, request -from ._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, 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: - kwargs.setdefault('cls', 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: - kwargs.setdefault('cls', current_app.json_decoder) - else: - kwargs.setdefault('cls', JSONDecoder) - - -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): - s = s.decode(kwargs.pop('encoding', None) or 'utf-8') - 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 ``') - # => <script> do_nasty_stuff() </script> - # sanitize_html('Click here for $100') - # => Click here for $100 - def sanitize_token(self, token): - - # accommodate filters which use token_type differently - token_type = token["type"] - if token_type in ("StartTag", "EndTag", "EmptyTag"): - name = token["name"] - namespace = token["namespace"] - if ((namespace, name) in self.allowed_elements or - (namespace is None and - (namespaces["html"], name) in self.allowed_elements)): - return self.allowed_token(token) - else: - return self.disallowed_token(token) - elif token_type == "Comment": - pass - else: - return token - - def allowed_token(self, token): - if "data" in token: - attrs = token["data"] - attr_names = set(attrs.keys()) - - # Remove forbidden attributes - for to_remove in (attr_names - self.allowed_attributes): - del token["data"][to_remove] - attr_names.remove(to_remove) - - # Remove attributes with disallowed URL values - for attr in (attr_names & self.attr_val_is_uri): - assert attr in attrs - # I don't have a clue where this regexp comes from or why it matches those - # characters, nor why we call unescape. I just know it's always been here. - # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all - # this will do is remove *more* than it otherwise would. - val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\s]+", '', - unescape(attrs[attr])).lower() - # remove replacement characters from unescaped characters - val_unescaped = val_unescaped.replace("\ufffd", "") - try: - uri = urlparse.urlparse(val_unescaped) - except ValueError: - uri = None - del attrs[attr] - if uri and uri.scheme: - if uri.scheme not in self.allowed_protocols: - del attrs[attr] - if uri.scheme == 'data': - m = data_content_type.match(uri.path) - if not m: - del attrs[attr] - elif m.group('content_type') not in self.allowed_content_types: - del attrs[attr] - - for attr in self.svg_attr_val_allows_ref: - if attr in attrs: - attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', - ' ', - unescape(attrs[attr])) - if (token["name"] in self.svg_allow_local_href and - (namespaces['xlink'], 'href') in attrs and re.search('^\s*[^#\s].*', - attrs[(namespaces['xlink'], 'href')])): - del attrs[(namespaces['xlink'], 'href')] - if (None, 'style') in attrs: - attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) - token["data"] = attrs - return token - - def disallowed_token(self, token): - token_type = token["type"] - if token_type == "EndTag": - token["data"] = "" % token["name"] - elif token["data"]: - assert token_type in ("StartTag", "EmptyTag") - attrs = [] - for (ns, name), v in token["data"].items(): - attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) - token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) - else: - token["data"] = "<%s>" % token["name"] - if token.get("selfClosing"): - token["data"] = token["data"][:-1] + "/>" - - token["type"] = "Characters" - - del token["name"] - return token - - def sanitize_css(self, style): - # disallow urls - style = re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) - - # gauntlet - if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): - return '' - if not re.match("^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): - return '' - - clean = [] - for prop, value in re.findall("([-\w]+)\s*:\s*([^:;]*)", style): - if not value: - continue - if prop.lower() in self.allowed_css_properties: - clean.append(prop + ': ' + value + ';') - elif prop.split('-')[0].lower() in ['background', 'border', 'margin', - 'padding']: - for keyword in value.split(): - if keyword not in self.allowed_css_keywords and \ - not re.match("^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa - break - else: - clean.append(prop + ': ' + value + ';') - elif prop.lower() in self.allowed_svg_properties: - clean.append(prop + ': ' + value + ';') - - return ' '.join(clean) diff --git a/website/web/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/website/web/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py deleted file mode 100644 index 892105287..000000000 --- a/website/web/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re - -from . import base -from ..constants import rcdataElements, spaceCharacters -spaceCharacters = "".join(spaceCharacters) - -SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) - - -class Filter(base.Filter): - - spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) - - def __iter__(self): - preserve = 0 - for token in base.Filter.__iter__(self): - type = token["type"] - if type == "StartTag" \ - and (preserve or token["name"] in self.spacePreserveElements): - preserve += 1 - - elif type == "EndTag" and preserve: - preserve -= 1 - - elif not preserve and type == "SpaceCharacters" and token["data"]: - # Test on token["data"] above to not introduce spaces where there were not - token["data"] = " " - - elif not preserve and type == "Characters": - token["data"] = collapse_spaces(token["data"]) - - yield token - - -def collapse_spaces(text): - return SPACES_REGEX.sub(' ', text) diff --git a/website/web/Lib/site-packages/pip/_vendor/html5lib/html5parser.py b/website/web/Lib/site-packages/pip/_vendor/html5lib/html5parser.py deleted file mode 100644 index f7043cb19..000000000 --- a/website/web/Lib/site-packages/pip/_vendor/html5lib/html5parser.py +++ /dev/null @@ -1,2733 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import with_metaclass, viewkeys, PY3 - -import types - -try: - from collections import OrderedDict -except ImportError: - from pip._vendor.ordereddict import OrderedDict - -from . import _inputstream -from . import _tokenizer - -from . import treebuilders -from .treebuilders.base import Marker - -from . import _utils -from .constants import ( - spaceCharacters, asciiUpper2Lower, - specialElements, headingElements, cdataElements, rcdataElements, - tokenTypes, tagTokenTypes, - namespaces, - htmlIntegrationPointElements, mathmlTextIntegrationPointElements, - adjustForeignAttributes as adjustForeignAttributesMap, - adjustMathMLAttributes, adjustSVGAttributes, - E, - ReparseException -) - - -def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): - """Parse a string or file-like object into a tree""" - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parse(doc, **kwargs) - - -def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parseFragment(doc, container=container, **kwargs) - - -def method_decorator_metaclass(function): - class Decorated(type): - def __new__(meta, classname, bases, classDict): - for attributeName, attribute in classDict.items(): - if isinstance(attribute, types.FunctionType): - attribute = function(attribute) - - classDict[attributeName] = attribute - return type.__new__(meta, classname, bases, classDict) - return Decorated - - -class HTMLParser(object): - """HTML parser. Generates a tree structure from a stream of (possibly - malformed) HTML""" - - def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): - """ - strict - raise an exception when a parse error is encountered - - tree - a treebuilder class controlling the type of tree that will be - returned. Built in treebuilders can be accessed through - html5lib.treebuilders.getTreeBuilder(treeType) - """ - - # Raise an exception on the first error encountered - self.strict = strict - - if tree is None: - tree = treebuilders.getTreeBuilder("etree") - self.tree = tree(namespaceHTMLElements) - self.errors = [] - - self.phases = dict([(name, cls(self, self.tree)) for name, cls in - getPhases(debug).items()]) - - def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): - - self.innerHTMLMode = innerHTML - self.container = container - self.scripting = scripting - self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) - self.reset() - - try: - self.mainLoop() - except ReparseException: - self.reset() - self.mainLoop() - - def reset(self): - self.tree.reset() - self.firstStartTag = False - self.errors = [] - self.log = [] # only used with debug mode - # "quirks" / "limited quirks" / "no quirks" - self.compatMode = "no quirks" - - if self.innerHTMLMode: - self.innerHTML = self.container.lower() - - if self.innerHTML in cdataElements: - self.tokenizer.state = self.tokenizer.rcdataState - elif self.innerHTML in rcdataElements: - self.tokenizer.state = self.tokenizer.rawtextState - elif self.innerHTML == 'plaintext': - self.tokenizer.state = self.tokenizer.plaintextState - else: - # state already is data state - # self.tokenizer.state = self.tokenizer.dataState - pass - self.phase = self.phases["beforeHtml"] - self.phase.insertHtmlElement() - self.resetInsertionMode() - else: - self.innerHTML = False # pylint:disable=redefined-variable-type - self.phase = self.phases["initial"] - - self.lastPhase = None - - self.beforeRCDataPhase = None - - self.framesetOK = True - - @property - def documentEncoding(self): - """The name of the character encoding - that was used to decode the input stream, - or :obj:`None` if that is not determined yet. - - """ - if not hasattr(self, 'tokenizer'): - return None - return self.tokenizer.stream.charEncoding[0].name - - def isHTMLIntegrationPoint(self, element): - if (element.name == "annotation-xml" and - element.namespace == namespaces["mathml"]): - return ("encoding" in element.attributes and - element.attributes["encoding"].translate( - asciiUpper2Lower) in - ("text/html", "application/xhtml+xml")) - else: - return (element.namespace, element.name) in htmlIntegrationPointElements - - def isMathMLTextIntegrationPoint(self, element): - return (element.namespace, element.name) in mathmlTextIntegrationPointElements - - def mainLoop(self): - CharactersToken = tokenTypes["Characters"] - SpaceCharactersToken = tokenTypes["SpaceCharacters"] - StartTagToken = tokenTypes["StartTag"] - EndTagToken = tokenTypes["EndTag"] - CommentToken = tokenTypes["Comment"] - DoctypeToken = tokenTypes["Doctype"] - ParseErrorToken = tokenTypes["ParseError"] - - for token in self.normalizedTokens(): - prev_token = None - new_token = token - while new_token is not None: - prev_token = new_token - currentNode = self.tree.openElements[-1] if self.tree.openElements else None - currentNodeNamespace = currentNode.namespace if currentNode else None - currentNodeName = currentNode.name if currentNode else None - - type = new_token["type"] - - if type == ParseErrorToken: - self.parseError(new_token["data"], new_token.get("datavars", {})) - new_token = None - else: - if (len(self.tree.openElements) == 0 or - currentNodeNamespace == self.tree.defaultNamespace or - (self.isMathMLTextIntegrationPoint(currentNode) and - ((type == StartTagToken and - token["name"] not in frozenset(["mglyph", "malignmark"])) or - type in (CharactersToken, SpaceCharactersToken))) or - (currentNodeNamespace == namespaces["mathml"] and - currentNodeName == "annotation-xml" and - type == StartTagToken and - token["name"] == "svg") or - (self.isHTMLIntegrationPoint(currentNode) and - type in (StartTagToken, CharactersToken, SpaceCharactersToken))): - phase = self.phase - else: - phase = self.phases["inForeignContent"] - - if type == CharactersToken: - new_token = phase.processCharacters(new_token) - elif type == SpaceCharactersToken: - new_token = phase.processSpaceCharacters(new_token) - elif type == StartTagToken: - new_token = phase.processStartTag(new_token) - elif type == EndTagToken: - new_token = phase.processEndTag(new_token) - elif type == CommentToken: - new_token = phase.processComment(new_token) - elif type == DoctypeToken: - new_token = phase.processDoctype(new_token) - - if (type == StartTagToken and prev_token["selfClosing"] and - not prev_token["selfClosingAcknowledged"]): - self.parseError("non-void-element-with-trailing-solidus", - {"name": prev_token["name"]}) - - # When the loop finishes it's EOF - reprocess = True - phases = [] - while reprocess: - phases.append(self.phase) - reprocess = self.phase.processEOF() - if reprocess: - assert self.phase not in phases - - def normalizedTokens(self): - for token in self.tokenizer: - yield self.normalizeToken(token) - - def parse(self, stream, *args, **kwargs): - """Parse a HTML document into a well-formed tree - - stream - a filelike object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - scripting - treat noscript elements as if javascript was turned on - """ - self._parse(stream, False, None, *args, **kwargs) - return self.tree.getDocument() - - def parseFragment(self, stream, *args, **kwargs): - """Parse a HTML fragment into a well-formed tree fragment - - container - name of the element we're setting the innerHTML property - if set to None, default to 'div' - - stream - a filelike object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - scripting - treat noscript elements as if javascript was turned on - """ - self._parse(stream, True, *args, **kwargs) - return self.tree.getFragment() - - def parseError(self, errorcode="XXX-undefined-error", datavars=None): - # XXX The idea is to make errorcode mandatory. - if datavars is None: - datavars = {} - self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) - if self.strict: - raise ParseError(E[errorcode] % datavars) - - def normalizeToken(self, token): - """ HTML5 specific normalizations to the token stream """ - - if token["type"] == tokenTypes["StartTag"]: - raw = token["data"] - token["data"] = OrderedDict(raw) - if len(raw) > len(token["data"]): - # we had some duplicated attribute, fix so first wins - token["data"].update(raw[::-1]) - - return token - - def adjustMathMLAttributes(self, token): - adjust_attributes(token, adjustMathMLAttributes) - - def adjustSVGAttributes(self, token): - adjust_attributes(token, adjustSVGAttributes) - - def adjustForeignAttributes(self, token): - adjust_attributes(token, adjustForeignAttributesMap) - - def reparseTokenNormal(self, token): - # pylint:disable=unused-argument - self.parser.phase() - - def resetInsertionMode(self): - # The name of this method is mostly historical. (It's also used in the - # specification.) - last = False - newModes = { - "select": "inSelect", - "td": "inCell", - "th": "inCell", - "tr": "inRow", - "tbody": "inTableBody", - "thead": "inTableBody", - "tfoot": "inTableBody", - "caption": "inCaption", - "colgroup": "inColumnGroup", - "table": "inTable", - "head": "inBody", - "body": "inBody", - "frameset": "inFrameset", - "html": "beforeHead" - } - for node in self.tree.openElements[::-1]: - nodeName = node.name - new_phase = None - if node == self.tree.openElements[0]: - assert self.innerHTML - last = True - nodeName = self.innerHTML - # Check for conditions that should only happen in the innerHTML - # case - if nodeName in ("select", "colgroup", "head", "html"): - assert self.innerHTML - - if not last and node.namespace != self.tree.defaultNamespace: - continue - - if nodeName in newModes: - new_phase = self.phases[newModes[nodeName]] - break - elif last: - new_phase = self.phases["inBody"] - break - - self.phase = new_phase - - def parseRCDataRawtext(self, token, contentType): - """Generic RCDATA/RAWTEXT Parsing algorithm - contentType - RCDATA or RAWTEXT - """ - assert contentType in ("RAWTEXT", "RCDATA") - - self.tree.insertElement(token) - - if contentType == "RAWTEXT": - self.tokenizer.state = self.tokenizer.rawtextState - else: - self.tokenizer.state = self.tokenizer.rcdataState - - self.originalPhase = self.phase - - self.phase = self.phases["text"] - - -@_utils.memoize -def getPhases(debug): - def log(function): - """Logger that records which phase processes each token""" - type_names = dict((value, key) for key, value in - tokenTypes.items()) - - def wrapped(self, *args, **kwargs): - if function.__name__.startswith("process") and len(args) > 0: - token = args[0] - try: - info = {"type": type_names[token['type']]} - except: - raise - if token['type'] in tagTokenTypes: - info["name"] = token['name'] - - self.parser.log.append((self.parser.tokenizer.state.__name__, - self.parser.phase.__class__.__name__, - self.__class__.__name__, - function.__name__, - info)) - return function(self, *args, **kwargs) - else: - return function(self, *args, **kwargs) - return wrapped - - def getMetaclass(use_metaclass, metaclass_func): - if use_metaclass: - return method_decorator_metaclass(metaclass_func) - else: - return type - - # pylint:disable=unused-argument - class Phase(with_metaclass(getMetaclass(debug, log))): - """Base class for helper object that implements each phase of processing - """ - - def __init__(self, parser, tree): - self.parser = parser - self.tree = tree - - def processEOF(self): - raise NotImplementedError - - def processComment(self, token): - # For most phases the following is correct. Where it's not it will be - # overridden. - self.tree.insertComment(token, self.tree.openElements[-1]) - - def processDoctype(self, token): - self.parser.parseError("unexpected-doctype") - - def processCharacters(self, token): - self.tree.insertText(token["data"]) - - def processSpaceCharacters(self, token): - self.tree.insertText(token["data"]) - - def processStartTag(self, token): - return self.startTagHandler[token["name"]](token) - - def startTagHtml(self, token): - if not self.parser.firstStartTag and token["name"] == "html": - self.parser.parseError("non-html-root") - # XXX Need a check here to see if the first start tag token emitted is - # this token... If it's not, invoke self.parser.parseError(). - for attr, value in token["data"].items(): - if attr not in self.tree.openElements[0].attributes: - self.tree.openElements[0].attributes[attr] = value - self.parser.firstStartTag = False - - def processEndTag(self, token): - return self.endTagHandler[token["name"]](token) - - class InitialPhase(Phase): - def processSpaceCharacters(self, token): - pass - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - correct = token["correct"] - - if (name != "html" or publicId is not None or - systemId is not None and systemId != "about:legacy-compat"): - self.parser.parseError("unknown-doctype") - - if publicId is None: - publicId = "" - - self.tree.insertDoctype(token) - - if publicId != "": - publicId = publicId.translate(asciiUpper2Lower) - - if (not correct or token["name"] != "html" or - publicId.startswith( - ("+//silmaril//dtd html pro v0r11 19970101//", - "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", - "-//as//dtd html 3.0 aswedit + extensions//", - "-//ietf//dtd html 2.0 level 1//", - "-//ietf//dtd html 2.0 level 2//", - "-//ietf//dtd html 2.0 strict level 1//", - "-//ietf//dtd html 2.0 strict level 2//", - "-//ietf//dtd html 2.0 strict//", - "-//ietf//dtd html 2.0//", - "-//ietf//dtd html 2.1e//", - "-//ietf//dtd html 3.0//", - "-//ietf//dtd html 3.2 final//", - "-//ietf//dtd html 3.2//", - "-//ietf//dtd html 3//", - "-//ietf//dtd html level 0//", - "-//ietf//dtd html level 1//", - "-//ietf//dtd html level 2//", - "-//ietf//dtd html level 3//", - "-//ietf//dtd html strict level 0//", - "-//ietf//dtd html strict level 1//", - "-//ietf//dtd html strict level 2//", - "-//ietf//dtd html strict level 3//", - "-//ietf//dtd html strict//", - "-//ietf//dtd html//", - "-//metrius//dtd metrius presentational//", - "-//microsoft//dtd internet explorer 2.0 html strict//", - "-//microsoft//dtd internet explorer 2.0 html//", - "-//microsoft//dtd internet explorer 2.0 tables//", - "-//microsoft//dtd internet explorer 3.0 html strict//", - "-//microsoft//dtd internet explorer 3.0 html//", - "-//microsoft//dtd internet explorer 3.0 tables//", - "-//netscape comm. corp.//dtd html//", - "-//netscape comm. corp.//dtd strict html//", - "-//o'reilly and associates//dtd html 2.0//", - "-//o'reilly and associates//dtd html extended 1.0//", - "-//o'reilly and associates//dtd html extended relaxed 1.0//", - "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", - "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", - "-//spyglass//dtd html 2.0 extended//", - "-//sq//dtd html 2.0 hotmetal + extensions//", - "-//sun microsystems corp.//dtd hotjava html//", - "-//sun microsystems corp.//dtd hotjava strict html//", - "-//w3c//dtd html 3 1995-03-24//", - "-//w3c//dtd html 3.2 draft//", - "-//w3c//dtd html 3.2 final//", - "-//w3c//dtd html 3.2//", - "-//w3c//dtd html 3.2s draft//", - "-//w3c//dtd html 4.0 frameset//", - "-//w3c//dtd html 4.0 transitional//", - "-//w3c//dtd html experimental 19960712//", - "-//w3c//dtd html experimental 970421//", - "-//w3c//dtd w3 html//", - "-//w3o//dtd w3 html 3.0//", - "-//webtechs//dtd mozilla html 2.0//", - "-//webtechs//dtd mozilla html//")) or - publicId in ("-//w3o//dtd w3 html strict 3.0//en//", - "-/w3c/dtd html 4.0 transitional/en", - "html") or - publicId.startswith( - ("-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//")) and - systemId is None or - systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): - self.parser.compatMode = "quirks" - elif (publicId.startswith( - ("-//w3c//dtd xhtml 1.0 frameset//", - "-//w3c//dtd xhtml 1.0 transitional//")) or - publicId.startswith( - ("-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//")) and - systemId is not None): - self.parser.compatMode = "limited quirks" - - self.parser.phase = self.parser.phases["beforeHtml"] - - def anythingElse(self): - self.parser.compatMode = "quirks" - self.parser.phase = self.parser.phases["beforeHtml"] - - def processCharacters(self, token): - self.parser.parseError("expected-doctype-but-got-chars") - self.anythingElse() - return token - - def processStartTag(self, token): - self.parser.parseError("expected-doctype-but-got-start-tag", - {"name": token["name"]}) - self.anythingElse() - return token - - def processEndTag(self, token): - self.parser.parseError("expected-doctype-but-got-end-tag", - {"name": token["name"]}) - self.anythingElse() - return token - - def processEOF(self): - self.parser.parseError("expected-doctype-but-got-eof") - self.anythingElse() - return True - - class BeforeHtmlPhase(Phase): - # helper methods - def insertHtmlElement(self): - self.tree.insertRoot(impliedTagToken("html", "StartTag")) - self.parser.phase = self.parser.phases["beforeHead"] - - # other - def processEOF(self): - self.insertHtmlElement() - return True - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processSpaceCharacters(self, token): - pass - - def processCharacters(self, token): - self.insertHtmlElement() - return token - - def processStartTag(self, token): - if token["name"] == "html": - self.parser.firstStartTag = True - self.insertHtmlElement() - return token - - def processEndTag(self, token): - if token["name"] not in ("head", "body", "html", "br"): - self.parser.parseError("unexpected-end-tag-before-html", - {"name": token["name"]}) - else: - self.insertHtmlElement() - return token - - class BeforeHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("head", "body", "html", "br"), self.endTagImplyHead) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.startTagHead(impliedTagToken("head", "StartTag")) - return True - - def processSpaceCharacters(self, token): - pass - - def processCharacters(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagHead(self, token): - self.tree.insertElement(token) - self.tree.headPointer = self.tree.openElements[-1] - self.parser.phase = self.parser.phases["inHead"] - - def startTagOther(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def endTagImplyHead(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def endTagOther(self, token): - self.parser.parseError("end-tag-after-implied-root", - {"name": token["name"]}) - - class InHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("title", self.startTagTitle), - (("noframes", "style"), self.startTagNoFramesStyle), - ("noscript", self.startTagNoscript), - ("script", self.startTagScript), - (("base", "basefont", "bgsound", "command", "link"), - self.startTagBaseLinkCommand), - ("meta", self.startTagMeta), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("head", self.endTagHead), - (("br", "html", "body"), self.endTagHtmlBodyBr) - ]) - self.endTagHandler.default = self.endTagOther - - # the real thing - def processEOF(self): - self.anythingElse() - return True - - def processCharacters(self, token): - self.anythingElse() - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagHead(self, token): - self.parser.parseError("two-heads-are-not-better-than-one") - - def startTagBaseLinkCommand(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagMeta(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - attributes = token["data"] - if self.parser.tokenizer.stream.charEncoding[1] == "tentative": - if "charset" in attributes: - self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) - elif ("content" in attributes and - "http-equiv" in attributes and - attributes["http-equiv"].lower() == "content-type"): - # Encoding it as UTF-8 here is a hack, as really we should pass - # the abstract Unicode string, and just use the - # ContentAttrParser on that, but using UTF-8 allows all chars - # to be encoded and as a ASCII-superset works. - data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) - parser = _inputstream.ContentAttrParser(data) - codec = parser.parse() - self.parser.tokenizer.stream.changeEncoding(codec) - - def startTagTitle(self, token): - self.parser.parseRCDataRawtext(token, "RCDATA") - - def startTagNoFramesStyle(self, token): - # Need to decide whether to implement the scripting-disabled case - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - def startTagNoscript(self, token): - if self.parser.scripting: - self.parser.parseRCDataRawtext(token, "RAWTEXT") - else: - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inHeadNoscript"] - - def startTagScript(self, token): - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState - self.parser.originalPhase = self.parser.phase - self.parser.phase = self.parser.phases["text"] - - def startTagOther(self, token): - self.anythingElse() - return token - - def endTagHead(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == "head", "Expected head got %s" % node.name - self.parser.phase = self.parser.phases["afterHead"] - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - self.endTagHead(impliedTagToken("head")) - - class InHeadNoscriptPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), - (("head", "noscript"), self.startTagHeadNoscript), - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("noscript", self.endTagNoscript), - ("br", self.endTagBr), - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.parser.parseError("eof-in-head-noscript") - self.anythingElse() - return True - - def processComment(self, token): - return self.parser.phases["inHead"].processComment(token) - - def processCharacters(self, token): - self.parser.parseError("char-in-head-noscript") - self.anythingElse() - return token - - def processSpaceCharacters(self, token): - return self.parser.phases["inHead"].processSpaceCharacters(token) - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagBaseLinkCommand(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagHeadNoscript(self, token): - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - - def startTagOther(self, token): - self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) - self.anythingElse() - return token - - def endTagNoscript(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == "noscript", "Expected noscript got %s" % node.name - self.parser.phase = self.parser.phases["inHead"] - - def endTagBr(self, token): - self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - # Caller must raise parse error first! - self.endTagNoscript(impliedTagToken("noscript")) - - class AfterHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("body", self.startTagBody), - ("frameset", self.startTagFrameset), - (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", - "style", "title"), - self.startTagFromHead), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), - self.endTagHtmlBodyBr)]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.anythingElse() - return True - - def processCharacters(self, token): - self.anythingElse() - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagBody(self, token): - self.parser.framesetOK = False - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inBody"] - - def startTagFrameset(self, token): - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inFrameset"] - - def startTagFromHead(self, token): - self.parser.parseError("unexpected-start-tag-out-of-my-head", - {"name": token["name"]}) - self.tree.openElements.append(self.tree.headPointer) - self.parser.phases["inHead"].processStartTag(token) - for node in self.tree.openElements[::-1]: - if node.name == "head": - self.tree.openElements.remove(node) - break - - def startTagHead(self, token): - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - - def startTagOther(self, token): - self.anythingElse() - return token - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - self.tree.insertElement(impliedTagToken("body", "StartTag")) - self.parser.phase = self.parser.phases["inBody"] - self.parser.framesetOK = True - - class InBodyPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody - # the really-really-really-very crazy mode - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - # Set this to the default handler - self.processSpaceCharacters = self.processSpaceCharactersNonPre - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("base", "basefont", "bgsound", "command", "link", "meta", - "script", "style", "title"), - self.startTagProcessInHead), - ("body", self.startTagBody), - ("frameset", self.startTagFrameset), - (("address", "article", "aside", "blockquote", "center", "details", - "dir", "div", "dl", "fieldset", "figcaption", "figure", - "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", - "section", "summary", "ul"), - self.startTagCloseP), - (headingElements, self.startTagHeading), - (("pre", "listing"), self.startTagPreListing), - ("form", self.startTagForm), - (("li", "dd", "dt"), self.startTagListItem), - ("plaintext", self.startTagPlaintext), - ("a", self.startTagA), - (("b", "big", "code", "em", "font", "i", "s", "small", "strike", - "strong", "tt", "u"), self.startTagFormatting), - ("nobr", self.startTagNobr), - ("button", self.startTagButton), - (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), - ("xmp", self.startTagXmp), - ("table", self.startTagTable), - (("area", "br", "embed", "img", "keygen", "wbr"), - self.startTagVoidFormatting), - (("param", "source", "track"), self.startTagParamSource), - ("input", self.startTagInput), - ("hr", self.startTagHr), - ("image", self.startTagImage), - ("isindex", self.startTagIsIndex), - ("textarea", self.startTagTextarea), - ("iframe", self.startTagIFrame), - ("noscript", self.startTagNoscript), - (("noembed", "noframes"), self.startTagRawtext), - ("select", self.startTagSelect), - (("rp", "rt"), self.startTagRpRt), - (("option", "optgroup"), self.startTagOpt), - (("math"), self.startTagMath), - (("svg"), self.startTagSvg), - (("caption", "col", "colgroup", "frame", "head", - "tbody", "td", "tfoot", "th", "thead", - "tr"), self.startTagMisplaced) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("body", self.endTagBody), - ("html", self.endTagHtml), - (("address", "article", "aside", "blockquote", "button", "center", - "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", - "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", - "section", "summary", "ul"), self.endTagBlock), - ("form", self.endTagForm), - ("p", self.endTagP), - (("dd", "dt", "li"), self.endTagListItem), - (headingElements, self.endTagHeading), - (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", - "strike", "strong", "tt", "u"), self.endTagFormatting), - (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), - ("br", self.endTagBr), - ]) - self.endTagHandler.default = self.endTagOther - - def isMatchingFormattingElement(self, node1, node2): - return (node1.name == node2.name and - node1.namespace == node2.namespace and - node1.attributes == node2.attributes) - - # helper - def addFormattingElement(self, token): - self.tree.insertElement(token) - element = self.tree.openElements[-1] - - matchingElements = [] - for node in self.tree.activeFormattingElements[::-1]: - if node is Marker: - break - elif self.isMatchingFormattingElement(node, element): - matchingElements.append(node) - - assert len(matchingElements) <= 3 - if len(matchingElements) == 3: - self.tree.activeFormattingElements.remove(matchingElements[-1]) - self.tree.activeFormattingElements.append(element) - - # the real deal - def processEOF(self): - allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", - "tfoot", "th", "thead", "tr", "body", - "html")) - for node in self.tree.openElements[::-1]: - if node.name not in allowed_elements: - self.parser.parseError("expected-closing-tag-but-got-eof") - break - # Stop parsing - - def processSpaceCharactersDropNewline(self, token): - # Sometimes (start of

, , and ",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("