From f2b31062ed5f86674c80fbde6812448821bec710 Mon Sep 17 00:00:00 2001 From: Aleks Date: Mon, 21 Sep 2020 11:27:04 +0300 Subject: [PATCH 1/6] Debug=False --- .vs/ProjectSettings.json | 3 +++ .vs/PythonSettings.json | 3 +++ .vs/VSWorkspaceState.json | 8 ++++++++ .vs/brightonpy.org/v16/.suo | Bin 0 -> 34304 bytes .vs/slnx.sqlite | Bin 0 -> 90112 bytes brighton.py | 2 +- 6 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/PythonSettings.json create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/brightonpy.org/v16/.suo create mode 100644 .vs/slnx.sqlite diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..f8b4888 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/PythonSettings.json b/.vs/PythonSettings.json new file mode 100644 index 0000000..656fe2b --- /dev/null +++ b/.vs/PythonSettings.json @@ -0,0 +1,3 @@ +{ + "Interpreter": "Global|VisualStudio|env for brightonpy" +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..9e83989 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,8 @@ +{ + "ExpandedNodes": [ + "", + "\\templates" + ], + "SelectedNode": "\\brighton.py", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/brightonpy.org/v16/.suo b/.vs/brightonpy.org/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..843a6e022370e0fa6e413bc4710ee80ddc4dc40d GIT binary patch literal 34304 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 Date: Tue, 22 Sep 2020 12:08:59 +0300 Subject: [PATCH 2/6] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B2=20brighton.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/PythonSettings.json | 2 +- .vs/brightonpy.org/v16/.suo | Bin 34304 -> 23040 bytes .vs/slnx.sqlite | Bin 90112 -> 1560576 bytes brighton.py | 7 +- .../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 + .../Jinja2-2.11.2.dist-info/INSTALLER | 1 + .../Jinja2-2.11.2.dist-info/LICENSE.rst | 28 + .../Jinja2-2.11.2.dist-info/METADATA | 106 + .../Jinja2-2.11.2.dist-info/RECORD | 61 + .../Jinja2-2.11.2.dist-info/WHEEL | 6 + .../Jinja2-2.11.2.dist-info/entry_points.txt | 3 + .../Jinja2-2.11.2.dist-info/top_level.txt | 1 + .../Markdown-2.6.8.dist-info/INSTALLER | 1 + .../Markdown-2.6.8.dist-info/LICENSE.md | 30 + .../Markdown-2.6.8.dist-info/METADATA | 51 + .../Markdown-2.6.8.dist-info/RECORD | 68 + .../Markdown-2.6.8.dist-info/WHEEL | 5 + .../Markdown-2.6.8.dist-info/top_level.txt | 1 + .../MarkupSafe-1.1.1.dist-info/INSTALLER | 1 + .../MarkupSafe-1.1.1.dist-info/LICENSE.rst | 28 + .../MarkupSafe-1.1.1.dist-info/METADATA | 103 + .../MarkupSafe-1.1.1.dist-info/RECORD | 15 + .../MarkupSafe-1.1.1.dist-info/WHEEL | 5 + .../MarkupSafe-1.1.1.dist-info/top_level.txt | 1 + .../PyYAML-3.12.dist-info/INSTALLER | 1 + .../PyYAML-3.12.dist-info/LICENSE | 19 + .../PyYAML-3.12.dist-info/METADATA | 35 + .../PyYAML-3.12.dist-info/RECORD | 40 + .../site-packages/PyYAML-3.12.dist-info/WHEEL | 5 + .../PyYAML-3.12.dist-info/top_level.txt | 2 + .../Werkzeug-0.16.1.dist-info/INSTALLER | 1 + .../Werkzeug-0.16.1.dist-info/LICENSE.rst | 28 + .../Werkzeug-0.16.1.dist-info/METADATA | 130 + .../Werkzeug-0.16.1.dist-info/RECORD | 119 + .../Werkzeug-0.16.1.dist-info/WHEEL | 6 + .../Werkzeug-0.16.1.dist-info/top_level.txt | 1 + .../click-7.1.2.dist-info/INSTALLER | 1 + .../click-7.1.2.dist-info/LICENSE.rst | 28 + .../click-7.1.2.dist-info/METADATA | 102 + .../click-7.1.2.dist-info/RECORD | 40 + .../site-packages/click-7.1.2.dist-info/WHEEL | 6 + .../click-7.1.2.dist-info/top_level.txt | 1 + .../Lib/site-packages/click/__init__.py | 79 + .../Lib/site-packages/click/_bashcomplete.py | 375 + brightonpy/Lib/site-packages/click/_compat.py | 786 ++ .../Lib/site-packages/click/_termui_impl.py | 657 ++ .../Lib/site-packages/click/_textwrap.py | 37 + .../Lib/site-packages/click/_unicodefun.py | 131 + .../Lib/site-packages/click/_winconsole.py | 370 + brightonpy/Lib/site-packages/click/core.py | 2030 ++++ .../Lib/site-packages/click/decorators.py | 333 + .../Lib/site-packages/click/exceptions.py | 253 + .../Lib/site-packages/click/formatting.py | 283 + brightonpy/Lib/site-packages/click/globals.py | 47 + brightonpy/Lib/site-packages/click/parser.py | 428 + brightonpy/Lib/site-packages/click/termui.py | 681 ++ brightonpy/Lib/site-packages/click/testing.py | 382 + brightonpy/Lib/site-packages/click/types.py | 762 ++ brightonpy/Lib/site-packages/click/utils.py | 455 + brightonpy/Lib/site-packages/easy_install.py | 5 + .../Lib/site-packages/flask/__init__.py | 49 + .../Lib/site-packages/flask/__main__.py | 15 + brightonpy/Lib/site-packages/flask/_compat.py | 96 + brightonpy/Lib/site-packages/flask/app.py | 2003 ++++ .../Lib/site-packages/flask/blueprints.py | 413 + brightonpy/Lib/site-packages/flask/cli.py | 517 + brightonpy/Lib/site-packages/flask/config.py | 263 + brightonpy/Lib/site-packages/flask/ctx.py | 410 + .../Lib/site-packages/flask/debughelpers.py | 155 + .../Lib/site-packages/flask/ext/__init__.py | 29 + brightonpy/Lib/site-packages/flask/exthook.py | 143 + brightonpy/Lib/site-packages/flask/globals.py | 61 + brightonpy/Lib/site-packages/flask/helpers.py | 966 ++ brightonpy/Lib/site-packages/flask/json.py | 269 + brightonpy/Lib/site-packages/flask/logging.py | 94 + .../Lib/site-packages/flask/sessions.py | 366 + brightonpy/Lib/site-packages/flask/signals.py | 56 + .../Lib/site-packages/flask/templating.py | 149 + brightonpy/Lib/site-packages/flask/testing.py | 143 + brightonpy/Lib/site-packages/flask/views.py | 149 + .../Lib/site-packages/flask/wrappers.py | 205 + .../itsdangerous-1.1.0.dist-info/INSTALLER | 1 + .../itsdangerous-1.1.0.dist-info/LICENSE.rst | 47 + .../itsdangerous-1.1.0.dist-info/METADATA | 98 + .../itsdangerous-1.1.0.dist-info/RECORD | 26 + .../itsdangerous-1.1.0.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../site-packages/itsdangerous/__init__.py | 22 + .../Lib/site-packages/itsdangerous/_compat.py | 46 + .../Lib/site-packages/itsdangerous/_json.py | 18 + .../site-packages/itsdangerous/encoding.py | 49 + .../Lib/site-packages/itsdangerous/exc.py | 98 + .../Lib/site-packages/itsdangerous/jws.py | 218 + .../site-packages/itsdangerous/serializer.py | 233 + .../Lib/site-packages/itsdangerous/signer.py | 179 + .../Lib/site-packages/itsdangerous/timed.py | 147 + .../site-packages/itsdangerous/url_safe.py | 65 + .../Lib/site-packages/jinja2/__init__.py | 44 + .../Lib/site-packages/jinja2/_compat.py | 132 + .../Lib/site-packages/jinja2/_identifier.py | 6 + .../Lib/site-packages/jinja2/asyncfilters.py | 158 + .../Lib/site-packages/jinja2/asyncsupport.py | 264 + .../Lib/site-packages/jinja2/bccache.py | 350 + .../Lib/site-packages/jinja2/compiler.py | 1843 ++++ .../Lib/site-packages/jinja2/constants.py | 21 + brightonpy/Lib/site-packages/jinja2/debug.py | 268 + .../Lib/site-packages/jinja2/defaults.py | 44 + .../Lib/site-packages/jinja2/environment.py | 1362 +++ .../Lib/site-packages/jinja2/exceptions.py | 177 + brightonpy/Lib/site-packages/jinja2/ext.py | 704 ++ .../Lib/site-packages/jinja2/filters.py | 1382 +++ .../Lib/site-packages/jinja2/idtracking.py | 290 + brightonpy/Lib/site-packages/jinja2/lexer.py | 848 ++ .../Lib/site-packages/jinja2/loaders.py | 504 + brightonpy/Lib/site-packages/jinja2/meta.py | 101 + .../Lib/site-packages/jinja2/nativetypes.py | 94 + brightonpy/Lib/site-packages/jinja2/nodes.py | 1088 +++ .../Lib/site-packages/jinja2/optimizer.py | 41 + brightonpy/Lib/site-packages/jinja2/parser.py | 939 ++ .../Lib/site-packages/jinja2/runtime.py | 1011 ++ .../Lib/site-packages/jinja2/sandbox.py | 510 + brightonpy/Lib/site-packages/jinja2/tests.py | 215 + brightonpy/Lib/site-packages/jinja2/utils.py | 732 ++ .../Lib/site-packages/jinja2/visitor.py | 81 + .../Lib/site-packages/markdown/__init__.py | 529 ++ .../Lib/site-packages/markdown/__main__.py | 136 + .../Lib/site-packages/markdown/__version__.py | 30 + .../Lib/site-packages/markdown/blockparser.py | 100 + .../site-packages/markdown/blockprocessors.py | 573 ++ .../markdown/extensions/__init__.py | 100 + .../site-packages/markdown/extensions/abbr.py | 91 + .../markdown/extensions/admonition.py | 96 + .../markdown/extensions/attr_list.py | 178 + .../markdown/extensions/codehilite.py | 265 + .../markdown/extensions/def_list.py | 115 + .../markdown/extensions/extra.py | 132 + .../markdown/extensions/fenced_code.py | 113 + .../markdown/extensions/footnotes.py | 416 + .../markdown/extensions/headerid.py | 97 + .../site-packages/markdown/extensions/meta.py | 78 + .../markdown/extensions/nl2br.py | 35 + .../markdown/extensions/sane_lists.py | 55 + .../markdown/extensions/smart_strong.py | 41 + .../markdown/extensions/smarty.py | 268 + .../markdown/extensions/tables.py | 196 + .../site-packages/markdown/extensions/toc.py | 310 + .../markdown/extensions/wikilinks.py | 89 + .../site-packages/markdown/inlinepatterns.py | 534 ++ .../Lib/site-packages/markdown/odict.py | 191 + .../site-packages/markdown/postprocessors.py | 111 + .../site-packages/markdown/preprocessors.py | 352 + .../Lib/site-packages/markdown/serializers.py | 282 + .../site-packages/markdown/treeprocessors.py | 371 + brightonpy/Lib/site-packages/markdown/util.py | 177 + .../Lib/site-packages/markupsafe/__init__.py | 327 + .../Lib/site-packages/markupsafe/_compat.py | 33 + .../site-packages/markupsafe/_constants.py | 264 + .../Lib/site-packages/markupsafe/_native.py | 69 + .../markupsafe/_speedups.cp37-win_amd64.pyd | Bin 0 -> 15360 bytes .../pip-20.1.1.dist-info/INSTALLER | 1 + .../pip-20.1.1.dist-info/LICENSE.txt | 20 + .../pip-20.1.1.dist-info/METADATA | 87 + .../site-packages/pip-20.1.1.dist-info/RECORD | 743 ++ .../site-packages/pip-20.1.1.dist-info/WHEEL | 6 + .../pip-20.1.1.dist-info/entry_points.txt | 5 + .../pip-20.1.1.dist-info/top_level.txt | 1 + brightonpy/Lib/site-packages/pip/__init__.py | 18 + brightonpy/Lib/site-packages/pip/__main__.py | 26 + .../site-packages/pip/_internal/__init__.py | 17 + .../site-packages/pip/_internal/build_env.py | 219 + .../Lib/site-packages/pip/_internal/cache.py | 349 + .../pip/_internal/cli/__init__.py | 4 + .../pip/_internal/cli/autocompletion.py | 164 + .../pip/_internal/cli/base_command.py | 228 + .../pip/_internal/cli/cmdoptions.py | 962 ++ .../pip/_internal/cli/command_context.py | 36 + .../site-packages/pip/_internal/cli/main.py | 75 + .../pip/_internal/cli/main_parser.py | 99 + .../site-packages/pip/_internal/cli/parser.py | 266 + .../pip/_internal/cli/progress_bars.py | 277 + .../pip/_internal/cli/req_command.py | 408 + .../pip/_internal/cli/spinners.py | 173 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 122 + .../pip/_internal/commands/cache.py | 181 + .../pip/_internal/commands/check.py | 51 + .../pip/_internal/commands/completion.py | 95 + .../pip/_internal/commands/configuration.py | 233 + .../pip/_internal/commands/debug.py | 237 + .../pip/_internal/commands/download.py | 142 + .../pip/_internal/commands/freeze.py | 99 + .../pip/_internal/commands/hash.py | 58 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/install.py | 691 ++ .../pip/_internal/commands/list.py | 299 + .../pip/_internal/commands/search.py | 146 + .../pip/_internal/commands/show.py | 180 + .../pip/_internal/commands/uninstall.py | 89 + .../pip/_internal/commands/wheel.py | 190 + .../pip/_internal/configuration.py | 426 + .../pip/_internal/distributions/__init__.py | 24 + .../pip/_internal/distributions/base.py | 45 + .../pip/_internal/distributions/installed.py | 24 + .../pip/_internal/distributions/sdist.py | 104 + .../pip/_internal/distributions/wheel.py | 36 + .../site-packages/pip/_internal/exceptions.py | 308 + .../pip/_internal/index/__init__.py | 2 + .../pip/_internal/index/collector.py | 661 ++ .../pip/_internal/index/package_finder.py | 1016 ++ .../site-packages/pip/_internal/locations.py | 194 + .../Lib/site-packages/pip/_internal/main.py | 16 + .../pip/_internal/models/__init__.py | 2 + .../pip/_internal/models/candidate.py | 36 + .../pip/_internal/models/direct_url.py | 245 + .../pip/_internal/models/format_control.py | 84 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 236 + .../pip/_internal/models/scheme.py | 25 + .../pip/_internal/models/search_scope.py | 133 + .../pip/_internal/models/selection_prefs.py | 47 + .../pip/_internal/models/target_python.py | 110 + .../pip/_internal/models/wheel.py | 78 + .../pip/_internal/network/__init__.py | 2 + .../pip/_internal/network/auth.py | 298 + .../pip/_internal/network/cache.py | 81 + .../pip/_internal/network/download.py | 200 + .../pip/_internal/network/session.py | 421 + .../pip/_internal/network/utils.py | 48 + .../pip/_internal/network/xmlrpc.py | 44 + .../pip/_internal/operations/__init__.py | 0 .../_internal/operations/build/__init__.py | 0 .../_internal/operations/build/metadata.py | 40 + .../operations/build/metadata_legacy.py | 77 + .../pip/_internal/operations/build/wheel.py | 46 + .../operations/build/wheel_legacy.py | 115 + .../pip/_internal/operations/check.py | 163 + .../pip/_internal/operations/freeze.py | 272 + .../_internal/operations/install/__init__.py | 2 + .../operations/install/editable_legacy.py | 52 + .../_internal/operations/install/legacy.py | 142 + .../pip/_internal/operations/install/wheel.py | 631 ++ .../pip/_internal/operations/prepare.py | 568 ++ .../site-packages/pip/_internal/pyproject.py | 196 + .../pip/_internal/req/__init__.py | 92 + .../pip/_internal/req/constructors.py | 464 + .../pip/_internal/req/req_file.py | 582 ++ .../pip/_internal/req/req_install.py | 850 ++ .../pip/_internal/req/req_set.py | 202 + .../pip/_internal/req/req_tracker.py | 151 + .../pip/_internal/req/req_uninstall.py | 649 ++ .../pip/_internal/resolution/__init__.py | 0 .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../_internal/resolution/legacy/resolver.py | 459 + .../resolution/resolvelib/__init__.py | 0 .../_internal/resolution/resolvelib/base.py | 52 + .../resolution/resolvelib/candidates.py | 450 + .../resolution/resolvelib/factory.py | 201 + .../resolution/resolvelib/provider.py | 54 + .../resolution/resolvelib/requirements.py | 119 + .../resolution/resolvelib/resolver.py | 174 + .../pip/_internal/self_outdated_check.py | 242 + .../pip/_internal/utils/__init__.py | 0 .../pip/_internal/utils/appdirs.py | 44 + .../pip/_internal/utils/compat.py | 270 + .../pip/_internal/utils/compatibility_tags.py | 169 + .../pip/_internal/utils/deprecation.py | 104 + .../pip/_internal/utils/direct_url_helpers.py | 130 + .../pip/_internal/utils/distutils_args.py | 48 + .../pip/_internal/utils/encoding.py | 42 + .../pip/_internal/utils/entrypoints.py | 31 + .../pip/_internal/utils/filesystem.py | 222 + .../pip/_internal/utils/filetypes.py | 16 + .../pip/_internal/utils/glibc.py | 98 + .../pip/_internal/utils/hashes.py | 133 + .../_internal/utils/inject_securetransport.py | 36 + .../pip/_internal/utils/logging.py | 399 + .../site-packages/pip/_internal/utils/misc.py | 913 ++ .../pip/_internal/utils/models.py | 42 + .../pip/_internal/utils/packaging.py | 94 + .../pip/_internal/utils/pkg_resources.py | 44 + .../pip/_internal/utils/setuptools_build.py | 181 + .../pip/_internal/utils/subprocess.py | 277 + .../pip/_internal/utils/temp_dir.py | 271 + .../pip/_internal/utils/typing.py | 38 + .../pip/_internal/utils/unpacking.py | 272 + .../site-packages/pip/_internal/utils/urls.py | 55 + .../pip/_internal/utils/virtualenv.py | 116 + .../pip/_internal/utils/wheel.py | 225 + .../pip/_internal/vcs/__init__.py | 15 + .../site-packages/pip/_internal/vcs/bazaar.py | 120 + .../site-packages/pip/_internal/vcs/git.py | 394 + .../pip/_internal/vcs/mercurial.py | 161 + .../pip/_internal/vcs/subversion.py | 334 + .../pip/_internal/vcs/versioncontrol.py | 723 ++ .../pip/_internal/wheel_builder.py | 309 + .../Lib/site-packages/pip/_vendor/__init__.py | 114 + .../Lib/site-packages/pip/_vendor/appdirs.py | 633 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 376 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 188 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 12 + .../pip/_vendor/certifi/cacert.pem | 4641 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 30 + .../pip/_vendor/chardet/__init__.py | 39 + .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 ++ .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 257 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../site-packages/pip/_vendor/contextlib2.py | 518 + .../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 | 786 ++ .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++++++ .../pip/_vendor/distlib/compat.py | 1120 +++ .../pip/_vendor/distlib/database.py | 1339 +++ .../pip/_vendor/distlib/index.py | 516 + .../pip/_vendor/distlib/locators.py | 1302 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1096 +++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 416 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 96768 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 105984 bytes .../site-packages/pip/_vendor/distlib/util.py | 1761 ++++ .../pip/_vendor/distlib/version.py | 736 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 90112 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99840 bytes .../pip/_vendor/distlib/wheel.py | 1004 ++ .../Lib/site-packages/pip/_vendor/distro.py | 1230 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../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 | 40 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/constants.py | 2947 ++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2791 ++++++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 239 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 398 + .../pip/_vendor/idna/idnadata.py | 1991 ++++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8317 +++++++++++++++++ .../site-packages/pip/_vendor/ipaddress.py | 2420 +++++ .../pip/_vendor/msgpack/__init__.py | 54 + .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 191 + .../pip/_vendor/msgpack/fallback.py | 1063 +++ .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__init__.py | 26 + .../pip/_vendor/packaging/_compat.py | 38 + .../pip/_vendor/packaging/_structures.py | 86 + .../pip/_vendor/packaging/_typing.py | 39 + .../pip/_vendor/packaging/markers.py | 328 + .../pip/_vendor/packaging/requirements.py | 145 + .../pip/_vendor/packaging/specifiers.py | 849 ++ .../pip/_vendor/packaging/tags.py | 739 ++ .../pip/_vendor/packaging/utils.py | 62 + .../pip/_vendor/packaging/version.py | 535 ++ .../pip/_vendor/pep517/__init__.py | 4 + .../pip/_vendor/pep517/_in_process.py | 280 + .../site-packages/pip/_vendor/pep517/build.py | 124 + .../site-packages/pip/_vendor/pep517/check.py | 203 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 34 + .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/envbuild.py | 167 + .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../pip/_vendor/pep517/wrappers.py | 308 + .../pip/_vendor/pkg_resources/__init__.py | 3296 +++++++ .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 177 + .../site-packages/pip/_vendor/progress/bar.py | 91 + .../pip/_vendor/progress/counter.py | 41 + .../pip/_vendor/progress/spinner.py | 43 + .../site-packages/pip/_vendor/pyparsing.py | 7107 ++++++++++++++ .../pip/_vendor/requests/__init__.py | 133 + .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 533 ++ .../site-packages/pip/_vendor/requests/api.py | 161 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 76 + .../pip/_vendor/requests/cookies.py | 549 ++ .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/help.py | 119 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 954 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 767 ++ .../pip/_vendor/requests/status_codes.py | 123 + .../pip/_vendor/requests/structures.py | 105 + .../pip/_vendor/requests/utils.py | 982 ++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../pip/_vendor/resolvelib/providers.py | 121 + .../pip/_vendor/resolvelib/reporters.py | 36 + .../pip/_vendor/resolvelib/resolvers.py | 414 + .../pip/_vendor/resolvelib/structs.py | 68 + .../Lib/site-packages/pip/_vendor/retrying.py | 267 + .../Lib/site-packages/pip/_vendor/six.py | 980 ++ .../Lib/site-packages/pip/_vendor/toml.py | 1039 ++ .../pip/_vendor/toml/__init__.py | 21 + .../site-packages/pip/_vendor/toml/decoder.py | 945 ++ .../site-packages/pip/_vendor/toml/encoder.py | 250 + .../site-packages/pip/_vendor/toml/ordered.py | 15 + .../Lib/site-packages/pip/_vendor/toml/tz.py | 21 + .../pip/_vendor/urllib3/__init__.py | 86 + .../pip/_vendor/urllib3/_collections.py | 336 + .../pip/_vendor/urllib3/connection.py | 414 + .../pip/_vendor/urllib3/connectionpool.py | 1051 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 493 + .../contrib/_securetransport/low_level.py | 328 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 121 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 498 + .../urllib3/contrib/securetransport.py | 859 ++ .../pip/_vendor/urllib3/contrib/socks.py | 210 + .../pip/_vendor/urllib3/exceptions.py | 255 + .../pip/_vendor/urllib3/fields.py | 273 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 52 + .../pip/_vendor/urllib3/packages/six.py | 1021 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../ssl_match_hostname/_implementation.py | 160 + .../pip/_vendor/urllib3/poolmanager.py | 470 + .../pip/_vendor/urllib3/request.py | 171 + .../pip/_vendor/urllib3/response.py | 809 ++ .../pip/_vendor/urllib3/util/__init__.py | 46 + .../pip/_vendor/urllib3/util/connection.py | 138 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 135 + .../pip/_vendor/urllib3/util/response.py | 86 + .../pip/_vendor/urllib3/util/retry.py | 450 + .../pip/_vendor/urllib3/util/ssl_.py | 407 + .../pip/_vendor/urllib3/util/timeout.py | 258 + .../pip/_vendor/urllib3/util/url.py | 430 + .../pip/_vendor/urllib3/util/wait.py | 153 + .../Lib/site-packages/pip/_vendor/vendor.txt | 24 + .../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 + .../site-packages/pkg_resources/__init__.py | 3307 +++++++ .../pkg_resources/_vendor/__init__.py | 0 .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 66 + .../site-packages/pkg_resources/py2_warn.py | 16 + .../site-packages/pkg_resources/py31compat.py | 23 + .../setuptools-47.1.0.dist-info/INSTALLER | 1 + .../setuptools-47.1.0.dist-info/LICENSE | 19 + .../setuptools-47.1.0.dist-info/METADATA | 109 + .../setuptools-47.1.0.dist-info/RECORD | 196 + .../setuptools-47.1.0.dist-info/WHEEL | 5 + .../dependency_links.txt | 2 + .../entry_points.txt | 68 + .../setuptools-47.1.0.dist-info/top_level.txt | 3 + .../setuptools-47.1.0.dist-info/zip-safe | 1 + .../Lib/site-packages/setuptools/__init__.py | 232 + .../setuptools/_deprecation_warning.py | 7 + .../Lib/site-packages/setuptools/_imp.py | 82 + .../setuptools/_vendor/__init__.py | 0 .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 27 + .../setuptools/_vendor/packaging/__init__.py | 26 + .../setuptools/_vendor/packaging/_compat.py | 31 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 296 + .../_vendor/packaging/requirements.py | 138 + .../_vendor/packaging/specifiers.py | 749 ++ .../setuptools/_vendor/packaging/tags.py | 404 + .../setuptools/_vendor/packaging/utils.py | 57 + .../setuptools/_vendor/packaging/version.py | 420 + .../setuptools/_vendor/pyparsing.py | 5742 ++++++++++++ .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 175 + .../site-packages/setuptools/build_meta.py | 272 + .../Lib/site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../Lib/site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 17 + .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 509 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 30 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 330 + .../setuptools/command/build_py.py | 276 + .../setuptools/command/develop.py | 221 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2354 +++++ .../setuptools/command/egg_info.py | 721 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 122 + .../setuptools/command/install_scripts.py | 68 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 252 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 280 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 206 + .../Lib/site-packages/setuptools/config.py | 700 ++ .../Lib/site-packages/setuptools/dep_util.py | 25 + .../Lib/site-packages/setuptools/depends.py | 176 + .../Lib/site-packages/setuptools/dist.py | 1031 ++ .../Lib/site-packages/setuptools/errors.py | 16 + .../Lib/site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 66 + .../Lib/site-packages/setuptools/glob.py | 174 + .../Lib/site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../Lib/site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/installer.py | 150 + .../Lib/site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 71 + .../Lib/site-packages/setuptools/monkey.py | 179 + .../Lib/site-packages/setuptools/msvc.py | 1825 ++++ .../site-packages/setuptools/namespaces.py | 111 + .../site-packages/setuptools/package_index.py | 1140 +++ .../site-packages/setuptools/py27compat.py | 60 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 59 + .../site-packages/setuptools/py34compat.py | 13 + .../Lib/site-packages/setuptools/sandbox.py | 492 + .../setuptools/script (dev).tmpl | 6 + .../Lib/site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 76 + .../site-packages/setuptools/ssl_support.py | 265 + .../site-packages/setuptools/unicode_utils.py | 44 + .../Lib/site-packages/setuptools/version.py | 6 + .../Lib/site-packages/setuptools/wheel.py | 217 + .../setuptools/windows_support.py | 29 + .../waitress-1.0.2.dist-info/DESCRIPTION.rst | 87 + .../waitress-1.0.2.dist-info/INSTALLER | 1 + .../waitress-1.0.2.dist-info/METADATA | 122 + .../waitress-1.0.2.dist-info/RECORD | 86 + .../waitress-1.0.2.dist-info/WHEEL | 6 + .../waitress-1.0.2.dist-info/entry_points.txt | 6 + .../waitress-1.0.2.dist-info/metadata.json | 1 + .../waitress-1.0.2.dist-info/top_level.txt | 1 + .../Lib/site-packages/waitress/__init__.py | 41 + .../Lib/site-packages/waitress/adjustments.py | 340 + .../Lib/site-packages/waitress/buffers.py | 298 + .../Lib/site-packages/waitress/channel.py | 386 + .../Lib/site-packages/waitress/compat.py | 140 + .../Lib/site-packages/waitress/parser.py | 298 + .../Lib/site-packages/waitress/receiver.py | 149 + .../Lib/site-packages/waitress/runner.py | 275 + .../Lib/site-packages/waitress/server.py | 357 + brightonpy/Lib/site-packages/waitress/task.py | 528 ++ .../site-packages/waitress/tests/__init__.py | 2 + .../waitress/tests/fixtureapps/__init__.py | 1 + .../waitress/tests/fixtureapps/badcl.py | 12 + .../waitress/tests/fixtureapps/echo.py | 11 + .../waitress/tests/fixtureapps/error.py | 20 + .../waitress/tests/fixtureapps/filewrapper.py | 70 + .../waitress/tests/fixtureapps/getline.py | 17 + .../waitress/tests/fixtureapps/groundhog1.jpg | Bin 0 -> 45448 bytes .../waitress/tests/fixtureapps/nocl.py | 24 + .../waitress/tests/fixtureapps/runner.py | 5 + .../waitress/tests/fixtureapps/sleepy.py | 14 + .../waitress/tests/fixtureapps/toolarge.py | 8 + .../waitress/tests/fixtureapps/writecb.py | 14 + .../waitress/tests/test_adjustments.py | 294 + .../waitress/tests/test_buffers.py | 453 + .../waitress/tests/test_channel.py | 727 ++ .../waitress/tests/test_compat.py | 20 + .../waitress/tests/test_functional.py | 1551 +++ .../site-packages/waitress/tests/test_init.py | 47 + .../waitress/tests/test_parser.py | 438 + .../waitress/tests/test_receiver.py | 169 + .../waitress/tests/test_regression.py | 144 + .../waitress/tests/test_runner.py | 205 + .../waitress/tests/test_server.py | 367 + .../site-packages/waitress/tests/test_task.py | 931 ++ .../waitress/tests/test_trigger.py | 105 + .../waitress/tests/test_utilities.py | 121 + .../Lib/site-packages/waitress/trigger.py | 198 + .../Lib/site-packages/waitress/utilities.py | 216 + .../Lib/site-packages/werkzeug/__init__.py | 223 + .../Lib/site-packages/werkzeug/_compat.py | 219 + .../Lib/site-packages/werkzeug/_internal.py | 484 + .../Lib/site-packages/werkzeug/_reloader.py | 341 + .../werkzeug/contrib/__init__.py | 16 + .../site-packages/werkzeug/contrib/atom.py | 362 + .../site-packages/werkzeug/contrib/cache.py | 933 ++ .../site-packages/werkzeug/contrib/fixers.py | 262 + .../site-packages/werkzeug/contrib/iterio.py | 358 + .../site-packages/werkzeug/contrib/lint.py | 11 + .../werkzeug/contrib/profiler.py | 42 + .../werkzeug/contrib/securecookie.py | 362 + .../werkzeug/contrib/sessions.py | 389 + .../werkzeug/contrib/wrappers.py | 385 + .../site-packages/werkzeug/datastructures.py | 2852 ++++++ .../site-packages/werkzeug/debug/__init__.py | 524 ++ .../site-packages/werkzeug/debug/console.py | 216 + .../Lib/site-packages/werkzeug/debug/repr.py | 297 + .../werkzeug/debug/shared/FONT_LICENSE | 96 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 210 + .../werkzeug/debug/shared/jquery.js | 2 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/source.png | Bin 0 -> 818 bytes .../werkzeug/debug/shared/style.css | 154 + .../werkzeug/debug/shared/ubuntu.ttf | Bin 0 -> 70220 bytes .../site-packages/werkzeug/debug/tbtools.py | 629 ++ .../Lib/site-packages/werkzeug/exceptions.py | 779 ++ .../Lib/site-packages/werkzeug/filesystem.py | 64 + .../Lib/site-packages/werkzeug/formparser.py | 584 ++ brightonpy/Lib/site-packages/werkzeug/http.py | 1259 +++ .../Lib/site-packages/werkzeug/local.py | 421 + .../werkzeug/middleware/__init__.py | 25 + .../werkzeug/middleware/dispatcher.py | 66 + .../werkzeug/middleware/http_proxy.py | 219 + .../site-packages/werkzeug/middleware/lint.py | 408 + .../werkzeug/middleware/profiler.py | 132 + .../werkzeug/middleware/proxy_fix.py | 232 + .../werkzeug/middleware/shared_data.py | 253 + .../site-packages/werkzeug/posixemulation.py | 117 + .../Lib/site-packages/werkzeug/routing.py | 2039 ++++ .../Lib/site-packages/werkzeug/security.py | 249 + .../Lib/site-packages/werkzeug/serving.py | 1077 +++ brightonpy/Lib/site-packages/werkzeug/test.py | 1146 +++ .../Lib/site-packages/werkzeug/testapp.py | 241 + brightonpy/Lib/site-packages/werkzeug/urls.py | 1138 +++ .../Lib/site-packages/werkzeug/useragents.py | 210 + .../Lib/site-packages/werkzeug/utils.py | 774 ++ .../werkzeug/wrappers/__init__.py | 36 + .../site-packages/werkzeug/wrappers/accept.py | 50 + .../site-packages/werkzeug/wrappers/auth.py | 33 + .../werkzeug/wrappers/base_request.py | 695 ++ .../werkzeug/wrappers/base_response.py | 702 ++ .../werkzeug/wrappers/common_descriptors.py | 322 + .../site-packages/werkzeug/wrappers/etag.py | 304 + .../site-packages/werkzeug/wrappers/json.py | 145 + .../werkzeug/wrappers/request.py | 44 + .../werkzeug/wrappers/response.py | 78 + .../werkzeug/wrappers/user_agent.py | 14 + brightonpy/Lib/site-packages/werkzeug/wsgi.py | 1013 ++ brightonpy/Lib/site-packages/yaml/__init__.py | 312 + brightonpy/Lib/site-packages/yaml/composer.py | 139 + .../Lib/site-packages/yaml/constructor.py | 686 ++ brightonpy/Lib/site-packages/yaml/cyaml.py | 85 + brightonpy/Lib/site-packages/yaml/dumper.py | 62 + brightonpy/Lib/site-packages/yaml/emitter.py | 1137 +++ brightonpy/Lib/site-packages/yaml/error.py | 75 + brightonpy/Lib/site-packages/yaml/events.py | 86 + brightonpy/Lib/site-packages/yaml/loader.py | 40 + brightonpy/Lib/site-packages/yaml/nodes.py | 49 + brightonpy/Lib/site-packages/yaml/parser.py | 589 ++ brightonpy/Lib/site-packages/yaml/reader.py | 192 + .../Lib/site-packages/yaml/representer.py | 387 + brightonpy/Lib/site-packages/yaml/resolver.py | 227 + brightonpy/Lib/site-packages/yaml/scanner.py | 1444 +++ .../Lib/site-packages/yaml/serializer.py | 111 + brightonpy/Lib/site-packages/yaml/tokens.py | 104 + brightonpy/Scripts/Activate.ps1 | 51 + brightonpy/Scripts/activate | 76 + brightonpy/Scripts/activate.bat | 33 + brightonpy/Scripts/deactivate.bat | 21 + brightonpy/Scripts/easy_install-3.7.exe | Bin 0 -> 106367 bytes brightonpy/Scripts/easy_install.exe | Bin 0 -> 106367 bytes brightonpy/Scripts/flask.exe | Bin 0 -> 106345 bytes brightonpy/Scripts/markdown_py | 34 + brightonpy/Scripts/markdown_py.bat | 1 + brightonpy/Scripts/pip.exe | Bin 0 -> 106358 bytes brightonpy/Scripts/pip3.7.exe | Bin 0 -> 106358 bytes brightonpy/Scripts/pip3.exe | Bin 0 -> 106358 bytes brightonpy/Scripts/python.exe | Bin 0 -> 522768 bytes brightonpy/Scripts/pythonw.exe | Bin 0 -> 522256 bytes brightonpy/Scripts/waitress-serve.exe | Bin 0 -> 106349 bytes brightonpy/pyvenv.cfg | 3 + requirements.txt | 3 +- 791 files changed, 232129 insertions(+), 5 deletions(-) create mode 100644 brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/DESCRIPTION.rst create mode 100644 brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/INSTALLER create mode 100644 brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/LICENSE.txt create mode 100644 brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/METADATA create mode 100644 brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/RECORD create mode 100644 brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/WHEEL create mode 100644 brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/entry_points.txt create mode 100644 brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/metadata.json create mode 100644 brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/top_level.txt create mode 100644 brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/INSTALLER create mode 100644 brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/LICENSE.rst create mode 100644 brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/METADATA create mode 100644 brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/RECORD create mode 100644 brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/WHEEL create mode 100644 brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/entry_points.txt create mode 100644 brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/top_level.txt create mode 100644 brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/INSTALLER create mode 100644 brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/LICENSE.md create mode 100644 brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/METADATA create mode 100644 brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/RECORD create mode 100644 brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/WHEEL create mode 100644 brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/top_level.txt create mode 100644 brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER create mode 100644 brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.rst create mode 100644 brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/METADATA create mode 100644 brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/RECORD create mode 100644 brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL create mode 100644 brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt create mode 100644 brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/INSTALLER create mode 100644 brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/LICENSE create mode 100644 brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/METADATA create mode 100644 brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/RECORD create mode 100644 brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/WHEEL create mode 100644 brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/top_level.txt create mode 100644 brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/INSTALLER create mode 100644 brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/LICENSE.rst create mode 100644 brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/METADATA create mode 100644 brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/RECORD create mode 100644 brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/WHEEL create mode 100644 brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/top_level.txt create mode 100644 brightonpy/Lib/site-packages/click-7.1.2.dist-info/INSTALLER create mode 100644 brightonpy/Lib/site-packages/click-7.1.2.dist-info/LICENSE.rst create mode 100644 brightonpy/Lib/site-packages/click-7.1.2.dist-info/METADATA create mode 100644 brightonpy/Lib/site-packages/click-7.1.2.dist-info/RECORD create mode 100644 brightonpy/Lib/site-packages/click-7.1.2.dist-info/WHEEL create mode 100644 brightonpy/Lib/site-packages/click-7.1.2.dist-info/top_level.txt create mode 100644 brightonpy/Lib/site-packages/click/__init__.py create mode 100644 brightonpy/Lib/site-packages/click/_bashcomplete.py create mode 100644 brightonpy/Lib/site-packages/click/_compat.py create mode 100644 brightonpy/Lib/site-packages/click/_termui_impl.py create mode 100644 brightonpy/Lib/site-packages/click/_textwrap.py create mode 100644 brightonpy/Lib/site-packages/click/_unicodefun.py create mode 100644 brightonpy/Lib/site-packages/click/_winconsole.py create mode 100644 brightonpy/Lib/site-packages/click/core.py create mode 100644 brightonpy/Lib/site-packages/click/decorators.py create mode 100644 brightonpy/Lib/site-packages/click/exceptions.py create mode 100644 brightonpy/Lib/site-packages/click/formatting.py create mode 100644 brightonpy/Lib/site-packages/click/globals.py create mode 100644 brightonpy/Lib/site-packages/click/parser.py create mode 100644 brightonpy/Lib/site-packages/click/termui.py create mode 100644 brightonpy/Lib/site-packages/click/testing.py create mode 100644 brightonpy/Lib/site-packages/click/types.py create mode 100644 brightonpy/Lib/site-packages/click/utils.py create mode 100644 brightonpy/Lib/site-packages/easy_install.py create mode 100644 brightonpy/Lib/site-packages/flask/__init__.py create mode 100644 brightonpy/Lib/site-packages/flask/__main__.py create mode 100644 brightonpy/Lib/site-packages/flask/_compat.py create mode 100644 brightonpy/Lib/site-packages/flask/app.py create mode 100644 brightonpy/Lib/site-packages/flask/blueprints.py create mode 100644 brightonpy/Lib/site-packages/flask/cli.py create mode 100644 brightonpy/Lib/site-packages/flask/config.py create mode 100644 brightonpy/Lib/site-packages/flask/ctx.py create mode 100644 brightonpy/Lib/site-packages/flask/debughelpers.py create mode 100644 brightonpy/Lib/site-packages/flask/ext/__init__.py create mode 100644 brightonpy/Lib/site-packages/flask/exthook.py create mode 100644 brightonpy/Lib/site-packages/flask/globals.py create mode 100644 brightonpy/Lib/site-packages/flask/helpers.py create mode 100644 brightonpy/Lib/site-packages/flask/json.py create mode 100644 brightonpy/Lib/site-packages/flask/logging.py create mode 100644 brightonpy/Lib/site-packages/flask/sessions.py create mode 100644 brightonpy/Lib/site-packages/flask/signals.py create mode 100644 brightonpy/Lib/site-packages/flask/templating.py create mode 100644 brightonpy/Lib/site-packages/flask/testing.py create mode 100644 brightonpy/Lib/site-packages/flask/views.py create mode 100644 brightonpy/Lib/site-packages/flask/wrappers.py create mode 100644 brightonpy/Lib/site-packages/itsdangerous-1.1.0.dist-info/INSTALLER create mode 100644 brightonpy/Lib/site-packages/itsdangerous-1.1.0.dist-info/LICENSE.rst create mode 100644 brightonpy/Lib/site-packages/itsdangerous-1.1.0.dist-info/METADATA create mode 100644 brightonpy/Lib/site-packages/itsdangerous-1.1.0.dist-info/RECORD create mode 100644 brightonpy/Lib/site-packages/itsdangerous-1.1.0.dist-info/WHEEL create mode 100644 brightonpy/Lib/site-packages/itsdangerous-1.1.0.dist-info/top_level.txt create mode 100644 brightonpy/Lib/site-packages/itsdangerous/__init__.py create mode 100644 brightonpy/Lib/site-packages/itsdangerous/_compat.py create mode 100644 brightonpy/Lib/site-packages/itsdangerous/_json.py create mode 100644 brightonpy/Lib/site-packages/itsdangerous/encoding.py create mode 100644 brightonpy/Lib/site-packages/itsdangerous/exc.py create mode 100644 brightonpy/Lib/site-packages/itsdangerous/jws.py create mode 100644 brightonpy/Lib/site-packages/itsdangerous/serializer.py create mode 100644 brightonpy/Lib/site-packages/itsdangerous/signer.py create mode 100644 brightonpy/Lib/site-packages/itsdangerous/timed.py create mode 100644 brightonpy/Lib/site-packages/itsdangerous/url_safe.py create mode 100644 brightonpy/Lib/site-packages/jinja2/__init__.py create mode 100644 brightonpy/Lib/site-packages/jinja2/_compat.py create mode 100644 brightonpy/Lib/site-packages/jinja2/_identifier.py create mode 100644 brightonpy/Lib/site-packages/jinja2/asyncfilters.py create mode 100644 brightonpy/Lib/site-packages/jinja2/asyncsupport.py create mode 100644 brightonpy/Lib/site-packages/jinja2/bccache.py create mode 100644 brightonpy/Lib/site-packages/jinja2/compiler.py create mode 100644 brightonpy/Lib/site-packages/jinja2/constants.py create mode 100644 brightonpy/Lib/site-packages/jinja2/debug.py create mode 100644 brightonpy/Lib/site-packages/jinja2/defaults.py create mode 100644 brightonpy/Lib/site-packages/jinja2/environment.py create mode 100644 brightonpy/Lib/site-packages/jinja2/exceptions.py create mode 100644 brightonpy/Lib/site-packages/jinja2/ext.py create mode 100644 brightonpy/Lib/site-packages/jinja2/filters.py create mode 100644 brightonpy/Lib/site-packages/jinja2/idtracking.py create mode 100644 brightonpy/Lib/site-packages/jinja2/lexer.py create mode 100644 brightonpy/Lib/site-packages/jinja2/loaders.py create mode 100644 brightonpy/Lib/site-packages/jinja2/meta.py create mode 100644 brightonpy/Lib/site-packages/jinja2/nativetypes.py create mode 100644 brightonpy/Lib/site-packages/jinja2/nodes.py create mode 100644 brightonpy/Lib/site-packages/jinja2/optimizer.py create mode 100644 brightonpy/Lib/site-packages/jinja2/parser.py create mode 100644 brightonpy/Lib/site-packages/jinja2/runtime.py create mode 100644 brightonpy/Lib/site-packages/jinja2/sandbox.py create mode 100644 brightonpy/Lib/site-packages/jinja2/tests.py create mode 100644 brightonpy/Lib/site-packages/jinja2/utils.py create mode 100644 brightonpy/Lib/site-packages/jinja2/visitor.py create mode 100644 brightonpy/Lib/site-packages/markdown/__init__.py create mode 100644 brightonpy/Lib/site-packages/markdown/__main__.py create mode 100644 brightonpy/Lib/site-packages/markdown/__version__.py create mode 100644 brightonpy/Lib/site-packages/markdown/blockparser.py create mode 100644 brightonpy/Lib/site-packages/markdown/blockprocessors.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/__init__.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/abbr.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/admonition.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/attr_list.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/codehilite.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/def_list.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/extra.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/fenced_code.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/footnotes.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/headerid.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/meta.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/nl2br.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/sane_lists.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/smart_strong.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/smarty.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/tables.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/toc.py create mode 100644 brightonpy/Lib/site-packages/markdown/extensions/wikilinks.py create mode 100644 brightonpy/Lib/site-packages/markdown/inlinepatterns.py create mode 100644 brightonpy/Lib/site-packages/markdown/odict.py create mode 100644 brightonpy/Lib/site-packages/markdown/postprocessors.py create mode 100644 brightonpy/Lib/site-packages/markdown/preprocessors.py create mode 100644 brightonpy/Lib/site-packages/markdown/serializers.py create mode 100644 brightonpy/Lib/site-packages/markdown/treeprocessors.py create mode 100644 brightonpy/Lib/site-packages/markdown/util.py create mode 100644 brightonpy/Lib/site-packages/markupsafe/__init__.py create mode 100644 brightonpy/Lib/site-packages/markupsafe/_compat.py create mode 100644 brightonpy/Lib/site-packages/markupsafe/_constants.py create mode 100644 brightonpy/Lib/site-packages/markupsafe/_native.py create mode 100644 brightonpy/Lib/site-packages/markupsafe/_speedups.cp37-win_amd64.pyd create mode 100644 brightonpy/Lib/site-packages/pip-20.1.1.dist-info/INSTALLER create mode 100644 brightonpy/Lib/site-packages/pip-20.1.1.dist-info/LICENSE.txt create mode 100644 brightonpy/Lib/site-packages/pip-20.1.1.dist-info/METADATA create mode 100644 brightonpy/Lib/site-packages/pip-20.1.1.dist-info/RECORD create mode 100644 brightonpy/Lib/site-packages/pip-20.1.1.dist-info/WHEEL create mode 100644 brightonpy/Lib/site-packages/pip-20.1.1.dist-info/entry_points.txt create mode 100644 brightonpy/Lib/site-packages/pip-20.1.1.dist-info/top_level.txt create mode 100644 brightonpy/Lib/site-packages/pip/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/__main__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/build_env.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cache.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cli/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cli/base_command.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cli/command_context.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cli/main.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cli/main_parser.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cli/parser.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cli/req_command.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cli/spinners.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/cli/status_codes.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/cache.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/check.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/completion.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/configuration.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/debug.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/download.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/freeze.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/hash.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/help.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/install.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/list.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/search.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/show.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/uninstall.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/commands/wheel.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/configuration.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/distributions/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/distributions/base.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/distributions/installed.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/distributions/sdist.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/distributions/wheel.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/exceptions.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/index/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/index/collector.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/index/package_finder.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/locations.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/main.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/models/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/models/candidate.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/models/direct_url.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/models/format_control.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/models/index.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/models/link.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/models/scheme.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/models/search_scope.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/models/target_python.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/models/wheel.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/network/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/network/auth.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/network/cache.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/network/download.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/network/session.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/network/utils.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/check.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/freeze.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/operations/prepare.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/pyproject.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/req/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/req/constructors.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/req/req_file.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/req/req_install.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/req/req_set.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/req/req_tracker.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/resolution/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/resolution/base.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/self_outdated_check.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/appdirs.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/compat.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/deprecation.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/encoding.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/filesystem.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/filetypes.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/glibc.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/hashes.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/logging.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/misc.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/models.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/packaging.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/pkg_resources.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/subprocess.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/typing.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/unpacking.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/urls.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/utils/wheel.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/vcs/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/vcs/git.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/vcs/subversion.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 brightonpy/Lib/site-packages/pip/_internal/wheel_builder.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/appdirs.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/certifi/core.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/compat.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/enums.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/chardet/version.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/colorama/win32.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/contextlib2.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/compat.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/database.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/index.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/locators.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/markers.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/resources.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/util.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/version.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/distro.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/idna/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/idna/codec.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/idna/compat.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/idna/core.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/idna/intranges.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/idna/package_data.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/ipaddress.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/packaging/_typing.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/packaging/markers.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/packaging/tags.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/packaging/utils.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/packaging/version.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pep517/build.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pep517/check.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pep517/compat.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pep517/meta.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/progress/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/progress/bar.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/progress/counter.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/progress/spinner.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/pyparsing.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/__version__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/adapters.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/api.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/auth.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/certs.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/compat.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/cookies.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/help.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/hooks.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/models.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/packages.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/sessions.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/structures.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/requests/utils.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/retrying.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/six.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/toml.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/toml/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/toml/decoder.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/toml/encoder.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/toml/ordered.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/toml/tz.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/request.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/response.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/vendor.txt create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 brightonpy/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/__init__.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/_vendor/six.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/extern/__init__.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/py2_warn.py create mode 100644 brightonpy/Lib/site-packages/pkg_resources/py31compat.py create mode 100644 brightonpy/Lib/site-packages/setuptools-47.1.0.dist-info/INSTALLER create mode 100644 brightonpy/Lib/site-packages/setuptools-47.1.0.dist-info/LICENSE create mode 100644 brightonpy/Lib/site-packages/setuptools-47.1.0.dist-info/METADATA create mode 100644 brightonpy/Lib/site-packages/setuptools-47.1.0.dist-info/RECORD create mode 100644 brightonpy/Lib/site-packages/setuptools-47.1.0.dist-info/WHEEL create mode 100644 brightonpy/Lib/site-packages/setuptools-47.1.0.dist-info/dependency_links.txt create mode 100644 brightonpy/Lib/site-packages/setuptools-47.1.0.dist-info/entry_points.txt create mode 100644 brightonpy/Lib/site-packages/setuptools-47.1.0.dist-info/top_level.txt create mode 100644 brightonpy/Lib/site-packages/setuptools-47.1.0.dist-info/zip-safe create mode 100644 brightonpy/Lib/site-packages/setuptools/__init__.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_deprecation_warning.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_imp.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/__init__.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 brightonpy/Lib/site-packages/setuptools/_vendor/six.py create mode 100644 brightonpy/Lib/site-packages/setuptools/archive_util.py create mode 100644 brightonpy/Lib/site-packages/setuptools/build_meta.py create mode 100644 brightonpy/Lib/site-packages/setuptools/cli-32.exe create mode 100644 brightonpy/Lib/site-packages/setuptools/cli-64.exe create mode 100644 brightonpy/Lib/site-packages/setuptools/cli.exe create mode 100644 brightonpy/Lib/site-packages/setuptools/command/__init__.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/alias.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/bdist_egg.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/bdist_rpm.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/bdist_wininst.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/build_clib.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/build_ext.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/build_py.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/develop.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/dist_info.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/easy_install.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/egg_info.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/install.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/install_egg_info.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/install_lib.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/install_scripts.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/launcher manifest.xml create mode 100644 brightonpy/Lib/site-packages/setuptools/command/py36compat.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/register.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/rotate.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/saveopts.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/sdist.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/setopt.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/test.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/upload.py create mode 100644 brightonpy/Lib/site-packages/setuptools/command/upload_docs.py create mode 100644 brightonpy/Lib/site-packages/setuptools/config.py create mode 100644 brightonpy/Lib/site-packages/setuptools/dep_util.py create mode 100644 brightonpy/Lib/site-packages/setuptools/depends.py create mode 100644 brightonpy/Lib/site-packages/setuptools/dist.py create mode 100644 brightonpy/Lib/site-packages/setuptools/errors.py create mode 100644 brightonpy/Lib/site-packages/setuptools/extension.py create mode 100644 brightonpy/Lib/site-packages/setuptools/extern/__init__.py create mode 100644 brightonpy/Lib/site-packages/setuptools/glob.py create mode 100644 brightonpy/Lib/site-packages/setuptools/gui-32.exe create mode 100644 brightonpy/Lib/site-packages/setuptools/gui-64.exe create mode 100644 brightonpy/Lib/site-packages/setuptools/gui.exe create mode 100644 brightonpy/Lib/site-packages/setuptools/installer.py create mode 100644 brightonpy/Lib/site-packages/setuptools/launch.py create mode 100644 brightonpy/Lib/site-packages/setuptools/lib2to3_ex.py create mode 100644 brightonpy/Lib/site-packages/setuptools/monkey.py create mode 100644 brightonpy/Lib/site-packages/setuptools/msvc.py create mode 100644 brightonpy/Lib/site-packages/setuptools/namespaces.py create mode 100644 brightonpy/Lib/site-packages/setuptools/package_index.py create mode 100644 brightonpy/Lib/site-packages/setuptools/py27compat.py create mode 100644 brightonpy/Lib/site-packages/setuptools/py31compat.py create mode 100644 brightonpy/Lib/site-packages/setuptools/py33compat.py create mode 100644 brightonpy/Lib/site-packages/setuptools/py34compat.py create mode 100644 brightonpy/Lib/site-packages/setuptools/sandbox.py create mode 100644 brightonpy/Lib/site-packages/setuptools/script (dev).tmpl create mode 100644 brightonpy/Lib/site-packages/setuptools/script.tmpl create mode 100644 brightonpy/Lib/site-packages/setuptools/site-patch.py create mode 100644 brightonpy/Lib/site-packages/setuptools/ssl_support.py create mode 100644 brightonpy/Lib/site-packages/setuptools/unicode_utils.py create mode 100644 brightonpy/Lib/site-packages/setuptools/version.py create mode 100644 brightonpy/Lib/site-packages/setuptools/wheel.py create mode 100644 brightonpy/Lib/site-packages/setuptools/windows_support.py create mode 100644 brightonpy/Lib/site-packages/waitress-1.0.2.dist-info/DESCRIPTION.rst create mode 100644 brightonpy/Lib/site-packages/waitress-1.0.2.dist-info/INSTALLER create mode 100644 brightonpy/Lib/site-packages/waitress-1.0.2.dist-info/METADATA create mode 100644 brightonpy/Lib/site-packages/waitress-1.0.2.dist-info/RECORD create mode 100644 brightonpy/Lib/site-packages/waitress-1.0.2.dist-info/WHEEL create mode 100644 brightonpy/Lib/site-packages/waitress-1.0.2.dist-info/entry_points.txt create mode 100644 brightonpy/Lib/site-packages/waitress-1.0.2.dist-info/metadata.json create mode 100644 brightonpy/Lib/site-packages/waitress-1.0.2.dist-info/top_level.txt create mode 100644 brightonpy/Lib/site-packages/waitress/__init__.py create mode 100644 brightonpy/Lib/site-packages/waitress/adjustments.py create mode 100644 brightonpy/Lib/site-packages/waitress/buffers.py create mode 100644 brightonpy/Lib/site-packages/waitress/channel.py create mode 100644 brightonpy/Lib/site-packages/waitress/compat.py create mode 100644 brightonpy/Lib/site-packages/waitress/parser.py create mode 100644 brightonpy/Lib/site-packages/waitress/receiver.py create mode 100644 brightonpy/Lib/site-packages/waitress/runner.py create mode 100644 brightonpy/Lib/site-packages/waitress/server.py create mode 100644 brightonpy/Lib/site-packages/waitress/task.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/__init__.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/fixtureapps/__init__.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/fixtureapps/badcl.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/fixtureapps/echo.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/fixtureapps/error.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/fixtureapps/filewrapper.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/fixtureapps/getline.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/fixtureapps/groundhog1.jpg create mode 100644 brightonpy/Lib/site-packages/waitress/tests/fixtureapps/nocl.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/fixtureapps/runner.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/fixtureapps/sleepy.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/fixtureapps/toolarge.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/fixtureapps/writecb.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_adjustments.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_buffers.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_channel.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_compat.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_functional.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_init.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_parser.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_receiver.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_regression.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_runner.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_server.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_task.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_trigger.py create mode 100644 brightonpy/Lib/site-packages/waitress/tests/test_utilities.py create mode 100644 brightonpy/Lib/site-packages/waitress/trigger.py create mode 100644 brightonpy/Lib/site-packages/waitress/utilities.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/__init__.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/_compat.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/_internal.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/_reloader.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/contrib/__init__.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/contrib/atom.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/contrib/cache.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/contrib/fixers.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/contrib/iterio.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/contrib/lint.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/contrib/profiler.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/contrib/securecookie.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/contrib/sessions.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/contrib/wrappers.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/datastructures.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/__init__.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/console.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/repr.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/shared/FONT_LICENSE create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/shared/console.png create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/shared/jquery.js create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/shared/less.png create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/shared/more.png create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/shared/source.png create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/shared/style.css create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/shared/ubuntu.ttf create mode 100644 brightonpy/Lib/site-packages/werkzeug/debug/tbtools.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/exceptions.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/filesystem.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/formparser.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/http.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/local.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/middleware/__init__.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/middleware/dispatcher.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/middleware/http_proxy.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/middleware/lint.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/middleware/profiler.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/middleware/proxy_fix.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/middleware/shared_data.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/posixemulation.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/routing.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/security.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/serving.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/test.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/testapp.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/urls.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/useragents.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/utils.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/wrappers/__init__.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/wrappers/accept.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/wrappers/auth.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/wrappers/base_request.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/wrappers/base_response.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/wrappers/common_descriptors.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/wrappers/etag.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/wrappers/json.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/wrappers/request.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/wrappers/response.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/wrappers/user_agent.py create mode 100644 brightonpy/Lib/site-packages/werkzeug/wsgi.py create mode 100644 brightonpy/Lib/site-packages/yaml/__init__.py create mode 100644 brightonpy/Lib/site-packages/yaml/composer.py create mode 100644 brightonpy/Lib/site-packages/yaml/constructor.py create mode 100644 brightonpy/Lib/site-packages/yaml/cyaml.py create mode 100644 brightonpy/Lib/site-packages/yaml/dumper.py create mode 100644 brightonpy/Lib/site-packages/yaml/emitter.py create mode 100644 brightonpy/Lib/site-packages/yaml/error.py create mode 100644 brightonpy/Lib/site-packages/yaml/events.py create mode 100644 brightonpy/Lib/site-packages/yaml/loader.py create mode 100644 brightonpy/Lib/site-packages/yaml/nodes.py create mode 100644 brightonpy/Lib/site-packages/yaml/parser.py create mode 100644 brightonpy/Lib/site-packages/yaml/reader.py create mode 100644 brightonpy/Lib/site-packages/yaml/representer.py create mode 100644 brightonpy/Lib/site-packages/yaml/resolver.py create mode 100644 brightonpy/Lib/site-packages/yaml/scanner.py create mode 100644 brightonpy/Lib/site-packages/yaml/serializer.py create mode 100644 brightonpy/Lib/site-packages/yaml/tokens.py create mode 100644 brightonpy/Scripts/Activate.ps1 create mode 100644 brightonpy/Scripts/activate create mode 100644 brightonpy/Scripts/activate.bat create mode 100644 brightonpy/Scripts/deactivate.bat create mode 100644 brightonpy/Scripts/easy_install-3.7.exe create mode 100644 brightonpy/Scripts/easy_install.exe create mode 100644 brightonpy/Scripts/flask.exe create mode 100644 brightonpy/Scripts/markdown_py create mode 100644 brightonpy/Scripts/markdown_py.bat create mode 100644 brightonpy/Scripts/pip.exe create mode 100644 brightonpy/Scripts/pip3.7.exe create mode 100644 brightonpy/Scripts/pip3.exe create mode 100644 brightonpy/Scripts/python.exe create mode 100644 brightonpy/Scripts/pythonw.exe create mode 100644 brightonpy/Scripts/waitress-serve.exe create mode 100644 brightonpy/pyvenv.cfg diff --git a/.vs/PythonSettings.json b/.vs/PythonSettings.json index 656fe2b..bb73427 100644 --- a/.vs/PythonSettings.json +++ b/.vs/PythonSettings.json @@ -1,3 +1,3 @@ { - "Interpreter": "Global|VisualStudio|env for brightonpy" + "Interpreter": "Workspace|Workspace|brightonpy" } \ No newline at end of file diff --git a/.vs/brightonpy.org/v16/.suo b/.vs/brightonpy.org/v16/.suo index 843a6e022370e0fa6e413bc4710ee80ddc4dc40d..c1f5e760f49a3002784e5d56eb910b82f6732d01 100644 GIT binary patch delta 3130 zcmeHJeN0nV6o0oADDbKvpGqg72-Vd}k*^tW<*Onfv{0Ek5gzbhl}bDM9s;6Nkm)u} zv?p1XY>ROwCQCMrW6QEEb2zuZG;T}wVceE!_VLd?qKPEpoa~&}S5}glXqILF?6$vm z&OP_sbI-Zw-t(USu*UxuJ6amaa~!8RTOOxjk&vaySP*}1|HykszhnlKPc4IC%|^Ho zVPVg~w5C~?jlx-M;K<5mJ3)>ZWtA`;k?TytfqOWhQx!-l3i)KUpMX@4h(WAUW${QC zsyyj0QF*dM4ZN}01|te{5ow4;s=}j4a}Z}8b{5dotBzl*d1%L@Gq#iC!R2OWLknwB zmKY|dpeO*+TcA=3EDk{dP(Y!%smO=y%?n^L4y34q;Q_4NkHRs;IN|_e0zuXeB0Yq7 zR_)(A>o~)XwHpKR67z%1H|wHtgw|5BF$&XsBTuet!o~YQ);IE$WJ*U!yKpadNSE4w z;XtI~0L*06@sw4{aL6~1G8^g0m9?VKgP`W%oXC4PH|Il6=3JbYvvUI1$@Sv1hZ8w7 zSB0E}sKee6oXtzskx6Q_K^6y^nN^IeLJ7P1U3DJyjB4}O<(kBpYYM*3JBL9rq-=WfWqypk8L?_0eOct?2 z6M9tYLfWhHZlt>qeF(~k7x6TrAK^nt2pKVe*o_!OP}IW+vN?ibCI%Ks%m(tJSylmZ zVuPOH!0d9=AW9jEDaTGe;{VM`3@nqtpQDArf_k1xU8r)hvr_UFENps$r&jE9+oJ@Ye8MKwI*kxIs4CK*l8)TLo2z@Li&t-4584Wv}1Bt&jS zg(#TWe^B4Sg0(jS%UA;(YfX;xiIU{%>+zYrLvXs)!ki?9StlPDPmPG?7%UkVGCiXS zW0zj8KcIWPd?sOPL+h$nVx~F;?Pou|us5Z+rRWB{G`<2V8m$ks|C!Ehg8h^RyYITRbsWE5d(y8_NukD(&o4jn&-)?1a=70gd8P|bk zqd{wy1|>|eF|NR5$q!m>38s2eBFeKKdWMC~_o~=r37WmXSN}XNLzmbs$Zn}k+U2dT zww0JA(ItE~O_SD=LwX1Z*~wkYA-lYGp|e-$5lxvbV!zMj=_|7one*sp%B;jp$o*p3XrCxc{es(+ zX_q_PuFg6Ujr59rWgU5Iy9>LEyDgTk!aQNE5J`TN-Di0xrtAp#l0)^ delta 3862 zcmeHJZA?>F81A{W(CV#xm0Gn*K|Ta}@%D?h6tRVhS}JY%5OmH7T9HHnp`C(d)VMhJ z6=~l@e=N&>n7Hp`8*VYnGD+NYOU#sH?lUoNKel8)_K`^@F4Mi|(u) z0iw-PxXSq9lf`<{3gMJtQUeny#Z?Nl%0S2wnTR=v8;Ld-$JcQ@5BqdPPSTnl$FV?L zMtOqc6FrQnRb(YxR2M6pNVyQ#V}U>8jF(6S|3=cnf`1Efp<`)WDtK>Dp=>uSv{3*w-Vxh;;}bg4!gb3AtuO z3t~OuF+}qEBT4hkNn>h*O?_i)f($15PTI!;TjQ*oO~Y{>f?5iyHA0wel2dJ_sQ^r{ zJ~kymP1Ak|D}AgCX;DSGfvf=uDNN=pebB@R5qkCprG(%K?jXQzQr#3ln$U&{zzPB& zL0eoCBC8;*xj|eIUeExwS_?74WJx_sWuy@%%9*+rCv^k{OFb-2A2DUn%4wFkgaGEgy&q%>pDTPSEY9-0XB^uh|%iv0ZPf2L7 z<|ebDLS$*^(=-unWgBpk3X{1WC84Q9(?eW~d!(>eR}Zy$7PzX5fU`)gexj^mAXM?5Z!@L zjvoc$W!sP(fXOn!50VC9y^p13gBsFC^}?z*p~oB1Szs?$52rON;#qEXDO%BLCR#x# z3tvQQSV0midlV-<5O7T0qp&C4HsI(%;bp?*CXswx8-goZEsSVQN^?=#NE9gEO4^XQ?flSI6bcF zgTE^k`%yd^%NS_hD07g&v)+0*XHu0!_L+IN$xvana+t2~w30q%qcetxBxGUHl>MsxN4MigRY&9mE5&yUfBX8sk2DgE;*{nRrW2>`S zEmphRI0Vmlz4HEGDAd*6*$E1;!1h%z*Pl&XDNV-Ew9JhqN8JNP680%M!AN~4Ba@zJ*C+2zf~+_ z=7aflm76;Hx;l4+db)cD%6s}cH_gIi#Y~&o%49O|c0ncutxvSnQmKaF<)#hrt0iaV z!GUY|?U=Kg8C~LQC;XFWF18UI(61BycGLe>Xrr+)6yf!Jq^^Buf3O}h`5d{wuV?G_ zuAMXN_WiZWYXHs)7+Q9*+3o?F&Y>PEQ9a;nsJ;km z#I*d{{NSZiE7PCIVbkB-^V;Pz2QPHDWc>v%6c>UMKR~f&ZN_I6->mBJH~NYq=Z;q! zU)=>RUZXLXEqe1*PSc#7Zt>#z!du3(iy*rGW8K$Jeen60gYy*qFP%858`|^7nin^> Ztl#K6^zQDT9iP5&N(JAxE`n%l^l$StEj0iD diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite index 6d0a5c31f2cfbab0bbcb1b4c794448f9be9b7928..2aa0dbcab900dcaa563535709f74a57eb956a50d 100644 GIT binary patch literal 1560576 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
  • xzHF*UMzggn|dB6_e9G<*}?*KnF%qrPhx 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�L@X%GPtJY42mGqY(8%z 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

    JiE$w}9fD0tLJWEq$2VdW$(VQ*G(+pQP5iwv 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½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

    yd10EbnyY+m0iSF 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
    dC4Fen^k^Ee0CljSdApB8^Ow45!vLt6tU$) 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 delta 3330 zcmZ8jeQXHdgGbT!&)=P#+ieKMdiqBPE{3se{Oa`VFiY5WsWF@QBd=Ivll5xR*T2A z#RJNGK`j^sO&y01Nzixiz($ts_8r!>mBO5&PpC%0SZ(&$306ynQmi;9aekr?6L40B z@5l{x0rX7PpD5Q|@SI(bZF{TEJTckf^^Q#}95tVrjC#FM^N&9=U!H7PqhBo(Jc%+s zekqq%5(`FgQLO*%V-#sSz?0pG6cxpaU8+S}_w!_D6|DuspWsP5Q_mOF*~R5KrBsc% zuM%@XD=OyXCj*aGYS>$;;driePYvO5E0B**%jtVE?5O~YT3$;msrezh>ev`hk~pIL z!F6xbUfUZUtBj1kme+Gj3#*CQQfbg0XEOH(D>{XTD-nvhf?7if z4)G*n&9#UMmIQm`mO-90p&O$)zVLuu^lZ*rdaq56WOx$8DpGQCC@!bta)xuDbi|D% zEl;g>?1DSW7@qI3mJb*lh6iK)ttZm4F z%)<}Z`Fq_YEV7y;(&Iq=R(|*R7as^!)QxnzNLK#pBqLpJC{q)9w;RIfDW|l^E;p2_ zfp$6&`n!_x)L?bk4mXCyR&_KV`;vy1M583J491aRy!-=%Ip=6ELpFU)3U2Q0247+ngT3qAhp?JzwS-2K*DH92~A=INf z=}6EGb)g`x#%Ok9xUkh^rZiBb6+cr=lE9uM55MZ76W_P%TuaN8qLGH@%;+TMttC)29OCh$Kmc!m*?GKEY=4uNCt=KLoz_k% zA3FF2VP}6kmd;pactWRD1#U;@z}ESikg{SK0DPX9KJOyPeUO@un*(3FD;UYsTA7 zSH7@Z(3PU18YRnFA7G=5BUYWrwllUuypIhtR2Hx0wl6JCVq;8I0M^RlnzV;!n|wG^ zKk2|JO2-J?fq%i@;XSww@8bRbJ9r!3gzIqC>^yc7E8YmKA5))Z%158``gd_GVOYy} zSeE!IB8?FE4g4D=Y6K$vO?pRq!)#ePm=!yPoA4)57k$FdMMZd3{Ic+o_=xabL4|9= zS>Xw|3>Solgb{cVz9t@oFG2x62UB7a`Z4KwfBD>BLXq;#HrTqZe(Cq@7EKLET$C_Q zSBhox-OzyobyoEWaP6cjke>^aO@%1nNCaGrxHW3vwv!r>>bNFisboDZ7}y}NvEKOp zWiU5RkMay$BXAA>{|R^pxQDxa<}XjDM2qQxTLk_Jw-Eakly9A`i#GBvoj?CgODGRM zdf+4Y5V6~^$ICK|pS7&VV~q@ocL@9eehklIvt%JGeJtIOE=k{zR;5RzAt@O6IB+BI z)4-X)Y@kQHg9=?2x%jxBJYQsbxPd)>Qtm4(}Qgd1Kk*9U;g&b!dtnAys;GJ9BD~faWp36iOJM6)!T=jJsNW#*OkDpMUC0z*%dE8 zaW%YyPkVRtqVKZCbUxV8gB7;p;|VLwE5?k~()M4UC+M}*3rZJ>^k4WEd>y}6~O zgxyCoc-9z-zGn;DO*>^q)r^^WZCRZg3$lF`uA=LjzK~Pr78QN8o()nRN33l|L+RSG zp=2$;Rr#>(UrSJ6NWkatX5$UoSOpqzZ`({QmbQlF^x1{Niqc;TrL28lQ0J7B$yz|B zGhQ~9b!DcgOjq8peU0pHEUaXpYx7mx!0x0%+m5((L|BS%I(n_T>=nSpLHXfHVv1Ly z!Z~;Wo`bK$)9@sUd>Gbf3y)Jvo7yu*zelMZp*BnHFttO}4pKWnZHC%3wf)qls7+EU WQ`<*vg4#H>z0~#u)|vP3YX1j-pl#X! diff --git a/brighton.py b/brighton.py index b199993..fb66a92 100644 --- a/brighton.py +++ b/brighton.py @@ -5,8 +5,9 @@ import markdown from urllib.parse import urljoin from datetime import timedelta -from werkzeug import secure_filename -from werkzeug.contrib.atom import AtomFeed +#from werkzeug import secure_filename +from werkzeug.utils import secure_filename +#from werkzeug.contrib.atom import AtomFeed from flask import Flask, render_template, Markup, abort, redirect, url_for, request app = Flask(__name__) @@ -142,4 +143,4 @@ def format_datetime(datetime_object, format): if __name__ == '__main__': port = int(os.getenv('PORT', 5000)) - app.run(debug=False, host='0.0.0.0', port=port) + app.run(debug=True, host='0.0.0.0', port=port) diff --git a/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/DESCRIPTION.rst b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..239dbda --- /dev/null +++ b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/DESCRIPTION.rst @@ -0,0 +1,46 @@ +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/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/INSTALLER b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/LICENSE.txt b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/LICENSE.txt new file mode 100644 index 0000000..a7da10e --- /dev/null +++ b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/LICENSE.txt @@ -0,0 +1,33 @@ +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/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/METADATA b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/METADATA new file mode 100644 index 0000000..8c43205 --- /dev/null +++ b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/METADATA @@ -0,0 +1,75 @@ +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/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/RECORD b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/RECORD new file mode 100644 index 0000000..0d66c28 --- /dev/null +++ b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/RECORD @@ -0,0 +1,52 @@ +../../Scripts/flask.exe,sha256=W11CqLEk_rWRUFYlCCzz_JUQ_zB2tsOM3BiO0HxsMqk,106345 +Flask-0.12.2.dist-info/DESCRIPTION.rst,sha256=DmJm8IBlBjl3wkm0Ly23jYvWbvK_mCuE5oUseYCijbI,810 +Flask-0.12.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +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/__pycache__/__init__.cpython-37.pyc,, +flask/__pycache__/__main__.cpython-37.pyc,, +flask/__pycache__/_compat.cpython-37.pyc,, +flask/__pycache__/app.cpython-37.pyc,, +flask/__pycache__/blueprints.cpython-37.pyc,, +flask/__pycache__/cli.cpython-37.pyc,, +flask/__pycache__/config.cpython-37.pyc,, +flask/__pycache__/ctx.cpython-37.pyc,, +flask/__pycache__/debughelpers.cpython-37.pyc,, +flask/__pycache__/exthook.cpython-37.pyc,, +flask/__pycache__/globals.cpython-37.pyc,, +flask/__pycache__/helpers.cpython-37.pyc,, +flask/__pycache__/json.cpython-37.pyc,, +flask/__pycache__/logging.cpython-37.pyc,, +flask/__pycache__/sessions.cpython-37.pyc,, +flask/__pycache__/signals.cpython-37.pyc,, +flask/__pycache__/templating.cpython-37.pyc,, +flask/__pycache__/testing.cpython-37.pyc,, +flask/__pycache__/views.cpython-37.pyc,, +flask/__pycache__/wrappers.cpython-37.pyc,, +flask/_compat.py,sha256=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/ext/__init__.py,sha256=UEezCApsG4ZJWqwUnX9YmWcNN4OVENgph_9L05n0eOM,842 +flask/ext/__pycache__/__init__.cpython-37.pyc,, +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 diff --git a/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/WHEEL b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +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/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/entry_points.txt b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/entry_points.txt new file mode 100644 index 0000000..14adf18 --- /dev/null +++ b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/entry_points.txt @@ -0,0 +1,4 @@ + + [console_scripts] + flask=flask.cli:main + \ No newline at end of file diff --git a/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/metadata.json b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/metadata.json new file mode 100644 index 0000000..4d814b8 --- /dev/null +++ b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/metadata.json @@ -0,0 +1 @@ +{"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/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/top_level.txt b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/top_level.txt new file mode 100644 index 0000000..7e10602 --- /dev/null +++ b/brightonpy/Lib/site-packages/Flask-0.12.2.dist-info/top_level.txt @@ -0,0 +1 @@ +flask diff --git a/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/INSTALLER b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/LICENSE.rst b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/LICENSE.rst new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/METADATA b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/METADATA new file mode 100644 index 0000000..55c0f82 --- /dev/null +++ b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/METADATA @@ -0,0 +1,106 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 2.11.2 +Summary: A very fast and expressive template engine. +Home-page: https://palletsprojects.com/p/jinja/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/jinja +Project-URL: Issue tracker, https://github.com/pallets/jinja/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* +Description-Content-Type: text/x-rst +Requires-Dist: MarkupSafe (>=0.23) +Provides-Extra: i18n +Requires-Dist: Babel (>=0.8) ; extra == 'i18n' + +Jinja +===== + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Jinja2 + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +In A Nutshell +------------- + +.. code-block:: jinja + + {% extends "base.html" %} + {% block title %}Members{% endblock %} + {% block content %} +

    + {% endblock %} + + +Links +----- + +- Website: https://palletsprojects.com/p/jinja/ +- Documentation: https://jinja.palletsprojects.com/ +- Releases: https://pypi.org/project/Jinja2/ +- Code: https://github.com/pallets/jinja +- Issue tracker: https://github.com/pallets/jinja/issues +- Test status: https://dev.azure.com/pallets/jinja/_build +- Official chat: https://discord.gg/t6rrQZH + + diff --git a/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/RECORD b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/RECORD new file mode 100644 index 0000000..0e209f3 --- /dev/null +++ b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/RECORD @@ -0,0 +1,61 @@ +Jinja2-2.11.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-2.11.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Jinja2-2.11.2.dist-info/METADATA,sha256=5ZHRZoIRAMHsJPnqhlJ622_dRPsYePYJ-9EH4-Ry7yI,3535 +Jinja2-2.11.2.dist-info/RECORD,, +Jinja2-2.11.2.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +Jinja2-2.11.2.dist-info/entry_points.txt,sha256=Qy_DkVo6Xj_zzOtmErrATe8lHZhOqdjpt3e4JJAGyi8,61 +Jinja2-2.11.2.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=0QCM_jKKDM10yzSdHRVV4mQbCbDqf0GN0GirAqibn9Y,1549 +jinja2/__pycache__/__init__.cpython-37.pyc,, +jinja2/__pycache__/_compat.cpython-37.pyc,, +jinja2/__pycache__/_identifier.cpython-37.pyc,, +jinja2/__pycache__/asyncfilters.cpython-37.pyc,, +jinja2/__pycache__/asyncsupport.cpython-37.pyc,, +jinja2/__pycache__/bccache.cpython-37.pyc,, +jinja2/__pycache__/compiler.cpython-37.pyc,, +jinja2/__pycache__/constants.cpython-37.pyc,, +jinja2/__pycache__/debug.cpython-37.pyc,, +jinja2/__pycache__/defaults.cpython-37.pyc,, +jinja2/__pycache__/environment.cpython-37.pyc,, +jinja2/__pycache__/exceptions.cpython-37.pyc,, +jinja2/__pycache__/ext.cpython-37.pyc,, +jinja2/__pycache__/filters.cpython-37.pyc,, +jinja2/__pycache__/idtracking.cpython-37.pyc,, +jinja2/__pycache__/lexer.cpython-37.pyc,, +jinja2/__pycache__/loaders.cpython-37.pyc,, +jinja2/__pycache__/meta.cpython-37.pyc,, +jinja2/__pycache__/nativetypes.cpython-37.pyc,, +jinja2/__pycache__/nodes.cpython-37.pyc,, +jinja2/__pycache__/optimizer.cpython-37.pyc,, +jinja2/__pycache__/parser.cpython-37.pyc,, +jinja2/__pycache__/runtime.cpython-37.pyc,, +jinja2/__pycache__/sandbox.cpython-37.pyc,, +jinja2/__pycache__/tests.cpython-37.pyc,, +jinja2/__pycache__/utils.cpython-37.pyc,, +jinja2/__pycache__/visitor.cpython-37.pyc,, +jinja2/_compat.py,sha256=B6Se8HjnXVpzz9-vfHejn-DV2NjaVK-Iewupc5kKlu8,3191 +jinja2/_identifier.py,sha256=EdgGJKi7O1yvr4yFlvqPNEqV6M1qHyQr8Gt8GmVTKVM,1775 +jinja2/asyncfilters.py,sha256=XJtYXTxFvcJ5xwk6SaDL4S0oNnT0wPYvXBCSzc482fI,4250 +jinja2/asyncsupport.py,sha256=ZBFsDLuq3Gtji3Ia87lcyuDbqaHZJRdtShZcqwpFnSQ,7209 +jinja2/bccache.py,sha256=3Pmp4jo65M9FQuIxdxoDBbEDFwe4acDMQf77nEJfrHA,12139 +jinja2/compiler.py,sha256=Ta9W1Lit542wItAHXlDcg0sEOsFDMirCdlFPHAurg4o,66284 +jinja2/constants.py,sha256=RR1sTzNzUmKco6aZicw4JpQpJGCuPuqm1h1YmCNUEFY,1458 +jinja2/debug.py,sha256=neR7GIGGjZH3_ILJGVUYy3eLQCCaWJMXOb7o0kGInWc,8529 +jinja2/defaults.py,sha256=85B6YUUCyWPSdrSeVhcqFVuu_bHUAQXeey--FIwSeVQ,1126 +jinja2/environment.py,sha256=XDSLKc4SqNLMOwTSq3TbWEyA5WyXfuLuVD0wAVjEFwM,50629 +jinja2/exceptions.py,sha256=VjNLawcmf2ODffqVMCQK1cRmvFaUfQWF4u8ouP3QPcE,5425 +jinja2/ext.py,sha256=AtwL5O5enT_L3HR9-oBvhGyUTdGoyaqG_ICtnR_EVd4,26441 +jinja2/filters.py,sha256=_RpPgAlgIj7ExvyDzcHAC3B36cocfWK-1TEketbNeM0,41415 +jinja2/idtracking.py,sha256=J3O4VHsrbf3wzwiBc7Cro26kHb6_5kbULeIOzocchIU,9211 +jinja2/lexer.py,sha256=nUFLRKhhKmmEWkLI65nQePgcQs7qsRdjVYZETMt_v0g,30331 +jinja2/loaders.py,sha256=C-fST_dmFjgWkp0ZuCkrgICAoOsoSIF28wfAFink0oU,17666 +jinja2/meta.py,sha256=QjyYhfNRD3QCXjBJpiPl9KgkEkGXJbAkCUq4-Ur10EQ,4131 +jinja2/nativetypes.py,sha256=Ul__gtVw4xH-0qvUvnCNHedQeNDwmEuyLJztzzSPeRg,2753 +jinja2/nodes.py,sha256=Mk1oJPVgIjnQw9WOqILvcu3rLepcFZ0ahxQm2mbwDwc,31095 +jinja2/optimizer.py,sha256=gQLlMYzvQhluhzmAIFA1tXS0cwgWYOjprN-gTRcHVsc,1457 +jinja2/parser.py,sha256=fcfdqePNTNyvosIvczbytVA332qpsURvYnCGcjDHSkA,35660 +jinja2/runtime.py,sha256=0y-BRyIEZ9ltByL2Id6GpHe1oDRQAwNeQvI0SKobNMw,30618 +jinja2/sandbox.py,sha256=knayyUvXsZ-F0mk15mO2-ehK9gsw04UhB8td-iUOtLc,17127 +jinja2/tests.py,sha256=iO_Y-9Vo60zrVe1lMpSl5sKHqAxe2leZHC08OoZ8K24,4799 +jinja2/utils.py,sha256=OoVMlQe9S2-lWT6jJbTu9tDuDvGNyWUhHDcE51i5_Do,22522 +jinja2/visitor.py,sha256=DUHupl0a4PGp7nxRtZFttUzAi1ccxzqc2hzetPYUz8U,3240 diff --git a/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/WHEEL b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/entry_points.txt b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/entry_points.txt new file mode 100644 index 0000000..3619483 --- /dev/null +++ b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[babel.extractors] +jinja2 = jinja2.ext:babel_extract [i18n] + diff --git a/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/top_level.txt b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/top_level.txt new file mode 100644 index 0000000..7f7afbf --- /dev/null +++ b/brightonpy/Lib/site-packages/Jinja2-2.11.2.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/INSTALLER b/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/LICENSE.md b/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/LICENSE.md new file mode 100644 index 0000000..4cd8b14 --- /dev/null +++ b/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/LICENSE.md @@ -0,0 +1,30 @@ +Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE PYTHON MARKDOWN PROJECT ''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 ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT +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/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/METADATA b/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/METADATA new file mode 100644 index 0000000..24ad70d --- /dev/null +++ b/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/METADATA @@ -0,0 +1,51 @@ +Metadata-Version: 2.1 +Name: Markdown +Version: 2.6.8 +Summary: Python implementation of Markdown. +Home-page: https://pythonhosted.org/Markdown/ +Author: Manfred Stienstra, Yuri takhteyev and Waylan limberg +Author-email: waylan.limberg [at] icloud.com +Maintainer: Waylan Limberg +Maintainer-email: waylan.limberg [at] icloud.com +License: BSD License +Download-URL: http://pypi.python.org/packages/source/M/Markdown/Markdown-2.6.8.tar.gz +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Topic :: Communications :: Email :: Filters +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries +Classifier: Topic :: Internet :: WWW/HTTP :: Site Management +Classifier: Topic :: Software Development :: Documentation +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Filters +Classifier: Topic :: Text Processing :: Markup :: HTML + + +This is a Python implementation of John Gruber's Markdown_. +It is almost completely compliant with the reference implementation, +though there are a few known issues. See Features_ for information +on what exactly is supported and what is not. Additional features are +supported by the `Available Extensions`_. + +.. _Markdown: http://daringfireball.net/projects/markdown/ +.. _Features: https://pythonhosted.org/Markdown/index.html#Features +.. _`Available Extensions`: https://pythonhosted.org/Markdown/extensions/index.html + +Support +======= + +You may ask for help and discuss various other issues on the +`mailing list`_ and report bugs on the `bug tracker`_. + +.. _`mailing list`: http://lists.sourceforge.net/lists/listinfo/python-markdown-discuss +.. _`bug tracker`: http://github.com/waylan/Python-Markdown/issues + + diff --git a/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/RECORD b/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/RECORD new file mode 100644 index 0000000..50ead33 --- /dev/null +++ b/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/RECORD @@ -0,0 +1,68 @@ +../../Scripts/markdown_py,sha256=JjImDngCKbxAAoY1h6PtYKpV8K4CROd4Q9HlTZenMeE,1004 +../../Scripts/markdown_py.bat,sha256=NJb3uAaWBV8CmsTgskLt0NeXLgTm_vIIDM2mnRpVGJ8,108 +Markdown-2.6.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Markdown-2.6.8.dist-info/LICENSE.md,sha256=lWw7Z4IoohYULfONA5u6Vu5lCdMpjnpLjdW8PqqA_jM,1663 +Markdown-2.6.8.dist-info/METADATA,sha256=F2GVuGVwkblRZlPrRqwU_q233cI71oiBzWbXd0gCPB4,2192 +Markdown-2.6.8.dist-info/RECORD,, +Markdown-2.6.8.dist-info/WHEEL,sha256=D1Wh14kWDxPnrM-5t_6UCB-UuQNrEODtRa3vF4OsvQY,97 +Markdown-2.6.8.dist-info/top_level.txt,sha256=IAxs8x618RXoH1uCqeLLxXsDefJvE_mIibr_M4sOlyk,9 +markdown/__init__.py,sha256=X3xNnQFzCg1qyv2KTbZ4gP_jEFa746L3C0uxt4HCr88,20802 +markdown/__main__.py,sha256=l2C_ES-2c8I2NRO4uslH_RoftcuusGmFz454umxxgb0,5137 +markdown/__pycache__/__init__.cpython-37.pyc,sha256=tigV7Z6TDxXL0QvZK733rxT6icBkmFKKhn--qWICXDo,14651 +markdown/__pycache__/__main__.cpython-37.pyc,, +markdown/__pycache__/__version__.cpython-37.pyc,sha256=sFmKc4_AvlA6pg1hHt9w7tPxCjElSzN52UH-mPobRFk,694 +markdown/__pycache__/blockparser.cpython-37.pyc,sha256=a49RtMugHI01VEgv2_I9bsFeuUZtjgNbAa9hwIWabz8,4074 +markdown/__pycache__/blockprocessors.cpython-37.pyc,sha256=E9VgZe2BC4dgJQNlA1Hml1KijRE9bQ5Ud48m7Z7TjA0,15991 +markdown/__pycache__/inlinepatterns.cpython-37.pyc,sha256=3YcwNJ9VeLfg-VyuJc45SxbHgp1dOizNDpWSmLsysRg,16919 +markdown/__pycache__/odict.cpython-37.pyc,sha256=HVF9gPAWr88CaOW0fQIzkr40CnbFTkLCA1LplUeVKCw,6907 +markdown/__pycache__/postprocessors.cpython-37.pyc,sha256=vyn3T_VxC5YblWxzJqqAZPJNn5Rf8iy4lrKjNQxZW6o,4304 +markdown/__pycache__/preprocessors.cpython-37.pyc,sha256=_wAquA3p08zVBnzyzGz0ESpzzgjd4aaVUFJr3YL5v6k,9033 +markdown/__pycache__/serializers.cpython-37.pyc,sha256=H41jyTuSvQStHKKY8URaV8_UdRIkSCzaJR7_IXxzMVo,5138 +markdown/__pycache__/treeprocessors.cpython-37.pyc,sha256=fWc5xYfR7L502_3YJ9oP9u2VpzXQMarrcXzVdgVQEOc,9802 +markdown/__pycache__/util.cpython-37.pyc,sha256=3eI9EnnCuQjmFOERsldIMoNgDzZCZTodFlSI0_d_5Lg,4404 +markdown/__version__.py,sha256=vzN8lZ0sRoJLSwNhz8O-b0gegPTMkhG1OERtwunE6zA,880 +markdown/blockparser.py,sha256=CM37G8uNufHkk-369PERAcJ4Bt2f9snW6F7nbHydaAA,3517 +markdown/blockprocessors.py,sha256=vTIevCnpFlFqXENMnZ5u2J3Ql4en_n55NFHPKh25KOE,23008 +markdown/extensions/__init__.py,sha256=nusbN8FPR5qF3yBx30FHWhLvDKzS-7aGJ07-4BYQuyM,3850 +markdown/extensions/__pycache__/__init__.cpython-37.pyc,sha256=NXZthRraeFNZVh5y8CiwW-MA5VZ3p9WlcaJ7oxWJwR4,3634 +markdown/extensions/__pycache__/abbr.cpython-37.pyc,sha256=uIuoKOvh6pnX6FyZxhXRL88adwVUAsjV0npDG7zbrr8,3459 +markdown/extensions/__pycache__/admonition.cpython-37.pyc,sha256=wU9MyA6ptn7WHqvx23Hvb18EqtUH53t5CQAzZ6BYou8,2928 +markdown/extensions/__pycache__/attr_list.cpython-37.pyc,sha256=tm0GGJlw_Sp-EgrE2gVtGnAoOzDPubJ-7M8avsBOL3w,4865 +markdown/extensions/__pycache__/codehilite.cpython-37.pyc,sha256=z_NUHmGPEuhdWgWT6aKMIMUWbEfUrLTITpPhd9KnIpQ,7870 +markdown/extensions/__pycache__/def_list.cpython-37.pyc,sha256=m84NFK12ynEf9Rk-ZvGmzQ1gQYNBuROj0iJseQapzNQ,3565 +markdown/extensions/__pycache__/extra.cpython-37.pyc,sha256=NVnVmGF47x8Foia-pFVo5aZC4ct3ZxGd7dWgGyK9EBQ,4736 +markdown/extensions/__pycache__/fenced_code.cpython-37.pyc,sha256=15HyG5oXN8iRRCsPUE0blbntVu7pkxTsErN_gI1T0Ek,3630 +markdown/extensions/__pycache__/footnotes.cpython-37.pyc,sha256=npz67ROXHS4AVq71aBolyKz2Xp2HsmzXYwWWZMtzq1E,11936 +markdown/extensions/__pycache__/headerid.cpython-37.pyc,, +markdown/extensions/__pycache__/meta.cpython-37.pyc,sha256=0X6V531Rpbbfvl-knXWCBiffdZFnfMQneNSoV2TjO40,2391 +markdown/extensions/__pycache__/nl2br.cpython-37.pyc,, +markdown/extensions/__pycache__/sane_lists.cpython-37.pyc,, +markdown/extensions/__pycache__/smart_strong.cpython-37.pyc,sha256=rhD-yGfGwzXpLE3hHcdTSMEeh1mou1l_GxWcPbp43go,1527 +markdown/extensions/__pycache__/smarty.cpython-37.pyc,sha256=Ejd3aSFhBIzkfb9KchBvpQ2nkT06sBI5XjM60tfpppk,8930 +markdown/extensions/__pycache__/tables.cpython-37.pyc,sha256=P5KWAgELI1oSl2q3P6fHlMaYU7pBWIX2p-Sjhr6WHLs,5034 +markdown/extensions/__pycache__/toc.cpython-37.pyc,sha256=VfenQL7LKBYwvuTpMS4z_NF6675c-iv6i18kWMlA00s,8440 +markdown/extensions/__pycache__/wikilinks.cpython-37.pyc,, +markdown/extensions/abbr.py,sha256=KgB7la3ooLMpgTAp6qrTzwz0b-48NWmdiBv7bBBgSm4,2738 +markdown/extensions/admonition.py,sha256=wCEoXtxx0qFEm50z2f0jhpAqCTOWWdTB3E9XQmsBTzk,3158 +markdown/extensions/attr_list.py,sha256=U6HvB2B_5mDnwRfzpNkJcoePZxmjIECwQoUobONyoAQ,6267 +markdown/extensions/codehilite.py,sha256=5TdoKQN1hmS3oPtN5Xbya0TzTWyxQpBmvG0nr9_gjJE,9769 +markdown/extensions/def_list.py,sha256=IUn0aXCS33mRHdFXhEo6l9U_0ihuwUQzpyWnMkWHPI8,3750 +markdown/extensions/extra.py,sha256=Ir2myWKZD18cNER95YNuTuC-8Q3yvOzWUklXlA-9xsA,5547 +markdown/extensions/fenced_code.py,sha256=n1XlDMHqEdtTUOFbkN51v_0wQN4Z6X8-B6wtj-U1C84,4104 +markdown/extensions/footnotes.py,sha256=0UnRdyJEUrcgCpPh83CNhZBGN4yt51ueYpHyRfkiCYw,14919 +markdown/extensions/headerid.py,sha256=1hGbmIS4MkUKYGO0x297Qh3pzmz6-OOwhmhTYppGLW4,3321 +markdown/extensions/meta.py,sha256=pJegFlul2iR-gssewSFHy9qRRMbZ17nSfyuedMv33SY,2400 +markdown/extensions/nl2br.py,sha256=icyTpth-w2khHOIoorZkBr_hOTDS7_VTg2en7JwFQWE,859 +markdown/extensions/sane_lists.py,sha256=vUuRMoPtqntpugGRts_esPicto9B47-zPPHOYVNixdI,1602 +markdown/extensions/smart_strong.py,sha256=qxbMJ6b2enTMB4Zc2NC5BmkNvXdAu5ti31s8wi0u7zk,1197 +markdown/extensions/smarty.py,sha256=O3FDJt43MEAJ9iWmjCTZ74fP9naIeOmSO5KRm_BiN24,10360 +markdown/extensions/tables.py,sha256=fy5qtdRt8h5VJXGlWCcdN6k7ktXk1bHol4bVhVORDtQ,6778 +markdown/extensions/toc.py,sha256=MuYFuoLKl-b9DHppelyGEPrax00KnBMnnuQmBOSLBtc,11044 +markdown/extensions/wikilinks.py,sha256=gwn1jJu-9zBfVJS9H3GBqX6YTyGNUjiR3cyrsnuRb5U,2872 +markdown/inlinepatterns.py,sha256=pjyMXyZizMaI83pugrgpfOjUgOcBtZD_sRF1Op8A-8w,17126 +markdown/odict.py,sha256=UQ-4Ba0BrBe6Ro3Rpcf93y8ewPzLmEUvxYiWxowV7Yk,6044 +markdown/postprocessors.py,sha256=rdIe47BNiC8awkuCLe7VM-WiiPnwBqj5VsnimGkTH0U,3614 +markdown/preprocessors.py,sha256=SbkLOFs6zJw5FsygZsS6FxagX_FFDRcwa7lDA7x8lb0,14647 +markdown/serializers.py,sha256=NZN9fU_xE18BsWjTNO2S90GMT_DddyL4p9lk-v3D5Pc,9820 +markdown/treeprocessors.py,sha256=G_D7uweKZYJgDLSVtfRWgcixWGXCdOA5jYUG1ka1P08,13032 +markdown/util.py,sha256=nykI1V7qBMKlYGiYnyRcqu3cbRNuDoXcE9rdTCd53is,5646 diff --git a/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/WHEEL b/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/WHEEL new file mode 100644 index 0000000..83ff02e --- /dev/null +++ b/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.35.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/top_level.txt b/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/top_level.txt new file mode 100644 index 0000000..0918c97 --- /dev/null +++ b/brightonpy/Lib/site-packages/Markdown-2.6.8.dist-info/top_level.txt @@ -0,0 +1 @@ +markdown diff --git a/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER b/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.rst b/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/METADATA b/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/METADATA new file mode 100644 index 0000000..b208d93 --- /dev/null +++ b/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/METADATA @@ -0,0 +1,103 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 1.1.1 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://palletsprojects.com/p/markupsafe/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: The Pallets Team +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/markupsafe +Project-URL: Issue tracker, https://github.com/pallets/markupsafe/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + >>> # escape replaces special characters and wraps in Markup + >>> escape('') + Markup(u'<script>alert(document.cookie);</script>') + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup('Hello') + Markup('hello') + >>> escape(Markup('Hello')) + Markup('hello') + >>> # Markup is a text subclass (str on Python 3, unicode on Python 2) + >>> # methods and operators escape their arguments + >>> template = Markup("Hello %s") + >>> template % '"World"' + Markup('Hello "World"') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +libraries that use it. In order to grow the community of contributors +and users, and allow the maintainers to devote more time to the +projects, `please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +* Website: https://palletsprojects.com/p/markupsafe/ +* Documentation: https://markupsafe.palletsprojects.com/ +* License: `BSD-3-Clause `_ +* Releases: https://pypi.org/project/MarkupSafe/ +* Code: https://github.com/pallets/markupsafe +* Issue tracker: https://github.com/pallets/markupsafe/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/markupsafe + * Windows: https://ci.appveyor.com/project/pallets/markupsafe + +* Test coverage: https://codecov.io/gh/pallets/markupsafe + + diff --git a/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/RECORD b/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/RECORD new file mode 100644 index 0000000..02615b4 --- /dev/null +++ b/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/RECORD @@ -0,0 +1,15 @@ +MarkupSafe-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-1.1.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +MarkupSafe-1.1.1.dist-info/METADATA,sha256=nJHwJ4_4ka-V39QH883jPrslj6inNdyyNASBXbYgHXQ,3570 +MarkupSafe-1.1.1.dist-info/RECORD,, +MarkupSafe-1.1.1.dist-info/WHEEL,sha256=QOmb-VuQJwuZ7Av_Q2839PCv6qsn6RGHIrt6Y0esFDg,106 +MarkupSafe-1.1.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=oTblO5f9KFM-pvnq9bB0HgElnqkJyqHnFN1Nx2NIvnY,10126 +markupsafe/__pycache__/__init__.cpython-37.pyc,, +markupsafe/__pycache__/_compat.cpython-37.pyc,, +markupsafe/__pycache__/_constants.cpython-37.pyc,, +markupsafe/__pycache__/_native.cpython-37.pyc,, +markupsafe/_compat.py,sha256=uEW1ybxEjfxIiuTbRRaJpHsPFf4yQUMMKaPgYEC5XbU,558 +markupsafe/_constants.py,sha256=zo2ajfScG-l1Sb_52EP3MlDCqO7Y1BVHUXXKRsVDRNk,4690 +markupsafe/_native.py,sha256=d-8S_zzYt2y512xYcuSxq0NeG2DUUvG80wVdTn-4KI8,1873 +markupsafe/_speedups.cp37-win_amd64.pyd,sha256=T4nav-uguElIirIlGPsvMQq9_zRXuQlYbEH_Ww05Jgs,15360 diff --git a/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL b/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL new file mode 100644 index 0000000..2f3c861 --- /dev/null +++ b/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: false +Tag: cp37-cp37m-win_amd64 + diff --git a/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt b/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/brightonpy/Lib/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/INSTALLER b/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/LICENSE b/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/LICENSE new file mode 100644 index 0000000..050ced2 --- /dev/null +++ b/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/METADATA b/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/METADATA new file mode 100644 index 0000000..e416828 --- /dev/null +++ b/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/METADATA @@ -0,0 +1,35 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 3.12 +Summary: YAML parser and emitter for Python +Home-page: http://pyyaml.org/wiki/PyYAML +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: http://pyyaml.org/download/pyyaml/PyYAML-3.12.tar.gz +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup + +YAML is a data serialization format designed for human readability +and interaction with scripting languages. PyYAML is a YAML parser +and emitter for Python. + +PyYAML features a complete YAML 1.1 parser, Unicode support, pickle +support, capable extension API, and sensible error messages. PyYAML +supports standard YAML tags and provides Python-specific tags that +allow to represent an arbitrary Python object. + +PyYAML is applicable for a broad range of tasks from complex +configuration files to object serialization and persistance. + diff --git a/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/RECORD b/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/RECORD new file mode 100644 index 0000000..f6a026c --- /dev/null +++ b/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/RECORD @@ -0,0 +1,40 @@ +PyYAML-3.12.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PyYAML-3.12.dist-info/LICENSE,sha256=0NiwmACkXNmC6VaPx2adnBpMMw4nWoIbviTVQ2bRb-k,1058 +PyYAML-3.12.dist-info/METADATA,sha256=lY2ZCMZYdzVv3IMtMx85WA6q8cYXjjAc-94U8kzeKXs,1424 +PyYAML-3.12.dist-info/RECORD,, +PyYAML-3.12.dist-info/WHEEL,sha256=zdzelNAN7OMlbGAPizxWEjDYw36I1XfOus-OTyLWlAw,106 +PyYAML-3.12.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11 +yaml/__init__.py,sha256=53VZayqtIKrdWEuauzPtjPqiyQ3XydjDsD5Yo2KKbak,9607 +yaml/__pycache__/__init__.cpython-37.pyc,, +yaml/__pycache__/composer.cpython-37.pyc,, +yaml/__pycache__/constructor.cpython-37.pyc,, +yaml/__pycache__/cyaml.cpython-37.pyc,, +yaml/__pycache__/dumper.cpython-37.pyc,, +yaml/__pycache__/emitter.cpython-37.pyc,, +yaml/__pycache__/error.cpython-37.pyc,, +yaml/__pycache__/events.cpython-37.pyc,, +yaml/__pycache__/loader.cpython-37.pyc,, +yaml/__pycache__/nodes.cpython-37.pyc,, +yaml/__pycache__/parser.cpython-37.pyc,, +yaml/__pycache__/reader.cpython-37.pyc,, +yaml/__pycache__/representer.cpython-37.pyc,, +yaml/__pycache__/resolver.cpython-37.pyc,, +yaml/__pycache__/scanner.cpython-37.pyc,, +yaml/__pycache__/serializer.cpython-37.pyc,, +yaml/__pycache__/tokens.cpython-37.pyc,, +yaml/composer.py,sha256=rAskP6VXqfAZcZxGIQFyPwVkNZYtnmmylV4TBSn4EUk,4881 +yaml/constructor.py,sha256=SVt8piayRVwV7Pd9RDvIM60BftFrqkA35z7HWwubHkg,25554 +yaml/cyaml.py,sha256=zajOEEo_11ZJC0pko7O-mqT9JYxhXVdFIXYAHTW9COU,3294 +yaml/dumper.py,sha256=86Yz2GmUk6lk6xUKRRWZwDmvSMp3pPekmWDIarq93Iw,2723 +yaml/emitter.py,sha256=16CwscYPx2DejDyE8MqfMybsm1DnFsSUwDvSQuC-3Rc,42954 +yaml/error.py,sha256=Ah9z-toHJUbE9j-M8YpxgSRM5CgLCcwVzJgLLRF2Fxo,2533 +yaml/events.py,sha256=50_TksgQiE4up-lKo_V-nBy-tAIxkIPQxY5qDhKCeHw,2445 +yaml/loader.py,sha256=aQ71rMxcAW_oA1dt0x3hlRDdqYjzwXXfpvSFFewh9NA,1138 +yaml/nodes.py,sha256=gPKNj8pKCdh2d4gr3gIYINnPOaOxGhJAUiYhGRnPE84,1440 +yaml/parser.py,sha256=ilWp5vvgoHFGzvOZDItFoGjD6D42nhlZrZyjAwa0oJo,25495 +yaml/reader.py,sha256=r22-ns0QvKAqGopu3IgczoK5VLGA7oZ3XN9sBESkb04,6854 +yaml/representer.py,sha256=ZmBbegM-yVa3NBBTo-LqF-O2IcgGIT5LlDweB8SDgAE,14097 +yaml/resolver.py,sha256=DJCjpQr8YQCEYYjKEYqTl0GrsZil2H4aFOI9b0Oe-U4,8970 +yaml/scanner.py,sha256=6LVPebouAqunvxw3tFVMa34pDgPsDKg2JuaaeNeTLtk,51695 +yaml/serializer.py,sha256=ChuFgmhU01hj4xgI8GaKv6vfM2Bujwa9i7d2FAHj7cA,4165 +yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp54,2573 diff --git a/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/WHEEL b/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/WHEEL new file mode 100644 index 0000000..4c36535 --- /dev/null +++ b/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.35.1) +Root-Is-Purelib: false +Tag: cp37-cp37m-win_amd64 + diff --git a/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/top_level.txt b/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/top_level.txt new file mode 100644 index 0000000..e6475e9 --- /dev/null +++ b/brightonpy/Lib/site-packages/PyYAML-3.12.dist-info/top_level.txt @@ -0,0 +1,2 @@ +_yaml +yaml diff --git a/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/INSTALLER b/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/LICENSE.rst b/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/LICENSE.rst new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/METADATA b/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/METADATA new file mode 100644 index 0000000..b679e89 --- /dev/null +++ b/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/METADATA @@ -0,0 +1,130 @@ +Metadata-Version: 2.1 +Name: Werkzeug +Version: 0.16.1 +Summary: The comprehensive WSGI web application library. +Home-page: https://palletsprojects.com/p/werkzeug/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://werkzeug.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/werkzeug +Project-URL: Issue tracker, https://github.com/pallets/werkzeug/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Description-Content-Type: text/x-rst +Provides-Extra: dev +Requires-Dist: pytest ; extra == 'dev' +Requires-Dist: coverage ; extra == 'dev' +Requires-Dist: tox ; extra == 'dev' +Requires-Dist: sphinx ; extra == 'dev' +Requires-Dist: pallets-sphinx-themes ; extra == 'dev' +Requires-Dist: sphinx-issues ; extra == 'dev' +Provides-Extra: termcolor +Requires-Dist: termcolor ; extra == 'termcolor' +Provides-Extra: watchdog +Requires-Dist: watchdog ; extra == 'watchdog' + +Werkzeug +======== + +*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") + +Werkzeug is a comprehensive `WSGI`_ web application library. It began as +a simple collection of various utilities for WSGI applications and has +become one of the most advanced WSGI utility libraries. + +It includes: + +- An interactive debugger that allows inspecting stack traces and + source code in the browser with an interactive interpreter for any + frame in the stack. +- A full-featured request object with objects to interact with + headers, query args, form data, files, and cookies. +- A response object that can wrap other WSGI applications and handle + streaming data. +- A routing system for matching URLs to endpoints and generating URLs + for endpoints, with an extensible system for capturing variables + from URLs. +- HTTP utilities to handle entity tags, cache control, dates, user + agents, cookies, files, and more. +- A threaded WSGI server for use while developing applications + locally. +- A test client for simulating HTTP requests during testing without + requiring running a server. + +Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up +to the developer to choose a template engine, database adapter, and even +how to handle requests. It can be used to build all sorts of end user +applications such as blogs, wikis, or bulletin boards. + +`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while +providing more structure and patterns for defining powerful +applications. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Werkzeug + + +A Simple Example +---------------- + +.. code-block:: python + + from werkzeug.wrappers import Request, Response + + @Request.application + def application(request): + return Response('Hello, World!') + + if __name__ == '__main__': + from werkzeug.serving import run_simple + run_simple('localhost', 4000, application) + + +Links +----- + +- Website: https://palletsprojects.com/p/werkzeug/ +- Documentation: https://werkzeug.palletsprojects.com/ +- Releases: https://pypi.org/project/Werkzeug/ +- Code: https://github.com/pallets/werkzeug +- Issue tracker: https://github.com/pallets/werkzeug/issues +- Test status: https://dev.azure.com/pallets/werkzeug/_build +- Official chat: https://discord.gg/t6rrQZH + +.. _WSGI: https://wsgi.readthedocs.io/en/latest/ +.. _Flask: https://www.palletsprojects.com/p/flask/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/RECORD b/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/RECORD new file mode 100644 index 0000000..cb1719a --- /dev/null +++ b/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/RECORD @@ -0,0 +1,119 @@ +Werkzeug-0.16.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Werkzeug-0.16.1.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Werkzeug-0.16.1.dist-info/METADATA,sha256=evmf7dad7_ZlJCBAbTgwTOUHYN9iMRIsh-P6Ea5hpLs,4799 +Werkzeug-0.16.1.dist-info/RECORD,, +Werkzeug-0.16.1.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +Werkzeug-0.16.1.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 +werkzeug/__init__.py,sha256=EunnTD1XRQT6KZ65HwvPRMsGZNqQ_LsaWVL6pHDm7ts,7219 +werkzeug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/__pycache__/_compat.cpython-37.pyc,, +werkzeug/__pycache__/_internal.cpython-37.pyc,, +werkzeug/__pycache__/_reloader.cpython-37.pyc,, +werkzeug/__pycache__/datastructures.cpython-37.pyc,, +werkzeug/__pycache__/exceptions.cpython-37.pyc,, +werkzeug/__pycache__/filesystem.cpython-37.pyc,, +werkzeug/__pycache__/formparser.cpython-37.pyc,, +werkzeug/__pycache__/http.cpython-37.pyc,, +werkzeug/__pycache__/local.cpython-37.pyc,, +werkzeug/__pycache__/posixemulation.cpython-37.pyc,, +werkzeug/__pycache__/routing.cpython-37.pyc,, +werkzeug/__pycache__/security.cpython-37.pyc,, +werkzeug/__pycache__/serving.cpython-37.pyc,, +werkzeug/__pycache__/test.cpython-37.pyc,, +werkzeug/__pycache__/testapp.cpython-37.pyc,, +werkzeug/__pycache__/urls.cpython-37.pyc,, +werkzeug/__pycache__/useragents.cpython-37.pyc,, +werkzeug/__pycache__/utils.cpython-37.pyc,, +werkzeug/__pycache__/wsgi.cpython-37.pyc,, +werkzeug/_compat.py,sha256=oBEVVrJT4sqYdIZbUWmgV9T9w257RhTSDBlTjh0Zbb0,6431 +werkzeug/_internal.py,sha256=Wx7cpTRWqeBd0LAqobo0lCO4pNUW4oav6XKf7Taumgk,14590 +werkzeug/_reloader.py,sha256=I3mg3oRQ0lLzl06oEoVopN3bN7CtINuuUQdqDcmTnEs,11531 +werkzeug/contrib/__init__.py,sha256=EvNyiiCF49j5P0fZYJ3ZGe82ofXdSBvUNqWFwwBMibQ,553 +werkzeug/contrib/__pycache__/__init__.cpython-37.pyc,, +werkzeug/contrib/__pycache__/atom.cpython-37.pyc,, +werkzeug/contrib/__pycache__/cache.cpython-37.pyc,, +werkzeug/contrib/__pycache__/fixers.cpython-37.pyc,, +werkzeug/contrib/__pycache__/iterio.cpython-37.pyc,, +werkzeug/contrib/__pycache__/lint.cpython-37.pyc,, +werkzeug/contrib/__pycache__/profiler.cpython-37.pyc,, +werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc,, +werkzeug/contrib/__pycache__/sessions.cpython-37.pyc,, +werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc,, +werkzeug/contrib/atom.py,sha256=KpPJcTfzNW1J0VNQckCbVtVGBe3V8s451tOUya4qByI,15415 +werkzeug/contrib/cache.py,sha256=AEh5UIw-Ui7sHZnlpvrD7ueOKUhCaAD55FXiPtXbbRs,32115 +werkzeug/contrib/fixers.py,sha256=peEtAiIWYT5bh00EWEPOGKzGZXivOzVhhzKPvvzk1RM,9193 +werkzeug/contrib/iterio.py,sha256=KKHa_8aCF_uhoeQVyPGUwrivuB6y6nNdXYo2D2vzOA8,10928 +werkzeug/contrib/lint.py,sha256=NdIxP0E2kVt1xDIxoaIz3Rcl8ZdgmHaFbGTOaybGpN4,296 +werkzeug/contrib/profiler.py,sha256=k_oMLU-AtsVvQ9TxNdermY6FuzSTYr-WE-ZmWb_DMyU,1229 +werkzeug/contrib/securecookie.py,sha256=xbtElskGmtbiApgOJ5WhGgqGDs_68_PcWzqDIAY_QZY,13076 +werkzeug/contrib/sessions.py,sha256=CkJ4IWvNqIaZCP83FMKYFszKL7E6Y1m6YEii7RaTYWs,13040 +werkzeug/contrib/wrappers.py,sha256=ZmNk0wpzD66yomPnQxapndZQs4c0kNJaRzqI-BVxeQk,13199 +werkzeug/datastructures.py,sha256=yVH4r-XD8CjOo18tDGVJYiAfezng6pK9hWzzLFy5a94,91761 +werkzeug/debug/__init__.py,sha256=Bo3HvgTNY4NQ_2jROTSk3r1ScZcT_g_4EnuHTjKyrKM,18275 +werkzeug/debug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/debug/__pycache__/console.cpython-37.pyc,, +werkzeug/debug/__pycache__/repr.cpython-37.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-37.pyc,, +werkzeug/debug/console.py,sha256=HoBL21bbcmtiCLqiLDJLZi1LYnWMZxjoXYH5WaZB1XY,5469 +werkzeug/debug/repr.py,sha256=lIwuhbyrMwVe3P_cFqNyqzHL7P93TLKod7lw9clydEw,9621 +werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=rOhqZMRfpZnnu6_XCGn6wMWPhtfwRAcyZKksdIxPJas,6400 +werkzeug/debug/shared/jquery.js,sha256=CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo,88145 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818 +werkzeug/debug/shared/style.css,sha256=gZ9uhmb5zj3XLuT9RvnMp6jMINgQ-VVBCp-2AZbG3YQ,6604 +werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 +werkzeug/debug/tbtools.py,sha256=SkAAA4KKfwsXJinUbf-AEP4GqONTsR4uU7WPUloXcSE,20318 +werkzeug/exceptions.py,sha256=7wl3ufZZU23sASp0ciPe8GJssGND9DX6sDbjxvPuGYU,23437 +werkzeug/filesystem.py,sha256=HzKl-j0Hd8Jl66j778UbPTAYNnY6vUZgYLlBZ0e7uw0,2101 +werkzeug/formparser.py,sha256=Sto0jZid9im9ZVIf56vilCdyX-arK33wSftkYsLCnzo,21788 +werkzeug/http.py,sha256=L6r2ehiorjOtsXITW-01zJsvtVa8Emkpkftu9di_cSk,41628 +werkzeug/local.py,sha256=USVEcgIg-oCiUJFPIecFIW9jkIejfw4Fjf1u5yN-Np4,14456 +werkzeug/middleware/__init__.py,sha256=f1SFZo67IlW4k1uqKzNHxYQlsakUS-D6KK_j0e3jjwQ,549 +werkzeug/middleware/__pycache__/__init__.cpython-37.pyc,, +werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc,, +werkzeug/middleware/__pycache__/http_proxy.cpython-37.pyc,, +werkzeug/middleware/__pycache__/lint.cpython-37.pyc,, +werkzeug/middleware/__pycache__/profiler.cpython-37.pyc,, +werkzeug/middleware/__pycache__/proxy_fix.cpython-37.pyc,, +werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc,, +werkzeug/middleware/dispatcher.py,sha256=_-KoMzHtcISHS7ouWKAOraqlCLprdh83YOAn_8DjLp8,2240 +werkzeug/middleware/http_proxy.py,sha256=lRjTdMmghHiZuZrS7_UJ3gZc-vlFizhBbFZ-XZPLwIA,7117 +werkzeug/middleware/lint.py,sha256=ItTwuWJnflF8xMT1uqU_Ty1ryhux-CjeUfskqaUpxsw,12967 +werkzeug/middleware/profiler.py,sha256=8B_s23d6BGrU_q54gJsm6kcCbOJbTSqrXCsioHON0Xs,4471 +werkzeug/middleware/proxy_fix.py,sha256=1hi6AJH-J2uh2hMm1g0u7XfjRiTOoUeIOOmwWZ2n9t0,8670 +werkzeug/middleware/shared_data.py,sha256=WtSphPrsUdpEk4E-_09CAILhfOBJ1YtcX1LrxcQfIzw,8224 +werkzeug/posixemulation.py,sha256=gSSiv1SCmOyzOM_nq1ZaZCtxP__C5MeDJl_4yXJmi4Q,3541 +werkzeug/routing.py,sha256=BSgjrYNwj2j5dAHQtK4INEp2TOf4OJP8hBncYSRO2ps,73410 +werkzeug/security.py,sha256=81149MplFq7-hD4RK4sKp9kzXXejjV9D4lWBzaRyeQ8,8106 +werkzeug/serving.py,sha256=czF2QRcEgQUTRzIi918qtKuxn_G5YKRVs9t9F67NCF4,36710 +werkzeug/test.py,sha256=Cnb5xa3vLDL0hzFCH1fkG_YRpndViGQgCh4D744iSQk,40645 +werkzeug/testapp.py,sha256=bHekqMsqRfVxwgFbvOMem-DYa_sdB7R47yUXpt1RUTo,9329 +werkzeug/urls.py,sha256=hWZMk4ABiJmQPP_B5rRibWTp9gOyNLQpTqq6cmQAfeE,39322 +werkzeug/useragents.py,sha256=0A_Ip74edPv_hy6CouBTpGumi2uyOci01COuzYFOm3U,5622 +werkzeug/utils.py,sha256=KxCOHhsox7tAVe0m-ZyOGPoCaIbBIy7TxhocaUEHrd4,25050 +werkzeug/wrappers/__init__.py,sha256=S4VioKAmF_av9Ec9zQvG71X1EOkYfPx1TYck9jyDiyY,1384 +werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/accept.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/auth.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/etag.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/json.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/request.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/response.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc,, +werkzeug/wrappers/accept.py,sha256=TIvjUc0g73fhTWX54wg_D9NNzKvpnG1X8u1w26tK1o8,1760 +werkzeug/wrappers/auth.py,sha256=Pmn6iaGHBrUyHbJpW0lZhO_q9RVoAa5QalaTqcavdAI,1158 +werkzeug/wrappers/base_request.py,sha256=aknREwqVT7WJUxm4weUGdBj90H6rDR3DvsIvmYhaC8A,26943 +werkzeug/wrappers/base_response.py,sha256=ZA1XlxtsbvG4SpbdOEMT5--z7aZM0w6C5y33W8wOXa4,27906 +werkzeug/wrappers/common_descriptors.py,sha256=OJ8jOwMun4L-BxCuFPkK1vaefx_-Y5IndVXvvn_ems4,12089 +werkzeug/wrappers/etag.py,sha256=TwMO1fvluXbBqnFTj2DvrCNa3mYhbHYe1UZAVzfXvuU,12533 +werkzeug/wrappers/json.py,sha256=HvK_A4NpO0sLqgb10sTJcoZydYOwyNiPCJPV7SVgcgE,4343 +werkzeug/wrappers/request.py,sha256=qPo2zmmBv4HxboywtWZb2pJL8OPXo07BUXBKw2j9Fi8,1338 +werkzeug/wrappers/response.py,sha256=vDZFEGzDOG0jjmS0uVVjeT3hqRt1hFaf15npnx7RD28,2329 +werkzeug/wrappers/user_agent.py,sha256=YJb-vr12cujG7sQMG9V89VsJa-03SWSenhg1W4cT0EY,435 +werkzeug/wsgi.py,sha256=iXOR9l1fDd2IgqeTRQZPR6LnBBBx7Xsy97_i2n5HPUo,34666 diff --git a/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/WHEEL b/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/WHEEL new file mode 100644 index 0000000..8b701e9 --- /dev/null +++ b/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/top_level.txt b/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/top_level.txt new file mode 100644 index 0000000..6fe8da8 --- /dev/null +++ b/brightonpy/Lib/site-packages/Werkzeug-0.16.1.dist-info/top_level.txt @@ -0,0 +1 @@ +werkzeug diff --git a/brightonpy/Lib/site-packages/click-7.1.2.dist-info/INSTALLER b/brightonpy/Lib/site-packages/click-7.1.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/brightonpy/Lib/site-packages/click-7.1.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/brightonpy/Lib/site-packages/click-7.1.2.dist-info/LICENSE.rst b/brightonpy/Lib/site-packages/click-7.1.2.dist-info/LICENSE.rst new file mode 100644 index 0000000..d12a849 --- /dev/null +++ b/brightonpy/Lib/site-packages/click-7.1.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2014 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/brightonpy/Lib/site-packages/click-7.1.2.dist-info/METADATA b/brightonpy/Lib/site-packages/click-7.1.2.dist-info/METADATA new file mode 100644 index 0000000..00d6974 --- /dev/null +++ b/brightonpy/Lib/site-packages/click-7.1.2.dist-info/METADATA @@ -0,0 +1,102 @@ +Metadata-Version: 2.1 +Name: click +Version: 7.1.2 +Summary: Composable command line interface toolkit +Home-page: https://palletsprojects.com/p/click/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/click +Project-URL: Issue tracker, https://github.com/pallets/click/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* + +\$ click\_ +========== + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U click + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +A Simple Example +---------------- + +.. code-block:: python + + import click + + @click.command() + @click.option("--count", default=1, help="Number of greetings.") + @click.option("--name", prompt="Your name", help="The person to greet.") + def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo(f"Hello, {name}!") + + if __name__ == '__main__': + hello() + +.. code-block:: text + + $ python hello.py --count=3 + Your name: Click + Hello, Click! + Hello, Click! + Hello, Click! + + +Donate +------ + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Website: https://palletsprojects.com/p/click/ +- Documentation: https://click.palletsprojects.com/ +- Releases: https://pypi.org/project/click/ +- Code: https://github.com/pallets/click +- Issue tracker: https://github.com/pallets/click/issues +- Test status: https://dev.azure.com/pallets/click/_build +- Official chat: https://discord.gg/t6rrQZH + + diff --git a/brightonpy/Lib/site-packages/click-7.1.2.dist-info/RECORD b/brightonpy/Lib/site-packages/click-7.1.2.dist-info/RECORD new file mode 100644 index 0000000..c2079aa --- /dev/null +++ b/brightonpy/Lib/site-packages/click-7.1.2.dist-info/RECORD @@ -0,0 +1,40 @@ +click-7.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-7.1.2.dist-info/LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click-7.1.2.dist-info/METADATA,sha256=LrRgakZKV7Yg3qJqX_plu2WhFW81MzP3EqQmZhHIO8M,2868 +click-7.1.2.dist-info/RECORD,, +click-7.1.2.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +click-7.1.2.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=FkyGDQ-cbiQxP_lxgUspyFYS48f2S_pTcfKPz-d_RMo,2463 +click/__pycache__/__init__.cpython-37.pyc,, +click/__pycache__/_bashcomplete.cpython-37.pyc,, +click/__pycache__/_compat.cpython-37.pyc,, +click/__pycache__/_termui_impl.cpython-37.pyc,, +click/__pycache__/_textwrap.cpython-37.pyc,, +click/__pycache__/_unicodefun.cpython-37.pyc,, +click/__pycache__/_winconsole.cpython-37.pyc,, +click/__pycache__/core.cpython-37.pyc,, +click/__pycache__/decorators.cpython-37.pyc,, +click/__pycache__/exceptions.cpython-37.pyc,, +click/__pycache__/formatting.cpython-37.pyc,, +click/__pycache__/globals.cpython-37.pyc,, +click/__pycache__/parser.cpython-37.pyc,, +click/__pycache__/termui.cpython-37.pyc,, +click/__pycache__/testing.cpython-37.pyc,, +click/__pycache__/types.cpython-37.pyc,, +click/__pycache__/utils.cpython-37.pyc,, +click/_bashcomplete.py,sha256=9J98IHQYmCAr2Jup6TDshUr5FJEen-AoQCZR0K5nKxQ,12309 +click/_compat.py,sha256=AoMaYnZ-3pwtNXuHtlb6_UXsayoG0QZiHKIRy2VFezc,24169 +click/_termui_impl.py,sha256=yNktUMAdjYOU1HMkq915jR3zgAzUNtGSQqSTSSMn3eQ,20702 +click/_textwrap.py,sha256=ajCzkzFly5tjm9foQ5N9_MOeaYJMBjAltuFa69n4iXY,1197 +click/_unicodefun.py,sha256=apLSNEBZgUsQNPMUv072zJ1swqnm0dYVT5TqcIWTt6w,4201 +click/_winconsole.py,sha256=6YDu6Rq1Wxx4w9uinBMK2LHvP83aerZM9GQurlk3QDo,10010 +click/core.py,sha256=V6DJzastGhrC6WTDwV9MSLwcJUdX2Uf1ypmgkjBdn_Y,77650 +click/decorators.py,sha256=3TvEO_BkaHl7k6Eh1G5eC7JK4LKPdpFqH9JP0QDyTlM,11215 +click/exceptions.py,sha256=3pQAyyMFzx5A3eV0Y27WtDTyGogZRbrC6_o5DjjKBbw,8118 +click/formatting.py,sha256=Wb4gqFEpWaKPgAbOvnkCl8p-bEZx5KpM5ZSByhlnJNk,9281 +click/globals.py,sha256=ht7u2kUGI08pAarB4e4yC8Lkkxy6gJfRZyzxEj8EbWQ,1501 +click/parser.py,sha256=mFK-k58JtPpqO0AC36WAr0t5UfzEw1mvgVSyn7WCe9M,15691 +click/termui.py,sha256=G7QBEKIepRIGLvNdGwBTYiEtSImRxvTO_AglVpyHH2s,23998 +click/testing.py,sha256=EUEsDUqNXFgCLhZ0ZFOROpaVDA5I_rijwnNPE6qICgA,12854 +click/types.py,sha256=wuubik4VqgqAw5dvbYFkDt-zSAx97y9TQXuXcVaRyQA,25045 +click/utils.py,sha256=4VEcJ7iEHwjnFuzEuRtkT99o5VG3zqSD7Q2CVzv13WU,15940 diff --git a/brightonpy/Lib/site-packages/click-7.1.2.dist-info/WHEEL b/brightonpy/Lib/site-packages/click-7.1.2.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/brightonpy/Lib/site-packages/click-7.1.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/brightonpy/Lib/site-packages/click-7.1.2.dist-info/top_level.txt b/brightonpy/Lib/site-packages/click-7.1.2.dist-info/top_level.txt new file mode 100644 index 0000000..dca9a90 --- /dev/null +++ b/brightonpy/Lib/site-packages/click-7.1.2.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/brightonpy/Lib/site-packages/click/__init__.py b/brightonpy/Lib/site-packages/click/__init__.py new file mode 100644 index 0000000..2b6008f --- /dev/null +++ b/brightonpy/Lib/site-packages/click/__init__.py @@ -0,0 +1,79 @@ +""" +Click is a simple Python module inspired by the stdlib optparse to make +writing command line scripts fun. Unlike other modules, it's based +around a simple API that does not come with too much magic and is +composable. +""" +from .core import Argument +from .core import BaseCommand +from .core import Command +from .core import CommandCollection +from .core import Context +from .core import Group +from .core import MultiCommand +from .core import Option +from .core import Parameter +from .decorators import argument +from .decorators import command +from .decorators import confirmation_option +from .decorators import group +from .decorators import help_option +from .decorators import make_pass_decorator +from .decorators import option +from .decorators import pass_context +from .decorators import pass_obj +from .decorators import password_option +from .decorators import version_option +from .exceptions import Abort +from .exceptions import BadArgumentUsage +from .exceptions import BadOptionUsage +from .exceptions import BadParameter +from .exceptions import ClickException +from .exceptions import FileError +from .exceptions import MissingParameter +from .exceptions import NoSuchOption +from .exceptions import UsageError +from .formatting import HelpFormatter +from .formatting import wrap_text +from .globals import get_current_context +from .parser import OptionParser +from .termui import clear +from .termui import confirm +from .termui import echo_via_pager +from .termui import edit +from .termui import get_terminal_size +from .termui import getchar +from .termui import launch +from .termui import pause +from .termui import progressbar +from .termui import prompt +from .termui import secho +from .termui import style +from .termui import unstyle +from .types import BOOL +from .types import Choice +from .types import DateTime +from .types import File +from .types import FLOAT +from .types import FloatRange +from .types import INT +from .types import IntRange +from .types import ParamType +from .types import Path +from .types import STRING +from .types import Tuple +from .types import UNPROCESSED +from .types import UUID +from .utils import echo +from .utils import format_filename +from .utils import get_app_dir +from .utils import get_binary_stream +from .utils import get_os_args +from .utils import get_text_stream +from .utils import open_file + +# Controls if click should emit the warning about the use of unicode +# literals. +disable_unicode_literals_warning = False + +__version__ = "7.1.2" diff --git a/brightonpy/Lib/site-packages/click/_bashcomplete.py b/brightonpy/Lib/site-packages/click/_bashcomplete.py new file mode 100644 index 0000000..8bca244 --- /dev/null +++ b/brightonpy/Lib/site-packages/click/_bashcomplete.py @@ -0,0 +1,375 @@ +import copy +import os +import re + +from .core import Argument +from .core import MultiCommand +from .core import Option +from .parser import split_arg_string +from .types import Choice +from .utils import echo + +try: + from collections import abc +except ImportError: + import collections as abc + +WORDBREAK = "=" + +# Note, only BASH version 4.4 and later have the nosort option. +COMPLETION_SCRIPT_BASH = """ +%(complete_func)s() { + local IFS=$'\n' + COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + %(autocomplete_var)s=complete $1 ) ) + return 0 +} + +%(complete_func)setup() { + local COMPLETION_OPTIONS="" + local BASH_VERSION_ARR=(${BASH_VERSION//./ }) + # Only BASH version 4.4 and later have the nosort option. + if [ ${BASH_VERSION_ARR[0]} -gt 4 ] || ([ ${BASH_VERSION_ARR[0]} -eq 4 ] \ +&& [ ${BASH_VERSION_ARR[1]} -ge 4 ]); then + COMPLETION_OPTIONS="-o nosort" + fi + + complete $COMPLETION_OPTIONS -F %(complete_func)s %(script_names)s +} + +%(complete_func)setup +""" + +COMPLETION_SCRIPT_ZSH = """ +#compdef %(script_names)s + +%(complete_func)s() { + local -a completions + local -a completions_with_descriptions + local -a response + (( ! $+commands[%(script_names)s] )) && return 1 + + response=("${(@f)$( env COMP_WORDS=\"${words[*]}\" \\ + COMP_CWORD=$((CURRENT-1)) \\ + %(autocomplete_var)s=\"complete_zsh\" \\ + %(script_names)s )}") + + for key descr in ${(kv)response}; do + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + done + + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U + fi + + if [ -n "$completions" ]; then + compadd -U -V unsorted -a completions + fi + compstate[insert]="automenu" +} + +compdef %(complete_func)s %(script_names)s +""" + +COMPLETION_SCRIPT_FISH = ( + "complete --no-files --command %(script_names)s --arguments" + ' "(env %(autocomplete_var)s=complete_fish' + " COMP_WORDS=(commandline -cp) COMP_CWORD=(commandline -t)" + ' %(script_names)s)"' +) + +_completion_scripts = { + "bash": COMPLETION_SCRIPT_BASH, + "zsh": COMPLETION_SCRIPT_ZSH, + "fish": COMPLETION_SCRIPT_FISH, +} + +_invalid_ident_char_re = re.compile(r"[^a-zA-Z0-9_]") + + +def get_completion_script(prog_name, complete_var, shell): + cf_name = _invalid_ident_char_re.sub("", prog_name.replace("-", "_")) + script = _completion_scripts.get(shell, COMPLETION_SCRIPT_BASH) + return ( + script + % { + "complete_func": "_{}_completion".format(cf_name), + "script_names": prog_name, + "autocomplete_var": complete_var, + } + ).strip() + ";" + + +def resolve_ctx(cli, prog_name, args): + """Parse into a hierarchy of contexts. Contexts are connected + through the parent variable. + + :param cli: command definition + :param prog_name: the program that is running + :param args: full list of args + :return: the final context/command parsed + """ + ctx = cli.make_context(prog_name, args, resilient_parsing=True) + args = ctx.protected_args + ctx.args + while args: + if isinstance(ctx.command, MultiCommand): + if not ctx.command.chain: + cmd_name, cmd, args = ctx.command.resolve_command(ctx, args) + if cmd is None: + return ctx + ctx = cmd.make_context( + cmd_name, args, parent=ctx, resilient_parsing=True + ) + args = ctx.protected_args + ctx.args + else: + # Walk chained subcommand contexts saving the last one. + while args: + cmd_name, cmd, args = ctx.command.resolve_command(ctx, args) + if cmd is None: + return ctx + sub_ctx = cmd.make_context( + cmd_name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + resilient_parsing=True, + ) + args = sub_ctx.args + ctx = sub_ctx + args = sub_ctx.protected_args + sub_ctx.args + else: + break + return ctx + + +def start_of_option(param_str): + """ + :param param_str: param_str to check + :return: whether or not this is the start of an option declaration + (i.e. starts "-" or "--") + """ + return param_str and param_str[:1] == "-" + + +def is_incomplete_option(all_args, cmd_param): + """ + :param all_args: the full original list of args supplied + :param cmd_param: the current command paramter + :return: whether or not the last option declaration (i.e. starts + "-" or "--") is incomplete and corresponds to this cmd_param. In + other words whether this cmd_param option can still accept + values + """ + if not isinstance(cmd_param, Option): + return False + if cmd_param.is_flag: + return False + last_option = None + for index, arg_str in enumerate( + reversed([arg for arg in all_args if arg != WORDBREAK]) + ): + if index + 1 > cmd_param.nargs: + break + if start_of_option(arg_str): + last_option = arg_str + + return True if last_option and last_option in cmd_param.opts else False + + +def is_incomplete_argument(current_params, cmd_param): + """ + :param current_params: the current params and values for this + argument as already entered + :param cmd_param: the current command parameter + :return: whether or not the last argument is incomplete and + corresponds to this cmd_param. In other words whether or not the + this cmd_param argument can still accept values + """ + if not isinstance(cmd_param, Argument): + return False + current_param_values = current_params[cmd_param.name] + if current_param_values is None: + return True + if cmd_param.nargs == -1: + return True + if ( + isinstance(current_param_values, abc.Iterable) + and cmd_param.nargs > 1 + and len(current_param_values) < cmd_param.nargs + ): + return True + return False + + +def get_user_autocompletions(ctx, args, incomplete, cmd_param): + """ + :param ctx: context associated with the parsed command + :param args: full list of args + :param incomplete: the incomplete text to autocomplete + :param cmd_param: command definition + :return: all the possible user-specified completions for the param + """ + results = [] + if isinstance(cmd_param.type, Choice): + # Choices don't support descriptions. + results = [ + (c, None) for c in cmd_param.type.choices if str(c).startswith(incomplete) + ] + elif cmd_param.autocompletion is not None: + dynamic_completions = cmd_param.autocompletion( + ctx=ctx, args=args, incomplete=incomplete + ) + results = [ + c if isinstance(c, tuple) else (c, None) for c in dynamic_completions + ] + return results + + +def get_visible_commands_starting_with(ctx, starts_with): + """ + :param ctx: context associated with the parsed command + :starts_with: string that visible commands must start with. + :return: all visible (not hidden) commands that start with starts_with. + """ + for c in ctx.command.list_commands(ctx): + if c.startswith(starts_with): + command = ctx.command.get_command(ctx, c) + if not command.hidden: + yield command + + +def add_subcommand_completions(ctx, incomplete, completions_out): + # Add subcommand completions. + if isinstance(ctx.command, MultiCommand): + completions_out.extend( + [ + (c.name, c.get_short_help_str()) + for c in get_visible_commands_starting_with(ctx, incomplete) + ] + ) + + # Walk up the context list and add any other completion + # possibilities from chained commands + while ctx.parent is not None: + ctx = ctx.parent + if isinstance(ctx.command, MultiCommand) and ctx.command.chain: + remaining_commands = [ + c + for c in get_visible_commands_starting_with(ctx, incomplete) + if c.name not in ctx.protected_args + ] + completions_out.extend( + [(c.name, c.get_short_help_str()) for c in remaining_commands] + ) + + +def get_choices(cli, prog_name, args, incomplete): + """ + :param cli: command definition + :param prog_name: the program that is running + :param args: full list of args + :param incomplete: the incomplete text to autocomplete + :return: all the possible completions for the incomplete + """ + all_args = copy.deepcopy(args) + + ctx = resolve_ctx(cli, prog_name, args) + if ctx is None: + return [] + + has_double_dash = "--" in all_args + + # In newer versions of bash long opts with '='s are partitioned, but + # it's easier to parse without the '=' + if start_of_option(incomplete) and WORDBREAK in incomplete: + partition_incomplete = incomplete.partition(WORDBREAK) + all_args.append(partition_incomplete[0]) + incomplete = partition_incomplete[2] + elif incomplete == WORDBREAK: + incomplete = "" + + completions = [] + if not has_double_dash and start_of_option(incomplete): + # completions for partial options + for param in ctx.command.params: + if isinstance(param, Option) and not param.hidden: + param_opts = [ + param_opt + for param_opt in param.opts + param.secondary_opts + if param_opt not in all_args or param.multiple + ] + completions.extend( + [(o, param.help) for o in param_opts if o.startswith(incomplete)] + ) + return completions + # completion for option values from user supplied values + for param in ctx.command.params: + if is_incomplete_option(all_args, param): + return get_user_autocompletions(ctx, all_args, incomplete, param) + # completion for argument values from user supplied values + for param in ctx.command.params: + if is_incomplete_argument(ctx.params, param): + return get_user_autocompletions(ctx, all_args, incomplete, param) + + add_subcommand_completions(ctx, incomplete, completions) + # Sort before returning so that proper ordering can be enforced in custom types. + return sorted(completions) + + +def do_complete(cli, prog_name, include_descriptions): + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + for item in get_choices(cli, prog_name, args, incomplete): + echo(item[0]) + if include_descriptions: + # ZSH has trouble dealing with empty array parameters when + # returned from commands, use '_' to indicate no description + # is present. + echo(item[1] if item[1] else "_") + + return True + + +def do_complete_fish(cli, prog_name): + cwords = split_arg_string(os.environ["COMP_WORDS"]) + incomplete = os.environ["COMP_CWORD"] + args = cwords[1:] + + for item in get_choices(cli, prog_name, args, incomplete): + if item[1]: + echo("{arg}\t{desc}".format(arg=item[0], desc=item[1])) + else: + echo(item[0]) + + return True + + +def bashcomplete(cli, prog_name, complete_var, complete_instr): + if "_" in complete_instr: + command, shell = complete_instr.split("_", 1) + else: + command = complete_instr + shell = "bash" + + if command == "source": + echo(get_completion_script(prog_name, complete_var, shell)) + return True + elif command == "complete": + if shell == "fish": + return do_complete_fish(cli, prog_name) + elif shell in {"bash", "zsh"}: + return do_complete(cli, prog_name, shell == "zsh") + + return False diff --git a/brightonpy/Lib/site-packages/click/_compat.py b/brightonpy/Lib/site-packages/click/_compat.py new file mode 100644 index 0000000..60cb115 --- /dev/null +++ b/brightonpy/Lib/site-packages/click/_compat.py @@ -0,0 +1,786 @@ +# flake8: noqa +import codecs +import io +import os +import re +import sys +from weakref import WeakKeyDictionary + +PY2 = sys.version_info[0] == 2 +CYGWIN = sys.platform.startswith("cygwin") +MSYS2 = sys.platform.startswith("win") and ("GCC" in sys.version) +# Determine local App Engine environment, per Google's own suggestion +APP_ENGINE = "APPENGINE_RUNTIME" in os.environ and "Development/" in os.environ.get( + "SERVER_SOFTWARE", "" +) +WIN = sys.platform.startswith("win") and not APP_ENGINE and not MSYS2 +DEFAULT_COLUMNS = 80 + + +_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") + + +def get_filesystem_encoding(): + return sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def _make_text_stream( + stream, encoding, errors, force_readable=False, force_writable=False +): + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = "replace" + return _NonClosingTextIOWrapper( + stream, + encoding, + errors, + line_buffering=True, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def is_ascii_encoding(encoding): + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +def get_best_encoding(stream): + """Returns the default stream encoding if not found.""" + rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() + if is_ascii_encoding(rv): + return "utf-8" + return rv + + +class _NonClosingTextIOWrapper(io.TextIOWrapper): + def __init__( + self, + stream, + encoding, + errors, + force_readable=False, + force_writable=False, + **extra + ): + self._stream = stream = _FixupStream(stream, force_readable, force_writable) + io.TextIOWrapper.__init__(self, stream, encoding, errors, **extra) + + # The io module is a place where the Python 3 text behavior + # was forced upon Python 2, so we need to unbreak + # it to look like Python 2. + if PY2: + + def write(self, x): + if isinstance(x, str) or is_bytes(x): + try: + self.flush() + except Exception: + pass + return self.buffer.write(str(x)) + return io.TextIOWrapper.write(self, x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __del__(self): + try: + self.detach() + except Exception: + pass + + def isatty(self): + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream(object): + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + + The forcing of readable and writable flags are there because some tools + put badly patched objects on sys (one such offender are certain version + of jupyter notebook). + """ + + def __init__(self, stream, force_readable=False, force_writable=False): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name): + return getattr(self._stream, name) + + def read1(self, size): + f = getattr(self._stream, "read1", None) + if f is not None: + return f(size) + # We only dispatch to readline instead of read in Python 2 as we + # do not want cause problems with the different implementation + # of line buffering. + if PY2: + return self._stream.readline(size) + return self._stream.read(size) + + def readable(self): + if self._force_readable: + return True + x = getattr(self._stream, "readable", None) + if x is not None: + return x() + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self): + if self._force_writable: + return True + x = getattr(self._stream, "writable", None) + if x is not None: + return x() + try: + self._stream.write("") + except Exception: + try: + self._stream.write(b"") + except Exception: + return False + return True + + def seekable(self): + x = getattr(self._stream, "seekable", None) + if x is not None: + return x() + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +if PY2: + text_type = unicode + raw_input = raw_input + string_types = (str, unicode) + int_types = (int, long) + iteritems = lambda x: x.iteritems() + range_type = xrange + + def is_bytes(x): + return isinstance(x, (buffer, bytearray)) + + _identifier_re = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*$") + + # For Windows, we need to force stdout/stdin/stderr to binary if it's + # fetched for that. This obviously is not the most correct way to do + # it as it changes global state. Unfortunately, there does not seem to + # be a clear better way to do it as just reopening the file in binary + # mode does not change anything. + # + # An option would be to do what Python 3 does and to open the file as + # binary only, patch it back to the system, and then use a wrapper + # stream that converts newlines. It's not quite clear what's the + # correct option here. + # + # This code also lives in _winconsole for the fallback to the console + # emulation stream. + # + # There are also Windows environments where the `msvcrt` module is not + # available (which is why we use try-catch instead of the WIN variable + # here), such as the Google App Engine development server on Windows. In + # those cases there is just nothing we can do. + def set_binary_mode(f): + return f + + try: + import msvcrt + except ImportError: + pass + else: + + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + msvcrt.setmode(fileno, os.O_BINARY) + return f + + try: + import fcntl + except ImportError: + pass + else: + + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + flags = fcntl.fcntl(fileno, fcntl.F_GETFL) + fcntl.fcntl(fileno, fcntl.F_SETFL, flags & ~os.O_NONBLOCK) + return f + + def isidentifier(x): + return _identifier_re.search(x) is not None + + def get_binary_stdin(): + return set_binary_mode(sys.stdin) + + def get_binary_stdout(): + _wrap_std_stream("stdout") + return set_binary_mode(sys.stdout) + + def get_binary_stderr(): + _wrap_std_stream("stderr") + return set_binary_mode(sys.stderr) + + def get_text_stdin(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdin, encoding, errors, force_readable=True) + + def get_text_stdout(encoding=None, errors=None): + _wrap_std_stream("stdout") + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdout, encoding, errors, force_writable=True) + + def get_text_stderr(encoding=None, errors=None): + _wrap_std_stream("stderr") + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stderr, encoding, errors, force_writable=True) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), "replace") + return value + + +else: + import io + + text_type = str + raw_input = input + string_types = (str,) + int_types = (int,) + range_type = range + isidentifier = lambda x: x.isidentifier() + iteritems = lambda x: iter(x.items()) + + def is_bytes(x): + return isinstance(x, (bytes, memoryview, bytearray)) + + def _is_binary_reader(stream, default=False): + try: + return isinstance(stream.read(0), bytes) + except Exception: + return default + # This happens in some cases where the stream was already + # closed. In this case, we assume the default. + + def _is_binary_writer(stream, default=False): + try: + stream.write(b"") + except Exception: + try: + stream.write("") + return False + except Exception: + pass + return default + return True + + def _find_binary_reader(stream): + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_reader(stream, False): + return stream + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_reader(buf, True): + return buf + + def _find_binary_writer(stream): + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detatching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_writer(stream, False): + return stream + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_writer(buf, True): + return buf + + def _stream_is_misconfigured(stream): + """A stream is misconfigured if its encoding is ASCII.""" + # If the stream does not have an encoding set, we assume it's set + # to ASCII. This appears to happen in certain unittest + # environments. It's not quite clear what the correct behavior is + # but this at least will force Click to recover somehow. + return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") + + def _is_compat_stream_attr(stream, attr, value): + """A stream attribute is compatible if it is equal to the + desired value or the desired value is unset and the attribute + has a value. + """ + stream_value = getattr(stream, attr, None) + return stream_value == value or (value is None and stream_value is not None) + + def _is_compatible_text_stream(stream, encoding, errors): + """Check if a stream's encoding and errors attributes are + compatible with the desired values. + """ + return _is_compat_stream_attr( + stream, "encoding", encoding + ) and _is_compat_stream_attr(stream, "errors", errors) + + def _force_correct_text_stream( + text_stream, + encoding, + errors, + is_binary, + find_binary, + force_readable=False, + force_writable=False, + ): + if is_binary(text_stream, False): + binary_reader = text_stream + else: + # If the stream looks compatible, and won't default to a + # misconfigured ascii encoding, return it as-is. + if _is_compatible_text_stream(text_stream, encoding, errors) and not ( + encoding is None and _stream_is_misconfigured(text_stream) + ): + return text_stream + + # Otherwise, get the underlying binary reader. + binary_reader = find_binary(text_stream) + + # If that's not possible, silently use the original reader + # and get mojibake instead of exceptions. + if binary_reader is None: + return text_stream + + # Default errors to replace instead of strict in order to get + # something that works. + if errors is None: + errors = "replace" + + # Wrap the binary stream in a text stream with the correct + # encoding parameters. + return _make_text_stream( + binary_reader, + encoding, + errors, + force_readable=force_readable, + force_writable=force_writable, + ) + + def _force_correct_text_reader(text_reader, encoding, errors, force_readable=False): + return _force_correct_text_stream( + text_reader, + encoding, + errors, + _is_binary_reader, + _find_binary_reader, + force_readable=force_readable, + ) + + def _force_correct_text_writer(text_writer, encoding, errors, force_writable=False): + return _force_correct_text_stream( + text_writer, + encoding, + errors, + _is_binary_writer, + _find_binary_writer, + force_writable=force_writable, + ) + + def get_binary_stdin(): + reader = _find_binary_reader(sys.stdin) + if reader is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdin.") + return reader + + def get_binary_stdout(): + writer = _find_binary_writer(sys.stdout) + if writer is None: + raise RuntimeError( + "Was not able to determine binary stream for sys.stdout." + ) + return writer + + def get_binary_stderr(): + writer = _find_binary_writer(sys.stderr) + if writer is None: + raise RuntimeError( + "Was not able to determine binary stream for sys.stderr." + ) + return writer + + def get_text_stdin(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader( + sys.stdin, encoding, errors, force_readable=True + ) + + def get_text_stdout(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer( + sys.stdout, encoding, errors, force_writable=True + ) + + def get_text_stderr(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer( + sys.stderr, encoding, errors, force_writable=True + ) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), "replace") + else: + value = value.encode("utf-8", "surrogateescape").decode("utf-8", "replace") + return value + + +def get_streerror(e, default=None): + if hasattr(e, "strerror"): + msg = e.strerror + else: + if default is not None: + msg = default + else: + msg = str(e) + if isinstance(msg, bytes): + msg = msg.decode("utf-8", "replace") + return msg + + +def _wrap_io_open(file, mode, encoding, errors): + """On Python 2, :func:`io.open` returns a text file wrapper that + requires passing ``unicode`` to ``write``. Need to open the file in + binary mode then wrap it in a subclass that can write ``str`` and + ``unicode``. + + Also handles not passing ``encoding`` and ``errors`` in binary mode. + """ + binary = "b" in mode + + if binary: + kwargs = {} + else: + kwargs = {"encoding": encoding, "errors": errors} + + if not PY2 or binary: + return io.open(file, mode, **kwargs) + + f = io.open(file, "{}b".format(mode.replace("t", ""))) + return _make_text_stream(f, **kwargs) + + +def open_stream(filename, mode="r", encoding=None, errors="strict", atomic=False): + binary = "b" in mode + + # Standard streams first. These are simple because they don't need + # special handling for the atomic flag. It's entirely ignored. + if filename == "-": + if any(m in mode for m in ["w", "a", "x"]): + if binary: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if binary: + return get_binary_stdin(), False + return get_text_stdin(encoding=encoding, errors=errors), False + + # Non-atomic writes directly go out through the regular open functions. + if not atomic: + return _wrap_io_open(filename, mode, encoding, errors), True + + # Some usability stuff for atomic writes + if "a" in mode: + raise ValueError( + "Appending to an existing file is not supported, because that" + " would involve an expensive `copy`-operation to a temporary" + " file. Open the file in normal `w`-mode and copy explicitly" + " if that's what you're after." + ) + if "x" in mode: + raise ValueError("Use the `overwrite`-parameter instead.") + if "w" not in mode: + raise ValueError("Atomic writes only make sense with `w`-mode.") + + # Atomic writes are more complicated. They work by opening a file + # as a proxy in the same folder and then using the fdopen + # functionality to wrap it in a Python file. Then we wrap it in an + # atomic file that moves the file over on close. + import errno + import random + + try: + perm = os.stat(filename).st_mode + except OSError: + perm = None + + flags = os.O_RDWR | os.O_CREAT | os.O_EXCL + + if binary: + flags |= getattr(os, "O_BINARY", 0) + + while True: + tmp_filename = os.path.join( + os.path.dirname(filename), + ".__atomic-write{:08x}".format(random.randrange(1 << 32)), + ) + try: + fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) + break + except OSError as e: + if e.errno == errno.EEXIST or ( + os.name == "nt" + and e.errno == errno.EACCES + and os.path.isdir(e.filename) + and os.access(e.filename, os.W_OK) + ): + continue + raise + + if perm is not None: + os.chmod(tmp_filename, perm) # in case perm includes bits in umask + + f = _wrap_io_open(fd, mode, encoding, errors) + return _AtomicFile(f, tmp_filename, os.path.realpath(filename)), True + + +# Used in a destructor call, needs extra protection from interpreter cleanup. +if hasattr(os, "replace"): + _replace = os.replace + _can_replace = True +else: + _replace = os.rename + _can_replace = not WIN + + +class _AtomicFile(object): + def __init__(self, f, tmp_filename, real_filename): + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self): + return self._real_filename + + def close(self, delete=False): + if self.closed: + return + self._f.close() + if not _can_replace: + try: + os.remove(self._real_filename) + except OSError: + pass + _replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name): + return getattr(self._f, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close(delete=exc_type is not None) + + def __repr__(self): + return repr(self._f) + + +auto_wrap_for_ansi = None +colorama = None +get_winterm_size = None + + +def strip_ansi(value): + return _ansi_re.sub("", value) + + +def _is_jupyter_kernel_output(stream): + if WIN: + # TODO: Couldn't test on Windows, should't try to support until + # someone tests the details wrt colorama. + return + + while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): + stream = stream._stream + + return stream.__class__.__module__.startswith("ipykernel.") + + +def should_strip_ansi(stream=None, color=None): + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) and not _is_jupyter_kernel_output(stream) + return not color + + +# If we're on Windows, we provide transparent integration through +# colorama. This will make ANSI colors through the echo function +# work automatically. +if WIN: + # Windows has a smaller terminal + DEFAULT_COLUMNS = 79 + + from ._winconsole import _get_windows_console_stream, _wrap_std_stream + + def _get_argv_encoding(): + import locale + + return locale.getpreferredencoding() + + if PY2: + + def raw_input(prompt=""): + sys.stderr.flush() + if prompt: + stdout = _default_text_stdout() + stdout.write(prompt) + stdin = _default_text_stdin() + return stdin.readline().rstrip("\r\n") + + try: + import colorama + except ImportError: + pass + else: + _ansi_stream_wrappers = WeakKeyDictionary() + + def auto_wrap_for_ansi(stream, color=None): + """This function wraps a stream so that calls through colorama + are issued to the win32 console API to recolor on demand. It + also ensures to reset the colors if a write call is interrupted + to not destroy the console afterwards. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + if cached is not None: + return cached + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = ansi_wrapper.stream + _write = rv.write + + def _safe_write(s): + try: + return _write(s) + except: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + return rv + + def get_winterm_size(): + win = colorama.win32.GetConsoleScreenBufferInfo( + colorama.win32.STDOUT + ).srWindow + return win.Right - win.Left, win.Bottom - win.Top + + +else: + + def _get_argv_encoding(): + return getattr(sys.stdin, "encoding", None) or get_filesystem_encoding() + + _get_windows_console_stream = lambda *x: None + _wrap_std_stream = lambda *x: None + + +def term_len(x): + return len(strip_ansi(x)) + + +def isatty(stream): + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func(src_func, wrapper_func): + cache = WeakKeyDictionary() + + def func(): + stream = src_func() + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + stream = src_func() # In case wrapper_func() modified the stream + cache[stream] = rv + except Exception: + pass + return rv + + return func + + +_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) +_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) +_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) + + +binary_streams = { + "stdin": get_binary_stdin, + "stdout": get_binary_stdout, + "stderr": get_binary_stderr, +} + +text_streams = { + "stdin": get_text_stdin, + "stdout": get_text_stdout, + "stderr": get_text_stderr, +} diff --git a/brightonpy/Lib/site-packages/click/_termui_impl.py b/brightonpy/Lib/site-packages/click/_termui_impl.py new file mode 100644 index 0000000..88bec37 --- /dev/null +++ b/brightonpy/Lib/site-packages/click/_termui_impl.py @@ -0,0 +1,657 @@ +# -*- coding: utf-8 -*- +""" +This module contains implementations for the termui module. To keep the +import time of Click down, some infrequently used functionality is +placed in this module and only imported as needed. +""" +import contextlib +import math +import os +import sys +import time + +from ._compat import _default_text_stdout +from ._compat import CYGWIN +from ._compat import get_best_encoding +from ._compat import int_types +from ._compat import isatty +from ._compat import open_stream +from ._compat import range_type +from ._compat import strip_ansi +from ._compat import term_len +from ._compat import WIN +from .exceptions import ClickException +from .utils import echo + +if os.name == "nt": + BEFORE_BAR = "\r" + AFTER_BAR = "\n" +else: + BEFORE_BAR = "\r\033[?25l" + AFTER_BAR = "\033[?25h\n" + + +def _length_hint(obj): + """Returns the length hint of an object.""" + try: + return len(obj) + except (AttributeError, TypeError): + try: + get_hint = type(obj).__length_hint__ + except AttributeError: + return None + try: + hint = get_hint(obj) + except TypeError: + return None + if hint is NotImplemented or not isinstance(hint, int_types) or hint < 0: + return None + return hint + + +class ProgressBar(object): + def __init__( + self, + iterable, + length=None, + fill_char="#", + empty_char=" ", + bar_template="%(bar)s", + info_sep=" ", + show_eta=True, + show_percent=None, + show_pos=False, + item_show_func=None, + label=None, + file=None, + color=None, + width=30, + ): + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label = label or "" + if file is None: + file = _default_text_stdout() + self.file = file + self.color = color + self.width = width + self.autowidth = width == 0 + + if length is None: + length = _length_hint(iterable) + if iterable is None: + if length is None: + raise TypeError("iterable or length is required") + iterable = range_type(length) + self.iter = iter(iterable) + self.length = length + self.length_known = length is not None + self.pos = 0 + self.avg = [] + self.start = self.last_eta = time.time() + self.eta_known = False + self.finished = False + self.max_width = None + self.entered = False + self.current_item = None + self.is_hidden = not isatty(self.file) + self._last_line = None + self.short_limit = 0.5 + + def __enter__(self): + self.entered = True + self.render_progress() + return self + + def __exit__(self, exc_type, exc_value, tb): + self.render_finish() + + def __iter__(self): + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + self.render_progress() + return self.generator() + + def __next__(self): + # Iteration is defined in terms of a generator function, + # returned by iter(self); use that to define next(). This works + # because `self.iter` is an iterable consumed by that generator, + # so it is re-entry safe. Calling `next(self.generator())` + # twice works and does "what you want". + return next(iter(self)) + + # Python 2 compat + next = __next__ + + def is_fast(self): + return time.time() - self.start <= self.short_limit + + def render_finish(self): + if self.is_hidden or self.is_fast(): + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self): + if self.finished: + return 1.0 + return min(self.pos / (float(self.length) or 1), 1.0) + + @property + def time_per_iteration(self): + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self): + if self.length_known and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self): + if self.eta_known: + t = int(self.eta) + seconds = t % 60 + t //= 60 + minutes = t % 60 + t //= 60 + hours = t % 24 + t //= 24 + if t > 0: + return "{}d {:02}:{:02}:{:02}".format(t, hours, minutes, seconds) + else: + return "{:02}:{:02}:{:02}".format(hours, minutes, seconds) + return "" + + def format_pos(self): + pos = str(self.pos) + if self.length_known: + pos += "/{}".format(self.length) + return pos + + def format_pct(self): + return "{: 4}%".format(int(self.pct * 100))[1:] + + def format_bar(self): + if self.length_known: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + elif self.finished: + bar = self.fill_char * self.width + else: + bar = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + bar[ + int( + (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) + * self.width + ) + ] = self.fill_char + bar = "".join(bar) + return bar + + def format_progress_line(self): + show_percent = self.show_percent + + info_bits = [] + if self.length_known and show_percent is None: + show_percent = not self.show_pos + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return ( + self.bar_template + % { + "label": self.label, + "bar": self.format_bar(), + "info": self.info_sep.join(info_bits), + } + ).rstrip() + + def render_progress(self): + from .termui import get_terminal_size + + if self.is_hidden: + return + + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, get_terminal_size()[0] - clutter_length) + if new_width < old_width: + buf.append(BEFORE_BAR) + buf.append(" " * self.max_width) + self.max_width = new_width + self.width = new_width + + clear_width = self.width + if self.max_width is not None: + clear_width = self.max_width + + buf.append(BEFORE_BAR) + line = self.format_progress_line() + line_len = term_len(line) + if self.max_width is None or self.max_width < line_len: + self.max_width = line_len + + buf.append(line) + buf.append(" " * (clear_width - line_len)) + line = "".join(buf) + # Render the line only if it changed. + + if line != self._last_line and not self.is_fast(): + self._last_line = line + echo(line, file=self.file, color=self.color, nl=False) + self.file.flush() + + def make_step(self, n_steps): + self.pos += n_steps + if self.length_known and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + + # self.avg is a rolling list of length <= 7 of steps where steps are + # defined as time elapsed divided by the total progress through + # self.length. + if self.pos: + step = (time.time() - self.start) / self.pos + else: + step = time.time() - self.start + + self.avg = self.avg[-6:] + [step] + + self.eta_known = self.length_known + + def update(self, n_steps): + self.make_step(n_steps) + self.render_progress() + + def finish(self): + self.eta_known = 0 + self.current_item = None + self.finished = True + + def generator(self): + """Return a generator which yields the items added to the bar + during construction, and updates the progress bar *after* the + yielded block returns. + """ + # WARNING: the iterator interface for `ProgressBar` relies on + # this and only works because this is a simple generator which + # doesn't create or manage additional state. If this function + # changes, the impact should be evaluated both against + # `iter(bar)` and `next(bar)`. `next()` in particular may call + # `self.generator()` repeatedly, and this must remain safe in + # order for that interface to work. + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + + if self.is_hidden: + for rv in self.iter: + yield rv + else: + for rv in self.iter: + self.current_item = rv + yield rv + self.update(1) + self.finish() + self.render_progress() + + +def pager(generator, color=None): + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + pager_cmd = (os.environ.get("PAGER", None) or "").strip() + if pager_cmd: + if WIN: + return _tempfilepager(generator, pager_cmd, color) + return _pipepager(generator, pager_cmd, color) + if os.environ.get("TERM") in ("dumb", "emacs"): + return _nullpager(stdout, generator, color) + if WIN or sys.platform.startswith("os2"): + return _tempfilepager(generator, "more <", color) + if hasattr(os, "system") and os.system("(less) 2>/dev/null") == 0: + return _pipepager(generator, "less", color) + + import tempfile + + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if hasattr(os, "system") and os.system('more "{}"'.format(filename)) == 0: + return _pipepager(generator, "more", color) + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager(generator, cmd, color): + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + """ + import subprocess + + env = dict(os.environ) + + # If we're piping to less we might support colors under the + # condition that + cmd_detail = cmd.rsplit("/", 1)[-1].split() + if color is None and cmd_detail[0] == "less": + less_flags = "{}{}".format(os.environ.get("LESS", ""), " ".join(cmd_detail[1:])) + if not less_flags: + env["LESS"] = "-R" + color = True + elif "r" in less_flags or "R" in less_flags: + color = True + + c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, env=env) + encoding = get_best_encoding(c.stdin) + try: + for text in generator: + if not color: + text = strip_ansi(text) + + c.stdin.write(text.encode(encoding, "replace")) + except (IOError, KeyboardInterrupt): + pass + else: + c.stdin.close() + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + +def _tempfilepager(generator, cmd, color): + """Page through text by invoking a program on a temporary file.""" + import tempfile + + filename = tempfile.mktemp() + # TODO: This never terminates if the passed generator never terminates. + text = "".join(generator) + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, "wb")[0] as f: + f.write(text.encode(encoding)) + try: + os.system('{} "{}"'.format(cmd, filename)) + finally: + os.unlink(filename) + + +def _nullpager(stream, generator, color): + """Simply print unformatted text. This is the ultimate fallback.""" + for text in generator: + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor(object): + def __init__(self, editor=None, env=None, require_save=True, extension=".txt"): + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self): + if self.editor is not None: + return self.editor + for key in "VISUAL", "EDITOR": + rv = os.environ.get(key) + if rv: + return rv + if WIN: + return "notepad" + for editor in "sensible-editor", "vim", "nano": + if os.system("which {} >/dev/null 2>&1".format(editor)) == 0: + return editor + return "vi" + + def edit_file(self, filename): + import subprocess + + editor = self.get_editor() + if self.env: + environ = os.environ.copy() + environ.update(self.env) + else: + environ = None + try: + c = subprocess.Popen( + '{} "{}"'.format(editor, filename), env=environ, shell=True, + ) + exit_code = c.wait() + if exit_code != 0: + raise ClickException("{}: Editing failed!".format(editor)) + except OSError as e: + raise ClickException("{}: Editing failed: {}".format(editor, e)) + + def edit(self, text): + import tempfile + + text = text or "" + if text and not text.endswith("\n"): + text += "\n" + + fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) + try: + if WIN: + encoding = "utf-8-sig" + text = text.replace("\n", "\r\n") + else: + encoding = "utf-8" + text = text.encode(encoding) + + f = os.fdopen(fd, "wb") + f.write(text) + f.close() + timestamp = os.path.getmtime(name) + + self.edit_file(name) + + if self.require_save and os.path.getmtime(name) == timestamp: + return None + + f = open(name, "rb") + try: + rv = f.read() + finally: + f.close() + return rv.decode("utf-8-sig").replace("\r\n", "\n") + finally: + os.unlink(name) + + +def open_url(url, wait=False, locate=False): + import subprocess + + def _unquote_file(url): + try: + import urllib + except ImportError: + import urllib + if url.startswith("file://"): + url = urllib.unquote(url[7:]) + return url + + if sys.platform == "darwin": + args = ["open"] + if wait: + args.append("-W") + if locate: + args.append("-R") + args.append(_unquote_file(url)) + null = open("/dev/null", "w") + try: + return subprocess.Popen(args, stderr=null).wait() + finally: + null.close() + elif WIN: + if locate: + url = _unquote_file(url) + args = 'explorer /select,"{}"'.format(_unquote_file(url.replace('"', ""))) + else: + args = 'start {} "" "{}"'.format( + "/WAIT" if wait else "", url.replace('"', "") + ) + return os.system(args) + elif CYGWIN: + if locate: + url = _unquote_file(url) + args = 'cygstart "{}"'.format(os.path.dirname(url).replace('"', "")) + else: + args = 'cygstart {} "{}"'.format("-w" if wait else "", url.replace('"', "")) + return os.system(args) + + try: + if locate: + url = os.path.dirname(_unquote_file(url)) or "." + else: + url = _unquote_file(url) + c = subprocess.Popen(["xdg-open", url]) + if wait: + return c.wait() + return 0 + except OSError: + if url.startswith(("http://", "https://")) and not locate and not wait: + import webbrowser + + webbrowser.open(url) + return 0 + return 1 + + +def _translate_ch_to_exc(ch): + if ch == u"\x03": + raise KeyboardInterrupt() + if ch == u"\x04" and not WIN: # Unix-like, Ctrl+D + raise EOFError() + if ch == u"\x1a" and WIN: # Windows, Ctrl+Z + raise EOFError() + + +if WIN: + import msvcrt + + @contextlib.contextmanager + def raw_terminal(): + yield + + def getchar(echo): + # The function `getch` will return a bytes object corresponding to + # the pressed character. Since Windows 10 build 1803, it will also + # return \x00 when called a second time after pressing a regular key. + # + # `getwch` does not share this probably-bugged behavior. Moreover, it + # returns a Unicode object by default, which is what we want. + # + # Either of these functions will return \x00 or \xe0 to indicate + # a special key, and you need to call the same function again to get + # the "rest" of the code. The fun part is that \u00e0 is + # "latin small letter a with grave", so if you type that on a French + # keyboard, you _also_ get a \xe0. + # E.g., consider the Up arrow. This returns \xe0 and then \x48. The + # resulting Unicode string reads as "a with grave" + "capital H". + # This is indistinguishable from when the user actually types + # "a with grave" and then "capital H". + # + # When \xe0 is returned, we assume it's part of a special-key sequence + # and call `getwch` again, but that means that when the user types + # the \u00e0 character, `getchar` doesn't return until a second + # character is typed. + # The alternative is returning immediately, but that would mess up + # cross-platform handling of arrow keys and others that start with + # \xe0. Another option is using `getch`, but then we can't reliably + # read non-ASCII characters, because return values of `getch` are + # limited to the current 8-bit codepage. + # + # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` + # is doing the right thing in more situations than with `getch`. + if echo: + func = msvcrt.getwche + else: + func = msvcrt.getwch + + rv = func() + if rv in (u"\x00", u"\xe0"): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + _translate_ch_to_exc(rv) + return rv + + +else: + import tty + import termios + + @contextlib.contextmanager + def raw_terminal(): + if not isatty(sys.stdin): + f = open("/dev/tty") + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + try: + old_settings = termios.tcgetattr(fd) + try: + tty.setraw(fd) + yield fd + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + if f is not None: + f.close() + except termios.error: + pass + + def getchar(echo): + with raw_terminal() as fd: + ch = os.read(fd, 32) + ch = ch.decode(get_best_encoding(sys.stdin), "replace") + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + _translate_ch_to_exc(ch) + return ch diff --git a/brightonpy/Lib/site-packages/click/_textwrap.py b/brightonpy/Lib/site-packages/click/_textwrap.py new file mode 100644 index 0000000..6959087 --- /dev/null +++ b/brightonpy/Lib/site-packages/click/_textwrap.py @@ -0,0 +1,37 @@ +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/brightonpy/Lib/site-packages/click/_unicodefun.py b/brightonpy/Lib/site-packages/click/_unicodefun.py new file mode 100644 index 0000000..781c365 --- /dev/null +++ b/brightonpy/Lib/site-packages/click/_unicodefun.py @@ -0,0 +1,131 @@ +import codecs +import os +import sys + +from ._compat import PY2 + + +def _find_unicode_literals_frame(): + import __future__ + + if not hasattr(sys, "_getframe"): # not all Python implementations have it + return 0 + frm = sys._getframe(1) + idx = 1 + while frm is not None: + if frm.f_globals.get("__name__", "").startswith("click."): + frm = frm.f_back + idx += 1 + elif frm.f_code.co_flags & __future__.unicode_literals.compiler_flag: + return idx + else: + break + return 0 + + +def _check_for_unicode_literals(): + if not __debug__: + return + + from . import disable_unicode_literals_warning + + if not PY2 or disable_unicode_literals_warning: + return + bad_frame = _find_unicode_literals_frame() + if bad_frame <= 0: + return + from warnings import warn + + warn( + Warning( + "Click detected the use of the unicode_literals __future__" + " import. This is heavily discouraged because it can" + " introduce subtle bugs in your code. You should instead" + ' use explicit u"" literals for your unicode strings. For' + " more information see" + " https://click.palletsprojects.com/python3/" + ), + stacklevel=bad_frame, + ) + + +def _verify_python3_env(): + """Ensures that the environment is good for unicode on Python 3.""" + if PY2: + return + try: + import locale + + fs_enc = codecs.lookup(locale.getpreferredencoding()).name + except Exception: + fs_enc = "ascii" + if fs_enc != "ascii": + return + + extra = "" + if os.name == "posix": + import subprocess + + try: + rv = subprocess.Popen( + ["locale", "-a"], stdout=subprocess.PIPE, stderr=subprocess.PIPE + ).communicate()[0] + except OSError: + rv = b"" + good_locales = set() + has_c_utf8 = False + + # Make sure we're operating on text here. + if isinstance(rv, bytes): + rv = rv.decode("ascii", "replace") + + for line in rv.splitlines(): + locale = line.strip() + if locale.lower().endswith((".utf-8", ".utf8")): + good_locales.add(locale) + if locale.lower() in ("c.utf8", "c.utf-8"): + has_c_utf8 = True + + extra += "\n\n" + if not good_locales: + extra += ( + "Additional information: on this system no suitable" + " UTF-8 locales were discovered. This most likely" + " requires resolving by reconfiguring the locale" + " system." + ) + elif has_c_utf8: + extra += ( + "This system supports the C.UTF-8 locale which is" + " recommended. You might be able to resolve your issue" + " by exporting the following environment variables:\n\n" + " export LC_ALL=C.UTF-8\n" + " export LANG=C.UTF-8" + ) + else: + extra += ( + "This system lists a couple of UTF-8 supporting locales" + " that you can pick from. The following suitable" + " locales were discovered: {}".format(", ".join(sorted(good_locales))) + ) + + bad_locale = None + for locale in os.environ.get("LC_ALL"), os.environ.get("LANG"): + if locale and locale.lower().endswith((".utf-8", ".utf8")): + bad_locale = locale + if locale is not None: + break + if bad_locale is not None: + extra += ( + "\n\nClick discovered that you exported a UTF-8 locale" + " but the locale system could not pick up from it" + " because it does not exist. The exported locale is" + " '{}' but it is not supported".format(bad_locale) + ) + + raise RuntimeError( + "Click will abort further execution because Python 3 was" + " configured to use ASCII as encoding for the environment." + " Consult https://click.palletsprojects.com/python3/ for" + " mitigation steps.{}".format(extra) + ) diff --git a/brightonpy/Lib/site-packages/click/_winconsole.py b/brightonpy/Lib/site-packages/click/_winconsole.py new file mode 100644 index 0000000..b6c4274 --- /dev/null +++ b/brightonpy/Lib/site-packages/click/_winconsole.py @@ -0,0 +1,370 @@ +# -*- coding: utf-8 -*- +# This module is based on the excellent work by Adam Bartoš who +# provided a lot of what went into the implementation here in +# the discussion to issue1602 in the Python bug tracker. +# +# There are some general differences in regards to how this works +# compared to the original patches as we do not need to patch +# the entire interpreter but just work in our little world of +# echo and prmopt. +import ctypes +import io +import os +import sys +import time +import zlib +from ctypes import byref +from ctypes import c_char +from ctypes import c_char_p +from ctypes import c_int +from ctypes import c_ssize_t +from ctypes import c_ulong +from ctypes import c_void_p +from ctypes import POINTER +from ctypes import py_object +from ctypes import windll +from ctypes import WinError +from ctypes import WINFUNCTYPE +from ctypes.wintypes import DWORD +from ctypes.wintypes import HANDLE +from ctypes.wintypes import LPCWSTR +from ctypes.wintypes import LPWSTR + +import msvcrt + +from ._compat import _NonClosingTextIOWrapper +from ._compat import PY2 +from ._compat import text_type + +try: + from ctypes import pythonapi + + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release +except ImportError: + pythonapi = None + + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetConsoleMode = kernel32.GetConsoleMode +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ("CommandLineToArgvW", windll.shell32) +) +LocalFree = WINFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p)( + ("LocalFree", windll.kernel32) +) + + +STDIN_HANDLE = GetStdHandle(-10) +STDOUT_HANDLE = GetStdHandle(-11) +STDERR_HANDLE = GetStdHandle(-12) + + +PyBUF_SIMPLE = 0 +PyBUF_WRITABLE = 1 + +ERROR_SUCCESS = 0 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_OPERATION_ABORTED = 995 + +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 + +EOF = b"\x1a" +MAX_BYTES_WRITTEN = 32767 + + +class Py_buffer(ctypes.Structure): + _fields_ = [ + ("buf", c_void_p), + ("obj", py_object), + ("len", c_ssize_t), + ("itemsize", c_ssize_t), + ("readonly", c_int), + ("ndim", c_int), + ("format", c_char_p), + ("shape", c_ssize_p), + ("strides", c_ssize_p), + ("suboffsets", c_ssize_p), + ("internal", c_void_p), + ] + + if PY2: + _fields_.insert(-1, ("smalltable", c_ssize_t * 2)) + + +# On PyPy we cannot get buffers so our ability to operate here is +# serverly limited. +if pythonapi is None: + get_buffer = None +else: + + def get_buffer(obj, writable=False): + buf = Py_buffer() + flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + try: + buffer_type = c_char * buf.len + return buffer_type.from_address(buf.buf) + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + def __init__(self, handle): + self.handle = handle + + def isatty(self): + io.RawIOBase.isatty(self) + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + def readable(self): + return True + + def readinto(self, b): + bytes_to_be_read = len(b) + if not bytes_to_be_read: + return 0 + elif bytes_to_be_read % 2: + raise ValueError( + "cannot read odd number of bytes from UTF-16-LE encoded console" + ) + + buffer = get_buffer(b, writable=True) + code_units_to_be_read = bytes_to_be_read // 2 + code_units_read = c_ulong() + + rv = ReadConsoleW( + HANDLE(self.handle), + buffer, + code_units_to_be_read, + byref(code_units_read), + None, + ) + if GetLastError() == ERROR_OPERATION_ABORTED: + # wait for KeyboardInterrupt + time.sleep(0.1) + if not rv: + raise OSError("Windows error: {}".format(GetLastError())) + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + def writable(self): + return True + + @staticmethod + def _get_error_message(errno): + if errno == ERROR_SUCCESS: + return "ERROR_SUCCESS" + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return "ERROR_NOT_ENOUGH_MEMORY" + return "Windows error {}".format(errno) + + def write(self, b): + bytes_to_be_written = len(b) + buf = get_buffer(b) + code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 + code_units_written = c_ulong() + + WriteConsoleW( + HANDLE(self.handle), + buf, + code_units_to_be_written, + byref(code_units_written), + None, + ) + bytes_written = 2 * code_units_written.value + + if bytes_written == 0 and bytes_to_be_written > 0: + raise OSError(self._get_error_message(GetLastError())) + return bytes_written + + +class ConsoleStream(object): + def __init__(self, text_stream, byte_stream): + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self): + return self.buffer.name + + def write(self, x): + if isinstance(x, text_type): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __getattr__(self, name): + return getattr(self._text_stream, name) + + def isatty(self): + return self.buffer.isatty() + + def __repr__(self): + return "".format( + self.name, self.encoding + ) + + +class WindowsChunkedWriter(object): + """ + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()' which we wrap to write in + limited chunks due to a Windows limitation on binary console streams. + """ + + def __init__(self, wrapped): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def write(self, text): + total_to_write = len(text) + written = 0 + + while written < total_to_write: + to_write = min(total_to_write - written, MAX_BYTES_WRITTEN) + self.__wrapped.write(text[written : written + to_write]) + written += to_write + + +_wrapped_std_streams = set() + + +def _wrap_std_stream(name): + # Python 2 & Windows 7 and below + if ( + PY2 + and sys.getwindowsversion()[:2] <= (6, 1) + and name not in _wrapped_std_streams + ): + setattr(sys, name, WindowsChunkedWriter(getattr(sys, name))) + _wrapped_std_streams.add(name) + + +def _get_text_stdin(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stdout(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stderr(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return ConsoleStream(text_stream, buffer_stream) + + +if PY2: + + def _hash_py_argv(): + return zlib.crc32("\x00".join(sys.argv[1:])) + + _initial_argv_hash = _hash_py_argv() + + def _get_windows_argv(): + argc = c_int(0) + argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc)) + if not argv_unicode: + raise WinError() + try: + argv = [argv_unicode[i] for i in range(0, argc.value)] + finally: + LocalFree(argv_unicode) + del argv_unicode + + if not hasattr(sys, "frozen"): + argv = argv[1:] + while len(argv) > 0: + arg = argv[0] + if not arg.startswith("-") or arg == "-": + break + argv = argv[1:] + if arg.startswith(("-c", "-m")): + break + + return argv[1:] + + +_stream_factories = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _is_console(f): + if not hasattr(f, "fileno"): + return False + + try: + fileno = f.fileno() + except OSError: + return False + + handle = msvcrt.get_osfhandle(fileno) + return bool(GetConsoleMode(handle, byref(DWORD()))) + + +def _get_windows_console_stream(f, encoding, errors): + if ( + get_buffer is not None + and encoding in ("utf-16-le", None) + and errors in ("strict", None) + and _is_console(f) + ): + func = _stream_factories.get(f.fileno()) + if func is not None: + if not PY2: + f = getattr(f, "buffer", None) + if f is None: + return None + else: + # If we are on Python 2 we need to set the stream that we + # deal with to binary mode as otherwise the exercise if a + # bit moot. The same problems apply as for + # get_binary_stdin and friends from _compat. + msvcrt.setmode(f.fileno(), os.O_BINARY) + return func(f) diff --git a/brightonpy/Lib/site-packages/click/core.py b/brightonpy/Lib/site-packages/click/core.py new file mode 100644 index 0000000..f58bf26 --- /dev/null +++ b/brightonpy/Lib/site-packages/click/core.py @@ -0,0 +1,2030 @@ +import errno +import inspect +import os +import sys +from contextlib import contextmanager +from functools import update_wrapper +from itertools import repeat + +from ._compat import isidentifier +from ._compat import iteritems +from ._compat import PY2 +from ._compat import string_types +from ._unicodefun import _check_for_unicode_literals +from ._unicodefun import _verify_python3_env +from .exceptions import Abort +from .exceptions import BadParameter +from .exceptions import ClickException +from .exceptions import Exit +from .exceptions import MissingParameter +from .exceptions import UsageError +from .formatting import HelpFormatter +from .formatting import join_options +from .globals import pop_context +from .globals import push_context +from .parser import OptionParser +from .parser import split_opt +from .termui import confirm +from .termui import prompt +from .termui import style +from .types import BOOL +from .types import convert_type +from .types import IntRange +from .utils import echo +from .utils import get_os_args +from .utils import make_default_short_help +from .utils import make_str +from .utils import PacifyFlushWrapper + +_missing = object() + +SUBCOMMAND_METAVAR = "COMMAND [ARGS]..." +SUBCOMMANDS_METAVAR = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." + +DEPRECATED_HELP_NOTICE = " (DEPRECATED)" +DEPRECATED_INVOKE_NOTICE = "DeprecationWarning: The command %(name)s is deprecated." + + +def _maybe_show_deprecated_notice(cmd): + if cmd.deprecated: + echo(style(DEPRECATED_INVOKE_NOTICE % {"name": cmd.name}, fg="red"), err=True) + + +def fast_exit(code): + """Exit without garbage collection, this speeds up exit by about 10ms for + things like bash completion. + """ + sys.stdout.flush() + sys.stderr.flush() + os._exit(code) + + +def _bashcomplete(cmd, prog_name, complete_var=None): + """Internal handler for the bash completion support.""" + if complete_var is None: + complete_var = "_{}_COMPLETE".format(prog_name.replace("-", "_").upper()) + complete_instr = os.environ.get(complete_var) + if not complete_instr: + return + + from ._bashcomplete import bashcomplete + + if bashcomplete(cmd, prog_name, complete_var, complete_instr): + fast_exit(1) + + +def _check_multicommand(base_command, cmd_name, cmd, register=False): + if not base_command.chain or not isinstance(cmd, MultiCommand): + return + if register: + hint = ( + "It is not possible to add multi commands as children to" + " another multi command that is in chain mode." + ) + else: + hint = ( + "Found a multi command as subcommand to a multi command" + " that is in chain mode. This is not supported." + ) + raise RuntimeError( + "{}. Command '{}' is set to chain and '{}' was added as" + " subcommand but it in itself is a multi command. ('{}' is a {}" + " within a chained {} named '{}').".format( + hint, + base_command.name, + cmd_name, + cmd_name, + cmd.__class__.__name__, + base_command.__class__.__name__, + base_command.name, + ) + ) + + +def batch(iterable, batch_size): + return list(zip(*repeat(iter(iterable), batch_size))) + + +def invoke_param_callback(callback, ctx, param, value): + code = getattr(callback, "__code__", None) + args = getattr(code, "co_argcount", 3) + + if args < 3: + from warnings import warn + + warn( + "Parameter callbacks take 3 args, (ctx, param, value). The" + " 2-arg style is deprecated and will be removed in 8.0.".format(callback), + DeprecationWarning, + stacklevel=3, + ) + return callback(ctx, value) + + return callback(ctx, param, value) + + +@contextmanager +def augment_usage_errors(ctx, param=None): + """Context manager that attaches extra information to exceptions.""" + try: + yield + except BadParameter as e: + if e.ctx is None: + e.ctx = ctx + if param is not None and e.param is None: + e.param = param + raise + except UsageError as e: + if e.ctx is None: + e.ctx = ctx + raise + + +def iter_params_for_processing(invocation_order, declaration_order): + """Given a sequence of parameters in the order as should be considered + for processing and an iterable of parameters that exist, this returns + a list in the correct order as they should be processed. + """ + + def sort_key(item): + try: + idx = invocation_order.index(item) + except ValueError: + idx = float("inf") + return (not item.is_eager, idx) + + return sorted(declaration_order, key=sort_key) + + +class Context(object): + """The context is a special internal object that holds state relevant + for the script execution at every single level. It's normally invisible + to commands unless they opt-in to getting access to it. + + The context is useful as it can pass internal objects around and can + control special execution features such as reading data from + environment variables. + + A context can be used as context manager in which case it will call + :meth:`close` on teardown. + + .. versionadded:: 2.0 + Added the `resilient_parsing`, `help_option_names`, + `token_normalize_func` parameters. + + .. versionadded:: 3.0 + Added the `allow_extra_args` and `allow_interspersed_args` + parameters. + + .. versionadded:: 4.0 + Added the `color`, `ignore_unknown_options`, and + `max_content_width` parameters. + + .. versionadded:: 7.1 + Added the `show_default` parameter. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. Default values will also be + ignored. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + :param show_default: if True, shows defaults for all options. + Even if an option is later created with show_default=False, + this command-level setting overrides it. + """ + + def __init__( + self, + command, + parent=None, + info_name=None, + obj=None, + auto_envvar_prefix=None, + default_map=None, + terminal_width=None, + max_content_width=None, + resilient_parsing=False, + allow_extra_args=None, + allow_interspersed_args=None, + ignore_unknown_options=None, + help_option_names=None, + token_normalize_func=None, + color=None, + show_default=None, + ): + #: the parent context or `None` if none exists. + self.parent = parent + #: the :class:`Command` for this context. + self.command = command + #: the descriptive information name + self.info_name = info_name + #: the parsed parameters except if the value is hidden in which + #: case it's not remembered. + self.params = {} + #: the leftover arguments. + self.args = [] + #: protected arguments. These are arguments that are prepended + #: to `args` when certain parsing scenarios are encountered but + #: must be never propagated to another arguments. This is used + #: to implement nested parsing. + self.protected_args = [] + if obj is None and parent is not None: + obj = parent.obj + #: the user object stored. + self.obj = obj + self._meta = getattr(parent, "meta", {}) + + #: A dictionary (-like object) with defaults for parameters. + if ( + default_map is None + and parent is not None + and parent.default_map is not None + ): + default_map = parent.default_map.get(info_name) + self.default_map = default_map + + #: This flag indicates if a subcommand is going to be executed. A + #: group callback can use this information to figure out if it's + #: being executed directly or because the execution flow passes + #: onwards to a subcommand. By default it's None, but it can be + #: the name of the subcommand to execute. + #: + #: If chaining is enabled this will be set to ``'*'`` in case + #: any commands are executed. It is however not possible to + #: figure out which ones. If you require this knowledge you + #: should use a :func:`resultcallback`. + self.invoked_subcommand = None + + if terminal_width is None and parent is not None: + terminal_width = parent.terminal_width + #: The width of the terminal (None is autodetection). + self.terminal_width = terminal_width + + if max_content_width is None and parent is not None: + max_content_width = parent.max_content_width + #: The maximum width of formatted content (None implies a sensible + #: default which is 80 for most things). + self.max_content_width = max_content_width + + if allow_extra_args is None: + allow_extra_args = command.allow_extra_args + #: Indicates if the context allows extra args or if it should + #: fail on parsing. + #: + #: .. versionadded:: 3.0 + self.allow_extra_args = allow_extra_args + + if allow_interspersed_args is None: + allow_interspersed_args = command.allow_interspersed_args + #: Indicates if the context allows mixing of arguments and + #: options or not. + #: + #: .. versionadded:: 3.0 + self.allow_interspersed_args = allow_interspersed_args + + if ignore_unknown_options is None: + ignore_unknown_options = command.ignore_unknown_options + #: Instructs click to ignore options that a command does not + #: understand and will store it on the context for later + #: processing. This is primarily useful for situations where you + #: want to call into external programs. Generally this pattern is + #: strongly discouraged because it's not possibly to losslessly + #: forward all arguments. + #: + #: .. versionadded:: 4.0 + self.ignore_unknown_options = ignore_unknown_options + + if help_option_names is None: + if parent is not None: + help_option_names = parent.help_option_names + else: + help_option_names = ["--help"] + + #: The names for the help options. + self.help_option_names = help_option_names + + if token_normalize_func is None and parent is not None: + token_normalize_func = parent.token_normalize_func + + #: An optional normalization function for tokens. This is + #: options, choices, commands etc. + self.token_normalize_func = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures and default values + #: will be ignored. Useful for completion. + self.resilient_parsing = resilient_parsing + + # If there is no envvar prefix yet, but the parent has one and + # the command on this level has a name, we can expand the envvar + # prefix automatically. + if auto_envvar_prefix is None: + if ( + parent is not None + and parent.auto_envvar_prefix is not None + and self.info_name is not None + ): + auto_envvar_prefix = "{}_{}".format( + parent.auto_envvar_prefix, self.info_name.upper() + ) + else: + auto_envvar_prefix = auto_envvar_prefix.upper() + if auto_envvar_prefix is not None: + auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") + self.auto_envvar_prefix = auto_envvar_prefix + + if color is None and parent is not None: + color = parent.color + + #: Controls if styling output is wanted or not. + self.color = color + + self.show_default = show_default + + self._close_callbacks = [] + self._depth = 0 + + def __enter__(self): + self._depth += 1 + push_context(self) + return self + + def __exit__(self, exc_type, exc_value, tb): + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup=True): + """This helper method can be used with the context object to promote + it to the current thread local (see :func:`get_current_context`). + The default behavior of this is to invoke the cleanup functions which + can be disabled by setting `cleanup` to `False`. The cleanup + functions are typically used for things such as closing file handles. + + If the cleanup is intended the context object can also be directly + used as a context manager. + + Example usage:: + + with ctx.scope(): + assert get_current_context() is ctx + + This is equivalent:: + + with ctx: + assert get_current_context() is ctx + + .. versionadded:: 5.0 + + :param cleanup: controls if the cleanup functions should be run or + not. The default is to run these functions. In + some situations the context only wants to be + temporarily pushed in which case this can be disabled. + Nested pushes automatically defer the cleanup. + """ + if not cleanup: + self._depth += 1 + try: + with self as rv: + yield rv + finally: + if not cleanup: + self._depth -= 1 + + @property + def meta(self): + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utilities can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = f'{__name__}.lang' + + def set_language(value): + ctx = get_current_context() + ctx.meta[LANG_KEY] = value + + def get_language(): + return get_current_context().meta.get(LANG_KEY, 'en_US') + + .. versionadded:: 5.0 + """ + return self._meta + + def make_formatter(self): + """Creates the formatter for the help and usage output.""" + return HelpFormatter( + width=self.terminal_width, max_width=self.max_content_width + ) + + def call_on_close(self, f): + """This decorator remembers a function as callback that should be + executed when the context tears down. This is most useful to bind + resource handling to the script execution. For instance, file objects + opened by the :class:`File` type will register their close callbacks + here. + + :param f: the function to execute on teardown. + """ + self._close_callbacks.append(f) + return f + + def close(self): + """Invokes all close callbacks.""" + for cb in self._close_callbacks: + cb() + self._close_callbacks = [] + + @property + def command_path(self): + """The computed command path. This is used for the ``usage`` + information on the help page. It's automatically created by + combining the info names of the chain of contexts to the root. + """ + rv = "" + if self.info_name is not None: + rv = self.info_name + if self.parent is not None: + rv = "{} {}".format(self.parent.command_path, rv) + return rv.lstrip() + + def find_root(self): + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type): + """Finds the closest object of a given type.""" + node = self + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + node = node.parent + + def ensure_object(self, object_type): + """Like :meth:`find_object` but sets the innermost object to a + new instance of `object_type` if it does not exist. + """ + rv = self.find_object(object_type) + if rv is None: + self.obj = rv = object_type() + return rv + + def lookup_default(self, name): + """Looks up the default for a parameter name. This by default + looks into the :attr:`default_map` if available. + """ + if self.default_map is not None: + rv = self.default_map.get(name) + if callable(rv): + rv = rv() + return rv + + def fail(self, message): + """Aborts the execution of the program with a specific error + message. + + :param message: the error message to fail with. + """ + raise UsageError(message, self) + + def abort(self): + """Aborts the script.""" + raise Abort() + + def exit(self, code=0): + """Exits the application with a given exit code.""" + raise Exit(code) + + def get_usage(self): + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self): + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def invoke(*args, **kwargs): # noqa: B902 + """Invokes a command callback in exactly the way it expects. There + are two ways to invoke this method: + + 1. the first argument can be a callback and all other arguments and + keyword arguments are forwarded directly to the function. + 2. the first argument is a click command object. In that case all + arguments are forwarded as well but proper click parameters + (options and click arguments) must be keyword arguments and Click + will fill in defaults. + + Note that before Click 3.2 keyword arguments were not properly filled + in against the intention of this code and no context was created. For + more information about this change and why it was done in a bugfix + release see :ref:`upgrade-to-3.2`. + """ + self, callback = args[:2] + ctx = self + + # It's also possible to invoke another command which might or + # might not have a callback. In that case we also fill + # in defaults and make a new context for this command. + if isinstance(callback, Command): + other_cmd = callback + callback = other_cmd.callback + ctx = Context(other_cmd, info_name=other_cmd.name, parent=self) + if callback is None: + raise TypeError( + "The given command does not have a callback that can be invoked." + ) + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.get_default(ctx) + + args = args[2:] + with augment_usage_errors(self): + with ctx: + return callback(*args, **kwargs) + + def forward(*args, **kwargs): # noqa: B902 + """Similar to :meth:`invoke` but fills in default keyword + arguments from the current context if the other command expects + it. This cannot invoke callbacks directly, only other commands. + """ + self, cmd = args[:2] + + # It's also possible to invoke another command which might or + # might not have a callback. + if not isinstance(cmd, Command): + raise TypeError("Callback is not a command.") + + for param in self.params: + if param not in kwargs: + kwargs[param] = self.params[param] + + return self.invoke(cmd, **kwargs) + + +class BaseCommand(object): + """The base command implements the minimal API contract of commands. + Most code will never use this as it does not implement a lot of useful + functionality but it can act as the direct subclass of alternative + parsing methods that do not depend on the Click parser. + + For instance, this can be used to bridge Click and other systems like + argparse or docopt. + + Because base commands do not implement a lot of the API that other + parts of Click take for granted, they are not supported for all + operations. For instance, they cannot be used with the decorators + usually and they have no built-in callback system. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + """ + + #: the default for the :attr:`Context.allow_extra_args` flag. + allow_extra_args = False + #: the default for the :attr:`Context.allow_interspersed_args` flag. + allow_interspersed_args = True + #: the default for the :attr:`Context.ignore_unknown_options` flag. + ignore_unknown_options = False + + def __init__(self, name, context_settings=None): + #: the name the command thinks it has. Upon registering a command + #: on a :class:`Group` the group will default the command name + #: with this information. You should instead use the + #: :class:`Context`\'s :attr:`~Context.info_name` attribute. + self.name = name + if context_settings is None: + context_settings = {} + #: an optional dictionary with defaults passed to the context. + self.context_settings = context_settings + + def __repr__(self): + return "<{} {}>".format(self.__class__.__name__, self.name) + + def get_usage(self, ctx): + raise NotImplementedError("Base commands cannot get usage") + + def get_help(self, ctx): + raise NotImplementedError("Base commands cannot get help") + + def make_context(self, info_name, args, parent=None, **extra): + """This function when given an info name and arguments will kick + off the parsing and create a new :class:`Context`. It does not + invoke the actual command callback though. + + :param info_name: the info name for this invokation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it's usually + the name of the script, for commands below it it's + the name of the script. + :param args: the arguments to parse as list of strings. + :param parent: the parent context if available. + :param extra: extra keyword arguments forwarded to the context + constructor. + """ + for key, value in iteritems(self.context_settings): + if key not in extra: + extra[key] = value + ctx = Context(self, info_name=info_name, parent=parent, **extra) + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx, args): + """Given a context and a list of arguments this creates the parser + and parses the arguments, then modifies the context as necessary. + This is automatically invoked by :meth:`make_context`. + """ + raise NotImplementedError("Base commands do not know how to parse arguments.") + + def invoke(self, ctx): + """Given a context, this invokes the command. The default + implementation is raising a not implemented error. + """ + raise NotImplementedError("Base commands are not invokable by default") + + def main( + self, + args=None, + prog_name=None, + complete_var=None, + standalone_mode=True, + **extra + ): + """This is the way to invoke a script with all the bells and + whistles as a command line application. This will always terminate + the application after a call. If this is not wanted, ``SystemExit`` + needs to be caught. + + This method is also available by directly calling the instance of + a :class:`Command`. + + .. versionadded:: 3.0 + Added the `standalone_mode` flag to control the standalone mode. + + :param args: the arguments that should be used for parsing. If not + provided, ``sys.argv[1:]`` is used. + :param prog_name: the program name that should be used. By default + the program name is constructed by taking the file + name from ``sys.argv[0]``. + :param complete_var: the environment variable that controls the + bash completion support. The default is + ``"__COMPLETE"`` with prog_name in + uppercase. + :param standalone_mode: the default behavior is to invoke the script + in standalone mode. Click will then + handle exceptions and convert them into + error messages and the function will never + return but shut down the interpreter. If + this is set to `False` they will be + propagated to the caller and the return + value of this function is the return value + of :meth:`invoke`. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + """ + # If we are in Python 3, we will verify that the environment is + # sane at this point or reject further execution to avoid a + # broken script. + if not PY2: + _verify_python3_env() + else: + _check_for_unicode_literals() + + if args is None: + args = get_os_args() + else: + args = list(args) + + if prog_name is None: + prog_name = make_str( + os.path.basename(sys.argv[0] if sys.argv else __file__) + ) + + # Hook for the Bash completion. This only activates if the Bash + # completion is actually enabled, otherwise this is quite a fast + # noop. + _bashcomplete(self, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + # it's not safe to `ctx.exit(rv)` here! + # note that `rv` may actually contain data like "1" which + # has obvious effects + # more subtle case: `rv=[None, None]` can come out of + # chained commands which all returned `None` -- so it's not + # even always obvious that `rv` indicates success/failure + # by its truthiness/falsiness + ctx.exit() + except (EOFError, KeyboardInterrupt): + echo(file=sys.stderr) + raise Abort() + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except IOError as e: + if e.errno == errno.EPIPE: + sys.stdout = PacifyFlushWrapper(sys.stdout) + sys.stderr = PacifyFlushWrapper(sys.stderr) + sys.exit(1) + else: + raise + except Exit as e: + if standalone_mode: + sys.exit(e.exit_code) + else: + # in non-standalone mode, return the exit code + # note that this is only reached if `self.invoke` above raises + # an Exit explicitly -- thus bypassing the check there which + # would return its result + # the results of non-standalone execution may therefore be + # somewhat ambiguous: if there are codepaths which lead to + # `ctx.exit(1)` and to `return 1`, the caller won't be able to + # tell the difference between the two + return e.exit_code + except Abort: + if not standalone_mode: + raise + echo("Aborted!", file=sys.stderr) + sys.exit(1) + + def __call__(self, *args, **kwargs): + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class Command(BaseCommand): + """Commands are the basic building block of command line interfaces in + Click. A basic command handles command line parsing and might dispatch + more parsing to commands nested below it. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + .. versionchanged:: 7.1 + Added the `no_args_is_help` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is disabled by default. + If enabled this will add ``--help`` as argument + if no arguments are passed + :param hidden: hide this command from help outputs. + + :param deprecated: issues a message indicating that + the command is deprecated. + """ + + def __init__( + self, + name, + context_settings=None, + callback=None, + params=None, + help=None, + epilog=None, + short_help=None, + options_metavar="[OPTIONS]", + add_help_option=True, + no_args_is_help=False, + hidden=False, + deprecated=False, + ): + BaseCommand.__init__(self, name, context_settings) + #: the callback to execute when the command fires. This might be + #: `None` in which case nothing happens. + self.callback = callback + #: the list of parameters for this command in the order they + #: should show up in the help page and execute. Eager parameters + #: will automatically be handled before non eager ones. + self.params = params or [] + # if a form feed (page break) is found in the help text, truncate help + # text to the content preceding the first form feed + if help and "\f" in help: + help = help.split("\f", 1)[0] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self.no_args_is_help = no_args_is_help + self.hidden = hidden + self.deprecated = deprecated + + def get_usage(self, ctx): + """Formats the usage line into a string and returns it. + + Calls :meth:`format_usage` internally. + """ + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_params(self, ctx): + rv = self.params + help_option = self.get_help_option(ctx) + if help_option is not None: + rv = rv + [help_option] + return rv + + def format_usage(self, ctx, formatter): + """Writes the usage line into the formatter. + + This is a low-level method called by :meth:`get_usage`. + """ + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, " ".join(pieces)) + + def collect_usage_pieces(self, ctx): + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + return rv + + def get_help_option_names(self, ctx): + """Returns the names for the help option.""" + all_names = set(ctx.help_option_names) + for param in self.params: + all_names.difference_update(param.opts) + all_names.difference_update(param.secondary_opts) + return all_names + + def get_help_option(self, ctx): + """Returns the help option object.""" + help_options = self.get_help_option_names(ctx) + if not help_options or not self.add_help_option: + return + + def show_help(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + return Option( + help_options, + is_flag=True, + is_eager=True, + expose_value=False, + callback=show_help, + help="Show this message and exit.", + ) + + def make_parser(self, ctx): + """Creates the underlying option parser for this command.""" + parser = OptionParser(ctx) + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx): + """Formats the help into a string and returns it. + + Calls :meth:`format_help` internally. + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_short_help_str(self, limit=45): + """Gets short help for the command or makes it by shortening the + long help string. + """ + return ( + self.short_help + or self.help + and make_default_short_help(self.help, limit) + or "" + ) + + def format_help(self, ctx, formatter): + """Writes the help into the formatter if it exists. + + This is a low-level method called by :meth:`get_help`. + + This calls the following methods: + + - :meth:`format_usage` + - :meth:`format_help_text` + - :meth:`format_options` + - :meth:`format_epilog` + """ + self.format_usage(ctx, formatter) + self.format_help_text(ctx, formatter) + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + def format_help_text(self, ctx, formatter): + """Writes the help text to the formatter if it exists.""" + if self.help: + formatter.write_paragraph() + with formatter.indentation(): + help_text = self.help + if self.deprecated: + help_text += DEPRECATED_HELP_NOTICE + formatter.write_text(help_text) + elif self.deprecated: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(DEPRECATED_HELP_NOTICE) + + def format_options(self, ctx, formatter): + """Writes all the options into the formatter if they exist.""" + opts = [] + for param in self.get_params(ctx): + rv = param.get_help_record(ctx) + if rv is not None: + opts.append(rv) + + if opts: + with formatter.section("Options"): + formatter.write_dl(opts) + + def format_epilog(self, ctx, formatter): + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(self.epilog) + + def parse_args(self, ctx, args): + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + parser = self.make_parser(ctx) + opts, args, param_order = parser.parse_args(args=args) + + for param in iter_params_for_processing(param_order, self.get_params(ctx)): + value, args = param.handle_parse_result(ctx, opts, args) + + if args and not ctx.allow_extra_args and not ctx.resilient_parsing: + ctx.fail( + "Got unexpected extra argument{} ({})".format( + "s" if len(args) != 1 else "", " ".join(map(make_str, args)) + ) + ) + + ctx.args = args + return args + + def invoke(self, ctx): + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + _maybe_show_deprecated_notice(self) + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + +class MultiCommand(Command): + """A multi command is the basic implementation of a command that + dispatches to subcommands. The most common version is the + :class:`Group`. + + :param invoke_without_command: this controls how the multi command itself + is invoked. By default it's only invoked + if a subcommand is provided. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is enabled by default if + `invoke_without_command` is disabled or disabled + if it's enabled. If enabled this will add + ``--help`` as argument if no arguments are + passed. + :param subcommand_metavar: the string that is used in the documentation + to indicate the subcommand place. + :param chain: if this is set to `True` chaining of multiple subcommands + is enabled. This restricts the form of commands in that + they cannot have optional arguments but it allows + multiple commands to be chained together. + :param result_callback: the result callback to attach to this multi + command. + """ + + allow_extra_args = True + allow_interspersed_args = False + + def __init__( + self, + name=None, + invoke_without_command=False, + no_args_is_help=None, + subcommand_metavar=None, + chain=False, + result_callback=None, + **attrs + ): + Command.__init__(self, name, **attrs) + if no_args_is_help is None: + no_args_is_help = not invoke_without_command + self.no_args_is_help = no_args_is_help + self.invoke_without_command = invoke_without_command + if subcommand_metavar is None: + if chain: + subcommand_metavar = SUBCOMMANDS_METAVAR + else: + subcommand_metavar = SUBCOMMAND_METAVAR + self.subcommand_metavar = subcommand_metavar + self.chain = chain + #: The result callback that is stored. This can be set or + #: overridden with the :func:`resultcallback` decorator. + self.result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError( + "Multi commands in chain mode cannot have" + " optional arguments." + ) + + def collect_usage_pieces(self, ctx): + rv = Command.collect_usage_pieces(self, ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx, formatter): + Command.format_options(self, ctx, formatter) + self.format_commands(ctx, formatter) + + def resultcallback(self, replace=False): + """Adds a result callback to the chain command. By default if a + result callback is already registered this will chain them but + this can be disabled with the `replace` parameter. The result + callback is invoked with the return value of the subcommand + (or the list of return values from all subcommands if chaining + is enabled) as well as the parameters as they would be passed + to the main callback. + + Example:: + + @click.group() + @click.option('-i', '--input', default=23) + def cli(input): + return 42 + + @cli.resultcallback() + def process_result(result, input): + return result + input + + .. versionadded:: 3.0 + + :param replace: if set to `True` an already existing result + callback will be removed. + """ + + def decorator(f): + old_callback = self.result_callback + if old_callback is None or replace: + self.result_callback = f + return f + + def function(__value, *args, **kwargs): + return f(old_callback(__value, *args, **kwargs), *args, **kwargs) + + self.result_callback = rv = update_wrapper(function, f) + return rv + + return decorator + + def format_commands(self, ctx, formatter): + """Extra format methods for multi methods that adds all the commands + after the options. + """ + commands = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + if cmd.hidden: + continue + + commands.append((subcommand, cmd)) + + # allow for 3 times the default spacing + if len(commands): + limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) + + rows = [] + for subcommand, cmd in commands: + help = cmd.get_short_help_str(limit) + rows.append((subcommand, help)) + + if rows: + with formatter.section("Commands"): + formatter.write_dl(rows) + + def parse_args(self, ctx, args): + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + rest = Command.parse_args(self, ctx, args) + if self.chain: + ctx.protected_args = rest + ctx.args = [] + elif rest: + ctx.protected_args, ctx.args = rest[:1], rest[1:] + + return ctx.args + + def invoke(self, ctx): + def _process_result(value): + if self.result_callback is not None: + value = ctx.invoke(self.result_callback, value, **ctx.params) + return value + + if not ctx.protected_args: + # If we are invoked without command the chain flag controls + # how this happens. If we are not in chain mode, the return + # value here is the return value of the command. + # If however we are in chain mode, the return value is the + # return value of the result processor invoked with an empty + # list (which means that no subcommand actually was executed). + if self.invoke_without_command: + if not self.chain: + return Command.invoke(self, ctx) + with ctx: + Command.invoke(self, ctx) + return _process_result([]) + ctx.fail("Missing command.") + + # Fetch args back out + args = ctx.protected_args + ctx.args + ctx.args = [] + ctx.protected_args = [] + + # If we're not in chain mode, we only allow the invocation of a + # single command but we also inform the current context about the + # name of the command to invoke. + if not self.chain: + # Make sure the context is entered so we do not clean up + # resources until the result processor has worked. + with ctx: + cmd_name, cmd, args = self.resolve_command(ctx, args) + ctx.invoked_subcommand = cmd_name + Command.invoke(self, ctx) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) + with sub_ctx: + return _process_result(sub_ctx.command.invoke(sub_ctx)) + + # In chain mode we create the contexts step by step, but after the + # base command has been invoked. Because at that point we do not + # know the subcommands yet, the invoked subcommand attribute is + # set to ``*`` to inform the command that subcommands are executed + # but nothing else. + with ctx: + ctx.invoked_subcommand = "*" if args else None + Command.invoke(self, ctx) + + # Otherwise we make every single context and invoke them in a + # chain. In that case the return value to the result processor + # is the list of all invoked subcommand's results. + contexts = [] + while args: + cmd_name, cmd, args = self.resolve_command(ctx, args) + sub_ctx = cmd.make_context( + cmd_name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + ) + contexts.append(sub_ctx) + args, sub_ctx.args = sub_ctx.args, [] + + rv = [] + for sub_ctx in contexts: + with sub_ctx: + rv.append(sub_ctx.command.invoke(sub_ctx)) + return _process_result(rv) + + def resolve_command(self, ctx, args): + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None and not ctx.resilient_parsing: + if split_opt(cmd_name)[0]: + self.parse_args(ctx, ctx.args) + ctx.fail("No such command '{}'.".format(original_cmd_name)) + + return cmd_name, cmd, args[1:] + + def get_command(self, ctx, cmd_name): + """Given a context and a command name, this returns a + :class:`Command` object if it exists or returns `None`. + """ + raise NotImplementedError() + + def list_commands(self, ctx): + """Returns a list of subcommand names in the order they should + appear. + """ + return [] + + +class Group(MultiCommand): + """A group allows a command to have subcommands attached. This is the + most common way to implement nesting in Click. + + :param commands: a dictionary of commands. + """ + + def __init__(self, name=None, commands=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: the registered subcommands by their exported names. + self.commands = commands or {} + + def add_command(self, cmd, name=None): + """Registers another :class:`Command` with this group. If the name + is not provided, the name of the command is used. + """ + name = name or cmd.name + if name is None: + raise TypeError("Command has no name.") + _check_multicommand(self, name, cmd, register=True) + self.commands[name] = cmd + + def command(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + from .decorators import command + + def decorator(f): + cmd = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + return decorator + + def group(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + from .decorators import group + + def decorator(f): + cmd = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + return decorator + + def get_command(self, ctx, cmd_name): + return self.commands.get(cmd_name) + + def list_commands(self, ctx): + return sorted(self.commands) + + +class CommandCollection(MultiCommand): + """A command collection is a multi command that merges multiple multi + commands together into one. This is a straightforward implementation + that accepts a list of different multi commands as sources and + provides all the commands for each of them. + """ + + def __init__(self, name=None, sources=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: The list of registered multi commands. + self.sources = sources or [] + + def add_source(self, multi_cmd): + """Adds a new multi command to the chain dispatcher.""" + self.sources.append(multi_cmd) + + def get_command(self, ctx, cmd_name): + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + if rv is not None: + if self.chain: + _check_multicommand(self, cmd_name, rv) + return rv + + def list_commands(self, ctx): + rv = set() + for source in self.sources: + rv.update(source.list_commands(ctx)) + return sorted(rv) + + +class Parameter(object): + r"""A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + :param param_decls: the parameter declarations for this option or + argument. This is a list of flags or argument + names. + :param type: the type that should be used. Either a :class:`ParamType` + or a Python type. The later is converted into the former + automatically if supported. + :param required: controls if this is optional or not. + :param default: the default value if omitted. This can also be a callable, + in which case it's invoked when the default is needed + without any arguments. + :param callback: a callback that should be executed after the parameter + was matched. This is called as ``fn(ctx, param, + value)`` and needs to return the value. + :param nargs: the number of arguments to match. If not ``1`` the return + value is a tuple instead of single value. The default for + nargs is ``1`` (except if the type is a tuple, then it's + the arity of the tuple). + :param metavar: how the value is represented in the help page. + :param expose_value: if this is `True` then the value is passed onwards + to the command callback and stored on the context, + otherwise it's skipped. + :param is_eager: eager values are processed before non eager ones. This + should not be set for arguments or it will inverse the + order of processing. + :param envvar: a string or list of strings that are environment variables + that should be checked. + + .. versionchanged:: 7.1 + Empty environment variables are ignored rather than taking the + empty string value. This makes it possible for scripts to clear + variables if they can't unset them. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. The old callback format will still work, but it will + raise a warning to give you a chance to migrate the code easier. + """ + param_type_name = "parameter" + + def __init__( + self, + param_decls=None, + type=None, + required=False, + default=None, + callback=None, + nargs=None, + metavar=None, + expose_value=True, + is_eager=False, + envvar=None, + autocompletion=None, + ): + self.name, self.opts, self.secondary_opts = self._parse_decls( + param_decls or (), expose_value + ) + + self.type = convert_type(type, default) + + # Default nargs to what the type tells us if we have that + # information available. + if nargs is None: + if self.type.is_composite: + nargs = self.type.arity + else: + nargs = 1 + + self.required = required + self.callback = callback + self.nargs = nargs + self.multiple = False + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + self.autocompletion = autocompletion + + def __repr__(self): + return "<{} {}>".format(self.__class__.__name__, self.name) + + @property + def human_readable_name(self): + """Returns the human readable name of this parameter. This is the + same as the name for options, but the metavar for arguments. + """ + return self.name + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + metavar = self.type.get_metavar(self) + if metavar is None: + metavar = self.type.name.upper() + if self.nargs != 1: + metavar += "..." + return metavar + + def get_default(self, ctx): + """Given a context variable this calculates the default value.""" + # Otherwise go with the regular default. + if callable(self.default): + rv = self.default() + else: + rv = self.default + return self.type_cast_value(ctx, rv) + + def add_to_parser(self, parser, ctx): + pass + + def consume_value(self, ctx, opts): + value = opts.get(self.name) + if value is None: + value = self.value_from_envvar(ctx) + if value is None: + value = ctx.lookup_default(self.name) + return value + + def type_cast_value(self, ctx, value): + """Given a value this runs it properly through the type system. + This automatically handles things like `nargs` and `multiple` as + well as composite types. + """ + if self.type.is_composite: + if self.nargs <= 1: + raise TypeError( + "Attempted to invoke composite type but nargs has" + " been set to {}. This is not supported; nargs" + " needs to be set to a fixed value > 1.".format(self.nargs) + ) + if self.multiple: + return tuple(self.type(x or (), self, ctx) for x in value or ()) + return self.type(value or (), self, ctx) + + def _convert(value, level): + if level == 0: + return self.type(value, self, ctx) + return tuple(_convert(x, level - 1) for x in value or ()) + + return _convert(value, (self.nargs != 1) + bool(self.multiple)) + + def process_value(self, ctx, value): + """Given a value and context this runs the logic to convert the + value as necessary. + """ + # If the value we were given is None we do nothing. This way + # code that calls this can easily figure out if something was + # not provided. Otherwise it would be converted into an empty + # tuple for multiple invocations which is inconvenient. + if value is not None: + return self.type_cast_value(ctx, value) + + def value_is_missing(self, value): + if value is None: + return True + if (self.nargs != 1 or self.multiple) and value == (): + return True + return False + + def full_process_value(self, ctx, value): + value = self.process_value(ctx, value) + + if value is None and not ctx.resilient_parsing: + value = self.get_default(ctx) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + return value + + def resolve_envvar_value(self, ctx): + if self.envvar is None: + return + if isinstance(self.envvar, (tuple, list)): + for envvar in self.envvar: + rv = os.environ.get(envvar) + if rv is not None: + return rv + else: + rv = os.environ.get(self.envvar) + + if rv != "": + return rv + + def value_from_envvar(self, ctx): + rv = self.resolve_envvar_value(ctx) + if rv is not None and self.nargs != 1: + rv = self.type.split_envvar_value(rv) + return rv + + def handle_parse_result(self, ctx, opts, args): + with augment_usage_errors(ctx, param=self): + value = self.consume_value(ctx, opts) + try: + value = self.full_process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + value = None + if self.callback is not None: + try: + value = invoke_param_callback(self.callback, ctx, self, value) + except Exception: + if not ctx.resilient_parsing: + raise + + if self.expose_value: + ctx.params[self.name] = value + return value, args + + def get_help_record(self, ctx): + pass + + def get_usage_pieces(self, ctx): + return [] + + def get_error_hint(self, ctx): + """Get a stringified version of the param for use in error messages to + indicate which param caused the error. + """ + hint_list = self.opts or [self.human_readable_name] + return " / ".join(repr(x) for x in hint_list) + + +class Option(Parameter): + """Options are usually optional values on the command line and + have some extra features that arguments don't have. + + All other parameters are passed onwards to the parameter constructor. + + :param show_default: controls if the default value should be shown on the + help page. Normally, defaults are not shown. If this + value is a string, it shows the string instead of the + value. This is particularly useful for dynamic options. + :param show_envvar: controls if an environment variable should be shown on + the help page. Normally, environment variables + are not shown. + :param prompt: if set to `True` or a non empty string then the user will be + prompted for input. If set to `True` the prompt will be the + option name capitalized. + :param confirmation_prompt: if set then the value will need to be confirmed + if it was prompted for. + :param hide_input: if this is `True` then the input on the prompt will be + hidden from the user. This is useful for password + input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + :param hidden: hide this option from help outputs. + """ + + param_type_name = "option" + + def __init__( + self, + param_decls=None, + show_default=False, + prompt=False, + confirmation_prompt=False, + hide_input=False, + is_flag=None, + flag_value=None, + multiple=False, + count=False, + allow_from_autoenv=True, + type=None, + help=None, + hidden=False, + show_choices=True, + show_envvar=False, + **attrs + ): + default_is_missing = attrs.get("default", _missing) is _missing + Parameter.__init__(self, param_decls, type=type, **attrs) + + if prompt is True: + prompt_text = self.name.replace("_", " ").capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.hide_input = hide_input + self.hidden = hidden + + # Flags + if is_flag is None: + if flag_value is not None: + is_flag = True + else: + is_flag = bool(self.secondary_opts) + if is_flag and default_is_missing: + self.default = False + if flag_value is None: + flag_value = not self.default + self.is_flag = is_flag + self.flag_value = flag_value + if self.is_flag and isinstance(self.flag_value, bool) and type in [None, bool]: + self.type = BOOL + self.is_bool_flag = True + else: + self.is_bool_flag = False + + # Counting + self.count = count + if count: + if type is None: + self.type = IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.multiple = multiple + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + self.show_choices = show_choices + self.show_envvar = show_envvar + + # Sanity check for stuff we don't support + if __debug__: + if self.nargs < 0: + raise TypeError("Options cannot have nargs < 0") + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError("Cannot prompt for flags that are not bools.") + if not self.is_bool_flag and self.secondary_opts: + raise TypeError("Got secondary option for non boolean flag.") + if self.is_bool_flag and self.hide_input and self.prompt is not None: + raise TypeError("Hidden input does not work with boolean flag prompts.") + if self.count: + if self.multiple: + raise TypeError( + "Options cannot be multiple and count at the same time." + ) + elif self.is_flag: + raise TypeError( + "Options cannot be count and flags at the same time." + ) + + def _parse_decls(self, decls, expose_value): + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if isidentifier(decl): + if name is not None: + raise TypeError("Name defined twice") + name = decl + else: + split_char = ";" if decl[:1] == "/" else "/" + if split_char in decl: + first, second = decl.split(split_char, 1) + first = first.rstrip() + if first: + possible_names.append(split_opt(first)) + opts.append(first) + second = second.lstrip() + if second: + secondary_opts.append(second.lstrip()) + else: + possible_names.append(split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: -len(x[0])) # group long options first + name = possible_names[0][1].replace("-", "_").lower() + if not isidentifier(name): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError("Could not determine name for option") + + if not opts and not secondary_opts: + raise TypeError( + "No options defined but a name was passed ({}). Did you" + " mean to declare an argument instead of an option?".format(name) + ) + + return name, opts, secondary_opts + + def add_to_parser(self, parser, ctx): + kwargs = { + "dest": self.name, + "nargs": self.nargs, + "obj": self, + } + + if self.multiple: + action = "append" + elif self.count: + action = "count" + else: + action = "store" + + if self.is_flag: + kwargs.pop("nargs", None) + action_const = "{}_const".format(action) + if self.is_bool_flag and self.secondary_opts: + parser.add_option(self.opts, action=action_const, const=True, **kwargs) + parser.add_option( + self.secondary_opts, action=action_const, const=False, **kwargs + ) + else: + parser.add_option( + self.opts, action=action_const, const=self.flag_value, **kwargs + ) + else: + kwargs["action"] = action + parser.add_option(self.opts, **kwargs) + + def get_help_record(self, ctx): + if self.hidden: + return + any_prefix_is_slash = [] + + def _write_opts(opts): + rv, any_slashes = join_options(opts) + if any_slashes: + any_prefix_is_slash[:] = [True] + if not self.is_flag and not self.count: + rv += " {}".format(self.make_metavar()) + return rv + + rv = [_write_opts(self.opts)] + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or "" + extra = [] + if self.show_envvar: + envvar = self.envvar + if envvar is None: + if self.allow_from_autoenv and ctx.auto_envvar_prefix is not None: + envvar = "{}_{}".format(ctx.auto_envvar_prefix, self.name.upper()) + if envvar is not None: + extra.append( + "env var: {}".format( + ", ".join(str(d) for d in envvar) + if isinstance(envvar, (list, tuple)) + else envvar + ) + ) + if self.default is not None and (self.show_default or ctx.show_default): + if isinstance(self.show_default, string_types): + default_string = "({})".format(self.show_default) + elif isinstance(self.default, (list, tuple)): + default_string = ", ".join(str(d) for d in self.default) + elif inspect.isfunction(self.default): + default_string = "(dynamic)" + else: + default_string = self.default + extra.append("default: {}".format(default_string)) + + if self.required: + extra.append("required") + if extra: + help = "{}[{}]".format( + "{} ".format(help) if help else "", "; ".join(extra) + ) + + return ("; " if any_prefix_is_slash else " / ").join(rv), help + + def get_default(self, ctx): + # If we're a non boolean flag our default is more complex because + # we need to look at all flags in the same group to figure out + # if we're the the default one in which case we return the flag + # value as default. + if self.is_flag and not self.is_bool_flag: + for param in ctx.command.params: + if param.name == self.name and param.default: + return param.flag_value + return None + return Parameter.get_default(self, ctx) + + def prompt_for_value(self, ctx): + """This is an alternative flow that can be activated in the full + value processing if a value does not exist. It will prompt the + user until a valid value exists and then returns the processed + value as result. + """ + # Calculate the default before prompting anything to be stable. + default = self.get_default(ctx) + + # If this is a prompt for a flag we need to handle this + # differently. + if self.is_bool_flag: + return confirm(self.prompt, default) + + return prompt( + self.prompt, + default=default, + type=self.type, + hide_input=self.hide_input, + show_choices=self.show_choices, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x), + ) + + def resolve_envvar_value(self, ctx): + rv = Parameter.resolve_envvar_value(self, ctx) + if rv is not None: + return rv + if self.allow_from_autoenv and ctx.auto_envvar_prefix is not None: + envvar = "{}_{}".format(ctx.auto_envvar_prefix, self.name.upper()) + return os.environ.get(envvar) + + def value_from_envvar(self, ctx): + rv = self.resolve_envvar_value(ctx) + if rv is None: + return None + value_depth = (self.nargs != 1) + bool(self.multiple) + if value_depth > 0 and rv is not None: + rv = self.type.split_envvar_value(rv) + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + return rv + + def full_process_value(self, ctx, value): + if value is None and self.prompt is not None and not ctx.resilient_parsing: + return self.prompt_for_value(ctx) + return Parameter.full_process_value(self, ctx, value) + + +class Argument(Parameter): + """Arguments are positional parameters to a command. They generally + provide fewer features than options but can have infinite ``nargs`` + and are required by default. + + All parameters are passed onwards to the parameter constructor. + """ + + param_type_name = "argument" + + def __init__(self, param_decls, required=None, **attrs): + if required is None: + if attrs.get("default") is not None: + required = False + else: + required = attrs.get("nargs", 1) > 0 + Parameter.__init__(self, param_decls, required=required, **attrs) + if self.default is not None and self.nargs < 0: + raise TypeError( + "nargs=-1 in combination with a default value is not supported." + ) + + @property + def human_readable_name(self): + if self.metavar is not None: + return self.metavar + return self.name.upper() + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(self) + if not var: + var = self.name.upper() + if not self.required: + var = "[{}]".format(var) + if self.nargs != 1: + var += "..." + return var + + def _parse_decls(self, decls, expose_value): + if not decls: + if not expose_value: + return None, [], [] + raise TypeError("Could not determine name for argument") + if len(decls) == 1: + name = arg = decls[0] + name = name.replace("-", "_").lower() + else: + raise TypeError( + "Arguments take exactly one parameter declaration, got" + " {}".format(len(decls)) + ) + return name, [arg], [] + + def get_usage_pieces(self, ctx): + return [self.make_metavar()] + + def get_error_hint(self, ctx): + return repr(self.make_metavar()) + + def add_to_parser(self, parser, ctx): + parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) diff --git a/brightonpy/Lib/site-packages/click/decorators.py b/brightonpy/Lib/site-packages/click/decorators.py new file mode 100644 index 0000000..c7b5af6 --- /dev/null +++ b/brightonpy/Lib/site-packages/click/decorators.py @@ -0,0 +1,333 @@ +import inspect +import sys +from functools import update_wrapper + +from ._compat import iteritems +from ._unicodefun import _check_for_unicode_literals +from .core import Argument +from .core import Command +from .core import Group +from .core import Option +from .globals import get_current_context +from .utils import echo + + +def pass_context(f): + """Marks a callback as wanting to receive the current context + object as first argument. + """ + + def new_func(*args, **kwargs): + return f(get_current_context(), *args, **kwargs) + + return update_wrapper(new_func, f) + + +def pass_obj(f): + """Similar to :func:`pass_context`, but only pass the object on the + context onwards (:attr:`Context.obj`). This is useful if that object + represents the state of a nested system. + """ + + def new_func(*args, **kwargs): + return f(get_current_context().obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + +def make_pass_decorator(object_type, ensure=False): + """Given an object type this creates a decorator that will work + similar to :func:`pass_obj` but instead of passing the object of the + current context, it will find the innermost context of type + :func:`object_type`. + + This generates a decorator that works roughly like this:: + + from functools import update_wrapper + + def decorator(f): + @pass_context + def new_func(ctx, *args, **kwargs): + obj = ctx.find_object(object_type) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + :param object_type: the type of the object to pass. + :param ensure: if set to `True`, a new object will be created and + remembered on the context if it's not there yet. + """ + + def decorator(f): + def new_func(*args, **kwargs): + ctx = get_current_context() + if ensure: + obj = ctx.ensure_object(object_type) + else: + obj = ctx.find_object(object_type) + if obj is None: + raise RuntimeError( + "Managed to invoke callback without a context" + " object of type '{}' existing".format(object_type.__name__) + ) + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + return decorator + + +def _make_command(f, name, attrs, cls): + if isinstance(f, Command): + raise TypeError("Attempted to convert a callback into a command twice.") + try: + params = f.__click_params__ + params.reverse() + del f.__click_params__ + except AttributeError: + params = [] + help = attrs.get("help") + if help is None: + help = inspect.getdoc(f) + if isinstance(help, bytes): + help = help.decode("utf-8") + else: + help = inspect.cleandoc(help) + attrs["help"] = help + _check_for_unicode_literals() + return cls( + name=name or f.__name__.lower().replace("_", "-"), + callback=f, + params=params, + **attrs + ) + + +def command(name=None, cls=None, **attrs): + r"""Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function with + underscores replaced by dashes. If you want to change that, you can + pass the intended name as the first argument. + + All keyword arguments are forwarded to the underlying command class. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: the name of the command. This defaults to the function + name with underscores replaced by dashes. + :param cls: the command class to instantiate. This defaults to + :class:`Command`. + """ + if cls is None: + cls = Command + + def decorator(f): + cmd = _make_command(f, name, attrs, cls) + cmd.__doc__ = f.__doc__ + return cmd + + return decorator + + +def group(name=None, **attrs): + """Creates a new :class:`Group` with a function as callback. This + works otherwise the same as :func:`command` just that the `cls` + parameter is set to :class:`Group`. + """ + attrs.setdefault("cls", Group) + return command(name, **attrs) + + +def _param_memo(f, param): + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, "__click_params__"): + f.__click_params__ = [] + f.__click_params__.append(param) + + +def argument(*param_decls, **attrs): + """Attaches an argument to the command. All positional arguments are + passed as parameter declarations to :class:`Argument`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Argument` instance manually + and attaching it to the :attr:`Command.params` list. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + """ + + def decorator(f): + ArgumentClass = attrs.pop("cls", Argument) + _param_memo(f, ArgumentClass(param_decls, **attrs)) + return f + + return decorator + + +def option(*param_decls, **attrs): + """Attaches an option to the command. All positional arguments are + passed as parameter declarations to :class:`Option`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Option` instance manually + and attaching it to the :attr:`Command.params` list. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + """ + + def decorator(f): + # Issue 926, copy attrs, so pre-defined options can re-use the same cls= + option_attrs = attrs.copy() + + if "help" in option_attrs: + option_attrs["help"] = inspect.cleandoc(option_attrs["help"]) + OptionClass = option_attrs.pop("cls", Option) + _param_memo(f, OptionClass(param_decls, **option_attrs)) + return f + + return decorator + + +def confirmation_option(*param_decls, **attrs): + """Shortcut for confirmation prompts that can be ignored by passing + ``--yes`` as parameter. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + def callback(ctx, param, value): + if not value: + ctx.abort() + + @click.command() + @click.option('--yes', is_flag=True, callback=callback, + expose_value=False, prompt='Do you want to continue?') + def dropdb(): + pass + """ + + def decorator(f): + def callback(ctx, param, value): + if not value: + ctx.abort() + + attrs.setdefault("is_flag", True) + attrs.setdefault("callback", callback) + attrs.setdefault("expose_value", False) + attrs.setdefault("prompt", "Do you want to continue?") + attrs.setdefault("help", "Confirm the action without prompting.") + return option(*(param_decls or ("--yes",)), **attrs)(f) + + return decorator + + +def password_option(*param_decls, **attrs): + """Shortcut for password prompts. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + @click.command() + @click.option('--password', prompt=True, confirmation_prompt=True, + hide_input=True) + def changeadmin(password): + pass + """ + + def decorator(f): + attrs.setdefault("prompt", True) + attrs.setdefault("confirmation_prompt", True) + attrs.setdefault("hide_input", True) + return option(*(param_decls or ("--password",)), **attrs)(f) + + return decorator + + +def version_option(version=None, *param_decls, **attrs): + """Adds a ``--version`` option which immediately ends the program + printing out the version number. This is implemented as an eager + option that prints the version and exits the program in the callback. + + :param version: the version number to show. If not provided Click + attempts an auto discovery via setuptools. + :param prog_name: the name of the program (defaults to autodetection) + :param message: custom message to show instead of the default + (``'%(prog)s, version %(version)s'``) + :param others: everything else is forwarded to :func:`option`. + """ + if version is None: + if hasattr(sys, "_getframe"): + module = sys._getframe(1).f_globals.get("__name__") + else: + module = "" + + def decorator(f): + prog_name = attrs.pop("prog_name", None) + message = attrs.pop("message", "%(prog)s, version %(version)s") + + def callback(ctx, param, value): + if not value or ctx.resilient_parsing: + return + prog = prog_name + if prog is None: + prog = ctx.find_root().info_name + ver = version + if ver is None: + try: + import pkg_resources + except ImportError: + pass + else: + for dist in pkg_resources.working_set: + scripts = dist.get_entry_map().get("console_scripts") or {} + for _, entry_point in iteritems(scripts): + if entry_point.module_name == module: + ver = dist.version + break + if ver is None: + raise RuntimeError("Could not determine version") + echo(message % {"prog": prog, "version": ver}, color=ctx.color) + ctx.exit() + + attrs.setdefault("is_flag", True) + attrs.setdefault("expose_value", False) + attrs.setdefault("is_eager", True) + attrs.setdefault("help", "Show the version and exit.") + attrs["callback"] = callback + return option(*(param_decls or ("--version",)), **attrs)(f) + + return decorator + + +def help_option(*param_decls, **attrs): + """Adds a ``--help`` option which immediately ends the program + printing out the help page. This is usually unnecessary to add as + this is added by default to all commands unless suppressed. + + Like :func:`version_option`, this is implemented as eager option that + prints in the callback and exits. + + All arguments are forwarded to :func:`option`. + """ + + def decorator(f): + def callback(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + attrs.setdefault("is_flag", True) + attrs.setdefault("expose_value", False) + attrs.setdefault("help", "Show this message and exit.") + attrs.setdefault("is_eager", True) + attrs["callback"] = callback + return option(*(param_decls or ("--help",)), **attrs)(f) + + return decorator diff --git a/brightonpy/Lib/site-packages/click/exceptions.py b/brightonpy/Lib/site-packages/click/exceptions.py new file mode 100644 index 0000000..592ee38 --- /dev/null +++ b/brightonpy/Lib/site-packages/click/exceptions.py @@ -0,0 +1,253 @@ +from ._compat import filename_to_ui +from ._compat import get_text_stderr +from ._compat import PY2 +from .utils import echo + + +def _join_param_hints(param_hint): + if isinstance(param_hint, (tuple, list)): + return " / ".join(repr(x) for x in param_hint) + return param_hint + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception + exit_code = 1 + + def __init__(self, message): + ctor_msg = message + if PY2: + if ctor_msg is not None: + ctor_msg = ctor_msg.encode("utf-8") + Exception.__init__(self, ctor_msg) + self.message = message + + def format_message(self): + return self.message + + def __str__(self): + return self.message + + if PY2: + __unicode__ = __str__ + + def __str__(self): + return self.message.encode("utf-8") + + def show(self, file=None): + if file is None: + file = get_text_stderr() + echo("Error: {}".format(self.format_message()), file=file) + + +class UsageError(ClickException): + """An internal exception that signals a usage error. This typically + aborts any further handling. + + :param message: the error message to display. + :param ctx: optionally the context that caused this error. Click will + fill in the context automatically in some situations. + """ + + exit_code = 2 + + def __init__(self, message, ctx=None): + ClickException.__init__(self, message) + self.ctx = ctx + self.cmd = self.ctx.command if self.ctx else None + + def show(self, file=None): + if file is None: + file = get_text_stderr() + color = None + hint = "" + if self.cmd is not None and self.cmd.get_help_option(self.ctx) is not None: + hint = "Try '{} {}' for help.\n".format( + self.ctx.command_path, self.ctx.help_option_names[0] + ) + if self.ctx is not None: + color = self.ctx.color + echo("{}\n{}".format(self.ctx.get_usage(), hint), file=file, color=color) + echo("Error: {}".format(self.format_message()), file=file, color=color) + + +class BadParameter(UsageError): + """An exception that formats out a standardized error message for a + bad parameter. This is useful when thrown from a callback or type as + Click will attach contextual information to it (for instance, which + parameter it is). + + .. versionadded:: 2.0 + + :param param: the parameter object that caused this error. This can + be left out, and Click will attach this info itself + if possible. + :param param_hint: a string that shows up as parameter name. This + can be used as alternative to `param` in cases + where custom validation should happen. If it is + a string it's used as such, if it's a list then + each item is quoted and separated. + """ + + def __init__(self, message, ctx=None, param=None, param_hint=None): + UsageError.__init__(self, message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self): + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) + else: + return "Invalid value: {}".format(self.message) + param_hint = _join_param_hints(param_hint) + + return "Invalid value for {}: {}".format(param_hint, self.message) + + +class MissingParameter(BadParameter): + """Raised if click required an option or argument but it was not + provided when invoking the script. + + .. versionadded:: 4.0 + + :param param_type: a string that indicates the type of the parameter. + The default is to inherit the parameter type from + the given `param`. Valid values are ``'parameter'``, + ``'option'`` or ``'argument'``. + """ + + def __init__( + self, message=None, ctx=None, param=None, param_hint=None, param_type=None + ): + BadParameter.__init__(self, message, ctx, param, param_hint) + self.param_type = param_type + + def format_message(self): + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) + else: + param_hint = None + param_hint = _join_param_hints(param_hint) + + param_type = self.param_type + if param_type is None and self.param is not None: + param_type = self.param.param_type_name + + msg = self.message + if self.param is not None: + msg_extra = self.param.type.get_missing_message(self.param) + if msg_extra: + if msg: + msg += ". {}".format(msg_extra) + else: + msg = msg_extra + + return "Missing {}{}{}{}".format( + param_type, + " {}".format(param_hint) if param_hint else "", + ". " if msg else ".", + msg or "", + ) + + def __str__(self): + if self.message is None: + param_name = self.param.name if self.param else None + return "missing parameter: {}".format(param_name) + else: + return self.message + + if PY2: + __unicode__ = __str__ + + def __str__(self): + return self.__unicode__().encode("utf-8") + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__(self, option_name, message=None, possibilities=None, ctx=None): + if message is None: + message = "no such option: {}".format(option_name) + UsageError.__init__(self, message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self): + bits = [self.message] + if self.possibilities: + if len(self.possibilities) == 1: + bits.append("Did you mean {}?".format(self.possibilities[0])) + else: + possibilities = sorted(self.possibilities) + bits.append("(Possible options: {})".format(", ".join(possibilities))) + return " ".join(bits) + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + + :param option_name: the name of the option being used incorrectly. + """ + + def __init__(self, option_name, message, ctx=None): + UsageError.__init__(self, message, ctx) + self.option_name = option_name + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + def __init__(self, message, ctx=None): + UsageError.__init__(self, message, ctx) + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename, hint=None): + ui_filename = filename_to_ui(filename) + if hint is None: + hint = "unknown error" + ClickException.__init__(self, hint) + self.ui_filename = ui_filename + self.filename = filename + + def format_message(self): + return "Could not open file {}: {}".format(self.ui_filename, self.message) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" + + +class Exit(RuntimeError): + """An exception that indicates that the application should exit with some + status code. + + :param code: the status code to exit with. + """ + + __slots__ = ("exit_code",) + + def __init__(self, code=0): + self.exit_code = code diff --git a/brightonpy/Lib/site-packages/click/formatting.py b/brightonpy/Lib/site-packages/click/formatting.py new file mode 100644 index 0000000..319c7f6 --- /dev/null +++ b/brightonpy/Lib/site-packages/click/formatting.py @@ -0,0 +1,283 @@ +from contextlib import contextmanager + +from ._compat import term_len +from .parser import split_opt +from .termui import get_terminal_size + +# Can force a width. This is used by the test system +FORCED_WIDTH = None + + +def measure_table(rows): + widths = {} + for row in rows: + for idx, col in enumerate(row): + widths[idx] = max(widths.get(idx, 0), term_len(col)) + return tuple(y for x, y in sorted(widths.items())) + + +def iter_rows(rows, col_count): + for row in rows: + row = tuple(row) + yield row + ("",) * (col_count - len(row)) + + +def wrap_text( + text, width=78, initial_indent="", subsequent_indent="", preserve_paragraphs=False +): + """A helper function that intelligently wraps text. By default, it + assumes that it operates on a single paragraph of text but if the + `preserve_paragraphs` parameter is provided it will intelligently + handle paragraphs (defined by two empty lines). + + If paragraphs are handled, a paragraph can be prefixed with an empty + line containing the ``\\b`` character (``\\x08``) to indicate that + no rewrapping should happen in that block. + + :param text: the text that should be rewrapped. + :param width: the maximum width for the text. + :param initial_indent: the initial indent that should be placed on the + first line as a string. + :param subsequent_indent: the indent string that should be placed on + each consecutive line. + :param preserve_paragraphs: if this flag is set then the wrapping will + intelligently handle paragraphs. + """ + from ._textwrap import TextWrapper + + text = text.expandtabs() + wrapper = TextWrapper( + width, + initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + replace_whitespace=False, + ) + if not preserve_paragraphs: + return wrapper.fill(text) + + p = [] + buf = [] + indent = None + + def _flush_par(): + if not buf: + return + if buf[0].strip() == "\b": + p.append((indent or 0, True, "\n".join(buf[1:]))) + else: + p.append((indent or 0, False, " ".join(buf))) + del buf[:] + + for line in text.splitlines(): + if not line: + _flush_par() + indent = None + else: + if indent is None: + orig_len = term_len(line) + line = line.lstrip() + indent = orig_len - term_len(line) + buf.append(line) + _flush_par() + + rv = [] + for indent, raw, text in p: + with wrapper.extra_indent(" " * indent): + if raw: + rv.append(wrapper.indent_only(text)) + else: + rv.append(wrapper.fill(text)) + + return "\n\n".join(rv) + + +class HelpFormatter(object): + """This class helps with formatting text-based help pages. It's + usually just needed for very special internal cases, but it's also + exposed so that developers can write their own fancy outputs. + + At present, it always writes into memory. + + :param indent_increment: the additional increment for each level. + :param width: the width for the text. This defaults to the terminal + width clamped to a maximum of 78. + """ + + def __init__(self, indent_increment=2, width=None, max_width=None): + self.indent_increment = indent_increment + if max_width is None: + max_width = 80 + if width is None: + width = FORCED_WIDTH + if width is None: + width = max(min(get_terminal_size()[0], max_width) - 2, 50) + self.width = width + self.current_indent = 0 + self.buffer = [] + + def write(self, string): + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self): + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self): + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage(self, prog, args="", prefix="Usage: "): + """Writes a usage line into the buffer. + + :param prog: the program name. + :param args: whitespace separated list of arguments. + :param prefix: the prefix for the first line. + """ + usage_prefix = "{:>{w}}{} ".format(prefix, prog, w=self.current_indent) + text_width = self.width - self.current_indent + + if text_width >= (term_len(usage_prefix) + 20): + # The arguments will fit to the right of the prefix. + indent = " " * term_len(usage_prefix) + self.write( + wrap_text( + args, + text_width, + initial_indent=usage_prefix, + subsequent_indent=indent, + ) + ) + else: + # The prefix is too long, put the arguments on the next line. + self.write(usage_prefix) + self.write("\n") + indent = " " * (max(self.current_indent, term_len(prefix)) + 4) + self.write( + wrap_text( + args, text_width, initial_indent=indent, subsequent_indent=indent + ) + ) + + self.write("\n") + + def write_heading(self, heading): + """Writes a heading into the buffer.""" + self.write("{:>{w}}{}:\n".format("", heading, w=self.current_indent)) + + def write_paragraph(self): + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write("\n") + + def write_text(self, text): + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + text_width = max(self.width - self.current_indent, 11) + indent = " " * self.current_indent + self.write( + wrap_text( + text, + text_width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True, + ) + ) + self.write("\n") + + def write_dl(self, rows, col_max=30, col_spacing=2): + """Writes a definition list into the buffer. This is how options + and commands are usually formatted. + + :param rows: a list of two item tuples for the terms and values. + :param col_max: the maximum width of the first column. + :param col_spacing: the number of spaces between the first and + second column. + """ + rows = list(rows) + widths = measure_table(rows) + if len(widths) != 2: + raise TypeError("Expected two columns for definition list") + + first_col = min(widths[0], col_max) + col_spacing + + for first, second in iter_rows(rows, len(widths)): + self.write("{:>{w}}{}".format("", first, w=self.current_indent)) + if not second: + self.write("\n") + continue + if term_len(first) <= first_col - col_spacing: + self.write(" " * (first_col - term_len(first))) + else: + self.write("\n") + self.write(" " * (first_col + self.current_indent)) + + text_width = max(self.width - first_col - 2, 10) + wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) + lines = wrapped_text.splitlines() + + if lines: + self.write("{}\n".format(lines[0])) + + for line in lines[1:]: + self.write( + "{:>{w}}{}\n".format( + "", line, w=first_col + self.current_indent + ) + ) + + if len(lines) > 1: + # separate long help from next option + self.write("\n") + else: + self.write("\n") + + @contextmanager + def section(self, name): + """Helpful context manager that writes a paragraph, a heading, + and the indents. + + :param name: the section name that is written as heading. + """ + self.write_paragraph() + self.write_heading(name) + self.indent() + try: + yield + finally: + self.dedent() + + @contextmanager + def indentation(self): + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self): + """Returns the buffer contents.""" + return "".join(self.buffer) + + +def join_options(options): + """Given a list of option strings this joins them in the most appropriate + way and returns them in the form ``(formatted_string, + any_prefix_is_slash)`` where the second item in the tuple is a flag that + indicates if any of the option prefixes was a slash. + """ + rv = [] + any_prefix_is_slash = False + for opt in options: + prefix = split_opt(opt)[0] + if prefix == "/": + any_prefix_is_slash = True + rv.append((len(prefix), opt)) + + rv.sort(key=lambda x: x[0]) + + rv = ", ".join(x[1] for x in rv) + return rv, any_prefix_is_slash diff --git a/brightonpy/Lib/site-packages/click/globals.py b/brightonpy/Lib/site-packages/click/globals.py new file mode 100644 index 0000000..1649f9a --- /dev/null +++ b/brightonpy/Lib/site-packages/click/globals.py @@ -0,0 +1,47 @@ +from threading import local + +_local = local() + + +def get_current_context(silent=False): + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing its behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: if set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return _local.stack[-1] + except (AttributeError, IndexError): + if not silent: + raise RuntimeError("There is no active click context.") + + +def push_context(ctx): + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault("stack", []).append(ctx) + + +def pop_context(): + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color=None): + """"Internal helper to get the default value of the color flag. If a + value is passed it's returned unchanged, otherwise it's looked up from + the current context. + """ + if color is not None: + return color + ctx = get_current_context(silent=True) + if ctx is not None: + return ctx.color diff --git a/brightonpy/Lib/site-packages/click/parser.py b/brightonpy/Lib/site-packages/click/parser.py new file mode 100644 index 0000000..f43ebfe --- /dev/null +++ b/brightonpy/Lib/site-packages/click/parser.py @@ -0,0 +1,428 @@ +# -*- coding: utf-8 -*- +""" +This module started out as largely a copy paste from the stdlib's +optparse module with the features removed that we do not need from +optparse because we implement them in Click on a higher level (for +instance type handling, help formatting and a lot more). + +The plan is to remove more and more from here over time. + +The reason this is a different module and not optparse from the stdlib +is that there are differences in 2.x and 3.x about the error messages +generated and optparse in the stdlib uses gettext for no good reason +and might cause us issues. + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright 2001-2006 Gregory P. Ward. All rights reserved. +Copyright 2002-2006 Python Software Foundation. All rights reserved. +""" +import re +from collections import deque + +from .exceptions import BadArgumentUsage +from .exceptions import BadOptionUsage +from .exceptions import NoSuchOption +from .exceptions import UsageError + + +def _unpack_args(args, nargs_spec): + """Given an iterable of arguments and an iterable of nargs specifications, + it returns a tuple with all the unpacked arguments at the first index + and all remaining arguments as the second. + + The nargs specification is the number of arguments that should be consumed + or `-1` to indicate that this position should eat up all the remainders. + + Missing items are filled with `None`. + """ + args = deque(args) + nargs_spec = deque(nargs_spec) + rv = [] + spos = None + + def _fetch(c): + try: + if spos is None: + return c.popleft() + else: + return c.pop() + except IndexError: + return None + + while nargs_spec: + nargs = _fetch(nargs_spec) + if nargs == 1: + rv.append(_fetch(args)) + elif nargs > 1: + x = [_fetch(args) for _ in range(nargs)] + # If we're reversed, we're pulling in the arguments in reverse, + # so we need to turn them around. + if spos is not None: + x.reverse() + rv.append(tuple(x)) + elif nargs < 0: + if spos is not None: + raise TypeError("Cannot have two nargs < 0") + spos = len(rv) + rv.append(None) + + # spos is the position of the wildcard (star). If it's not `None`, + # we fill it with the remainder. + if spos is not None: + rv[spos] = tuple(args) + args = [] + rv[spos + 1 :] = reversed(rv[spos + 1 :]) + + return tuple(rv), list(args) + + +def _error_opt_args(nargs, opt): + if nargs == 1: + raise BadOptionUsage(opt, "{} option requires an argument".format(opt)) + raise BadOptionUsage(opt, "{} option requires {} arguments".format(opt, nargs)) + + +def split_opt(opt): + first = opt[:1] + if first.isalnum(): + return "", opt + if opt[1:2] == first: + return opt[:2], opt[2:] + return first, opt[1:] + + +def normalize_opt(opt, ctx): + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = split_opt(opt) + return prefix + ctx.token_normalize_func(opt) + + +def split_arg_string(string): + """Given an argument string this attempts to split it into small parts.""" + rv = [] + for match in re.finditer( + r"('([^'\\]*(?:\\.[^'\\]*)*)'|\"([^\"\\]*(?:\\.[^\"\\]*)*)\"|\S+)\s*", + string, + re.S, + ): + arg = match.group().strip() + if arg[:1] == arg[-1:] and arg[:1] in "\"'": + arg = arg[1:-1].encode("ascii", "backslashreplace").decode("unicode-escape") + try: + arg = type(string)(arg) + except UnicodeError: + pass + rv.append(arg) + return rv + + +class Option(object): + def __init__(self, opts, dest, action=None, nargs=1, const=None, obj=None): + self._short_opts = [] + self._long_opts = [] + self.prefixes = set() + + for opt in opts: + prefix, value = split_opt(opt) + if not prefix: + raise ValueError("Invalid start character for option ({})".format(opt)) + self.prefixes.add(prefix[0]) + if len(prefix) == 1 and len(value) == 1: + self._short_opts.append(opt) + else: + self._long_opts.append(opt) + self.prefixes.add(prefix) + + if action is None: + action = "store" + + self.dest = dest + self.action = action + self.nargs = nargs + self.const = const + self.obj = obj + + @property + def takes_value(self): + return self.action in ("store", "append") + + def process(self, value, state): + if self.action == "store": + state.opts[self.dest] = value + elif self.action == "store_const": + state.opts[self.dest] = self.const + elif self.action == "append": + state.opts.setdefault(self.dest, []).append(value) + elif self.action == "append_const": + state.opts.setdefault(self.dest, []).append(self.const) + elif self.action == "count": + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 + else: + raise ValueError("unknown action '{}'".format(self.action)) + state.order.append(self.obj) + + +class Argument(object): + def __init__(self, dest, nargs=1, obj=None): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process(self, value, state): + if self.nargs > 1: + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage( + "argument {} takes {} values".format(self.dest, self.nargs) + ) + state.opts[self.dest] = value + state.order.append(self.obj) + + +class ParsingState(object): + def __init__(self, rargs): + self.opts = {} + self.largs = [] + self.rargs = rargs + self.order = [] + + +class OptionParser(object): + """The option parser is an internal class that is ultimately used to + parse options and arguments. It's modelled after optparse and brings + a similar but vastly simplified API. It should generally not be used + directly as the high level Click classes wrap it for you. + + It's not nearly as extensible as optparse or argparse as it does not + implement features that are implemented on a higher level (such as + types or defaults). + + :param ctx: optionally the :class:`~click.Context` where this parser + should go with. + """ + + def __init__(self, ctx=None): + #: The :class:`~click.Context` for this parser. This might be + #: `None` for some advanced use cases. + self.ctx = ctx + #: This controls how the parser deals with interspersed arguments. + #: If this is set to `False`, the parser will stop on the first + #: non-option. Click uses this to implement nested subcommands + #: safely. + self.allow_interspersed_args = True + #: This tells the parser how to deal with unknown options. By + #: default it will error out (which is sensible), but there is a + #: second mode where it will ignore it and continue processing + #: after shifting all the unknown options into the resulting args. + self.ignore_unknown_options = False + if ctx is not None: + self.allow_interspersed_args = ctx.allow_interspersed_args + self.ignore_unknown_options = ctx.ignore_unknown_options + self._short_opt = {} + self._long_opt = {} + self._opt_prefixes = {"-", "--"} + self._args = [] + + def add_option(self, opts, dest, action=None, nargs=1, const=None, obj=None): + """Adds a new option named `dest` to the parser. The destination + is not inferred (unlike with optparse) and needs to be explicitly + provided. Action can be any of ``store``, ``store_const``, + ``append``, ``appnd_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + if obj is None: + obj = dest + opts = [normalize_opt(opt, self.ctx) for opt in opts] + option = Option(opts, dest, action=action, nargs=nargs, const=const, obj=obj) + self._opt_prefixes.update(option.prefixes) + for opt in option._short_opts: + self._short_opt[opt] = option + for opt in option._long_opts: + self._long_opt[opt] = option + + def add_argument(self, dest, nargs=1, obj=None): + """Adds a positional argument named `dest` to the parser. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + if obj is None: + obj = dest + self._args.append(Argument(dest=dest, nargs=nargs, obj=obj)) + + def parse_args(self, args): + """Parses positional arguments and returns ``(values, args, order)`` + for the parsed options and arguments as well as the leftover + arguments if there are any. The order is a list of objects as they + appear on the command line. If arguments appear multiple times they + will be memorized multiple times as well. + """ + state = ParsingState(args) + try: + self._process_args_for_options(state) + self._process_args_for_args(state) + except UsageError: + if self.ctx is None or not self.ctx.resilient_parsing: + raise + return state.opts, state.largs, state.order + + def _process_args_for_args(self, state): + pargs, args = _unpack_args( + state.largs + state.rargs, [x.nargs for x in self._args] + ) + + for idx, arg in enumerate(self._args): + arg.process(pargs[idx], state) + + state.largs = args + state.rargs = [] + + def _process_args_for_options(self, state): + while state.rargs: + arg = state.rargs.pop(0) + arglen = len(arg) + # Double dashes always handled explicitly regardless of what + # prefixes are valid. + if arg == "--": + return + elif arg[:1] in self._opt_prefixes and arglen > 1: + self._process_opts(arg, state) + elif self.allow_interspersed_args: + state.largs.append(arg) + else: + state.rargs.insert(0, arg) + return + + # Say this is the original argument list: + # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] + # ^ + # (we are about to process arg(i)). + # + # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of + # [arg0, ..., arg(i-1)] (any options and their arguments will have + # been removed from largs). + # + # The while loop will usually consume 1 or more arguments per pass. + # If it consumes 1 (eg. arg is an option that takes no arguments), + # then after _process_arg() is done the situation is: + # + # largs = subset of [arg0, ..., arg(i)] + # rargs = [arg(i+1), ..., arg(N-1)] + # + # If allow_interspersed_args is false, largs will always be + # *empty* -- still a subset of [arg0, ..., arg(i-1)], but + # not a very interesting subset! + + def _match_long_opt(self, opt, explicit_value, state): + if opt not in self._long_opt: + possibilities = [word for word in self._long_opt if word.startswith(opt)] + raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + elif explicit_value is not None: + raise BadOptionUsage(opt, "{} option does not take a value".format(opt)) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg, state): + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = normalize_opt(prefix + ch, self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt, ctx=self.ctx) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + else: + value = None + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we re-combinate the string of the + # remaining options and re-attach the prefix, then report that + # to the state as new larg. This way there is basic combinatorics + # that can be achieved while still ignoring unknown arguments. + if self.ignore_unknown_options and unknown_options: + state.largs.append("{}{}".format(prefix, "".join(unknown_options))) + + def _process_opts(self, arg, state): + explicit_value = None + # Long option handling happens in two parts. The first part is + # supporting explicitly attached values. In any case, we will try + # to long match the option first. + if "=" in arg: + long_opt, explicit_value = arg.split("=", 1) + else: + long_opt = arg + norm_long_opt = normalize_opt(long_opt, self.ctx) + + # At this point we will match the (assumed) long option through + # the long option matching code. Note that this allows options + # like "-foo" to be matched as long options. + try: + self._match_long_opt(norm_long_opt, explicit_value, state) + except NoSuchOption: + # At this point the long option matching failed, and we need + # to try with short options. However there is a special rule + # which says, that if we have a two character options prefix + # (applies to "--foo" for instance), we do not dispatch to the + # short option code and will instead raise the no option + # error. + if arg[:2] not in self._opt_prefixes: + return self._match_short_opt(arg, state) + if not self.ignore_unknown_options: + raise + state.largs.append(arg) diff --git a/brightonpy/Lib/site-packages/click/termui.py b/brightonpy/Lib/site-packages/click/termui.py new file mode 100644 index 0000000..02ef9e9 --- /dev/null +++ b/brightonpy/Lib/site-packages/click/termui.py @@ -0,0 +1,681 @@ +import inspect +import io +import itertools +import os +import struct +import sys + +from ._compat import DEFAULT_COLUMNS +from ._compat import get_winterm_size +from ._compat import isatty +from ._compat import raw_input +from ._compat import string_types +from ._compat import strip_ansi +from ._compat import text_type +from ._compat import WIN +from .exceptions import Abort +from .exceptions import UsageError +from .globals import resolve_color_default +from .types import Choice +from .types import convert_type +from .types import Path +from .utils import echo +from .utils import LazyFile + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func = raw_input + +_ansi_colors = { + "black": 30, + "red": 31, + "green": 32, + "yellow": 33, + "blue": 34, + "magenta": 35, + "cyan": 36, + "white": 37, + "reset": 39, + "bright_black": 90, + "bright_red": 91, + "bright_green": 92, + "bright_yellow": 93, + "bright_blue": 94, + "bright_magenta": 95, + "bright_cyan": 96, + "bright_white": 97, +} +_ansi_reset_all = "\033[0m" + + +def hidden_prompt_func(prompt): + import getpass + + return getpass.getpass(prompt) + + +def _build_prompt( + text, suffix, show_default=False, default=None, show_choices=True, type=None +): + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += " ({})".format(", ".join(map(str, type.choices))) + if default is not None and show_default: + prompt = "{} [{}]".format(prompt, _format_default(default)) + return prompt + suffix + + +def _format_default(default): + if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): + return default.name + + return default + + +def prompt( + text, + default=None, + hide_input=False, + confirmation_prompt=False, + type=None, + value_proc=None, + prompt_suffix=": ", + show_default=True, + err=False, + show_choices=True, +): + """Prompts a user for input. This is a convenience function that can + be used to prompt a user for input later. + + If the user aborts the input by sending a interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + .. versionadded:: 7.0 + Added the show_choices parameter. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param text: the text to show for the prompt. + :param default: the default value to use if no input happens. If this + is not given it will prompt until it's aborted. + :param hide_input: if this is set to true then the input value will + be hidden. + :param confirmation_prompt: asks for confirmation for the value. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + :param show_choices: Show or hide choices if the passed type is a Choice. + For example if type is a Choice of either day or week, + show_choices is true and text is "Group by" then the + prompt will be "Group by (day, week): ". + """ + result = None + + def prompt_func(text): + f = hidden_prompt_func if hide_input else visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text, nl=False, err=err) + return f("") + except (KeyboardInterrupt, EOFError): + # getpass doesn't print a newline if the user aborts input with ^C. + # Allegedly this behavior is inherited from getpass(3). + # A doc bug has been filed at https://bugs.python.org/issue24711 + if hide_input: + echo(None, err=err) + raise Abort() + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt( + text, prompt_suffix, show_default, default, show_choices, type + ) + + while 1: + while 1: + value = prompt_func(prompt) + if value: + break + elif default is not None: + if isinstance(value_proc, Path): + # validate Path default value(exists, dir_okay etc.) + value = default + break + return default + try: + result = value_proc(value) + except UsageError as e: + echo("Error: {}".format(e.message), err=err) # noqa: B306 + continue + if not confirmation_prompt: + return result + while 1: + value2 = prompt_func("Repeat for confirmation: ") + if value2: + break + if value == value2: + return result + echo("Error: the two entered values do not match", err=err) + + +def confirm( + text, default=False, abort=False, prompt_suffix=": ", show_default=True, err=False +): + """Prompts for confirmation (yes/no question). + + If the user aborts the input by sending a interrupt signal this + function will catch it and raise a :exc:`Abort` exception. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param text: the question to ask. + :param default: the default for the prompt. + :param abort: if this is set to `True` a negative answer aborts the + exception by raising :exc:`Abort`. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + prompt = _build_prompt( + text, prompt_suffix, show_default, "Y/n" if default else "y/N" + ) + while 1: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt, nl=False, err=err) + value = visible_prompt_func("").lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() + if value in ("y", "yes"): + rv = True + elif value in ("n", "no"): + rv = False + elif value == "": + rv = default + else: + echo("Error: invalid input", err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def get_terminal_size(): + """Returns the current size of the terminal as tuple in the form + ``(width, height)`` in columns and rows. + """ + # If shutil has get_terminal_size() (Python 3.3 and later) use that + if sys.version_info >= (3, 3): + import shutil + + shutil_get_terminal_size = getattr(shutil, "get_terminal_size", None) + if shutil_get_terminal_size: + sz = shutil_get_terminal_size() + return sz.columns, sz.lines + + # We provide a sensible default for get_winterm_size() when being invoked + # inside a subprocess. Without this, it would not provide a useful input. + if get_winterm_size is not None: + size = get_winterm_size() + if size == (0, 0): + return (79, 24) + else: + return size + + def ioctl_gwinsz(fd): + try: + import fcntl + import termios + + cr = struct.unpack("hh", fcntl.ioctl(fd, termios.TIOCGWINSZ, "1234")) + except Exception: + return + return cr + + cr = ioctl_gwinsz(0) or ioctl_gwinsz(1) or ioctl_gwinsz(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + try: + cr = ioctl_gwinsz(fd) + finally: + os.close(fd) + except Exception: + pass + if not cr or not cr[0] or not cr[1]: + cr = (os.environ.get("LINES", 25), os.environ.get("COLUMNS", DEFAULT_COLUMNS)) + return int(cr[1]), int(cr[0]) + + +def echo_via_pager(text_or_generator, color=None): + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text_or_generator: the text to page, or alternatively, a + generator emitting the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + + if inspect.isgeneratorfunction(text_or_generator): + i = text_or_generator() + elif isinstance(text_or_generator, string_types): + i = [text_or_generator] + else: + i = iter(text_or_generator) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, string_types) else text_type(el) for el in i) + + from ._termui_impl import pager + + return pager(itertools.chain(text_generator, "\n"), color) + + +def progressbar( + iterable=None, + length=None, + label=None, + show_eta=True, + show_percent=None, + show_pos=False, + item_show_func=None, + fill_char="#", + empty_char="-", + bar_template="%(label)s [%(bar)s] %(info)s", + info_sep=" ", + width=36, + file=None, + color=None, +): + """This function creates an iterable context manager that can be used + to iterate over something while showing a progress bar. It will + either iterate over the `iterable` or `length` items (that are counted + up). While iteration happens, this function will print a rendered + progress bar to the given `file` (defaults to stdout) and will attempt + to calculate remaining time and more. By default, this progress bar + will not be rendered if the file is not a terminal. + + The context manager creates the progress bar. When the context + manager is entered the progress bar is already created. With every + iteration over the progress bar, the iterable passed to the bar is + advanced and the bar is updated. When the context manager exits, + a newline is printed and the progress bar is finalized on screen. + + Note: The progress bar is currently designed for use cases where the + total progress can be expected to take at least several seconds. + Because of this, the ProgressBar class object won't display + progress that is considered too fast, and progress where the time + between steps is less than a second. + + No printing must happen or the progress bar will be unintentionally + destroyed. + + Example usage:: + + with progressbar(items) as bar: + for item in bar: + do_something_with(item) + + Alternatively, if no iterable is specified, one can manually update the + progress bar through the `update()` method instead of directly + iterating over the progress bar. The update method accepts the number + of steps to increment the bar with:: + + with progressbar(length=chunks.total_bytes) as bar: + for chunk in chunks: + process_chunk(chunk) + bar.update(chunks.bytes) + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `color` parameter. Added a `update` method to the + progressbar object. + + :param iterable: an iterable to iterate over. If not provided the length + is required. + :param length: the number of items to iterate over. By default the + progressbar will attempt to ask the iterator about its + length, which might or might not work. If an iterable is + also provided this parameter can be used to override the + length. If an iterable is not provided the progress bar + will iterate over a range of that length. + :param label: the label to show next to the progress bar. + :param show_eta: enables or disables the estimated time display. This is + automatically disabled if the length cannot be + determined. + :param show_percent: enables or disables the percentage display. The + default is `True` if the iterable has a length or + `False` if not. + :param show_pos: enables or disables the absolute position display. The + default is `False`. + :param item_show_func: a function called with the current item which + can return a string to show the current item + next to the progress bar. Note that the current + item can be `None`! + :param fill_char: the character to use to show the filled part of the + progress bar. + :param empty_char: the character to use to show the non-filled part of + the progress bar. + :param bar_template: the format string to use as template for the bar. + The parameters in it are ``label`` for the label, + ``bar`` for the progress bar and ``info`` for the + info section. + :param info_sep: the separator between multiple info items (eta etc.) + :param width: the width of the progress bar in characters, 0 means full + terminal width + :param file: the file to write to. If this is not a terminal then + only the label is printed. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are included anywhere in the progress bar output + which is not the case by default. + """ + from ._termui_impl import ProgressBar + + color = resolve_color_default(color) + return ProgressBar( + iterable=iterable, + length=length, + show_eta=show_eta, + show_percent=show_percent, + show_pos=show_pos, + item_show_func=item_show_func, + fill_char=fill_char, + empty_char=empty_char, + bar_template=bar_template, + info_sep=info_sep, + file=file, + label=label, + width=width, + color=color, + ) + + +def clear(): + """Clears the terminal screen. This will have the effect of clearing + the whole visible space of the terminal and moving the cursor to the + top left. This does not do anything if not connected to a terminal. + + .. versionadded:: 2.0 + """ + if not isatty(sys.stdout): + return + # If we're on Windows and we don't have colorama available, then we + # clear the screen by shelling out. Otherwise we can use an escape + # sequence. + if WIN: + os.system("cls") + else: + sys.stdout.write("\033[2J\033[1;1H") + + +def style( + text, + fg=None, + bg=None, + bold=None, + dim=None, + underline=None, + blink=None, + reverse=None, + reset=True, +): + """Styles a text with ANSI styles and returns the new string. By + default the styling is self contained which means that at the end + of the string a reset code is issued. This can be prevented by + passing ``reset=False``. + + Examples:: + + click.echo(click.style('Hello World!', fg='green')) + click.echo(click.style('ATTENTION!', blink=True)) + click.echo(click.style('Some things', reverse=True, fg='cyan')) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``bright_black`` + * ``bright_red`` + * ``bright_green`` + * ``bright_yellow`` + * ``bright_blue`` + * ``bright_magenta`` + * ``bright_cyan`` + * ``bright_white`` + * ``reset`` (reset the color code only) + + .. versionadded:: 2.0 + + .. versionadded:: 7.0 + Added support for bright colors. + + :param text: the string to style with ansi codes. + :param fg: if provided this will become the foreground color. + :param bg: if provided this will become the background color. + :param bold: if provided this will enable or disable bold mode. + :param dim: if provided this will enable or disable dim mode. This is + badly supported. + :param underline: if provided this will enable or disable underline. + :param blink: if provided this will enable or disable blinking. + :param reverse: if provided this will enable or disable inverse + rendering (foreground becomes background and the + other way round). + :param reset: by default a reset-all code is added at the end of the + string which means that styles do not carry over. This + can be disabled to compose styles. + """ + bits = [] + if fg: + try: + bits.append("\033[{}m".format(_ansi_colors[fg])) + except KeyError: + raise TypeError("Unknown color '{}'".format(fg)) + if bg: + try: + bits.append("\033[{}m".format(_ansi_colors[bg] + 10)) + except KeyError: + raise TypeError("Unknown color '{}'".format(bg)) + if bold is not None: + bits.append("\033[{}m".format(1 if bold else 22)) + if dim is not None: + bits.append("\033[{}m".format(2 if dim else 22)) + if underline is not None: + bits.append("\033[{}m".format(4 if underline else 24)) + if blink is not None: + bits.append("\033[{}m".format(5 if blink else 25)) + if reverse is not None: + bits.append("\033[{}m".format(7 if reverse else 27)) + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return "".join(bits) + + +def unstyle(text): + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho(message=None, file=None, nl=True, err=False, color=None, **styles): + """This function combines :func:`echo` and :func:`style` into one + call. As such the following two calls are the same:: + + click.secho('Hello World!', fg='green') + click.echo(click.style('Hello World!', fg='green')) + + All keyword arguments are forwarded to the underlying functions + depending on which one they go with. + + .. versionadded:: 2.0 + """ + if message is not None: + message = style(message, **styles) + return echo(message, file=file, nl=nl, err=err, color=color) + + +def edit( + text=None, editor=None, env=None, require_save=True, extension=".txt", filename=None +): + r"""Edits the given text in the defined editor. If an editor is given + (should be the full path to the executable but the regular operating + system search path is used for finding the executable) it overrides + the detected editor. Optionally, some environment variables can be + used. If the editor is closed without changes, `None` is returned. In + case a file is edited directly the return value is always `None` and + `require_save` and `extension` are ignored. + + If the editor cannot be opened a :exc:`UsageError` is raised. + + Note for Windows: to simplify cross-platform usage, the newlines are + automatically converted from POSIX to Windows and vice versa. As such, + the message here will have ``\n`` as newline markers. + + :param text: the text to edit. + :param editor: optionally the editor to use. Defaults to automatic + detection. + :param env: environment variables to forward to the editor. + :param require_save: if this is true, then not saving in the editor + will make the return value become `None`. + :param extension: the extension to tell the editor about. This defaults + to `.txt` but changing this might change syntax + highlighting. + :param filename: if provided it will edit this file instead of the + provided text contents. It will not use a temporary + file as an indirection in that case. + """ + from ._termui_impl import Editor + + editor = Editor( + editor=editor, env=env, require_save=require_save, extension=extension + ) + if filename is None: + return editor.edit(text) + editor.edit_file(filename) + + +def launch(url, wait=False, locate=False): + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('https://click.palletsprojects.com/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: waits for the program to stop. + :param locate: if this is set to `True` then instead of launching the + application associated with the URL it will attempt to + launch a file manager with the file located. This + might have weird effects if the URL does not point to + the filesystem. + """ + from ._termui_impl import open_url + + return open_url(url, wait=wait, locate=locate) + + +# If this is provided, getchar() calls into this instead. This is used +# for unittesting purposes. +_getchar = None + + +def getchar(echo=False): + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + Note for Windows: in rare cases when typing non-ASCII characters, this + function might wait for a second character and then return both at once. + This is because certain Unicode characters look like special-key markers. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + f = _getchar + if f is None: + from ._termui_impl import getchar as f + return f(echo) + + +def raw_terminal(): + from ._termui_impl import raw_terminal as f + + return f() + + +def pause(info="Press any key to continue ...", err=False): + """This command stops execution and waits for the user to press any + key to continue. This is similar to the Windows batch "pause" + command. If the program is not run through a terminal, this command + will instead do nothing. + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param info: the info string to print before pausing. + :param err: if set to message goes to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + if not isatty(sys.stdin) or not isatty(sys.stdout): + return + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/brightonpy/Lib/site-packages/click/testing.py b/brightonpy/Lib/site-packages/click/testing.py new file mode 100644 index 0000000..a3dba3b --- /dev/null +++ b/brightonpy/Lib/site-packages/click/testing.py @@ -0,0 +1,382 @@ +import contextlib +import os +import shlex +import shutil +import sys +import tempfile + +from . import formatting +from . import termui +from . import utils +from ._compat import iteritems +from ._compat import PY2 +from ._compat import string_types + + +if PY2: + from cStringIO import StringIO +else: + import io + from ._compat import _find_binary_reader + + +class EchoingStdin(object): + def __init__(self, input, output): + self._input = input + self._output = output + + def __getattr__(self, x): + return getattr(self._input, x) + + def _echo(self, rv): + self._output.write(rv) + return rv + + def read(self, n=-1): + return self._echo(self._input.read(n)) + + def readline(self, n=-1): + return self._echo(self._input.readline(n)) + + def readlines(self): + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self): + return iter(self._echo(x) for x in self._input) + + def __repr__(self): + return repr(self._input) + + +def make_input_stream(input, charset): + # Is already an input stream. + if hasattr(input, "read"): + if PY2: + return input + rv = _find_binary_reader(input) + if rv is not None: + return rv + raise TypeError("Could not find binary reader for input stream.") + + if input is None: + input = b"" + elif not isinstance(input, bytes): + input = input.encode(charset) + if PY2: + return StringIO(input) + return io.BytesIO(input) + + +class Result(object): + """Holds the captured result of an invoked CLI script.""" + + def __init__( + self, runner, stdout_bytes, stderr_bytes, exit_code, exception, exc_info=None + ): + #: The runner that created the result + self.runner = runner + #: The standard output as bytes. + self.stdout_bytes = stdout_bytes + #: The standard error as bytes, or None if not available + self.stderr_bytes = stderr_bytes + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happened if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self): + """The (standard) output as unicode string.""" + return self.stdout + + @property + def stdout(self): + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stderr(self): + """The standard error as unicode string.""" + if self.stderr_bytes is None: + raise ValueError("stderr not separately captured") + return self.stderr_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + def __repr__(self): + return "<{} {}>".format( + type(self).__name__, repr(self.exception) if self.exception else "okay" + ) + + +class CliRunner(object): + """The CLI runner provides functionality to invoke a Click command line + script for unittesting purposes in a isolated environment. This only + works in single-threaded systems without any concurrency as it changes the + global interpreter state. + + :param charset: the character set for the input and output data. This is + UTF-8 by default and should not be changed currently as + the reporting to Click only works in Python 2 properly. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from stdin writes + to stdout. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param mix_stderr: if this is set to `False`, then stdout and stderr are + preserved as independent streams. This is useful for + Unix-philosophy apps that have predictable stdout and + noisy stderr, such that each may be measured + independently + """ + + def __init__(self, charset=None, env=None, echo_stdin=False, mix_stderr=True): + if charset is None: + charset = "utf-8" + self.charset = charset + self.env = env or {} + self.echo_stdin = echo_stdin + self.mix_stderr = mix_stderr + + def get_default_prog_name(self, cli): + """Given a command object it will return the default program name + for it. The default is the `name` attribute or ``"root"`` if not + set. + """ + return cli.name or "root" + + def make_env(self, overrides=None): + """Returns the environment overrides for invoking a script.""" + rv = dict(self.env) + if overrides: + rv.update(overrides) + return rv + + @contextlib.contextmanager + def isolation(self, input=None, env=None, color=False): + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up stdin with the given input data + and `os.environ` with the overrides from the given dictionary. + This also rebinds some internals in Click to be mocked (like the + prompt functionality). + + This is automatically done in the :meth:`invoke` method. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :param input: the input stream to put into sys.stdin. + :param env: the environment overrides as dictionary. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + """ + input = make_input_stream(input, self.charset) + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = formatting.FORCED_WIDTH + formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + if PY2: + bytes_output = StringIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + sys.stdout = bytes_output + if not self.mix_stderr: + bytes_error = StringIO() + sys.stderr = bytes_error + else: + bytes_output = io.BytesIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + input = io.TextIOWrapper(input, encoding=self.charset) + sys.stdout = io.TextIOWrapper(bytes_output, encoding=self.charset) + if not self.mix_stderr: + bytes_error = io.BytesIO() + sys.stderr = io.TextIOWrapper(bytes_error, encoding=self.charset) + + if self.mix_stderr: + sys.stderr = sys.stdout + + sys.stdin = input + + def visible_input(prompt=None): + sys.stdout.write(prompt or "") + val = input.readline().rstrip("\r\n") + sys.stdout.write("{}\n".format(val)) + sys.stdout.flush() + return val + + def hidden_input(prompt=None): + sys.stdout.write("{}\n".format(prompt or "")) + sys.stdout.flush() + return input.readline().rstrip("\r\n") + + def _getchar(echo): + char = sys.stdin.read(1) + if echo: + sys.stdout.write(char) + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi(stream=None, color=None): + if color is None: + return not default_color + return not color + + old_visible_prompt_func = termui.visible_prompt_func + old_hidden_prompt_func = termui.hidden_prompt_func + old__getchar_func = termui._getchar + old_should_strip_ansi = utils.should_strip_ansi + termui.visible_prompt_func = visible_input + termui.hidden_prompt_func = hidden_input + termui._getchar = _getchar + utils.should_strip_ansi = should_strip_ansi + + old_env = {} + try: + for key, value in iteritems(env): + old_env[key] = os.environ.get(key) + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + yield (bytes_output, not self.mix_stderr and bytes_error) + finally: + for key, value in iteritems(old_env): + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + sys.stdout = old_stdout + sys.stderr = old_stderr + sys.stdin = old_stdin + termui.visible_prompt_func = old_visible_prompt_func + termui.hidden_prompt_func = old_hidden_prompt_func + termui._getchar = old__getchar_func + utils.should_strip_ansi = old_should_strip_ansi + formatting.FORCED_WIDTH = old_forced_width + + def invoke( + self, + cli, + args=None, + input=None, + env=None, + catch_exceptions=True, + color=False, + **extra + ): + """Invokes a command in an isolated environment. The arguments are + forwarded directly to the command line script, the `extra` keyword + arguments are passed to the :meth:`~clickpkg.Command.main` function of + the command. + + This returns a :class:`Result` object. + + .. versionadded:: 3.0 + The ``catch_exceptions`` parameter was added. + + .. versionchanged:: 3.0 + The result object now has an `exc_info` attribute with the + traceback if available. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :param cli: the command to invoke + :param args: the arguments to invoke. It may be given as an iterable + or a string. When given as string it will be interpreted + as a Unix shell command. More details at + :func:`shlex.split`. + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + """ + exc_info = None + with self.isolation(input=input, env=env, color=color) as outstreams: + exception = None + exit_code = 0 + + if isinstance(args, string_types): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + exit_code = e.code + if exit_code is None: + exit_code = 0 + + if exit_code != 0: + exception = e + + if not isinstance(exit_code, int): + sys.stdout.write(str(exit_code)) + sys.stdout.write("\n") + exit_code = 1 + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + stdout = outstreams[0].getvalue() + if self.mix_stderr: + stderr = None + else: + stderr = outstreams[1].getvalue() + + return Result( + runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + exit_code=exit_code, + exception=exception, + exc_info=exc_info, + ) + + @contextlib.contextmanager + def isolated_filesystem(self): + """A context manager that creates a temporary folder and changes + the current working directory to it for isolated filesystem tests. + """ + cwd = os.getcwd() + t = tempfile.mkdtemp() + os.chdir(t) + try: + yield t + finally: + os.chdir(cwd) + try: + shutil.rmtree(t) + except (OSError, IOError): # noqa: B014 + pass diff --git a/brightonpy/Lib/site-packages/click/types.py b/brightonpy/Lib/site-packages/click/types.py new file mode 100644 index 0000000..505c39f --- /dev/null +++ b/brightonpy/Lib/site-packages/click/types.py @@ -0,0 +1,762 @@ +import os +import stat +from datetime import datetime + +from ._compat import _get_argv_encoding +from ._compat import filename_to_ui +from ._compat import get_filesystem_encoding +from ._compat import get_streerror +from ._compat import open_stream +from ._compat import PY2 +from ._compat import text_type +from .exceptions import BadParameter +from .utils import LazyFile +from .utils import safecall + + +class ParamType(object): + """Helper for converting values through types. The following is + necessary for a valid type: + + * it needs a name + * it needs to pass through None unchanged + * it needs to convert from a string + * it needs to convert its result type through unchanged + (eg: needs to be idempotent) + * it needs to be able to deal with param and context being `None`. + This can be the case when the object is used with prompt + inputs. + """ + + is_composite = False + + #: the descriptive name of this type + name = None + + #: if a list of this type is expected and the value is pulled from a + #: string environment variable, this is what splits it up. `None` + #: means any whitespace. For all parameters the general rule is that + #: whitespace splits them up. The exception are paths and files which + #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on + #: Windows). + envvar_list_splitter = None + + def __call__(self, value, param=None, ctx=None): + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param): + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param): + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert(self, value, param, ctx): + """Converts the value. This is not invoked for values that are + `None` (the missing value). + """ + return value + + def split_envvar_value(self, rv): + """Given a value from an environment variable this splits it up + into small chunks depending on the defined envvar list splitter. + + If the splitter is set to `None`, which means that whitespace splits, + then leading and trailing whitespace is ignored. Otherwise, leading + and trailing splitters usually lead to empty items being included. + """ + return (rv or "").split(self.envvar_list_splitter) + + def fail(self, message, param=None, ctx=None): + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self): + raise NotImplementedError() + + +class FuncParamType(ParamType): + def __init__(self, func): + self.name = func.__name__ + self.func = func + + def convert(self, value, param, ctx): + try: + return self.func(value) + except ValueError: + try: + value = text_type(value) + except UnicodeError: + value = str(value).decode("utf-8", "replace") + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = "text" + + def convert(self, value, param, ctx): + return value + + def __repr__(self): + return "UNPROCESSED" + + +class StringParamType(ParamType): + name = "text" + + def convert(self, value, param, ctx): + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = get_filesystem_encoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode("utf-8", "replace") + else: + value = value.decode("utf-8", "replace") + return value + return value + + def __repr__(self): + return "STRING" + + +class Choice(ParamType): + """The choice type allows a value to be checked against a fixed set + of supported values. All of these values have to be strings. + + You should only pass a list or tuple of choices. Other iterables + (like generators) may lead to surprising results. + + The resulting value will always be one of the originally passed choices + regardless of ``case_sensitive`` or any ``ctx.token_normalize_func`` + being specified. + + See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + """ + + name = "choice" + + def __init__(self, choices, case_sensitive=True): + self.choices = choices + self.case_sensitive = case_sensitive + + def get_metavar(self, param): + return "[{}]".format("|".join(self.choices)) + + def get_missing_message(self, param): + return "Choose from:\n\t{}.".format(",\n\t".join(self.choices)) + + def convert(self, value, param, ctx): + # Match through normalization and case sensitivity + # first do token_normalize_func, then lowercase + # preserve original `value` to produce an accurate message in + # `self.fail` + normed_value = value + normed_choices = {choice: choice for choice in self.choices} + + if ctx is not None and ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(value) + normed_choices = { + ctx.token_normalize_func(normed_choice): original + for normed_choice, original in normed_choices.items() + } + + if not self.case_sensitive: + if PY2: + lower = str.lower + else: + lower = str.casefold + + normed_value = lower(normed_value) + normed_choices = { + lower(normed_choice): original + for normed_choice, original in normed_choices.items() + } + + if normed_value in normed_choices: + return normed_choices[normed_value] + + self.fail( + "invalid choice: {}. (choose from {})".format( + value, ", ".join(self.choices) + ), + param, + ctx, + ) + + def __repr__(self): + return "Choice('{}')".format(list(self.choices)) + + +class DateTime(ParamType): + """The DateTime type converts date strings into `datetime` objects. + + The format strings which are checked are configurable, but default to some + common (non-timezone aware) ISO 8601 formats. + + When specifying *DateTime* formats, you should only pass a list or a tuple. + Other iterables, like generators, may lead to surprising results. + + The format strings are processed using ``datetime.strptime``, and this + consequently defines the format strings which are allowed. + + Parsing is tried using each format, in order, and the first format which + parses successfully is used. + + :param formats: A list or tuple of date format strings, in the order in + which they should be tried. Defaults to + ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, + ``'%Y-%m-%d %H:%M:%S'``. + """ + + name = "datetime" + + def __init__(self, formats=None): + self.formats = formats or ["%Y-%m-%d", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S"] + + def get_metavar(self, param): + return "[{}]".format("|".join(self.formats)) + + def _try_to_convert_date(self, value, format): + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert(self, value, param, ctx): + # Exact match + for format in self.formats: + dtime = self._try_to_convert_date(value, format) + if dtime: + return dtime + + self.fail( + "invalid datetime format: {}. (choose from {})".format( + value, ", ".join(self.formats) + ) + ) + + def __repr__(self): + return "DateTime" + + +class IntParamType(ParamType): + name = "integer" + + def convert(self, value, param, ctx): + try: + return int(value) + except ValueError: + self.fail("{} is not a valid integer".format(value), param, ctx) + + def __repr__(self): + return "INT" + + +class IntRange(IntParamType): + """A parameter that works similar to :data:`click.INT` but restricts + the value to fit into a range. The default behavior is to fail if the + value falls outside the range, but it can also be silently clamped + between the two edges. + + See :ref:`ranges` for an example. + """ + + name = "integer range" + + def __init__(self, min=None, max=None, clamp=False): + self.min = min + self.max = max + self.clamp = clamp + + def convert(self, value, param, ctx): + rv = IntParamType.convert(self, value, param, ctx) + if self.clamp: + if self.min is not None and rv < self.min: + return self.min + if self.max is not None and rv > self.max: + return self.max + if ( + self.min is not None + and rv < self.min + or self.max is not None + and rv > self.max + ): + if self.min is None: + self.fail( + "{} is bigger than the maximum valid value {}.".format( + rv, self.max + ), + param, + ctx, + ) + elif self.max is None: + self.fail( + "{} is smaller than the minimum valid value {}.".format( + rv, self.min + ), + param, + ctx, + ) + else: + self.fail( + "{} is not in the valid range of {} to {}.".format( + rv, self.min, self.max + ), + param, + ctx, + ) + return rv + + def __repr__(self): + return "IntRange({}, {})".format(self.min, self.max) + + +class FloatParamType(ParamType): + name = "float" + + def convert(self, value, param, ctx): + try: + return float(value) + except ValueError: + self.fail( + "{} is not a valid floating point value".format(value), param, ctx + ) + + def __repr__(self): + return "FLOAT" + + +class FloatRange(FloatParamType): + """A parameter that works similar to :data:`click.FLOAT` but restricts + the value to fit into a range. The default behavior is to fail if the + value falls outside the range, but it can also be silently clamped + between the two edges. + + See :ref:`ranges` for an example. + """ + + name = "float range" + + def __init__(self, min=None, max=None, clamp=False): + self.min = min + self.max = max + self.clamp = clamp + + def convert(self, value, param, ctx): + rv = FloatParamType.convert(self, value, param, ctx) + if self.clamp: + if self.min is not None and rv < self.min: + return self.min + if self.max is not None and rv > self.max: + return self.max + if ( + self.min is not None + and rv < self.min + or self.max is not None + and rv > self.max + ): + if self.min is None: + self.fail( + "{} is bigger than the maximum valid value {}.".format( + rv, self.max + ), + param, + ctx, + ) + elif self.max is None: + self.fail( + "{} is smaller than the minimum valid value {}.".format( + rv, self.min + ), + param, + ctx, + ) + else: + self.fail( + "{} is not in the valid range of {} to {}.".format( + rv, self.min, self.max + ), + param, + ctx, + ) + return rv + + def __repr__(self): + return "FloatRange({}, {})".format(self.min, self.max) + + +class BoolParamType(ParamType): + name = "boolean" + + def convert(self, value, param, ctx): + if isinstance(value, bool): + return bool(value) + value = value.lower() + if value in ("true", "t", "1", "yes", "y"): + return True + elif value in ("false", "f", "0", "no", "n"): + return False + self.fail("{} is not a valid boolean".format(value), param, ctx) + + def __repr__(self): + return "BOOL" + + +class UUIDParameterType(ParamType): + name = "uuid" + + def convert(self, value, param, ctx): + import uuid + + try: + if PY2 and isinstance(value, text_type): + value = value.encode("ascii") + return uuid.UUID(value) + except ValueError: + self.fail("{} is not a valid UUID value".format(value), param, ctx) + + def __repr__(self): + return "UUID" + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or upon + first IO. The default is to be non-lazy for standard input and output + streams as well as files opened for reading, `lazy` otherwise. When opening a + file lazily for reading, it is still opened temporarily for validation, but + will not be held open until first IO. lazy is mainly useful when opening + for writing to avoid creating the file until it is needed. + + Starting with Click 2.0, files can also be opened atomically in which + case all writes go into a separate file in the same folder and upon + completion the file will be moved over to the original location. This + is useful if a file regularly read by other users is modified. + + See :ref:`file-args` for more information. + """ + + name = "filename" + envvar_list_splitter = os.path.pathsep + + def __init__( + self, mode="r", encoding=None, errors="strict", lazy=None, atomic=False + ): + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def resolve_lazy_flag(self, value): + if self.lazy is not None: + return self.lazy + if value == "-": + return False + elif "w" in self.mode: + return True + return False + + def convert(self, value, param, ctx): + try: + if hasattr(value, "read") or hasattr(value, "write"): + return value + + lazy = self.resolve_lazy_flag(value) + + if lazy: + f = LazyFile( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + if ctx is not None: + ctx.call_on_close(f.close_intelligently) + return f + + f, should_close = open_stream( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + # If a context is provided, we automatically close the file + # at the end of the context execution (or flush out). If a + # context does not exist, it's the caller's responsibility to + # properly close the file. This for instance happens when the + # type is used with prompts. + if ctx is not None: + if should_close: + ctx.call_on_close(safecall(f.close)) + else: + ctx.call_on_close(safecall(f.flush)) + return f + except (IOError, OSError) as e: # noqa: B014 + self.fail( + "Could not open file: {}: {}".format( + filename_to_ui(value), get_streerror(e) + ), + param, + ctx, + ) + + +class Path(ParamType): + """The path type is similar to the :class:`File` type but it performs + different checks. First of all, instead of returning an open file + handle it returns just the filename. Secondly, it can perform various + basic checks about what the file or directory should be. + + .. versionchanged:: 6.0 + `allow_dash` was added. + + :param exists: if set to true, the file or directory needs to exist for + this value to be valid. If this is not required and a + file does indeed not exist, then all further checks are + silently skipped. + :param file_okay: controls if a file is a possible value. + :param dir_okay: controls if a directory is a possible value. + :param writable: if true, a writable check is performed. + :param readable: if true, a readable check is performed. + :param resolve_path: if this is true, then the path is fully resolved + before the value is passed onwards. This means + that it's absolute and symlinks are resolved. It + will not expand a tilde-prefix, as this is + supposed to be done by the shell only. + :param allow_dash: If this is set to `True`, a single dash to indicate + standard streams is permitted. + :param path_type: optionally a string type that should be used to + represent the path. The default is `None` which + means the return value will be either bytes or + unicode depending on what makes most sense given the + input data Click deals with. + """ + + envvar_list_splitter = os.path.pathsep + + def __init__( + self, + exists=False, + file_okay=True, + dir_okay=True, + writable=False, + readable=True, + resolve_path=False, + allow_dash=False, + path_type=None, + ): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.writable = writable + self.readable = readable + self.resolve_path = resolve_path + self.allow_dash = allow_dash + self.type = path_type + + if self.file_okay and not self.dir_okay: + self.name = "file" + self.path_type = "File" + elif self.dir_okay and not self.file_okay: + self.name = "directory" + self.path_type = "Directory" + else: + self.name = "path" + self.path_type = "Path" + + def coerce_path_result(self, rv): + if self.type is not None and not isinstance(rv, self.type): + if self.type is text_type: + rv = rv.decode(get_filesystem_encoding()) + else: + rv = rv.encode(get_filesystem_encoding()) + return rv + + def convert(self, value, param, ctx): + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") + + if not is_dash: + if self.resolve_path: + rv = os.path.realpath(rv) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail( + "{} '{}' does not exist.".format( + self.path_type, filename_to_ui(value) + ), + param, + ctx, + ) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail( + "{} '{}' is a file.".format(self.path_type, filename_to_ui(value)), + param, + ctx, + ) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail( + "{} '{}' is a directory.".format( + self.path_type, filename_to_ui(value) + ), + param, + ctx, + ) + if self.writable and not os.access(value, os.W_OK): + self.fail( + "{} '{}' is not writable.".format( + self.path_type, filename_to_ui(value) + ), + param, + ctx, + ) + if self.readable and not os.access(value, os.R_OK): + self.fail( + "{} '{}' is not readable.".format( + self.path_type, filename_to_ui(value) + ), + param, + ctx, + ) + + return self.coerce_path_result(rv) + + +class Tuple(CompositeParamType): + """The default behavior of Click is to apply a type on a value directly. + This works well in most cases, except for when `nargs` is set to a fixed + count and different types should be used for different items. In this + case the :class:`Tuple` type can be used. This type can only be used + if `nargs` is set to a fixed number. + + For more information see :ref:`tuple-type`. + + This can be selected by using a Python tuple literal as a type. + + :param types: a list of types that should be used for the tuple items. + """ + + def __init__(self, types): + self.types = [convert_type(ty) for ty in types] + + @property + def name(self): + return "<{}>".format(" ".join(ty.name for ty in self.types)) + + @property + def arity(self): + return len(self.types) + + def convert(self, value, param, ctx): + if len(value) != len(self.types): + raise TypeError( + "It would appear that nargs is set to conflict with the" + " composite type arity." + ) + return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) + + +def convert_type(ty, default=None): + """Converts a callable or python type into the most appropriate + param type. + """ + guessed_type = False + if ty is None and default is not None: + if isinstance(default, tuple): + ty = tuple(map(type, default)) + else: + ty = type(default) + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + if isinstance(ty, ParamType): + return ty + if ty is text_type or ty is str or ty is None: + return STRING + if ty is int: + return INT + # Booleans are only okay if not guessed. This is done because for + # flags the default value is actually a bit of a lie in that it + # indicates which of the flags is the one we want. See get_default() + # for more information. + if ty is bool and not guessed_type: + return BOOL + if ty is float: + return FLOAT + if guessed_type: + return STRING + + # Catch a common mistake + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError( + "Attempted to use an uninstantiated parameter type ({}).".format(ty) + ) + except TypeError: + pass + return FuncParamType(ty) + + +#: A dummy parameter type that just does nothing. From a user's +#: perspective this appears to just be the same as `STRING` but internally +#: no string conversion takes place. This is necessary to achieve the +#: same bytes/unicode behavior on Python 2/3 in situations where you want +#: to not convert argument types. This is usually useful when working +#: with file paths as they can appear in bytes and unicode. +#: +#: For path related uses the :class:`Path` type is a better choice but +#: there are situations where an unprocessed type is useful which is why +#: it is is provided. +#: +#: .. versionadded:: 4.0 +UNPROCESSED = UnprocessedParamType() + +#: A unicode string parameter type which is the implicit default. This +#: can also be selected by using ``str`` as type. +STRING = StringParamType() + +#: An integer parameter. This can also be selected by using ``int`` as +#: type. +INT = IntParamType() + +#: A floating point value parameter. This can also be selected by using +#: ``float`` as type. +FLOAT = FloatParamType() + +#: A boolean parameter. This is the default for boolean flags. This can +#: also be selected by using ``bool`` as a type. +BOOL = BoolParamType() + +#: A UUID parameter. +UUID = UUIDParameterType() diff --git a/brightonpy/Lib/site-packages/click/utils.py b/brightonpy/Lib/site-packages/click/utils.py new file mode 100644 index 0000000..79265e7 --- /dev/null +++ b/brightonpy/Lib/site-packages/click/utils.py @@ -0,0 +1,455 @@ +import os +import sys + +from ._compat import _default_text_stderr +from ._compat import _default_text_stdout +from ._compat import auto_wrap_for_ansi +from ._compat import binary_streams +from ._compat import filename_to_ui +from ._compat import get_filesystem_encoding +from ._compat import get_streerror +from ._compat import is_bytes +from ._compat import open_stream +from ._compat import PY2 +from ._compat import should_strip_ansi +from ._compat import string_types +from ._compat import strip_ansi +from ._compat import text_streams +from ._compat import text_type +from ._compat import WIN +from .globals import resolve_color_default + +if not PY2: + from ._compat import _find_binary_writer +elif WIN: + from ._winconsole import _get_windows_argv + from ._winconsole import _hash_py_argv + from ._winconsole import _initial_argv_hash + +echo_native_types = string_types + (bytes, bytearray) + + +def _posixify(name): + return "-".join(name.split()).lower() + + +def safecall(func): + """Wraps a function so that it swallows exceptions.""" + + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception: + pass + + return wrapper + + +def make_str(value): + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(get_filesystem_encoding()) + except UnicodeError: + return value.decode("utf-8", "replace") + return text_type(value) + + +def make_default_short_help(help, max_length=45): + """Return a condensed version of help string.""" + words = help.split() + total_length = 0 + result = [] + done = False + + for word in words: + if word[-1:] == ".": + done = True + new_length = 1 + len(word) if result else len(word) + if total_length + new_length > max_length: + result.append("...") + done = True + else: + if result: + result.append(" ") + result.append(word) + if done: + break + total_length += new_length + + return "".join(result) + + +class LazyFile(object): + """A lazy file works like a regular file but it does not fully open + the file but it does perform some basic checks early to see if the + filename parameter does make sense. This is useful for safely opening + files for writing. + """ + + def __init__( + self, filename, mode="r", encoding=None, errors="strict", atomic=False + ): + self.name = filename + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + + if filename == "-": + self._f, self.should_close = open_stream(filename, mode, encoding, errors) + else: + if "r" in mode: + # Open and close the file in case we're opening it for + # reading so that we can catch at least some errors in + # some cases early. + open(filename, mode).close() + self._f = None + self.should_close = True + + def __getattr__(self, name): + return getattr(self.open(), name) + + def __repr__(self): + if self._f is not None: + return repr(self._f) + return "".format(self.name, self.mode) + + def open(self): + """Opens the file if it's not yet open. This call might fail with + a :exc:`FileError`. Not handling this error will produce an error + that Click shows. + """ + if self._f is not None: + return self._f + try: + rv, self.should_close = open_stream( + self.name, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + except (IOError, OSError) as e: # noqa: E402 + from .exceptions import FileError + + raise FileError(self.name, hint=get_streerror(e)) + self._f = rv + return rv + + def close(self): + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self): + """This function only closes the file if it was opened by the lazy + file wrapper. For instance this will never close stdin. + """ + if self.should_close: + self.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close_intelligently() + + def __iter__(self): + self.open() + return iter(self._f) + + +class KeepOpenFile(object): + def __init__(self, file): + self._file = file + + def __getattr__(self, name): + return getattr(self._file, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + pass + + def __repr__(self): + return repr(self._file) + + def __iter__(self): + return iter(self._file) + + +def echo(message=None, file=None, nl=True, err=False, color=None): + """Prints a message plus a newline to the given file or stdout. On + first sight, this looks like the print function, but it has improved + support for handling Unicode and binary data that does not fail no + matter how badly configured the system is. + + Primarily it means that you can print binary data as well as Unicode + data on both 2.x and 3.x to the given file in the most appropriate way + possible. This is a very carefree function in that it will try its + best to not fail. As of Click 6.0 this includes support for unicode + output on the Windows console. + + In addition to that, if `colorama`_ is installed, the echo function will + also support clever handling of ANSI codes. Essentially it will then + do the following: + + - add transparent handling of ANSI color codes on Windows. + - hide ANSI codes automatically if the destination file is not a + terminal. + + .. _colorama: https://pypi.org/project/colorama/ + + .. versionchanged:: 6.0 + As of Click 6.0 the echo function will properly support unicode + output on the windows console. Not that click does not modify + the interpreter in any way which means that `sys.stdout` or the + print statement or function will still not provide unicode support. + + .. versionchanged:: 2.0 + Starting with version 2.0 of Click, the echo function will work + with colorama if it's installed. + + .. versionadded:: 3.0 + The `err` parameter was added. + + .. versionchanged:: 4.0 + Added the `color` flag. + + :param message: the message to print + :param file: the file to write to (defaults to ``stdout``) + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``. This is faster and easier than calling + :func:`get_text_stderr` yourself. + :param nl: if set to `True` (the default) a newline is printed afterwards. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, echo_native_types): + message = text_type(message) + + if nl: + message = message or u"" + if isinstance(message, text_type): + message += u"\n" + else: + message += b"\n" + + # If there is a message, and we're in Python 3, and the value looks + # like bytes, we manually need to find the binary stream and write the + # message in there. This is done separately so that most stream + # types will work as you would expect. Eg: you can write to StringIO + # for other cases. + if message and not PY2 and is_bytes(message): + binary_file = _find_binary_writer(file) + if binary_file is not None: + file.flush() + binary_file.write(message) + binary_file.flush() + return + + # ANSI-style support. If there is no message or we are dealing with + # bytes nothing is happening. If we are connected to a file we want + # to strip colors. If we are on windows we either wrap the stream + # to strip the color or we use the colorama support to translate the + # ansi codes to API calls. + if message and not is_bytes(message): + color = resolve_color_default(color) + if should_strip_ansi(file, color): + message = strip_ansi(message) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file) + elif not color: + message = strip_ansi(message) + + if message: + file.write(message) + file.flush() + + +def get_binary_stream(name): + """Returns a system stream for byte processing. This essentially + returns the stream from the sys module with the given name but it + solves some compatibility issues between different Python versions. + Primarily this function is necessary for getting binary streams on + Python 3. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + """ + opener = binary_streams.get(name) + if opener is None: + raise TypeError("Unknown standard stream '{}'".format(name)) + return opener() + + +def get_text_stream(name, encoding=None, errors="strict"): + """Returns a system stream for text processing. This usually returns + a wrapped stream around a binary stream returned from + :func:`get_binary_stream` but it also can take shortcuts on Python 3 + for already correctly configured streams. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + :param encoding: overrides the detected default encoding. + :param errors: overrides the default error mode. + """ + opener = text_streams.get(name) + if opener is None: + raise TypeError("Unknown standard stream '{}'".format(name)) + return opener(encoding, errors) + + +def open_file( + filename, mode="r", encoding=None, errors="strict", lazy=False, atomic=False +): + """This is similar to how the :class:`File` works but for manual + usage. Files are opened non lazy by default. This can open regular + files as well as stdin/stdout if ``'-'`` is passed. + + If stdin/stdout is returned the stream is wrapped so that the context + manager will not close the stream accidentally. This makes it possible + to always use the function like this without having to worry to + accidentally close a standard stream:: + + with open_file(filename) as f: + ... + + .. versionadded:: 3.0 + + :param filename: the name of the file to open (or ``'-'`` for stdin/stdout). + :param mode: the mode in which to open the file. + :param encoding: the encoding to use. + :param errors: the error handling for this file. + :param lazy: can be flipped to true to open the file lazily. + :param atomic: in atomic mode writes go into a temporary file and it's + moved on close. + """ + if lazy: + return LazyFile(filename, mode, encoding, errors, atomic=atomic) + f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) + if not should_close: + f = KeepOpenFile(f) + return f + + +def get_os_args(): + """This returns the argument part of sys.argv in the most appropriate + form for processing. What this means is that this return value is in + a format that works for Click to process but does not necessarily + correspond well to what's actually standard for the interpreter. + + On most environments the return value is ``sys.argv[:1]`` unchanged. + However if you are on Windows and running Python 2 the return value + will actually be a list of unicode strings instead because the + default behavior on that platform otherwise will not be able to + carry all possible values that sys.argv can have. + + .. versionadded:: 6.0 + """ + # We can only extract the unicode argv if sys.argv has not been + # changed since the startup of the application. + if PY2 and WIN and _initial_argv_hash == _hash_py_argv(): + return _get_windows_argv() + return sys.argv[1:] + + +def format_filename(filename, shorten=False): + """Formats a filename for user display. The main purpose of this + function is to ensure that the filename can be displayed at all. This + will decode the filename to unicode if necessary in a way that it will + not fail. Optionally, it can shorten the filename to not include the + full path to the filename. + + :param filename: formats a filename for UI display. This will also convert + the filename into unicode without failing. + :param shorten: this optionally shortens the filename to strip of the + path that leads up to it. + """ + if shorten: + filename = os.path.basename(filename) + return filename_to_ui(filename) + + +def get_app_dir(app_name, roaming=True, force_posix=False): + r"""Returns the config folder for the application. The default behavior + is to return whatever is most appropriate for the operating system. + + To give you an idea, for an app called ``"Foo Bar"``, something like + the following folders could be returned: + + Mac OS X: + ``~/Library/Application Support/Foo Bar`` + Mac OS X (POSIX): + ``~/.foo-bar`` + Unix: + ``~/.config/foo-bar`` + Unix (POSIX): + ``~/.foo-bar`` + Win XP (roaming): + ``C:\Documents and Settings\\Local Settings\Application Data\Foo Bar`` + Win XP (not roaming): + ``C:\Documents and Settings\\Application Data\Foo Bar`` + Win 7 (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Win 7 (not roaming): + ``C:\Users\\AppData\Local\Foo Bar`` + + .. versionadded:: 2.0 + + :param app_name: the application name. This should be properly capitalized + and can contain whitespace. + :param roaming: controls if the folder should be roaming or not on Windows. + Has no affect otherwise. + :param force_posix: if this is set to `True` then on any POSIX system the + folder will be stored in the home folder with a leading + dot instead of the XDG config home or darwin's + application support folder. + """ + if WIN: + key = "APPDATA" if roaming else "LOCALAPPDATA" + folder = os.environ.get(key) + if folder is None: + folder = os.path.expanduser("~") + return os.path.join(folder, app_name) + if force_posix: + return os.path.join(os.path.expanduser("~/.{}".format(_posixify(app_name)))) + if sys.platform == "darwin": + return os.path.join( + os.path.expanduser("~/Library/Application Support"), app_name + ) + return os.path.join( + os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), + _posixify(app_name), + ) + + +class PacifyFlushWrapper(object): + """This wrapper is used to catch and suppress BrokenPipeErrors resulting + from ``.flush()`` being called on broken pipe during the shutdown/final-GC + of the Python interpreter. Notably ``.flush()`` is always called on + ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any + other cleanup code, and the case where the underlying file is not a broken + pipe, all calls and attributes are proxied. + """ + + def __init__(self, wrapped): + self.wrapped = wrapped + + def flush(self): + try: + self.wrapped.flush() + except IOError as e: + import errno + + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr): + return getattr(self.wrapped, attr) diff --git a/brightonpy/Lib/site-packages/easy_install.py b/brightonpy/Lib/site-packages/easy_install.py new file mode 100644 index 0000000..d87e984 --- /dev/null +++ b/brightonpy/Lib/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/brightonpy/Lib/site-packages/flask/__init__.py b/brightonpy/Lib/site-packages/flask/__init__.py new file mode 100644 index 0000000..a9a873f --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/__init__.py @@ -0,0 +1,49 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/__main__.py b/brightonpy/Lib/site-packages/flask/__main__.py new file mode 100644 index 0000000..cbefccd --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/__main__.py @@ -0,0 +1,15 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/_compat.py b/brightonpy/Lib/site-packages/flask/_compat.py new file mode 100644 index 0000000..071628f --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/_compat.py @@ -0,0 +1,96 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/app.py b/brightonpy/Lib/site-packages/flask/app.py new file mode 100644 index 0000000..1404e17 --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/app.py @@ -0,0 +1,2003 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/blueprints.py b/brightonpy/Lib/site-packages/flask/blueprints.py new file mode 100644 index 0000000..586a1b0 --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/blueprints.py @@ -0,0 +1,413 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/cli.py b/brightonpy/Lib/site-packages/flask/cli.py new file mode 100644 index 0000000..074ee76 --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/cli.py @@ -0,0 +1,517 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/config.py b/brightonpy/Lib/site-packages/flask/config.py new file mode 100644 index 0000000..697add7 --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/config.py @@ -0,0 +1,263 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/ctx.py b/brightonpy/Lib/site-packages/flask/ctx.py new file mode 100644 index 0000000..480d9c5 --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/ctx.py @@ -0,0 +1,410 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/debughelpers.py b/brightonpy/Lib/site-packages/flask/debughelpers.py new file mode 100644 index 0000000..90710dd --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/debughelpers.py @@ -0,0 +1,155 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/ext/__init__.py b/brightonpy/Lib/site-packages/flask/ext/__init__.py new file mode 100644 index 0000000..051f44a --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/ext/__init__.py @@ -0,0 +1,29 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/exthook.py b/brightonpy/Lib/site-packages/flask/exthook.py new file mode 100644 index 0000000..d884280 --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/exthook.py @@ -0,0 +1,143 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/globals.py b/brightonpy/Lib/site-packages/flask/globals.py new file mode 100644 index 0000000..0b70a3e --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/globals.py @@ -0,0 +1,61 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/helpers.py b/brightonpy/Lib/site-packages/flask/helpers.py new file mode 100644 index 0000000..4bb1d1c --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/helpers.py @@ -0,0 +1,966 @@ +# -*- 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/brightonpy/Lib/site-packages/flask/json.py b/brightonpy/Lib/site-packages/flask/json.py new file mode 100644 index 0000000..16e0c29 --- /dev/null +++ b/brightonpy/Lib/site-packages/flask/json.py @@ -0,0 +1,269 @@ +# -*- 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(r'^\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(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall(r"([-\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(r"^(#[0-9a-fA-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/brightonpy/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/brightonpy/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/brightonpy/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +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): + """Collapses whitespace except in pre, textarea, and script elements""" + 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/brightonpy/Lib/site-packages/pip/_vendor/html5lib/html5parser.py b/brightonpy/Lib/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000..ae41a13 --- /dev/null +++ b/brightonpy/Lib/site-packages/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2791 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys + +import types +from collections 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 an HTML document as a string or file-like object into a tree + + :arg doc: the document to parse as a string or file-like object + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import parse + >>> parse('

    This is a doc

    ') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML fragment as a string or file-like object into a tree + + :arg doc: the fragment to parse as a string or file-like object + + :arg container: the container context to parse the fragment in + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import parseFragment + >>> parseFragment('this is a fragment') + + + """ + 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): + """ + :arg tree: a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + :arg strict: raise an exception when a parse error is encountered + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :arg debug: whether or not to enable debug mode which logs things + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() # generates parser with etree builder + >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict + + """ + + # 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): + """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 + + :arg stream: a file-like 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). + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parse('

    This is a doc

    ') + + + """ + 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 + + :arg container: name of the element we're setting the innerHTML + property if set to None, default to 'div' + + :arg stream: a file-like 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) + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parseFragment('this is a fragment') + + + """ + 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 + 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 ",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0gTe~DWM4fkj^!0 literal 0 HcmV?d00001 diff --git a/brightonpy/Lib/site-packages/werkzeug/debug/shared/more.png b/brightonpy/Lib/site-packages/werkzeug/debug/shared/more.png new file mode 100644 index 0000000000000000000000000000000000000000..804fa226fe3ed9e6cc2bd044a848f33a2d7b4e4f GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=fm(z?n2}-D90{Nxdx@v7EBg&5DRB)3hmHb?jr_0{K>_1cC{J-%1r lr(<|}#G9!1a#KtW>0AF44oJ8ZkqR`E!PC{xWt~$(698mrJ|X}B literal 0 HcmV?d00001 diff --git a/brightonpy/Lib/site-packages/werkzeug/debug/shared/source.png b/brightonpy/Lib/site-packages/werkzeug/debug/shared/source.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ea90419d950f9e69d977a1f5847456d96a5f0b GIT binary patch literal 818 zcmV-21I_%2P)@LCln44|RX7Ti z0HI3&7jPq){odH{?_{%nYVq_;n_c4WbUpvU(&Cvnj!vq|kVC-vpF6vp^;;e0mm6HW z+WPzA`AZ|;pPp$&dNjzrc??4rt`k%Q1l*u-BPD0MQ}Fbm8jnsyezNt7+u{23>t7Em zJtETY?ja9KrVs^!LJ$xEMF3-bAZO;-IQJavE60KA7fO$VY_%N)R6s>g5mW>fL4&aR z*EVgKKTBXm!=L?S0?xM zYqL@C$|EDF2q*3zWW7;PDZ}SK*IE8;i!3U62=qn80C&*I1Le7WwNP5EcX;_oh2dJn zf#HgBe4@r$GcjHjmj2vAfT%(YN?}kK=(*+1*DkNNc1H5R++vfBMhACi<5uFUU+N4+ z<&U*CPmWi}REa7C6-t>2im1CWv5Jkefxa6>)dEj-CAW wWa{_}BJ!}~75?MkfaCnj>Dn=~vkLS70Pk`;z)@TQj{pDw07*qoM6N<$f@imYHUIzs literal 0 HcmV?d00001 diff --git a/brightonpy/Lib/site-packages/werkzeug/debug/shared/style.css b/brightonpy/Lib/site-packages/werkzeug/debug/shared/style.css new file mode 100644 index 0000000..107863e --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/debug/shared/style.css @@ -0,0 +1,154 @@ +@font-face { + font-family: 'Ubuntu'; + font-style: normal; + font-weight: normal; + src: local('Ubuntu'), local('Ubuntu-Regular'), + url('?__debugger__=yes&cmd=resource&f=ubuntu.ttf') format('truetype'); +} + +body, input { font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; color: #000; text-align: center; + margin: 1em; padding: 0; font-size: 15px; } +h1, h2, h3 { font-family: 'Ubuntu', 'Lucida Grande', 'Lucida Sans Unicode', + 'Geneva', 'Verdana', sans-serif; font-weight: normal; } + +input { background-color: #fff; margin: 0; text-align: left; + outline: none !important; } +input[type="submit"] { padding: 3px 6px; } +a { color: #11557C; } +a:hover { color: #177199; } +pre, code, +textarea { font-family: 'Consolas', 'Monaco', 'Bitstream Vera Sans Mono', + monospace; font-size: 14px; } + +div.debugger { text-align: left; padding: 12px; margin: auto; + background-color: white; } +h1 { font-size: 36px; margin: 0 0 0.3em 0; } +div.detail { cursor: pointer; } +div.detail p { margin: 0 0 8px 13px; font-size: 14px; white-space: pre-wrap; + font-family: monospace; } +div.explanation { margin: 20px 13px; font-size: 15px; color: #555; } +div.footer { font-size: 13px; text-align: right; margin: 30px 0; + color: #86989B; } + +h2 { font-size: 16px; margin: 1.3em 0 0.0 0; padding: 9px; + background-color: #11557C; color: white; } +h2 em, h3 em { font-style: normal; color: #A5D6D9; font-weight: normal; } + +div.traceback, div.plain { border: 1px solid #ddd; margin: 0 0 1em 0; padding: 10px; } +div.plain p { margin: 0; } +div.plain textarea, +div.plain pre { margin: 10px 0 0 0; padding: 4px; + background-color: #E8EFF0; border: 1px solid #D3E7E9; } +div.plain textarea { width: 99%; height: 300px; } +div.traceback h3 { font-size: 1em; margin: 0 0 0.8em 0; } +div.traceback ul { list-style: none; margin: 0; padding: 0 0 0 1em; } +div.traceback h4 { font-size: 13px; font-weight: normal; margin: 0.7em 0 0.1em 0; } +div.traceback pre { margin: 0; padding: 5px 0 3px 15px; + background-color: #E8EFF0; border: 1px solid #D3E7E9; } +div.traceback .library .current { background: white; color: #555; } +div.traceback .expanded .current { background: #E8EFF0; color: black; } +div.traceback pre:hover { background-color: #DDECEE; color: black; cursor: pointer; } +div.traceback div.source.expanded pre + pre { border-top: none; } + +div.traceback span.ws { display: none; } +div.traceback pre.before, div.traceback pre.after { display: none; background: white; } +div.traceback div.source.expanded pre.before, +div.traceback div.source.expanded pre.after { + display: block; +} + +div.traceback div.source.expanded span.ws { + display: inline; +} + +div.traceback blockquote { margin: 1em 0 0 0; padding: 0; white-space: pre-line; } +div.traceback img { float: right; padding: 2px; margin: -3px 2px 0 0; display: none; } +div.traceback img:hover { background-color: #ddd; cursor: pointer; + border-color: #BFDDE0; } +div.traceback pre:hover img { display: block; } +div.traceback cite.filename { font-style: normal; color: #3B666B; } + +pre.console { border: 1px solid #ccc; background: white!important; + color: black; padding: 5px!important; + margin: 3px 0 0 0!important; cursor: default!important; + max-height: 400px; overflow: auto; } +pre.console form { color: #555; } +pre.console input { background-color: transparent; color: #555; + width: 90%; font-family: 'Consolas', 'Deja Vu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; font-size: 14px; + border: none!important; } + +span.string { color: #30799B; } +span.number { color: #9C1A1C; } +span.help { color: #3A7734; } +span.object { color: #485F6E; } +span.extended { opacity: 0.5; } +span.extended:hover { opacity: 1; } +a.toggle { text-decoration: none; background-repeat: no-repeat; + background-position: center center; + background-image: url(?__debugger__=yes&cmd=resource&f=more.png); } +a.toggle:hover { background-color: #444; } +a.open { background-image: url(?__debugger__=yes&cmd=resource&f=less.png); } + +pre.console div.traceback, +pre.console div.box { margin: 5px 10px; white-space: normal; + border: 1px solid #11557C; padding: 10px; + font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; } +pre.console div.box h3, +pre.console div.traceback h3 { margin: -10px -10px 10px -10px; padding: 5px; + background: #11557C; color: white; } + +pre.console div.traceback pre:hover { cursor: default; background: #E8EFF0; } +pre.console div.traceback pre.syntaxerror { background: inherit; border: none; + margin: 20px -10px -10px -10px; + padding: 10px; border-top: 1px solid #BFDDE0; + background: #E8EFF0; } +pre.console div.noframe-traceback pre.syntaxerror { margin-top: -10px; border: none; } + +pre.console div.box pre.repr { padding: 0; margin: 0; background-color: white; border: none; } +pre.console div.box table { margin-top: 6px; } +pre.console div.box pre { border: none; } +pre.console div.box pre.help { background-color: white; } +pre.console div.box pre.help:hover { cursor: default; } +pre.console table tr { vertical-align: top; } +div.console { border: 1px solid #ccc; padding: 4px; background-color: #fafafa; } + +div.traceback pre, div.console pre { + white-space: pre-wrap; /* css-3 should we be so lucky... */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 ?? */ + white-space: -o-pre-wrap; /* Opera 7 ?? */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ + _white-space: pre; /* IE only hack to re-specify in + addition to word-wrap */ +} + + +div.pin-prompt { + position: absolute; + display: none; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(255, 255, 255, 0.8); +} + +div.pin-prompt .inner { + background: #eee; + padding: 10px 50px; + width: 350px; + margin: 10% auto 0 auto; + border: 1px solid #ccc; + border-radius: 2px; +} + +div.exc-divider { + margin: 0.7em 0 0 -1em; + padding: 0.5em; + background: #11557C; + color: #ddd; + border: 1px solid #ddd; +} diff --git a/brightonpy/Lib/site-packages/werkzeug/debug/shared/ubuntu.ttf b/brightonpy/Lib/site-packages/werkzeug/debug/shared/ubuntu.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8079f938c9fa5aede9a151439f136e267958ccd1 GIT binary patch literal 70220 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

    %lg zINZYFmOi1!X^9<~q;Nv$-hQ9->=Am__pF?MPUuZuyAZ9-;NiA<1@u}yf9pq znb)v5ED9%fe51X5vEpB~{jANM-l^UG_*^BV37YxTsdZQ%+%-EJ^!3Y$YdWOZ+^-f*h^XZ31d z7}6R;dUd1XEn2og>-6jXcUfXDAJFR~!hS6oRot&Qr#P?e4e0lU;Zm08g;`a9dVA*C zz*hZkZzC(t9T;Ksf!*$w&ro@{o*;KqTWk%9i~ z=urPaE}P#xkiGEI(V_fkcKz^Be*Wc+1KCr1w5fxc!~9x7rFa8s>ZlsiCz;`bflZ@Z z`V<_za`ts=Wi`>ujT(_;%g;(^k5U5Wm?v*fA zeOvPK^}N2mP3{SAetmcDygK`ty4~NZu$`YCHPzjEp4Ck@XOBAMunKopg|IoF-*)Dz zRol03@99UtR`K_29Ny~J{@)usxCg$e?)vYQ&zJ6;l)Ftqo#5cVJ|?;I9m8Ef2C6{# z;MZUK%kLh1gV(pHvjml&zP7#pwZ$#ca>W~NG3aTHIsNzm;_V(Yx{jZgfPjAa@Jtc;|&wjh|WGCr9=I>DD`8$>6I$2M8J4Iud9(5caK~K~D{8sDU zZl~)&afZfMzL(G%jZ@yQXK9|T=6+D0&vmNNR|S6fkm}6ORYmv))$5)w)gM)j@&&T^ z<2o!|q{`G!C~xBW%TH-G>1V>l%476pI>N0Q<7oDExHAO)^_ci88^^N&rh{I3A-@_~6)o@Grxkl!9t4jV-b@y+nL)@d?I<4_->9tZ?BHW+T)9~-&g4Aq5BoP7wF&J|Ga&VfA7kaPT}{5 H?s(!~BBTR` literal 0 HcmV?d00001 diff --git a/brightonpy/Lib/site-packages/werkzeug/debug/tbtools.py b/brightonpy/Lib/site-packages/werkzeug/debug/tbtools.py new file mode 100644 index 0000000..c835888 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/debug/tbtools.py @@ -0,0 +1,629 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.debug.tbtools + ~~~~~~~~~~~~~~~~~~~~~~ + + This module provides various traceback related utility functions. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import inspect +import json +import os +import re +import sys +import sysconfig +import traceback +from tokenize import TokenError + +from .._compat import PY2 +from .._compat import range_type +from .._compat import reraise +from .._compat import string_types +from .._compat import text_type +from .._compat import to_native +from .._compat import to_unicode +from ..filesystem import get_filesystem_encoding +from ..utils import cached_property +from ..utils import escape +from .console import Console + + +_coding_re = re.compile(br"coding[:=]\s*([-\w.]+)") +_line_re = re.compile(br"^(.*?)$", re.MULTILINE) +_funcdef_re = re.compile(r"^(\s*def\s)|(.*(? + + + %(title)s // Werkzeug Debugger + + + + + + + + +

    +""" +FOOTER = u"""\ + +
    + +
    +
    +

    Console Locked

    +

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

    +

    PIN: + + +

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

    %(exception_type)s

    +
    +

    %(exception)s

    +
    +

    Traceback (most recent call last)

    +%(summary)s +
    +
    +

    + + This is the Copy/Paste friendly version of the traceback. You can also paste this traceback into + a gist: + +

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

    Interactive Console

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

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

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

    %s

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

    %s

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

    %(name)s

    \n" + u"%(description)s\n" + ) + % { + "code": self.code, + "name": escape(self.name), + "description": self.get_description(environ), + } + ) + + def get_headers(self, environ=None): + """Get a list of headers.""" + return [("Content-Type", "text/html")] + + def get_response(self, environ=None): + """Get a response object. If one was passed to the exception + it's returned directly. + + :param environ: the optional environ for the request. This + can be used to modify the response depending + on how the request looked like. + :return: a :class:`Response` object or a subclass thereof. + """ + from .wrappers.response import Response + + if self.response is not None: + return self.response + if environ is not None: + environ = _get_environ(environ) + headers = self.get_headers(environ) + return Response(self.get_body(environ), self.code, headers) + + def __call__(self, environ, start_response): + """Call the exception as WSGI application. + + :param environ: the WSGI environment. + :param start_response: the response callable provided by the WSGI + server. + """ + response = self.get_response(environ) + return response(environ, start_response) + + def __str__(self): + code = self.code if self.code is not None else "???" + return "%s %s: %s" % (code, self.name, self.description) + + def __repr__(self): + code = self.code if self.code is not None else "???" + return "<%s '%s: %s'>" % (self.__class__.__name__, code, self.name) + + +class BadRequest(HTTPException): + """*400* `Bad Request` + + Raise if the browser sends something to the application the application + or server cannot handle. + """ + + code = 400 + description = ( + "The browser (or proxy) sent a request that this server could " + "not understand." + ) + + +class ClientDisconnected(BadRequest): + """Internal exception that is raised if Werkzeug detects a disconnected + client. Since the client is already gone at that point attempting to + send the error message to the client might not work and might ultimately + result in another exception in the server. Mainly this is here so that + it is silenced by default as far as Werkzeug is concerned. + + Since disconnections cannot be reliably detected and are unspecified + by WSGI to a large extent this might or might not be raised if a client + is gone. + + .. versionadded:: 0.8 + """ + + +class SecurityError(BadRequest): + """Raised if something triggers a security error. This is otherwise + exactly like a bad request error. + + .. versionadded:: 0.9 + """ + + +class BadHost(BadRequest): + """Raised if the submitted host is badly formatted. + + .. versionadded:: 0.11.2 + """ + + +class Unauthorized(HTTPException): + """*401* ``Unauthorized`` + + Raise if the user is not authorized to access a resource. + + The ``www_authenticate`` argument should be used to set the + ``WWW-Authenticate`` header. This is used for HTTP basic auth and + other schemes. Use :class:`~werkzeug.datastructures.WWWAuthenticate` + to create correctly formatted values. Strictly speaking a 401 + response is invalid if it doesn't provide at least one value for + this header, although real clients typically don't care. + + :param description: Override the default message used for the body + of the response. + :param www-authenticate: A single value, or list of values, for the + WWW-Authenticate header. + + .. versionchanged:: 0.15.3 + If the ``www_authenticate`` argument is not set, the + ``WWW-Authenticate`` header is not set. + + .. versionchanged:: 0.15.3 + The ``response`` argument was restored. + + .. versionchanged:: 0.15.1 + ``description`` was moved back as the first argument, restoring + its previous position. + + .. versionchanged:: 0.15.0 + ``www_authenticate`` was added as the first argument, ahead of + ``description``. + """ + + code = 401 + description = ( + "The server could not verify that you are authorized to access" + " the URL requested. You either supplied the wrong credentials" + " (e.g. a bad password), or your browser doesn't understand" + " how to supply the credentials required." + ) + + def __init__(self, description=None, response=None, www_authenticate=None): + HTTPException.__init__(self, description, response) + + if www_authenticate is not None: + if not isinstance(www_authenticate, (tuple, list)): + www_authenticate = (www_authenticate,) + + self.www_authenticate = www_authenticate + + def get_headers(self, environ=None): + headers = HTTPException.get_headers(self, environ) + if self.www_authenticate: + headers.append( + ("WWW-Authenticate", ", ".join([str(x) for x in self.www_authenticate])) + ) + return headers + + +class Forbidden(HTTPException): + """*403* `Forbidden` + + Raise if the user doesn't have the permission for the requested resource + but was authenticated. + """ + + code = 403 + description = ( + "You don't have the permission to access the requested" + " resource. It is either read-protected or not readable by the" + " server." + ) + + +class NotFound(HTTPException): + """*404* `Not Found` + + Raise if a resource does not exist and never existed. + """ + + code = 404 + description = ( + "The requested URL was not found on the server. If you entered" + " the URL manually please check your spelling and try again." + ) + + +class MethodNotAllowed(HTTPException): + """*405* `Method Not Allowed` + + Raise if the server used a method the resource does not handle. For + example `POST` if the resource is view only. Especially useful for REST. + + The first argument for this exception should be a list of allowed methods. + Strictly speaking the response would be invalid if you don't provide valid + methods in the header which you can do with that list. + """ + + code = 405 + description = "The method is not allowed for the requested URL." + + def __init__(self, valid_methods=None, description=None): + """Takes an optional list of valid http methods + starting with werkzeug 0.3 the list will be mandatory.""" + HTTPException.__init__(self, description) + self.valid_methods = valid_methods + + def get_headers(self, environ=None): + headers = HTTPException.get_headers(self, environ) + if self.valid_methods: + headers.append(("Allow", ", ".join(self.valid_methods))) + return headers + + +class NotAcceptable(HTTPException): + """*406* `Not Acceptable` + + Raise if the server can't return any content conforming to the + `Accept` headers of the client. + """ + + code = 406 + + description = ( + "The resource identified by the request is only capable of" + " generating response entities which have content" + " characteristics not acceptable according to the accept" + " headers sent in the request." + ) + + +class RequestTimeout(HTTPException): + """*408* `Request Timeout` + + Raise to signalize a timeout. + """ + + code = 408 + description = ( + "The server closed the network connection because the browser" + " didn't finish the request within the specified time." + ) + + +class Conflict(HTTPException): + """*409* `Conflict` + + Raise to signal that a request cannot be completed because it conflicts + with the current state on the server. + + .. versionadded:: 0.7 + """ + + code = 409 + description = ( + "A conflict happened while processing the request. The" + " resource might have been modified while the request was being" + " processed." + ) + + +class Gone(HTTPException): + """*410* `Gone` + + Raise if a resource existed previously and went away without new location. + """ + + code = 410 + description = ( + "The requested URL is no longer available on this server and" + " there is no forwarding address. If you followed a link from a" + " foreign page, please contact the author of this page." + ) + + +class LengthRequired(HTTPException): + """*411* `Length Required` + + Raise if the browser submitted data but no ``Content-Length`` header which + is required for the kind of processing the server does. + """ + + code = 411 + description = ( + "A request with this method requires a valid Content-" + "Length header." + ) + + +class PreconditionFailed(HTTPException): + """*412* `Precondition Failed` + + Status code used in combination with ``If-Match``, ``If-None-Match``, or + ``If-Unmodified-Since``. + """ + + code = 412 + description = ( + "The precondition on the request for the URL failed positive evaluation." + ) + + +class RequestEntityTooLarge(HTTPException): + """*413* `Request Entity Too Large` + + The status code one should return if the data submitted exceeded a given + limit. + """ + + code = 413 + description = "The data value transmitted exceeds the capacity limit." + + +class RequestURITooLarge(HTTPException): + """*414* `Request URI Too Large` + + Like *413* but for too long URLs. + """ + + code = 414 + description = ( + "The length of the requested URL exceeds the capacity limit for" + " this server. The request cannot be processed." + ) + + +class UnsupportedMediaType(HTTPException): + """*415* `Unsupported Media Type` + + The status code returned if the server is unable to handle the media type + the client transmitted. + """ + + code = 415 + description = ( + "The server does not support the media type transmitted in the request." + ) + + +class RequestedRangeNotSatisfiable(HTTPException): + """*416* `Requested Range Not Satisfiable` + + The client asked for an invalid part of the file. + + .. versionadded:: 0.7 + """ + + code = 416 + description = "The server cannot provide the requested range." + + def __init__(self, length=None, units="bytes", description=None): + """Takes an optional `Content-Range` header value based on ``length`` + parameter. + """ + HTTPException.__init__(self, description) + self.length = length + self.units = units + + def get_headers(self, environ=None): + headers = HTTPException.get_headers(self, environ) + if self.length is not None: + headers.append(("Content-Range", "%s */%d" % (self.units, self.length))) + return headers + + +class ExpectationFailed(HTTPException): + """*417* `Expectation Failed` + + The server cannot meet the requirements of the Expect request-header. + + .. versionadded:: 0.7 + """ + + code = 417 + description = "The server could not meet the requirements of the Expect header" + + +class ImATeapot(HTTPException): + """*418* `I'm a teapot` + + The server should return this if it is a teapot and someone attempted + to brew coffee with it. + + .. versionadded:: 0.7 + """ + + code = 418 + description = "This server is a teapot, not a coffee machine" + + +class UnprocessableEntity(HTTPException): + """*422* `Unprocessable Entity` + + Used if the request is well formed, but the instructions are otherwise + incorrect. + """ + + code = 422 + description = ( + "The request was well-formed but was unable to be followed due" + " to semantic errors." + ) + + +class Locked(HTTPException): + """*423* `Locked` + + Used if the resource that is being accessed is locked. + """ + + code = 423 + description = "The resource that is being accessed is locked." + + +class FailedDependency(HTTPException): + """*424* `Failed Dependency` + + Used if the method could not be performed on the resource + because the requested action depended on another action and that action failed. + """ + + code = 424 + description = ( + "The method could not be performed on the resource because the" + " requested action depended on another action and that action" + " failed." + ) + + +class PreconditionRequired(HTTPException): + """*428* `Precondition Required` + + The server requires this request to be conditional, typically to prevent + the lost update problem, which is a race condition between two or more + clients attempting to update a resource through PUT or DELETE. By requiring + each client to include a conditional header ("If-Match" or "If-Unmodified- + Since") with the proper value retained from a recent GET request, the + server ensures that each client has at least seen the previous revision of + the resource. + """ + + code = 428 + description = ( + "This request is required to be conditional; try using" + ' "If-Match" or "If-Unmodified-Since".' + ) + + +class TooManyRequests(HTTPException): + """*429* `Too Many Requests` + + The server is limiting the rate at which this user receives responses, and + this request exceeds that rate. (The server may use any convenient method + to identify users and their request rates). The server may include a + "Retry-After" header to indicate how long the user should wait before + retrying. + """ + + code = 429 + description = "This user has exceeded an allotted request count. Try again later." + + +class RequestHeaderFieldsTooLarge(HTTPException): + """*431* `Request Header Fields Too Large` + + The server refuses to process the request because the header fields are too + large. One or more individual fields may be too large, or the set of all + headers is too large. + """ + + code = 431 + description = "One or more header fields exceeds the maximum size." + + +class UnavailableForLegalReasons(HTTPException): + """*451* `Unavailable For Legal Reasons` + + This status code indicates that the server is denying access to the + resource as a consequence of a legal demand. + """ + + code = 451 + description = "Unavailable for legal reasons." + + +class InternalServerError(HTTPException): + """*500* `Internal Server Error` + + Raise if an internal server error occurred. This is a good fallback if an + unknown error occurred in the dispatcher. + """ + + code = 500 + description = ( + "The server encountered an internal error and was unable to" + " complete your request. Either the server is overloaded or" + " there is an error in the application." + ) + + +class NotImplemented(HTTPException): + """*501* `Not Implemented` + + Raise if the application does not support the action requested by the + browser. + """ + + code = 501 + description = "The server does not support the action requested by the browser." + + +class BadGateway(HTTPException): + """*502* `Bad Gateway` + + If you do proxying in your application you should return this status code + if you received an invalid response from the upstream server it accessed + in attempting to fulfill the request. + """ + + code = 502 + description = ( + "The proxy server received an invalid response from an upstream server." + ) + + +class ServiceUnavailable(HTTPException): + """*503* `Service Unavailable` + + Status code you should return if a service is temporarily unavailable. + """ + + code = 503 + description = ( + "The server is temporarily unable to service your request due" + " to maintenance downtime or capacity problems. Please try" + " again later." + ) + + +class GatewayTimeout(HTTPException): + """*504* `Gateway Timeout` + + Status code you should return if a connection to an upstream server + times out. + """ + + code = 504 + description = "The connection to an upstream server timed out." + + +class HTTPVersionNotSupported(HTTPException): + """*505* `HTTP Version Not Supported` + + The server does not support the HTTP protocol version used in the request. + """ + + code = 505 + description = ( + "The server does not support the HTTP protocol version used in the request." + ) + + +default_exceptions = {} +__all__ = ["HTTPException"] + + +def _find_exceptions(): + for _name, obj in iteritems(globals()): + try: + is_http_exception = issubclass(obj, HTTPException) + except TypeError: + is_http_exception = False + if not is_http_exception or obj.code is None: + continue + __all__.append(obj.__name__) + old_obj = default_exceptions.get(obj.code, None) + if old_obj is not None and issubclass(obj, old_obj): + continue + default_exceptions[obj.code] = obj + + +_find_exceptions() +del _find_exceptions + + +class Aborter(object): + """When passed a dict of code -> exception items it can be used as + callable that raises exceptions. If the first argument to the + callable is an integer it will be looked up in the mapping, if it's + a WSGI application it will be raised in a proxy exception. + + The rest of the arguments are forwarded to the exception constructor. + """ + + def __init__(self, mapping=None, extra=None): + if mapping is None: + mapping = default_exceptions + self.mapping = dict(mapping) + if extra is not None: + self.mapping.update(extra) + + def __call__(self, code, *args, **kwargs): + if not args and not kwargs and not isinstance(code, integer_types): + raise HTTPException(response=code) + if code not in self.mapping: + raise LookupError("no exception for %r" % code) + raise self.mapping[code](*args, **kwargs) + + +def abort(status, *args, **kwargs): + """Raises an :py:exc:`HTTPException` for the given status code or WSGI + application:: + + abort(404) # 404 Not Found + abort(Response('Hello World')) + + Can be passed a WSGI application or a status code. If a status code is + given it's looked up in the list of exceptions and will raise that + exception, if passed a WSGI application it will wrap it in a proxy WSGI + exception and raise that:: + + abort(404) + abort(Response('Hello World')) + + """ + return _aborter(status, *args, **kwargs) + + +_aborter = Aborter() + +#: An exception that is used to signal both a :exc:`KeyError` and a +#: :exc:`BadRequest`. Used by many of the datastructures. +BadRequestKeyError = BadRequest.wrap(KeyError) diff --git a/brightonpy/Lib/site-packages/werkzeug/filesystem.py b/brightonpy/Lib/site-packages/werkzeug/filesystem.py new file mode 100644 index 0000000..d016cae --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/filesystem.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.filesystem + ~~~~~~~~~~~~~~~~~~~ + + Various utilities for the local filesystem. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import sys +import warnings + +# We do not trust traditional unixes. +has_likely_buggy_unicode_filesystem = ( + sys.platform.startswith("linux") or "bsd" in sys.platform +) + + +def _is_ascii_encoding(encoding): + """Given an encoding this figures out if the encoding is actually ASCII (which + is something we don't actually want in most cases). This is necessary + because ASCII comes under many names such as ANSI_X3.4-1968. + """ + if encoding is None: + return False + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +class BrokenFilesystemWarning(RuntimeWarning, UnicodeWarning): + """The warning used by Werkzeug to signal a broken filesystem. Will only be + used once per runtime.""" + + +_warned_about_filesystem_encoding = False + + +def get_filesystem_encoding(): + """Returns the filesystem encoding that should be used. Note that this is + different from the Python understanding of the filesystem encoding which + might be deeply flawed. Do not use this value against Python's unicode APIs + because it might be different. See :ref:`filesystem-encoding` for the exact + behavior. + + The concept of a filesystem encoding in generally is not something you + should rely on. As such if you ever need to use this function except for + writing wrapper code reconsider. + """ + global _warned_about_filesystem_encoding + rv = sys.getfilesystemencoding() + if has_likely_buggy_unicode_filesystem and not rv or _is_ascii_encoding(rv): + if not _warned_about_filesystem_encoding: + warnings.warn( + "Detected a misconfigured UNIX filesystem: Will use" + " UTF-8 as filesystem encoding instead of {0!r}".format(rv), + BrokenFilesystemWarning, + ) + _warned_about_filesystem_encoding = True + return "utf-8" + return rv diff --git a/brightonpy/Lib/site-packages/werkzeug/formparser.py b/brightonpy/Lib/site-packages/werkzeug/formparser.py new file mode 100644 index 0000000..ffdb9b0 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/formparser.py @@ -0,0 +1,584 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.formparser + ~~~~~~~~~~~~~~~~~~~ + + This module implements the form parsing. It supports url-encoded forms + as well as non-nested multipart uploads. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import re +from functools import update_wrapper +from itertools import chain +from itertools import repeat +from itertools import tee + +from . import exceptions +from ._compat import BytesIO +from ._compat import text_type +from ._compat import to_native +from .datastructures import FileStorage +from .datastructures import Headers +from .datastructures import MultiDict +from .http import parse_options_header +from .urls import url_decode_stream +from .wsgi import get_content_length +from .wsgi import get_input_stream +from .wsgi import make_line_iter + +# there are some platforms where SpooledTemporaryFile is not available. +# In that case we need to provide a fallback. +try: + from tempfile import SpooledTemporaryFile +except ImportError: + from tempfile import TemporaryFile + + SpooledTemporaryFile = None + + +#: an iterator that yields empty strings +_empty_string_iter = repeat("") + +#: a regular expression for multipart boundaries +_multipart_boundary_re = re.compile("^[ -~]{0,200}[!-~]$") + +#: supported http encodings that are also available in python we support +#: for multipart messages. +_supported_multipart_encodings = frozenset(["base64", "quoted-printable"]) + + +def default_stream_factory( + total_content_length, filename, content_type, content_length=None +): + """The stream factory that is used per default.""" + max_size = 1024 * 500 + if SpooledTemporaryFile is not None: + return SpooledTemporaryFile(max_size=max_size, mode="wb+") + if total_content_length is None or total_content_length > max_size: + return TemporaryFile("wb+") + return BytesIO() + + +def parse_form_data( + environ, + stream_factory=None, + charset="utf-8", + errors="replace", + max_form_memory_size=None, + max_content_length=None, + cls=None, + silent=True, +): + """Parse the form data in the environ and return it as tuple in the form + ``(stream, form, files)``. You should only call this method if the + transport method is `POST`, `PUT`, or `PATCH`. + + If the mimetype of the data transmitted is `multipart/form-data` the + files multidict will be filled with `FileStorage` objects. If the + mimetype is unknown the input stream is wrapped and returned as first + argument, else the stream is empty. + + This is a shortcut for the common usage of :class:`FormDataParser`. + + Have a look at :ref:`dealing-with-request-data` for more details. + + .. versionadded:: 0.5 + The `max_form_memory_size`, `max_content_length` and + `cls` parameters were added. + + .. versionadded:: 0.5.1 + The optional `silent` flag was added. + + :param environ: the WSGI environment to be used for parsing. + :param stream_factory: An optional callable that returns a new read and + writeable file descriptor. This callable works + the same as :meth:`~BaseResponse._get_file_stream`. + :param charset: The character set for URL and url encoded form data. + :param errors: The encoding error behavior. + :param max_form_memory_size: the maximum number of bytes to be accepted for + in-memory stored form data. If the data + exceeds the value specified an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param max_content_length: If this is provided and the transmitted data + is longer than this value an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`MultiDict` is used. + :param silent: If set to False parsing errors will not be caught. + :return: A tuple in the form ``(stream, form, files)``. + """ + return FormDataParser( + stream_factory, + charset, + errors, + max_form_memory_size, + max_content_length, + cls, + silent, + ).parse_from_environ(environ) + + +def exhaust_stream(f): + """Helper decorator for methods that exhausts the stream on return.""" + + def wrapper(self, stream, *args, **kwargs): + try: + return f(self, stream, *args, **kwargs) + finally: + exhaust = getattr(stream, "exhaust", None) + if exhaust is not None: + exhaust() + else: + while 1: + chunk = stream.read(1024 * 64) + if not chunk: + break + + return update_wrapper(wrapper, f) + + +class FormDataParser(object): + """This class implements parsing of form data for Werkzeug. By itself + it can parse multipart and url encoded form data. It can be subclassed + and extended but for most mimetypes it is a better idea to use the + untouched stream and expose it as separate attributes on a request + object. + + .. versionadded:: 0.8 + + :param stream_factory: An optional callable that returns a new read and + writeable file descriptor. This callable works + the same as :meth:`~BaseResponse._get_file_stream`. + :param charset: The character set for URL and url encoded form data. + :param errors: The encoding error behavior. + :param max_form_memory_size: the maximum number of bytes to be accepted for + in-memory stored form data. If the data + exceeds the value specified an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param max_content_length: If this is provided and the transmitted data + is longer than this value an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`MultiDict` is used. + :param silent: If set to False parsing errors will not be caught. + """ + + def __init__( + self, + stream_factory=None, + charset="utf-8", + errors="replace", + max_form_memory_size=None, + max_content_length=None, + cls=None, + silent=True, + ): + if stream_factory is None: + stream_factory = default_stream_factory + self.stream_factory = stream_factory + self.charset = charset + self.errors = errors + self.max_form_memory_size = max_form_memory_size + self.max_content_length = max_content_length + if cls is None: + cls = MultiDict + self.cls = cls + self.silent = silent + + def get_parse_func(self, mimetype, options): + return self.parse_functions.get(mimetype) + + def parse_from_environ(self, environ): + """Parses the information from the environment as form data. + + :param environ: the WSGI environment to be used for parsing. + :return: A tuple in the form ``(stream, form, files)``. + """ + content_type = environ.get("CONTENT_TYPE", "") + content_length = get_content_length(environ) + mimetype, options = parse_options_header(content_type) + return self.parse(get_input_stream(environ), mimetype, content_length, options) + + def parse(self, stream, mimetype, content_length, options=None): + """Parses the information from the given stream, mimetype, + content length and mimetype parameters. + + :param stream: an input stream + :param mimetype: the mimetype of the data + :param content_length: the content length of the incoming data + :param options: optional mimetype parameters (used for + the multipart boundary for instance) + :return: A tuple in the form ``(stream, form, files)``. + """ + if ( + self.max_content_length is not None + and content_length is not None + and content_length > self.max_content_length + ): + raise exceptions.RequestEntityTooLarge() + if options is None: + options = {} + + parse_func = self.get_parse_func(mimetype, options) + if parse_func is not None: + try: + return parse_func(self, stream, mimetype, content_length, options) + except ValueError: + if not self.silent: + raise + + return stream, self.cls(), self.cls() + + @exhaust_stream + def _parse_multipart(self, stream, mimetype, content_length, options): + parser = MultiPartParser( + self.stream_factory, + self.charset, + self.errors, + max_form_memory_size=self.max_form_memory_size, + cls=self.cls, + ) + boundary = options.get("boundary") + if boundary is None: + raise ValueError("Missing boundary") + if isinstance(boundary, text_type): + boundary = boundary.encode("ascii") + form, files = parser.parse(stream, boundary, content_length) + return stream, form, files + + @exhaust_stream + def _parse_urlencoded(self, stream, mimetype, content_length, options): + if ( + self.max_form_memory_size is not None + and content_length is not None + and content_length > self.max_form_memory_size + ): + raise exceptions.RequestEntityTooLarge() + form = url_decode_stream(stream, self.charset, errors=self.errors, cls=self.cls) + return stream, form, self.cls() + + #: mapping of mimetypes to parsing functions + parse_functions = { + "multipart/form-data": _parse_multipart, + "application/x-www-form-urlencoded": _parse_urlencoded, + "application/x-url-encoded": _parse_urlencoded, + } + + +def is_valid_multipart_boundary(boundary): + """Checks if the string given is a valid multipart boundary.""" + return _multipart_boundary_re.match(boundary) is not None + + +def _line_parse(line): + """Removes line ending characters and returns a tuple (`stripped_line`, + `is_terminated`). + """ + if line[-2:] in ["\r\n", b"\r\n"]: + return line[:-2], True + elif line[-1:] in ["\r", "\n", b"\r", b"\n"]: + return line[:-1], True + return line, False + + +def parse_multipart_headers(iterable): + """Parses multipart headers from an iterable that yields lines (including + the trailing newline symbol). The iterable has to be newline terminated. + + The iterable will stop at the line where the headers ended so it can be + further consumed. + + :param iterable: iterable of strings that are newline terminated + """ + result = [] + for line in iterable: + line = to_native(line) + line, line_terminated = _line_parse(line) + if not line_terminated: + raise ValueError("unexpected end of line in multipart header") + if not line: + break + elif line[0] in " \t" and result: + key, value = result[-1] + result[-1] = (key, value + "\n " + line[1:]) + else: + parts = line.split(":", 1) + if len(parts) == 2: + result.append((parts[0].strip(), parts[1].strip())) + + # we link the list to the headers, no need to create a copy, the + # list was not shared anyways. + return Headers(result) + + +_begin_form = "begin_form" +_begin_file = "begin_file" +_cont = "cont" +_end = "end" + + +class MultiPartParser(object): + def __init__( + self, + stream_factory=None, + charset="utf-8", + errors="replace", + max_form_memory_size=None, + cls=None, + buffer_size=64 * 1024, + ): + self.charset = charset + self.errors = errors + self.max_form_memory_size = max_form_memory_size + self.stream_factory = ( + default_stream_factory if stream_factory is None else stream_factory + ) + self.cls = MultiDict if cls is None else cls + + # make sure the buffer size is divisible by four so that we can base64 + # decode chunk by chunk + assert buffer_size % 4 == 0, "buffer size has to be divisible by 4" + # also the buffer size has to be at least 1024 bytes long or long headers + # will freak out the system + assert buffer_size >= 1024, "buffer size has to be at least 1KB" + + self.buffer_size = buffer_size + + def _fix_ie_filename(self, filename): + """Internet Explorer 6 transmits the full file name if a file is + uploaded. This function strips the full path if it thinks the + filename is Windows-like absolute. + """ + if filename[1:3] == ":\\" or filename[:2] == "\\\\": + return filename.split("\\")[-1] + return filename + + def _find_terminator(self, iterator): + """The terminator might have some additional newlines before it. + There is at least one application that sends additional newlines + before headers (the python setuptools package). + """ + for line in iterator: + if not line: + break + line = line.strip() + if line: + return line + return b"" + + def fail(self, message): + raise ValueError(message) + + def get_part_encoding(self, headers): + transfer_encoding = headers.get("content-transfer-encoding") + if ( + transfer_encoding is not None + and transfer_encoding in _supported_multipart_encodings + ): + return transfer_encoding + + def get_part_charset(self, headers): + # Figure out input charset for current part + content_type = headers.get("content-type") + if content_type: + mimetype, ct_params = parse_options_header(content_type) + return ct_params.get("charset", self.charset) + return self.charset + + def start_file_streaming(self, filename, headers, total_content_length): + if isinstance(filename, bytes): + filename = filename.decode(self.charset, self.errors) + filename = self._fix_ie_filename(filename) + content_type = headers.get("content-type") + try: + content_length = int(headers["content-length"]) + except (KeyError, ValueError): + content_length = 0 + container = self.stream_factory( + total_content_length=total_content_length, + filename=filename, + content_type=content_type, + content_length=content_length, + ) + return filename, container + + def in_memory_threshold_reached(self, bytes): + raise exceptions.RequestEntityTooLarge() + + def validate_boundary(self, boundary): + if not boundary: + self.fail("Missing boundary") + if not is_valid_multipart_boundary(boundary): + self.fail("Invalid boundary: %s" % boundary) + if len(boundary) > self.buffer_size: # pragma: no cover + # this should never happen because we check for a minimum size + # of 1024 and boundaries may not be longer than 200. The only + # situation when this happens is for non debug builds where + # the assert is skipped. + self.fail("Boundary longer than buffer size") + + def parse_lines(self, file, boundary, content_length, cap_at_buffer=True): + """Generate parts of + ``('begin_form', (headers, name))`` + ``('begin_file', (headers, name, filename))`` + ``('cont', bytestring)`` + ``('end', None)`` + + Always obeys the grammar + parts = ( begin_form cont* end | + begin_file cont* end )* + """ + next_part = b"--" + boundary + last_part = next_part + b"--" + + iterator = chain( + make_line_iter( + file, + limit=content_length, + buffer_size=self.buffer_size, + cap_at_buffer=cap_at_buffer, + ), + _empty_string_iter, + ) + + terminator = self._find_terminator(iterator) + + if terminator == last_part: + return + elif terminator != next_part: + self.fail("Expected boundary at start of multipart data") + + while terminator != last_part: + headers = parse_multipart_headers(iterator) + + disposition = headers.get("content-disposition") + if disposition is None: + self.fail("Missing Content-Disposition header") + disposition, extra = parse_options_header(disposition) + transfer_encoding = self.get_part_encoding(headers) + name = extra.get("name") + filename = extra.get("filename") + + # if no content type is given we stream into memory. A list is + # used as a temporary container. + if filename is None: + yield _begin_form, (headers, name) + + # otherwise we parse the rest of the headers and ask the stream + # factory for something we can write in. + else: + yield _begin_file, (headers, name, filename) + + buf = b"" + for line in iterator: + if not line: + self.fail("unexpected end of stream") + + if line[:2] == b"--": + terminator = line.rstrip() + if terminator in (next_part, last_part): + break + + if transfer_encoding is not None: + if transfer_encoding == "base64": + transfer_encoding = "base64_codec" + try: + line = codecs.decode(line, transfer_encoding) + except Exception: + self.fail("could not decode transfer encoded chunk") + + # we have something in the buffer from the last iteration. + # this is usually a newline delimiter. + if buf: + yield _cont, buf + buf = b"" + + # If the line ends with windows CRLF we write everything except + # the last two bytes. In all other cases however we write + # everything except the last byte. If it was a newline, that's + # fine, otherwise it does not matter because we will write it + # the next iteration. this ensures we do not write the + # final newline into the stream. That way we do not have to + # truncate the stream. However we do have to make sure that + # if something else than a newline is in there we write it + # out. + if line[-2:] == b"\r\n": + buf = b"\r\n" + cutoff = -2 + else: + buf = line[-1:] + cutoff = -1 + yield _cont, line[:cutoff] + + else: # pragma: no cover + raise ValueError("unexpected end of part") + + # if we have a leftover in the buffer that is not a newline + # character we have to flush it, otherwise we will chop of + # certain values. + if buf not in (b"", b"\r", b"\n", b"\r\n"): + yield _cont, buf + + yield _end, None + + def parse_parts(self, file, boundary, content_length): + """Generate ``('file', (name, val))`` and + ``('form', (name, val))`` parts. + """ + in_memory = 0 + + for ellt, ell in self.parse_lines(file, boundary, content_length): + if ellt == _begin_file: + headers, name, filename = ell + is_file = True + guard_memory = False + filename, container = self.start_file_streaming( + filename, headers, content_length + ) + _write = container.write + + elif ellt == _begin_form: + headers, name = ell + is_file = False + container = [] + _write = container.append + guard_memory = self.max_form_memory_size is not None + + elif ellt == _cont: + _write(ell) + # if we write into memory and there is a memory size limit we + # count the number of bytes in memory and raise an exception if + # there is too much data in memory. + if guard_memory: + in_memory += len(ell) + if in_memory > self.max_form_memory_size: + self.in_memory_threshold_reached(in_memory) + + elif ellt == _end: + if is_file: + container.seek(0) + yield ( + "file", + (name, FileStorage(container, filename, name, headers=headers)), + ) + else: + part_charset = self.get_part_charset(headers) + yield ( + "form", + (name, b"".join(container).decode(part_charset, self.errors)), + ) + + def parse(self, file, boundary, content_length): + formstream, filestream = tee( + self.parse_parts(file, boundary, content_length), 2 + ) + form = (p[1] for p in formstream if p[0] == "form") + files = (p[1] for p in filestream if p[0] == "file") + return self.cls(form), self.cls(files) diff --git a/brightonpy/Lib/site-packages/werkzeug/http.py b/brightonpy/Lib/site-packages/werkzeug/http.py new file mode 100644 index 0000000..686824c --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/http.py @@ -0,0 +1,1259 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.http + ~~~~~~~~~~~~~ + + Werkzeug comes with a bunch of utilities that help Werkzeug to deal with + HTTP data. Most of the classes and functions provided by this module are + used by the wrappers, but they are useful on their own, too, especially if + the response and request objects are not used. + + This covers some of the more HTTP centric features of WSGI, some other + utilities such as cookie handling are documented in the `werkzeug.utils` + module. + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import base64 +import re +import warnings +from datetime import datetime +from datetime import timedelta +from hashlib import md5 +from time import gmtime +from time import time + +from ._compat import integer_types +from ._compat import iteritems +from ._compat import PY2 +from ._compat import string_types +from ._compat import text_type +from ._compat import to_bytes +from ._compat import to_unicode +from ._compat import try_coerce_native +from ._internal import _cookie_parse_impl +from ._internal import _cookie_quote +from ._internal import _make_cookie_domain + +try: + from email.utils import parsedate_tz +except ImportError: + from email.Utils import parsedate_tz + +try: + from urllib.request import parse_http_list as _parse_list_header + from urllib.parse import unquote_to_bytes as _unquote +except ImportError: + from urllib2 import parse_http_list as _parse_list_header + from urllib2 import unquote as _unquote + +_cookie_charset = "latin1" +_basic_auth_charset = "utf-8" +# for explanation of "media-range", etc. see Sections 5.3.{1,2} of RFC 7231 +_accept_re = re.compile( + r""" + ( # media-range capturing-parenthesis + [^\s;,]+ # type/subtype + (?:[ \t]*;[ \t]* # ";" + (?: # parameter non-capturing-parenthesis + [^\s;,q][^\s;,]* # token that doesn't start with "q" + | # or + q[^\s;,=][^\s;,]* # token that is more than just "q" + ) + )* # zero or more parameters + ) # end of media-range + (?:[ \t]*;[ \t]*q= # weight is a "q" parameter + (\d*(?:\.\d+)?) # qvalue capturing-parentheses + [^,]* # "extension" accept params: who cares? + )? # accept params are optional + """, + re.VERBOSE, +) +_token_chars = frozenset( + "!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~" +) +_etag_re = re.compile(r'([Ww]/)?(?:"(.*?)"|(.*?))(?:\s*,\s*|$)') +_unsafe_header_chars = set('()<>@,;:"/[]?={} \t') +_option_header_piece_re = re.compile( + r""" + ;\s*,?\s* # newlines were replaced with commas + (?P + "[^"\\]*(?:\\.[^"\\]*)*" # quoted string + | + [^\s;,=*]+ # token + ) + (?:\*(?P\d+))? # *1, optional continuation index + \s* + (?: # optionally followed by =value + (?: # equals sign, possibly with encoding + \*\s*=\s* # * indicates extended notation + (?: # optional encoding + (?P[^\s]+?) + '(?P[^\s]*?)' + )? + | + =\s* # basic notation + ) + (?P + "[^"\\]*(?:\\.[^"\\]*)*" # quoted string + | + [^;,]+ # token + )? + )? + \s* + """, + flags=re.VERBOSE, +) +_option_header_start_mime_type = re.compile(r",\s*([^;,\s]+)([;,]\s*.+)?") + +_entity_headers = frozenset( + [ + "allow", + "content-encoding", + "content-language", + "content-length", + "content-location", + "content-md5", + "content-range", + "content-type", + "expires", + "last-modified", + ] +) +_hop_by_hop_headers = frozenset( + [ + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "te", + "trailer", + "transfer-encoding", + "upgrade", + ] +) + + +HTTP_STATUS_CODES = { + 100: "Continue", + 101: "Switching Protocols", + 102: "Processing", + 200: "OK", + 201: "Created", + 202: "Accepted", + 203: "Non Authoritative Information", + 204: "No Content", + 205: "Reset Content", + 206: "Partial Content", + 207: "Multi Status", + 226: "IM Used", # see RFC 3229 + 300: "Multiple Choices", + 301: "Moved Permanently", + 302: "Found", + 303: "See Other", + 304: "Not Modified", + 305: "Use Proxy", + 307: "Temporary Redirect", + 308: "Permanent Redirect", + 400: "Bad Request", + 401: "Unauthorized", + 402: "Payment Required", # unused + 403: "Forbidden", + 404: "Not Found", + 405: "Method Not Allowed", + 406: "Not Acceptable", + 407: "Proxy Authentication Required", + 408: "Request Timeout", + 409: "Conflict", + 410: "Gone", + 411: "Length Required", + 412: "Precondition Failed", + 413: "Request Entity Too Large", + 414: "Request URI Too Long", + 415: "Unsupported Media Type", + 416: "Requested Range Not Satisfiable", + 417: "Expectation Failed", + 418: "I'm a teapot", # see RFC 2324 + 421: "Misdirected Request", # see RFC 7540 + 422: "Unprocessable Entity", + 423: "Locked", + 424: "Failed Dependency", + 426: "Upgrade Required", + 428: "Precondition Required", # see RFC 6585 + 429: "Too Many Requests", + 431: "Request Header Fields Too Large", + 449: "Retry With", # proprietary MS extension + 451: "Unavailable For Legal Reasons", + 500: "Internal Server Error", + 501: "Not Implemented", + 502: "Bad Gateway", + 503: "Service Unavailable", + 504: "Gateway Timeout", + 505: "HTTP Version Not Supported", + 507: "Insufficient Storage", + 510: "Not Extended", +} + + +def wsgi_to_bytes(data): + """coerce wsgi unicode represented bytes to real ones""" + if isinstance(data, bytes): + return data + return data.encode("latin1") # XXX: utf8 fallback? + + +def bytes_to_wsgi(data): + assert isinstance(data, bytes), "data must be bytes" + if isinstance(data, str): + return data + else: + return data.decode("latin1") + + +def quote_header_value(value, extra_chars="", allow_token=True): + """Quote a header value if necessary. + + .. versionadded:: 0.5 + + :param value: the value to quote. + :param extra_chars: a list of extra characters to skip quoting. + :param allow_token: if this is enabled token values are returned + unchanged. + """ + if isinstance(value, bytes): + value = bytes_to_wsgi(value) + value = str(value) + if allow_token: + token_chars = _token_chars | set(extra_chars) + if set(value).issubset(token_chars): + return value + return '"%s"' % value.replace("\\", "\\\\").replace('"', '\\"') + + +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + .. versionadded:: 0.5 + + :param value: the header value to unquote. + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != "\\\\": + return value.replace("\\\\", "\\").replace('\\"', '"') + return value + + +def dump_options_header(header, options): + """The reverse function to :func:`parse_options_header`. + + :param header: the header to dump + :param options: a dict of options to append. + """ + segments = [] + if header is not None: + segments.append(header) + for key, value in iteritems(options): + if value is None: + segments.append(key) + else: + segments.append("%s=%s" % (key, quote_header_value(value))) + return "; ".join(segments) + + +def dump_header(iterable, allow_token=True): + """Dump an HTTP header again. This is the reversal of + :func:`parse_list_header`, :func:`parse_set_header` and + :func:`parse_dict_header`. This also quotes strings that include an + equals sign unless you pass it as dict of key, value pairs. + + >>> dump_header({'foo': 'bar baz'}) + 'foo="bar baz"' + >>> dump_header(('foo', 'bar baz')) + 'foo, "bar baz"' + + :param iterable: the iterable or dict of values to quote. + :param allow_token: if set to `False` tokens as values are disallowed. + See :func:`quote_header_value` for more details. + """ + if isinstance(iterable, dict): + items = [] + for key, value in iteritems(iterable): + if value is None: + items.append(key) + else: + items.append( + "%s=%s" % (key, quote_header_value(value, allow_token=allow_token)) + ) + else: + items = [quote_header_value(x, allow_token=allow_token) for x in iterable] + return ", ".join(items) + + +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +def parse_dict_header(value, cls=dict): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict (or any other mapping object created from + the type with a dict like interface provided by the `cls` argument): + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + .. versionchanged:: 0.9 + Added support for `cls` argument. + + :param value: a string with a dict header. + :param cls: callable to use for storage of parsed results. + :return: an instance of `cls` + """ + result = cls() + if not isinstance(value, text_type): + # XXX: validate + value = bytes_to_wsgi(value) + for item in _parse_list_header(value): + if "=" not in item: + result[item] = None + continue + name, value = item.split("=", 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +def parse_options_header(value, multiple=False): + """Parse a ``Content-Type`` like header into a tuple with the content + type and the options: + + >>> parse_options_header('text/html; charset=utf8') + ('text/html', {'charset': 'utf8'}) + + This should not be used to parse ``Cache-Control`` like headers that use + a slightly different format. For these headers use the + :func:`parse_dict_header` function. + + .. versionchanged:: 0.15 + :rfc:`2231` parameter continuations are handled. + + .. versionadded:: 0.5 + + :param value: the header to parse. + :param multiple: Whether try to parse and return multiple MIME types + :return: (mimetype, options) or (mimetype, options, mimetype, options, …) + if multiple=True + """ + if not value: + return "", {} + + result = [] + + value = "," + value.replace("\n", ",") + while value: + match = _option_header_start_mime_type.match(value) + if not match: + break + result.append(match.group(1)) # mimetype + options = {} + # Parse options + rest = match.group(2) + continued_encoding = None + while rest: + optmatch = _option_header_piece_re.match(rest) + if not optmatch: + break + option, count, encoding, language, option_value = optmatch.groups() + # Continuations don't have to supply the encoding after the + # first line. If we're in a continuation, track the current + # encoding to use for subsequent lines. Reset it when the + # continuation ends. + if not count: + continued_encoding = None + else: + if not encoding: + encoding = continued_encoding + continued_encoding = encoding + option = unquote_header_value(option) + if option_value is not None: + option_value = unquote_header_value(option_value, option == "filename") + if encoding is not None: + option_value = _unquote(option_value).decode(encoding) + if count: + # Continuations append to the existing value. For + # simplicity, this ignores the possibility of + # out-of-order indices, which shouldn't happen anyway. + options[option] = options.get(option, "") + option_value + else: + options[option] = option_value + rest = rest[optmatch.end() :] + result.append(options) + if multiple is False: + return tuple(result) + value = rest + + return tuple(result) if result else ("", {}) + + +def parse_accept_header(value, cls=None): + """Parses an HTTP Accept-* header. This does not implement a complete + valid algorithm but one that supports at least value and quality + extraction. + + Returns a new :class:`Accept` object (basically a list of ``(value, quality)`` + tuples sorted by the quality with some additional accessor methods). + + The second parameter can be a subclass of :class:`Accept` that is created + with the parsed values and returned. + + :param value: the accept header string to be parsed. + :param cls: the wrapper class for the return value (can be + :class:`Accept` or a subclass thereof) + :return: an instance of `cls`. + """ + if cls is None: + cls = Accept + + if not value: + return cls(None) + + result = [] + for match in _accept_re.finditer(value): + quality = match.group(2) + if not quality: + quality = 1 + else: + quality = max(min(float(quality), 1), 0) + result.append((match.group(1), quality)) + return cls(result) + + +def parse_cache_control_header(value, on_update=None, cls=None): + """Parse a cache control header. The RFC differs between response and + request cache control, this method does not. It's your responsibility + to not use the wrong control statements. + + .. versionadded:: 0.5 + The `cls` was added. If not specified an immutable + :class:`~werkzeug.datastructures.RequestCacheControl` is returned. + + :param value: a cache control header to be parsed. + :param on_update: an optional callable that is called every time a value + on the :class:`~werkzeug.datastructures.CacheControl` + object is changed. + :param cls: the class for the returned object. By default + :class:`~werkzeug.datastructures.RequestCacheControl` is used. + :return: a `cls` object. + """ + if cls is None: + cls = RequestCacheControl + if not value: + return cls(None, on_update) + return cls(parse_dict_header(value), on_update) + + +def parse_set_header(value, on_update=None): + """Parse a set-like header and return a + :class:`~werkzeug.datastructures.HeaderSet` object: + + >>> hs = parse_set_header('token, "quoted value"') + + The return value is an object that treats the items case-insensitively + and keeps the order of the items: + + >>> 'TOKEN' in hs + True + >>> hs.index('quoted value') + 1 + >>> hs + HeaderSet(['token', 'quoted value']) + + To create a header from the :class:`HeaderSet` again, use the + :func:`dump_header` function. + + :param value: a set header to be parsed. + :param on_update: an optional callable that is called every time a + value on the :class:`~werkzeug.datastructures.HeaderSet` + object is changed. + :return: a :class:`~werkzeug.datastructures.HeaderSet` + """ + if not value: + return HeaderSet(None, on_update) + return HeaderSet(parse_list_header(value), on_update) + + +def parse_authorization_header(value): + """Parse an HTTP basic/digest authorization header transmitted by the web + browser. The return value is either `None` if the header was invalid or + not given, otherwise an :class:`~werkzeug.datastructures.Authorization` + object. + + :param value: the authorization header to parse. + :return: a :class:`~werkzeug.datastructures.Authorization` object or `None`. + """ + if not value: + return + value = wsgi_to_bytes(value) + try: + auth_type, auth_info = value.split(None, 1) + auth_type = auth_type.lower() + except ValueError: + return + if auth_type == b"basic": + try: + username, password = base64.b64decode(auth_info).split(b":", 1) + except Exception: + return + return Authorization( + "basic", + { + "username": to_unicode(username, _basic_auth_charset), + "password": to_unicode(password, _basic_auth_charset), + }, + ) + elif auth_type == b"digest": + auth_map = parse_dict_header(auth_info) + for key in "username", "realm", "nonce", "uri", "response": + if key not in auth_map: + return + if "qop" in auth_map: + if not auth_map.get("nc") or not auth_map.get("cnonce"): + return + return Authorization("digest", auth_map) + + +def parse_www_authenticate_header(value, on_update=None): + """Parse an HTTP WWW-Authenticate header into a + :class:`~werkzeug.datastructures.WWWAuthenticate` object. + + :param value: a WWW-Authenticate header to parse. + :param on_update: an optional callable that is called every time a value + on the :class:`~werkzeug.datastructures.WWWAuthenticate` + object is changed. + :return: a :class:`~werkzeug.datastructures.WWWAuthenticate` object. + """ + if not value: + return WWWAuthenticate(on_update=on_update) + try: + auth_type, auth_info = value.split(None, 1) + auth_type = auth_type.lower() + except (ValueError, AttributeError): + return WWWAuthenticate(value.strip().lower(), on_update=on_update) + return WWWAuthenticate(auth_type, parse_dict_header(auth_info), on_update) + + +def parse_if_range_header(value): + """Parses an if-range header which can be an etag or a date. Returns + a :class:`~werkzeug.datastructures.IfRange` object. + + .. versionadded:: 0.7 + """ + if not value: + return IfRange() + date = parse_date(value) + if date is not None: + return IfRange(date=date) + # drop weakness information + return IfRange(unquote_etag(value)[0]) + + +def parse_range_header(value, make_inclusive=True): + """Parses a range header into a :class:`~werkzeug.datastructures.Range` + object. If the header is missing or malformed `None` is returned. + `ranges` is a list of ``(start, stop)`` tuples where the ranges are + non-inclusive. + + .. versionadded:: 0.7 + """ + if not value or "=" not in value: + return None + + ranges = [] + last_end = 0 + units, rng = value.split("=", 1) + units = units.strip().lower() + + for item in rng.split(","): + item = item.strip() + if "-" not in item: + return None + if item.startswith("-"): + if last_end < 0: + return None + try: + begin = int(item) + except ValueError: + return None + end = None + last_end = -1 + elif "-" in item: + begin, end = item.split("-", 1) + begin = begin.strip() + end = end.strip() + if not begin.isdigit(): + return None + begin = int(begin) + if begin < last_end or last_end < 0: + return None + if end: + if not end.isdigit(): + return None + end = int(end) + 1 + if begin >= end: + return None + else: + end = None + last_end = end + ranges.append((begin, end)) + + return Range(units, ranges) + + +def parse_content_range_header(value, on_update=None): + """Parses a range header into a + :class:`~werkzeug.datastructures.ContentRange` object or `None` if + parsing is not possible. + + .. versionadded:: 0.7 + + :param value: a content range header to be parsed. + :param on_update: an optional callable that is called every time a value + on the :class:`~werkzeug.datastructures.ContentRange` + object is changed. + """ + if value is None: + return None + try: + units, rangedef = (value or "").strip().split(None, 1) + except ValueError: + return None + + if "/" not in rangedef: + return None + rng, length = rangedef.split("/", 1) + if length == "*": + length = None + elif length.isdigit(): + length = int(length) + else: + return None + + if rng == "*": + return ContentRange(units, None, None, length, on_update=on_update) + elif "-" not in rng: + return None + + start, stop = rng.split("-", 1) + try: + start = int(start) + stop = int(stop) + 1 + except ValueError: + return None + + if is_byte_range_valid(start, stop, length): + return ContentRange(units, start, stop, length, on_update=on_update) + + +def quote_etag(etag, weak=False): + """Quote an etag. + + :param etag: the etag to quote. + :param weak: set to `True` to tag it "weak". + """ + if '"' in etag: + raise ValueError("invalid etag") + etag = '"%s"' % etag + if weak: + etag = "W/" + etag + return etag + + +def unquote_etag(etag): + """Unquote a single etag: + + >>> unquote_etag('W/"bar"') + ('bar', True) + >>> unquote_etag('"bar"') + ('bar', False) + + :param etag: the etag identifier to unquote. + :return: a ``(etag, weak)`` tuple. + """ + if not etag: + return None, None + etag = etag.strip() + weak = False + if etag.startswith(("W/", "w/")): + weak = True + etag = etag[2:] + if etag[:1] == etag[-1:] == '"': + etag = etag[1:-1] + return etag, weak + + +def parse_etags(value): + """Parse an etag header. + + :param value: the tag header to parse + :return: an :class:`~werkzeug.datastructures.ETags` object. + """ + if not value: + return ETags() + strong = [] + weak = [] + end = len(value) + pos = 0 + while pos < end: + match = _etag_re.match(value, pos) + if match is None: + break + is_weak, quoted, raw = match.groups() + if raw == "*": + return ETags(star_tag=True) + elif quoted: + raw = quoted + if is_weak: + weak.append(raw) + else: + strong.append(raw) + pos = match.end() + return ETags(strong, weak) + + +def generate_etag(data): + """Generate an etag for some data.""" + return md5(data).hexdigest() + + +def parse_date(value): + """Parse one of the following date formats into a datetime object: + + .. sourcecode:: text + + Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 + Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 + Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format + + If parsing fails the return value is `None`. + + :param value: a string with a supported date format. + :return: a :class:`datetime.datetime` object. + """ + if value: + t = parsedate_tz(value.strip()) + if t is not None: + try: + year = t[0] + # unfortunately that function does not tell us if two digit + # years were part of the string, or if they were prefixed + # with two zeroes. So what we do is to assume that 69-99 + # refer to 1900, and everything below to 2000 + if year >= 0 and year <= 68: + year += 2000 + elif year >= 69 and year <= 99: + year += 1900 + return datetime(*((year,) + t[1:7])) - timedelta(seconds=t[-1] or 0) + except (ValueError, OverflowError): + return None + + +def _dump_date(d, delim): + """Used for `http_date` and `cookie_date`.""" + if d is None: + d = gmtime() + elif isinstance(d, datetime): + d = d.utctimetuple() + elif isinstance(d, (integer_types, float)): + d = gmtime(d) + return "%s, %02d%s%s%s%s %02d:%02d:%02d GMT" % ( + ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")[d.tm_wday], + d.tm_mday, + delim, + ( + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + )[d.tm_mon - 1], + delim, + str(d.tm_year), + d.tm_hour, + d.tm_min, + d.tm_sec, + ) + + +def cookie_date(expires=None): + """Formats the time to ensure compatibility with Netscape's cookie + standard. + + Accepts a floating point number expressed in seconds since the epoch in, a + datetime object or a timetuple. All times in UTC. The :func:`parse_date` + function can be used to parse such a date. + + Outputs a string in the format ``Wdy, DD-Mon-YYYY HH:MM:SS GMT``. + + :param expires: If provided that date is used, otherwise the current. + """ + return _dump_date(expires, "-") + + +def http_date(timestamp=None): + """Formats the time to match the RFC1123 date format. + + Accepts a floating point number expressed in seconds since the epoch in, a + datetime object or a timetuple. All times in UTC. The :func:`parse_date` + function can be used to parse such a date. + + Outputs a string in the format ``Wdy, DD Mon YYYY HH:MM:SS GMT``. + + :param timestamp: If provided that date is used, otherwise the current. + """ + return _dump_date(timestamp, " ") + + +def parse_age(value=None): + """Parses a base-10 integer count of seconds into a timedelta. + + If parsing fails, the return value is `None`. + + :param value: a string consisting of an integer represented in base-10 + :return: a :class:`datetime.timedelta` object or `None`. + """ + if not value: + return None + try: + seconds = int(value) + except ValueError: + return None + if seconds < 0: + return None + try: + return timedelta(seconds=seconds) + except OverflowError: + return None + + +def dump_age(age=None): + """Formats the duration as a base-10 integer. + + :param age: should be an integer number of seconds, + a :class:`datetime.timedelta` object, or, + if the age is unknown, `None` (default). + """ + if age is None: + return + if isinstance(age, timedelta): + # do the equivalent of Python 2.7's timedelta.total_seconds(), + # but disregarding fractional seconds + age = age.seconds + (age.days * 24 * 3600) + + age = int(age) + if age < 0: + raise ValueError("age cannot be negative") + + return str(age) + + +def is_resource_modified( + environ, etag=None, data=None, last_modified=None, ignore_if_range=True +): + """Convenience method for conditional requests. + + :param environ: the WSGI environment of the request to be checked. + :param etag: the etag for the response for comparison. + :param data: or alternatively the data of the response to automatically + generate an etag using :func:`generate_etag`. + :param last_modified: an optional date of the last modification. + :param ignore_if_range: If `False`, `If-Range` header will be taken into + account. + :return: `True` if the resource was modified, otherwise `False`. + """ + if etag is None and data is not None: + etag = generate_etag(data) + elif data is not None: + raise TypeError("both data and etag given") + if environ["REQUEST_METHOD"] not in ("GET", "HEAD"): + return False + + unmodified = False + if isinstance(last_modified, string_types): + last_modified = parse_date(last_modified) + + # ensure that microsecond is zero because the HTTP spec does not transmit + # that either and we might have some false positives. See issue #39 + if last_modified is not None: + last_modified = last_modified.replace(microsecond=0) + + if_range = None + if not ignore_if_range and "HTTP_RANGE" in environ: + # https://tools.ietf.org/html/rfc7233#section-3.2 + # A server MUST ignore an If-Range header field received in a request + # that does not contain a Range header field. + if_range = parse_if_range_header(environ.get("HTTP_IF_RANGE")) + + if if_range is not None and if_range.date is not None: + modified_since = if_range.date + else: + modified_since = parse_date(environ.get("HTTP_IF_MODIFIED_SINCE")) + + if modified_since and last_modified and last_modified <= modified_since: + unmodified = True + + if etag: + etag, _ = unquote_etag(etag) + if if_range is not None and if_range.etag is not None: + unmodified = parse_etags(if_range.etag).contains(etag) + else: + if_none_match = parse_etags(environ.get("HTTP_IF_NONE_MATCH")) + if if_none_match: + # https://tools.ietf.org/html/rfc7232#section-3.2 + # "A recipient MUST use the weak comparison function when comparing + # entity-tags for If-None-Match" + unmodified = if_none_match.contains_weak(etag) + + # https://tools.ietf.org/html/rfc7232#section-3.1 + # "Origin server MUST use the strong comparison function when + # comparing entity-tags for If-Match" + if_match = parse_etags(environ.get("HTTP_IF_MATCH")) + if if_match: + unmodified = not if_match.is_strong(etag) + + return not unmodified + + +def remove_entity_headers(headers, allowed=("expires", "content-location")): + """Remove all entity headers from a list or :class:`Headers` object. This + operation works in-place. `Expires` and `Content-Location` headers are + by default not removed. The reason for this is :rfc:`2616` section + 10.3.5 which specifies some entity headers that should be sent. + + .. versionchanged:: 0.5 + added `allowed` parameter. + + :param headers: a list or :class:`Headers` object. + :param allowed: a list of headers that should still be allowed even though + they are entity headers. + """ + allowed = set(x.lower() for x in allowed) + headers[:] = [ + (key, value) + for key, value in headers + if not is_entity_header(key) or key.lower() in allowed + ] + + +def remove_hop_by_hop_headers(headers): + """Remove all HTTP/1.1 "Hop-by-Hop" headers from a list or + :class:`Headers` object. This operation works in-place. + + .. versionadded:: 0.5 + + :param headers: a list or :class:`Headers` object. + """ + headers[:] = [ + (key, value) for key, value in headers if not is_hop_by_hop_header(key) + ] + + +def is_entity_header(header): + """Check if a header is an entity header. + + .. versionadded:: 0.5 + + :param header: the header to test. + :return: `True` if it's an entity header, `False` otherwise. + """ + return header.lower() in _entity_headers + + +def is_hop_by_hop_header(header): + """Check if a header is an HTTP/1.1 "Hop-by-Hop" header. + + .. versionadded:: 0.5 + + :param header: the header to test. + :return: `True` if it's an HTTP/1.1 "Hop-by-Hop" header, `False` otherwise. + """ + return header.lower() in _hop_by_hop_headers + + +def parse_cookie(header, charset="utf-8", errors="replace", cls=None): + """Parse a cookie. Either from a string or WSGI environ. + + Per default encoding errors are ignored. If you want a different behavior + you can set `errors` to ``'replace'`` or ``'strict'``. In strict mode a + :exc:`HTTPUnicodeError` is raised. + + .. versionchanged:: 0.5 + This function now returns a :class:`TypeConversionDict` instead of a + regular dict. The `cls` parameter was added. + + :param header: the header to be used to parse the cookie. Alternatively + this can be a WSGI environment. + :param charset: the charset for the cookie values. + :param errors: the error behavior for the charset decoding. + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`TypeConversionDict` is + used. + """ + if isinstance(header, dict): + header = header.get("HTTP_COOKIE", "") + elif header is None: + header = "" + + # If the value is an unicode string it's mangled through latin1. This + # is done because on PEP 3333 on Python 3 all headers are assumed latin1 + # which however is incorrect for cookies, which are sent in page encoding. + # As a result we + if isinstance(header, text_type): + header = header.encode("latin1", "replace") + + if cls is None: + cls = TypeConversionDict + + def _parse_pairs(): + for key, val in _cookie_parse_impl(header): + key = to_unicode(key, charset, errors, allow_none_charset=True) + if not key: + continue + val = to_unicode(val, charset, errors, allow_none_charset=True) + yield try_coerce_native(key), val + + return cls(_parse_pairs()) + + +def dump_cookie( + key, + value="", + max_age=None, + expires=None, + path="/", + domain=None, + secure=False, + httponly=False, + charset="utf-8", + sync_expires=True, + max_size=4093, + samesite=None, +): + """Creates a new Set-Cookie header without the ``Set-Cookie`` prefix + The parameters are the same as in the cookie Morsel object in the + Python standard library but it accepts unicode data, too. + + On Python 3 the return value of this function will be a unicode + string, on Python 2 it will be a native string. In both cases the + return value is usually restricted to ascii as the vast majority of + values are properly escaped, but that is no guarantee. If a unicode + string is returned it's tunneled through latin1 as required by + PEP 3333. + + The return value is not ASCII safe if the key contains unicode + characters. This is technically against the specification but + happens in the wild. It's strongly recommended to not use + non-ASCII values for the keys. + + :param max_age: should be a number of seconds, or `None` (default) if + the cookie should last only as long as the client's + browser session. Additionally `timedelta` objects + are accepted, too. + :param expires: should be a `datetime` object or unix timestamp. + :param path: limits the cookie to a given path, per default it will + span the whole domain. + :param domain: Use this if you want to set a cross-domain cookie. For + example, ``domain=".example.com"`` will set a cookie + that is readable by the domain ``www.example.com``, + ``foo.example.com`` etc. Otherwise, a cookie will only + be readable by the domain that set it. + :param secure: The cookie will only be available via HTTPS + :param httponly: disallow JavaScript to access the cookie. This is an + extension to the cookie standard and probably not + supported by all browsers. + :param charset: the encoding for unicode values. + :param sync_expires: automatically set expires if max_age is defined + but expires not. + :param max_size: Warn if the final header value exceeds this size. The + default, 4093, should be safely `supported by most browsers + `_. Set to 0 to disable this check. + :param samesite: Limits the scope of the cookie such that it will only + be attached to requests if those requests are "same-site". + + .. _`cookie`: http://browsercookielimits.squawky.net/ + """ + key = to_bytes(key, charset) + value = to_bytes(value, charset) + + if path is not None: + from .urls import iri_to_uri + + path = iri_to_uri(path, charset) + domain = _make_cookie_domain(domain) + if isinstance(max_age, timedelta): + max_age = (max_age.days * 60 * 60 * 24) + max_age.seconds + if expires is not None: + if not isinstance(expires, string_types): + expires = cookie_date(expires) + elif max_age is not None and sync_expires: + expires = to_bytes(cookie_date(time() + max_age)) + + samesite = samesite.title() if samesite else None + if samesite not in ("Strict", "Lax", None): + raise ValueError("invalid SameSite value; must be 'Strict', 'Lax' or None") + + buf = [key + b"=" + _cookie_quote(value)] + + # XXX: In theory all of these parameters that are not marked with `None` + # should be quoted. Because stdlib did not quote it before I did not + # want to introduce quoting there now. + for k, v, q in ( + (b"Domain", domain, True), + (b"Expires", expires, False), + (b"Max-Age", max_age, False), + (b"Secure", secure, None), + (b"HttpOnly", httponly, None), + (b"Path", path, False), + (b"SameSite", samesite, False), + ): + if q is None: + if v: + buf.append(k) + continue + + if v is None: + continue + + tmp = bytearray(k) + if not isinstance(v, (bytes, bytearray)): + v = to_bytes(text_type(v), charset) + if q: + v = _cookie_quote(v) + tmp += b"=" + v + buf.append(bytes(tmp)) + + # The return value will be an incorrectly encoded latin1 header on + # Python 3 for consistency with the headers object and a bytestring + # on Python 2 because that's how the API makes more sense. + rv = b"; ".join(buf) + if not PY2: + rv = rv.decode("latin1") + + # Warn if the final value of the cookie is less than the limit. If the + # cookie is too large, then it may be silently ignored, which can be quite + # hard to debug. + cookie_size = len(rv) + + if max_size and cookie_size > max_size: + value_size = len(value) + warnings.warn( + 'The "{key}" cookie is too large: the value was {value_size} bytes' + " but the header required {extra_size} extra bytes. The final size" + " was {cookie_size} bytes but the limit is {max_size} bytes." + " Browsers may silently ignore cookies larger than this.".format( + key=key, + value_size=value_size, + extra_size=cookie_size - value_size, + cookie_size=cookie_size, + max_size=max_size, + ), + stacklevel=2, + ) + + return rv + + +def is_byte_range_valid(start, stop, length): + """Checks if a given byte content range is valid for the given length. + + .. versionadded:: 0.7 + """ + if (start is None) != (stop is None): + return False + elif start is None: + return length is None or length >= 0 + elif length is None: + return 0 <= start < stop + elif start >= stop: + return False + return 0 <= start < length + + +# circular dependencies +from .datastructures import Accept +from .datastructures import Authorization +from .datastructures import ContentRange +from .datastructures import ETags +from .datastructures import HeaderSet +from .datastructures import IfRange +from .datastructures import Range +from .datastructures import RequestCacheControl +from .datastructures import TypeConversionDict +from .datastructures import WWWAuthenticate + +from werkzeug import _DeprecatedImportModule + +_DeprecatedImportModule( + __name__, + {".datastructures": ["CharsetAccept", "Headers", "LanguageAccept", "MIMEAccept"]}, + "Werkzeug 1.0", +) +del _DeprecatedImportModule diff --git a/brightonpy/Lib/site-packages/werkzeug/local.py b/brightonpy/Lib/site-packages/werkzeug/local.py new file mode 100644 index 0000000..9a6088c --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/local.py @@ -0,0 +1,421 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.local + ~~~~~~~~~~~~~~ + + This module implements context-local objects. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import copy +from functools import update_wrapper + +from ._compat import implements_bool +from ._compat import PY2 +from .wsgi import ClosingIterator + +# since each thread has its own greenlet we can just use those as identifiers +# for the context. If greenlets are not available we fall back to the +# current thread ident depending on where it is. +try: + from greenlet import getcurrent as get_ident +except ImportError: + try: + from thread import get_ident + except ImportError: + from _thread import get_ident + + +def release_local(local): + """Releases the contents of the local for the current context. + This makes it possible to use locals without a manager. + + Example:: + + >>> loc = Local() + >>> loc.foo = 42 + >>> release_local(loc) + >>> hasattr(loc, 'foo') + False + + With this function one can release :class:`Local` objects as well + as :class:`LocalStack` objects. However it is not possible to + release data held by proxies that way, one always has to retain + a reference to the underlying local object in order to be able + to release it. + + .. versionadded:: 0.6.1 + """ + local.__release_local__() + + +class Local(object): + __slots__ = ("__storage__", "__ident_func__") + + def __init__(self): + object.__setattr__(self, "__storage__", {}) + object.__setattr__(self, "__ident_func__", get_ident) + + def __iter__(self): + return iter(self.__storage__.items()) + + def __call__(self, proxy): + """Create a proxy for a name.""" + return LocalProxy(self, proxy) + + def __release_local__(self): + self.__storage__.pop(self.__ident_func__(), None) + + def __getattr__(self, name): + try: + return self.__storage__[self.__ident_func__()][name] + except KeyError: + raise AttributeError(name) + + def __setattr__(self, name, value): + ident = self.__ident_func__() + storage = self.__storage__ + try: + storage[ident][name] = value + except KeyError: + storage[ident] = {name: value} + + def __delattr__(self, name): + try: + del self.__storage__[self.__ident_func__()][name] + except KeyError: + raise AttributeError(name) + + +class LocalStack(object): + """This class works similar to a :class:`Local` but keeps a stack + of objects instead. This is best explained with an example:: + + >>> ls = LocalStack() + >>> ls.push(42) + >>> ls.top + 42 + >>> ls.push(23) + >>> ls.top + 23 + >>> ls.pop() + 23 + >>> ls.top + 42 + + They can be force released by using a :class:`LocalManager` or with + the :func:`release_local` function but the correct way is to pop the + item from the stack after using. When the stack is empty it will + no longer be bound to the current context (and as such released). + + By calling the stack without arguments it returns a proxy that resolves to + the topmost item on the stack. + + .. versionadded:: 0.6.1 + """ + + def __init__(self): + self._local = Local() + + def __release_local__(self): + self._local.__release_local__() + + def _get__ident_func__(self): + return self._local.__ident_func__ + + def _set__ident_func__(self, value): + object.__setattr__(self._local, "__ident_func__", value) + + __ident_func__ = property(_get__ident_func__, _set__ident_func__) + del _get__ident_func__, _set__ident_func__ + + def __call__(self): + def _lookup(): + rv = self.top + if rv is None: + raise RuntimeError("object unbound") + return rv + + return LocalProxy(_lookup) + + def push(self, obj): + """Pushes a new item to the stack""" + rv = getattr(self._local, "stack", None) + if rv is None: + self._local.stack = rv = [] + rv.append(obj) + return rv + + def pop(self): + """Removes the topmost item from the stack, will return the + old value or `None` if the stack was already empty. + """ + stack = getattr(self._local, "stack", None) + if stack is None: + return None + elif len(stack) == 1: + release_local(self._local) + return stack[-1] + else: + return stack.pop() + + @property + def top(self): + """The topmost item on the stack. If the stack is empty, + `None` is returned. + """ + try: + return self._local.stack[-1] + except (AttributeError, IndexError): + return None + + +class LocalManager(object): + """Local objects cannot manage themselves. For that you need a local + manager. You can pass a local manager multiple locals or add them later + by appending them to `manager.locals`. Every time the manager cleans up, + it will clean up all the data left in the locals for this context. + + The `ident_func` parameter can be added to override the default ident + function for the wrapped locals. + + .. versionchanged:: 0.6.1 + Instead of a manager the :func:`release_local` function can be used + as well. + + .. versionchanged:: 0.7 + `ident_func` was added. + """ + + def __init__(self, locals=None, ident_func=None): + if locals is None: + self.locals = [] + elif isinstance(locals, Local): + self.locals = [locals] + else: + self.locals = list(locals) + if ident_func is not None: + self.ident_func = ident_func + for local in self.locals: + object.__setattr__(local, "__ident_func__", ident_func) + else: + self.ident_func = get_ident + + def get_ident(self): + """Return the context identifier the local objects use internally for + this context. You cannot override this method to change the behavior + but use it to link other context local objects (such as SQLAlchemy's + scoped sessions) to the Werkzeug locals. + + .. versionchanged:: 0.7 + You can pass a different ident function to the local manager that + will then be propagated to all the locals passed to the + constructor. + """ + return self.ident_func() + + def cleanup(self): + """Manually clean up the data in the locals for this context. Call + this at the end of the request or use `make_middleware()`. + """ + for local in self.locals: + release_local(local) + + def make_middleware(self, app): + """Wrap a WSGI application so that cleaning up happens after + request end. + """ + + def application(environ, start_response): + return ClosingIterator(app(environ, start_response), self.cleanup) + + return application + + def middleware(self, func): + """Like `make_middleware` but for decorating functions. + + Example usage:: + + @manager.middleware + def application(environ, start_response): + ... + + The difference to `make_middleware` is that the function passed + will have all the arguments copied from the inner application + (name, docstring, module). + """ + return update_wrapper(self.make_middleware(func), func) + + def __repr__(self): + return "<%s storages: %d>" % (self.__class__.__name__, len(self.locals)) + + +@implements_bool +class LocalProxy(object): + """Acts as a proxy for a werkzeug local. Forwards all operations to + a proxied object. The only operations not supported for forwarding + are right handed operands and any kind of assignment. + + Example usage:: + + from werkzeug.local import Local + l = Local() + + # these are proxies + request = l('request') + user = l('user') + + + from werkzeug.local import LocalStack + _response_local = LocalStack() + + # this is a proxy + response = _response_local() + + Whenever something is bound to l.user / l.request the proxy objects + will forward all operations. If no object is bound a :exc:`RuntimeError` + will be raised. + + To create proxies to :class:`Local` or :class:`LocalStack` objects, + call the object as shown above. If you want to have a proxy to an + object looked up by a function, you can (as of Werkzeug 0.6.1) pass + a function to the :class:`LocalProxy` constructor:: + + session = LocalProxy(lambda: get_current_request().session) + + .. versionchanged:: 0.6.1 + The class can be instantiated with a callable as well now. + """ + + __slots__ = ("__local", "__dict__", "__name__", "__wrapped__") + + def __init__(self, local, name=None): + object.__setattr__(self, "_LocalProxy__local", local) + object.__setattr__(self, "__name__", name) + if callable(local) and not hasattr(local, "__release_local__"): + # "local" is a callable that is not an instance of Local or + # LocalManager: mark it as a wrapped function. + object.__setattr__(self, "__wrapped__", local) + + def _get_current_object(self): + """Return the current object. This is useful if you want the real + object behind the proxy at a time for performance reasons or because + you want to pass the object into a different context. + """ + if not hasattr(self.__local, "__release_local__"): + return self.__local() + try: + return getattr(self.__local, self.__name__) + except AttributeError: + raise RuntimeError("no object bound to %s" % self.__name__) + + @property + def __dict__(self): + try: + return self._get_current_object().__dict__ + except RuntimeError: + raise AttributeError("__dict__") + + def __repr__(self): + try: + obj = self._get_current_object() + except RuntimeError: + return "<%s unbound>" % self.__class__.__name__ + return repr(obj) + + def __bool__(self): + try: + return bool(self._get_current_object()) + except RuntimeError: + return False + + def __unicode__(self): + try: + return unicode(self._get_current_object()) # noqa + except RuntimeError: + return repr(self) + + def __dir__(self): + try: + return dir(self._get_current_object()) + except RuntimeError: + return [] + + def __getattr__(self, name): + if name == "__members__": + return dir(self._get_current_object()) + return getattr(self._get_current_object(), name) + + def __setitem__(self, key, value): + self._get_current_object()[key] = value + + def __delitem__(self, key): + del self._get_current_object()[key] + + if PY2: + __getslice__ = lambda x, i, j: x._get_current_object()[i:j] + + def __setslice__(self, i, j, seq): + self._get_current_object()[i:j] = seq + + def __delslice__(self, i, j): + del self._get_current_object()[i:j] + + __setattr__ = lambda x, n, v: setattr(x._get_current_object(), n, v) + __delattr__ = lambda x, n: delattr(x._get_current_object(), n) + __str__ = lambda x: str(x._get_current_object()) + __lt__ = lambda x, o: x._get_current_object() < o + __le__ = lambda x, o: x._get_current_object() <= o + __eq__ = lambda x, o: x._get_current_object() == o + __ne__ = lambda x, o: x._get_current_object() != o + __gt__ = lambda x, o: x._get_current_object() > o + __ge__ = lambda x, o: x._get_current_object() >= o + __cmp__ = lambda x, o: cmp(x._get_current_object(), o) # noqa + __hash__ = lambda x: hash(x._get_current_object()) + __call__ = lambda x, *a, **kw: x._get_current_object()(*a, **kw) + __len__ = lambda x: len(x._get_current_object()) + __getitem__ = lambda x, i: x._get_current_object()[i] + __iter__ = lambda x: iter(x._get_current_object()) + __contains__ = lambda x, i: i in x._get_current_object() + __add__ = lambda x, o: x._get_current_object() + o + __sub__ = lambda x, o: x._get_current_object() - o + __mul__ = lambda x, o: x._get_current_object() * o + __floordiv__ = lambda x, o: x._get_current_object() // o + __mod__ = lambda x, o: x._get_current_object() % o + __divmod__ = lambda x, o: x._get_current_object().__divmod__(o) + __pow__ = lambda x, o: x._get_current_object() ** o + __lshift__ = lambda x, o: x._get_current_object() << o + __rshift__ = lambda x, o: x._get_current_object() >> o + __and__ = lambda x, o: x._get_current_object() & o + __xor__ = lambda x, o: x._get_current_object() ^ o + __or__ = lambda x, o: x._get_current_object() | o + __div__ = lambda x, o: x._get_current_object().__div__(o) + __truediv__ = lambda x, o: x._get_current_object().__truediv__(o) + __neg__ = lambda x: -(x._get_current_object()) + __pos__ = lambda x: +(x._get_current_object()) + __abs__ = lambda x: abs(x._get_current_object()) + __invert__ = lambda x: ~(x._get_current_object()) + __complex__ = lambda x: complex(x._get_current_object()) + __int__ = lambda x: int(x._get_current_object()) + __long__ = lambda x: long(x._get_current_object()) # noqa + __float__ = lambda x: float(x._get_current_object()) + __oct__ = lambda x: oct(x._get_current_object()) + __hex__ = lambda x: hex(x._get_current_object()) + __index__ = lambda x: x._get_current_object().__index__() + __coerce__ = lambda x, o: x._get_current_object().__coerce__(x, o) + __enter__ = lambda x: x._get_current_object().__enter__() + __exit__ = lambda x, *a, **kw: x._get_current_object().__exit__(*a, **kw) + __radd__ = lambda x, o: o + x._get_current_object() + __rsub__ = lambda x, o: o - x._get_current_object() + __rmul__ = lambda x, o: o * x._get_current_object() + __rdiv__ = lambda x, o: o / x._get_current_object() + if PY2: + __rtruediv__ = lambda x, o: x._get_current_object().__rtruediv__(o) + else: + __rtruediv__ = __rdiv__ + __rfloordiv__ = lambda x, o: o // x._get_current_object() + __rmod__ = lambda x, o: o % x._get_current_object() + __rdivmod__ = lambda x, o: x._get_current_object().__rdivmod__(o) + __copy__ = lambda x: copy.copy(x._get_current_object()) + __deepcopy__ = lambda x, memo: copy.deepcopy(x._get_current_object(), memo) diff --git a/brightonpy/Lib/site-packages/werkzeug/middleware/__init__.py b/brightonpy/Lib/site-packages/werkzeug/middleware/__init__.py new file mode 100644 index 0000000..5e049f5 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/middleware/__init__.py @@ -0,0 +1,25 @@ +""" +Middleware +========== + +A WSGI middleware is a WSGI application that wraps another application +in order to observe or change its behavior. Werkzeug provides some +middleware for common use cases. + +.. toctree:: + :maxdepth: 1 + + proxy_fix + shared_data + dispatcher + http_proxy + lint + profiler + +The :doc:`interactive debugger ` is also a middleware that can +be applied manually, although it is typically used automatically with +the :doc:`development server `. + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" diff --git a/brightonpy/Lib/site-packages/werkzeug/middleware/dispatcher.py b/brightonpy/Lib/site-packages/werkzeug/middleware/dispatcher.py new file mode 100644 index 0000000..2eb173e --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/middleware/dispatcher.py @@ -0,0 +1,66 @@ +""" +Application Dispatcher +====================== + +This middleware creates a single WSGI application that dispatches to +multiple other WSGI applications mounted at different URL paths. + +A common example is writing a Single Page Application, where you have a +backend API and a frontend written in JavaScript that does the routing +in the browser rather than requesting different pages from the server. +The frontend is a single HTML and JS file that should be served for any +path besides "/api". + +This example dispatches to an API app under "/api", an admin app +under "/admin", and an app that serves frontend files for all other +requests:: + + app = DispatcherMiddleware(serve_frontend, { + '/api': api_app, + '/admin': admin_app, + }) + +In production, you might instead handle this at the HTTP server level, +serving files or proxying to application servers based on location. The +API and admin apps would each be deployed with a separate WSGI server, +and the static files would be served directly by the HTTP server. + +.. autoclass:: DispatcherMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" + + +class DispatcherMiddleware(object): + """Combine multiple applications as a single WSGI application. + Requests are dispatched to an application based on the path it is + mounted under. + + :param app: The WSGI application to dispatch to if the request + doesn't match a mounted path. + :param mounts: Maps path prefixes to applications for dispatching. + """ + + def __init__(self, app, mounts=None): + self.app = app + self.mounts = mounts or {} + + def __call__(self, environ, start_response): + script = environ.get("PATH_INFO", "") + path_info = "" + + while "/" in script: + if script in self.mounts: + app = self.mounts[script] + break + + script, last_item = script.rsplit("/", 1) + path_info = "/%s%s" % (last_item, path_info) + else: + app = self.mounts.get(script, self.app) + + original_script_name = environ.get("SCRIPT_NAME", "") + environ["SCRIPT_NAME"] = original_script_name + script + environ["PATH_INFO"] = path_info + return app(environ, start_response) diff --git a/brightonpy/Lib/site-packages/werkzeug/middleware/http_proxy.py b/brightonpy/Lib/site-packages/werkzeug/middleware/http_proxy.py new file mode 100644 index 0000000..bfdc071 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/middleware/http_proxy.py @@ -0,0 +1,219 @@ +""" +Basic HTTP Proxy +================ + +.. autoclass:: ProxyMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +import socket + +from ..datastructures import EnvironHeaders +from ..http import is_hop_by_hop_header +from ..urls import url_parse +from ..urls import url_quote +from ..wsgi import get_input_stream + +try: + from http import client +except ImportError: + import httplib as client + + +class ProxyMiddleware(object): + """Proxy requests under a path to an external server, routing other + requests to the app. + + This middleware can only proxy HTTP requests, as that is the only + protocol handled by the WSGI server. Other protocols, such as + websocket requests, cannot be proxied at this layer. This should + only be used for development, in production a real proxying server + should be used. + + The middleware takes a dict that maps a path prefix to a dict + describing the host to be proxied to:: + + app = ProxyMiddleware(app, { + "/static/": { + "target": "http://127.0.0.1:5001/", + } + }) + + Each host has the following options: + + ``target``: + The target URL to dispatch to. This is required. + ``remove_prefix``: + Whether to remove the prefix from the URL before dispatching it + to the target. The default is ``False``. + ``host``: + ``""`` (default): + The host header is automatically rewritten to the URL of the + target. + ``None``: + The host header is unmodified from the client request. + Any other value: + The host header is overwritten with the value. + ``headers``: + A dictionary of headers to be sent with the request to the + target. The default is ``{}``. + ``ssl_context``: + A :class:`ssl.SSLContext` defining how to verify requests if the + target is HTTPS. The default is ``None``. + + In the example above, everything under ``"/static/"`` is proxied to + the server on port 5001. The host header is rewritten to the target, + and the ``"/static/"`` prefix is removed from the URLs. + + :param app: The WSGI application to wrap. + :param targets: Proxy target configurations. See description above. + :param chunk_size: Size of chunks to read from input stream and + write to target. + :param timeout: Seconds before an operation to a target fails. + + .. versionadded:: 0.14 + """ + + def __init__(self, app, targets, chunk_size=2 << 13, timeout=10): + def _set_defaults(opts): + opts.setdefault("remove_prefix", False) + opts.setdefault("host", "") + opts.setdefault("headers", {}) + opts.setdefault("ssl_context", None) + return opts + + self.app = app + self.targets = dict( + ("/%s/" % k.strip("/"), _set_defaults(v)) for k, v in targets.items() + ) + self.chunk_size = chunk_size + self.timeout = timeout + + def proxy_to(self, opts, path, prefix): + target = url_parse(opts["target"]) + + def application(environ, start_response): + headers = list(EnvironHeaders(environ).items()) + headers[:] = [ + (k, v) + for k, v in headers + if not is_hop_by_hop_header(k) + and k.lower() not in ("content-length", "host") + ] + headers.append(("Connection", "close")) + + if opts["host"] == "": + headers.append(("Host", target.ascii_host)) + elif opts["host"] is None: + headers.append(("Host", environ["HTTP_HOST"])) + else: + headers.append(("Host", opts["host"])) + + headers.extend(opts["headers"].items()) + remote_path = path + + if opts["remove_prefix"]: + remote_path = "%s/%s" % ( + target.path.rstrip("/"), + remote_path[len(prefix) :].lstrip("/"), + ) + + content_length = environ.get("CONTENT_LENGTH") + chunked = False + + if content_length not in ("", None): + headers.append(("Content-Length", content_length)) + elif content_length is not None: + headers.append(("Transfer-Encoding", "chunked")) + chunked = True + + try: + if target.scheme == "http": + con = client.HTTPConnection( + target.ascii_host, target.port or 80, timeout=self.timeout + ) + elif target.scheme == "https": + con = client.HTTPSConnection( + target.ascii_host, + target.port or 443, + timeout=self.timeout, + context=opts["ssl_context"], + ) + else: + raise RuntimeError( + "Target scheme must be 'http' or 'https', got '{}'.".format( + target.scheme + ) + ) + + con.connect() + remote_url = url_quote(remote_path) + querystring = environ["QUERY_STRING"] + + if querystring: + remote_url = remote_url + "?" + querystring + + con.putrequest(environ["REQUEST_METHOD"], remote_url, skip_host=True) + + for k, v in headers: + if k.lower() == "connection": + v = "close" + + con.putheader(k, v) + + con.endheaders() + stream = get_input_stream(environ) + + while 1: + data = stream.read(self.chunk_size) + + if not data: + break + + if chunked: + con.send(b"%x\r\n%s\r\n" % (len(data), data)) + else: + con.send(data) + + resp = con.getresponse() + except socket.error: + from ..exceptions import BadGateway + + return BadGateway()(environ, start_response) + + start_response( + "%d %s" % (resp.status, resp.reason), + [ + (k.title(), v) + for k, v in resp.getheaders() + if not is_hop_by_hop_header(k) + ], + ) + + def read(): + while 1: + try: + data = resp.read(self.chunk_size) + except socket.error: + break + + if not data: + break + + yield data + + return read() + + return application + + def __call__(self, environ, start_response): + path = environ["PATH_INFO"] + app = self.app + + for prefix, opts in self.targets.items(): + if path.startswith(prefix): + app = self.proxy_to(opts, path, prefix) + break + + return app(environ, start_response) diff --git a/brightonpy/Lib/site-packages/werkzeug/middleware/lint.py b/brightonpy/Lib/site-packages/werkzeug/middleware/lint.py new file mode 100644 index 0000000..98f9581 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/middleware/lint.py @@ -0,0 +1,408 @@ +""" +WSGI Protocol Linter +==================== + +This module provides a middleware that performs sanity checks on the +behavior of the WSGI server and application. It checks that the +:pep:`3333` WSGI spec is properly implemented. It also warns on some +common HTTP errors such as non-empty responses for 304 status codes. + +.. autoclass:: LintMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +from warnings import warn + +from .._compat import implements_iterator +from .._compat import PY2 +from .._compat import string_types +from ..datastructures import Headers +from ..http import is_entity_header +from ..wsgi import FileWrapper + +try: + from urllib.parse import urlparse +except ImportError: + from urlparse import urlparse + + +class WSGIWarning(Warning): + """Warning class for WSGI warnings.""" + + +class HTTPWarning(Warning): + """Warning class for HTTP warnings.""" + + +def check_string(context, obj, stacklevel=3): + if type(obj) is not str: + warn( + "'%s' requires strings, got '%s'" % (context, type(obj).__name__), + WSGIWarning, + ) + + +class InputStream(object): + def __init__(self, stream): + self._stream = stream + + def read(self, *args): + if len(args) == 0: + warn( + "WSGI does not guarantee an EOF marker on the input stream, thus making" + " calls to 'wsgi.input.read()' unsafe. Conforming servers may never" + " return from this call.", + WSGIWarning, + stacklevel=2, + ) + elif len(args) != 1: + warn( + "Too many parameters passed to 'wsgi.input.read()'.", + WSGIWarning, + stacklevel=2, + ) + return self._stream.read(*args) + + def readline(self, *args): + if len(args) == 0: + warn( + "Calls to 'wsgi.input.readline()' without arguments are unsafe. Use" + " 'wsgi.input.read()' instead.", + WSGIWarning, + stacklevel=2, + ) + elif len(args) == 1: + warn( + "'wsgi.input.readline()' was called with a size hint. WSGI does not" + " support this, although it's available on all major servers.", + WSGIWarning, + stacklevel=2, + ) + else: + raise TypeError("Too many arguments passed to 'wsgi.input.readline()'.") + return self._stream.readline(*args) + + def __iter__(self): + try: + return iter(self._stream) + except TypeError: + warn("'wsgi.input' is not iterable.", WSGIWarning, stacklevel=2) + return iter(()) + + def close(self): + warn("The application closed the input stream!", WSGIWarning, stacklevel=2) + self._stream.close() + + +class ErrorStream(object): + def __init__(self, stream): + self._stream = stream + + def write(self, s): + check_string("wsgi.error.write()", s) + self._stream.write(s) + + def flush(self): + self._stream.flush() + + def writelines(self, seq): + for line in seq: + self.write(line) + + def close(self): + warn("The application closed the error stream!", WSGIWarning, stacklevel=2) + self._stream.close() + + +class GuardedWrite(object): + def __init__(self, write, chunks): + self._write = write + self._chunks = chunks + + def __call__(self, s): + check_string("write()", s) + self._write.write(s) + self._chunks.append(len(s)) + + +@implements_iterator +class GuardedIterator(object): + def __init__(self, iterator, headers_set, chunks): + self._iterator = iterator + if PY2: + self._next = iter(iterator).next + else: + self._next = iter(iterator).__next__ + self.closed = False + self.headers_set = headers_set + self.chunks = chunks + + def __iter__(self): + return self + + def __next__(self): + if self.closed: + warn("Iterated over closed 'app_iter'.", WSGIWarning, stacklevel=2) + + rv = self._next() + + if not self.headers_set: + warn( + "The application returned before it started the response.", + WSGIWarning, + stacklevel=2, + ) + + check_string("application iterator items", rv) + self.chunks.append(len(rv)) + return rv + + def close(self): + self.closed = True + + if hasattr(self._iterator, "close"): + self._iterator.close() + + if self.headers_set: + status_code, headers = self.headers_set + bytes_sent = sum(self.chunks) + content_length = headers.get("content-length", type=int) + + if status_code == 304: + for key, _value in headers: + key = key.lower() + if key not in ("expires", "content-location") and is_entity_header( + key + ): + warn( + "Entity header %r found in 304 response." % key, HTTPWarning + ) + if bytes_sent: + warn("304 responses must not have a body.", HTTPWarning) + elif 100 <= status_code < 200 or status_code == 204: + if content_length != 0: + warn( + "%r responses must have an empty content length." % status_code, + HTTPWarning, + ) + if bytes_sent: + warn( + "%r responses must not have a body." % status_code, HTTPWarning + ) + elif content_length is not None and content_length != bytes_sent: + warn( + "Content-Length and the number of bytes sent to the client do not" + " match.", + WSGIWarning, + ) + + def __del__(self): + if not self.closed: + try: + warn( + "Iterator was garbage collected before it was closed.", WSGIWarning + ) + except Exception: + pass + + +class LintMiddleware(object): + """Warns about common errors in the WSGI and HTTP behavior of the + server and wrapped application. Some of the issues it check are: + + - invalid status codes + - non-bytestrings sent to the WSGI server + - strings returned from the WSGI application + - non-empty conditional responses + - unquoted etags + - relative URLs in the Location header + - unsafe calls to wsgi.input + - unclosed iterators + + Error information is emitted using the :mod:`warnings` module. + + :param app: The WSGI application to wrap. + + .. code-block:: python + + from werkzeug.middleware.lint import LintMiddleware + app = LintMiddleware(app) + """ + + def __init__(self, app): + self.app = app + + def check_environ(self, environ): + if type(environ) is not dict: + warn( + "WSGI environment is not a standard Python dict.", + WSGIWarning, + stacklevel=4, + ) + for key in ( + "REQUEST_METHOD", + "SERVER_NAME", + "SERVER_PORT", + "wsgi.version", + "wsgi.input", + "wsgi.errors", + "wsgi.multithread", + "wsgi.multiprocess", + "wsgi.run_once", + ): + if key not in environ: + warn( + "Required environment key %r not found" % key, + WSGIWarning, + stacklevel=3, + ) + if environ["wsgi.version"] != (1, 0): + warn("Environ is not a WSGI 1.0 environ.", WSGIWarning, stacklevel=3) + + script_name = environ.get("SCRIPT_NAME", "") + path_info = environ.get("PATH_INFO", "") + + if script_name and script_name[0] != "/": + warn( + "'SCRIPT_NAME' does not start with a slash: %r" % script_name, + WSGIWarning, + stacklevel=3, + ) + + if path_info and path_info[0] != "/": + warn( + "'PATH_INFO' does not start with a slash: %r" % path_info, + WSGIWarning, + stacklevel=3, + ) + + def check_start_response(self, status, headers, exc_info): + check_string("status", status) + status_code = status.split(None, 1)[0] + + if len(status_code) != 3 or not status_code.isdigit(): + warn(WSGIWarning("Status code must be three digits"), stacklevel=3) + + if len(status) < 4 or status[3] != " ": + warn( + WSGIWarning( + "Invalid value for status %r. Valid " + "status strings are three digits, a space " + "and a status explanation" + ), + stacklevel=3, + ) + + status_code = int(status_code) + + if status_code < 100: + warn(WSGIWarning("status code < 100 detected"), stacklevel=3) + + if type(headers) is not list: + warn(WSGIWarning("header list is not a list"), stacklevel=3) + + for item in headers: + if type(item) is not tuple or len(item) != 2: + warn(WSGIWarning("Headers must tuple 2-item tuples"), stacklevel=3) + name, value = item + if type(name) is not str or type(value) is not str: + warn(WSGIWarning("header items must be strings"), stacklevel=3) + if name.lower() == "status": + warn( + WSGIWarning( + "The status header is not supported due to " + "conflicts with the CGI spec." + ), + stacklevel=3, + ) + + if exc_info is not None and not isinstance(exc_info, tuple): + warn(WSGIWarning("invalid value for exc_info"), stacklevel=3) + + headers = Headers(headers) + self.check_headers(headers) + + return status_code, headers + + def check_headers(self, headers): + etag = headers.get("etag") + + if etag is not None: + if etag.startswith(("W/", "w/")): + if etag.startswith("w/"): + warn( + HTTPWarning("weak etag indicator should be upcase."), + stacklevel=4, + ) + + etag = etag[2:] + + if not (etag[:1] == etag[-1:] == '"'): + warn(HTTPWarning("unquoted etag emitted."), stacklevel=4) + + location = headers.get("location") + + if location is not None: + if not urlparse(location).netloc: + warn( + HTTPWarning("absolute URLs required for location header"), + stacklevel=4, + ) + + def check_iterator(self, app_iter): + if isinstance(app_iter, string_types): + warn( + "The application returned astring. The response will send one character" + " at a time to the client, which will kill performance. Return a list" + " or iterable instead.", + WSGIWarning, + stacklevel=3, + ) + + def __call__(self, *args, **kwargs): + if len(args) != 2: + warn("A WSGI app takes two arguments.", WSGIWarning, stacklevel=2) + + if kwargs: + warn( + "A WSGI app does not take keyword arguments.", WSGIWarning, stacklevel=2 + ) + + environ, start_response = args + + self.check_environ(environ) + environ["wsgi.input"] = InputStream(environ["wsgi.input"]) + environ["wsgi.errors"] = ErrorStream(environ["wsgi.errors"]) + + # Hook our own file wrapper in so that applications will always + # iterate to the end and we can check the content length. + environ["wsgi.file_wrapper"] = FileWrapper + + headers_set = [] + chunks = [] + + def checking_start_response(*args, **kwargs): + if len(args) not in (2, 3): + warn( + "Invalid number of arguments: %s, expected 2 or 3." % len(args), + WSGIWarning, + stacklevel=2, + ) + + if kwargs: + warn("'start_response' does not take keyword arguments.", WSGIWarning) + + status, headers = args[:2] + + if len(args) == 3: + exc_info = args[2] + else: + exc_info = None + + headers_set[:] = self.check_start_response(status, headers, exc_info) + return GuardedWrite(start_response(status, headers, exc_info), chunks) + + app_iter = self.app(environ, checking_start_response) + self.check_iterator(app_iter) + return GuardedIterator(app_iter, headers_set, chunks) diff --git a/brightonpy/Lib/site-packages/werkzeug/middleware/profiler.py b/brightonpy/Lib/site-packages/werkzeug/middleware/profiler.py new file mode 100644 index 0000000..32a14d9 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/middleware/profiler.py @@ -0,0 +1,132 @@ +""" +Application Profiler +==================== + +This module provides a middleware that profiles each request with the +:mod:`cProfile` module. This can help identify bottlenecks in your code +that may be slowing down your application. + +.. autoclass:: ProfilerMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +from __future__ import print_function + +import os.path +import sys +import time +from pstats import Stats + +try: + from cProfile import Profile +except ImportError: + from profile import Profile + + +class ProfilerMiddleware(object): + """Wrap a WSGI application and profile the execution of each + request. Responses are buffered so that timings are more exact. + + If ``stream`` is given, :class:`pstats.Stats` are written to it + after each request. If ``profile_dir`` is given, :mod:`cProfile` + data files are saved to that directory, one file per request. + + The filename can be customized by passing ``filename_format``. If + it is a string, it will be formatted using :meth:`str.format` with + the following fields available: + + - ``{method}`` - The request method; GET, POST, etc. + - ``{path}`` - The request path or 'root' should one not exist. + - ``{elapsed}`` - The elapsed time of the request. + - ``{time}`` - The time of the request. + + If it is a callable, it will be called with the WSGI ``environ`` + dict and should return a filename. + + :param app: The WSGI application to wrap. + :param stream: Write stats to this stream. Disable with ``None``. + :param sort_by: A tuple of columns to sort stats by. See + :meth:`pstats.Stats.sort_stats`. + :param restrictions: A tuple of restrictions to filter stats by. See + :meth:`pstats.Stats.print_stats`. + :param profile_dir: Save profile data files to this directory. + :param filename_format: Format string for profile data file names, + or a callable returning a name. See explanation above. + + .. code-block:: python + + from werkzeug.middleware.profiler import ProfilerMiddleware + app = ProfilerMiddleware(app) + + .. versionchanged:: 0.15 + Stats are written even if ``profile_dir`` is given, and can be + disable by passing ``stream=None``. + + .. versionadded:: 0.15 + Added ``filename_format``. + + .. versionadded:: 0.9 + Added ``restrictions`` and ``profile_dir``. + """ + + def __init__( + self, + app, + stream=sys.stdout, + sort_by=("time", "calls"), + restrictions=(), + profile_dir=None, + filename_format="{method}.{path}.{elapsed:.0f}ms.{time:.0f}.prof", + ): + self._app = app + self._stream = stream + self._sort_by = sort_by + self._restrictions = restrictions + self._profile_dir = profile_dir + self._filename_format = filename_format + + def __call__(self, environ, start_response): + response_body = [] + + def catching_start_response(status, headers, exc_info=None): + start_response(status, headers, exc_info) + return response_body.append + + def runapp(): + app_iter = self._app(environ, catching_start_response) + response_body.extend(app_iter) + + if hasattr(app_iter, "close"): + app_iter.close() + + profile = Profile() + start = time.time() + profile.runcall(runapp) + body = b"".join(response_body) + elapsed = time.time() - start + + if self._profile_dir is not None: + if callable(self._filename_format): + filename = self._filename_format(environ) + else: + filename = self._filename_format.format( + method=environ["REQUEST_METHOD"], + path=( + environ.get("PATH_INFO").strip("/").replace("/", ".") or "root" + ), + elapsed=elapsed * 1000.0, + time=time.time(), + ) + filename = os.path.join(self._profile_dir, filename) + profile.dump_stats(filename) + + if self._stream is not None: + stats = Stats(profile, stream=self._stream) + stats.sort_stats(*self._sort_by) + print("-" * 80, file=self._stream) + print("PATH: {!r}".format(environ.get("PATH_INFO", "")), file=self._stream) + stats.print_stats(*self._restrictions) + print("-" * 80 + "\n", file=self._stream) + + return [body] diff --git a/brightonpy/Lib/site-packages/werkzeug/middleware/proxy_fix.py b/brightonpy/Lib/site-packages/werkzeug/middleware/proxy_fix.py new file mode 100644 index 0000000..bbe1814 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/middleware/proxy_fix.py @@ -0,0 +1,232 @@ +""" +X-Forwarded-For Proxy Fix +========================= + +This module provides a middleware that adjusts the WSGI environ based on +``X-Forwarded-`` headers that proxies in front of an application may +set. + +When an application is running behind a proxy server, WSGI may see the +request as coming from that server rather than the real client. Proxies +set various headers to track where the request actually came from. + +This middleware should only be applied if the application is actually +behind such a proxy, and should be configured with the number of proxies +that are chained in front of it. Not all proxies set all the headers. +Since incoming headers can be faked, you must set how many proxies are +setting each header so the middleware knows what to trust. + +.. autoclass:: ProxyFix + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +import warnings + + +class ProxyFix(object): + """Adjust the WSGI environ based on ``X-Forwarded-`` that proxies in + front of the application may set. + + - ``X-Forwarded-For`` sets ``REMOTE_ADDR``. + - ``X-Forwarded-Proto`` sets ``wsgi.url_scheme``. + - ``X-Forwarded-Host`` sets ``HTTP_HOST``, ``SERVER_NAME``, and + ``SERVER_PORT``. + - ``X-Forwarded-Port`` sets ``HTTP_HOST`` and ``SERVER_PORT``. + - ``X-Forwarded-Prefix`` sets ``SCRIPT_NAME``. + + You must tell the middleware how many proxies set each header so it + knows what values to trust. It is a security issue to trust values + that came from the client rather than a proxy. + + The original values of the headers are stored in the WSGI + environ as ``werkzeug.proxy_fix.orig``, a dict. + + :param app: The WSGI application to wrap. + :param x_for: Number of values to trust for ``X-Forwarded-For``. + :param x_proto: Number of values to trust for ``X-Forwarded-Proto``. + :param x_host: Number of values to trust for ``X-Forwarded-Host``. + :param x_port: Number of values to trust for ``X-Forwarded-Port``. + :param x_prefix: Number of values to trust for + ``X-Forwarded-Prefix``. + :param num_proxies: Deprecated, use ``x_for`` instead. + + .. code-block:: python + + from werkzeug.middleware.proxy_fix import ProxyFix + # App is behind one proxy that sets the -For and -Host headers. + app = ProxyFix(app, x_for=1, x_host=1) + + .. versionchanged:: 0.15 + All headers support multiple values. The ``num_proxies`` + argument is deprecated. Each header is configured with a + separate number of trusted proxies. + + .. versionchanged:: 0.15 + Original WSGI environ values are stored in the + ``werkzeug.proxy_fix.orig`` dict. ``orig_remote_addr``, + ``orig_wsgi_url_scheme``, and ``orig_http_host`` are deprecated + and will be removed in 1.0. + + .. versionchanged:: 0.15 + Support ``X-Forwarded-Port`` and ``X-Forwarded-Prefix``. + + .. versionchanged:: 0.15 + ``X-Fowarded-Host`` and ``X-Forwarded-Port`` modify + ``SERVER_NAME`` and ``SERVER_PORT``. + """ + + def __init__( + self, app, num_proxies=None, x_for=1, x_proto=1, x_host=0, x_port=0, x_prefix=0 + ): + self.app = app + self.x_for = x_for + self.x_proto = x_proto + self.x_host = x_host + self.x_port = x_port + self.x_prefix = x_prefix + self.num_proxies = num_proxies + + @property + def num_proxies(self): + """The number of proxies setting ``X-Forwarded-For`` in front + of the application. + + .. deprecated:: 0.15 + A separate number of trusted proxies is configured for each + header. ``num_proxies`` maps to ``x_for``. This method will + be removed in 1.0. + + :internal: + """ + warnings.warn( + "'num_proxies' is deprecated as of version 0.15 and will be" + " removed in version 1.0. Use 'x_for' instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.x_for + + @num_proxies.setter + def num_proxies(self, value): + if value is not None: + warnings.warn( + "'num_proxies' is deprecated as of version 0.15 and" + " will be removed in version 1.0. Use" + " 'x_for={value}, x_proto={value}, x_host={value}'" + " instead.".format(value=value), + DeprecationWarning, + stacklevel=2, + ) + self.x_for = value + self.x_proto = value + self.x_host = value + + def get_remote_addr(self, forwarded_for): + """Get the real ``remote_addr`` by looking backwards ``x_for`` + number of values in the ``X-Forwarded-For`` header. + + :param forwarded_for: List of values parsed from the + ``X-Forwarded-For`` header. + :return: The real ``remote_addr``, or ``None`` if there were not + at least ``x_for`` values. + + .. deprecated:: 0.15 + This is handled internally for each header. This method will + be removed in 1.0. + + .. versionchanged:: 0.9 + Use ``num_proxies`` instead of always picking the first + value. + + .. versionadded:: 0.8 + """ + warnings.warn( + "'get_remote_addr' is deprecated as of version 0.15 and" + " will be removed in version 1.0. It is now handled" + " internally for each header.", + DeprecationWarning, + ) + return self._get_trusted_comma(self.x_for, ",".join(forwarded_for)) + + def _get_trusted_comma(self, trusted, value): + """Get the real value from a comma-separated header based on the + configured number of trusted proxies. + + :param trusted: Number of values to trust in the header. + :param value: Header value to parse. + :return: The real value, or ``None`` if there are fewer values + than the number of trusted proxies. + + .. versionadded:: 0.15 + """ + if not (trusted and value): + return + values = [x.strip() for x in value.split(",")] + if len(values) >= trusted: + return values[-trusted] + + def __call__(self, environ, start_response): + """Modify the WSGI environ based on the various ``Forwarded`` + headers before calling the wrapped application. Store the + original environ values in ``werkzeug.proxy_fix.orig_{key}``. + """ + environ_get = environ.get + orig_remote_addr = environ_get("REMOTE_ADDR") + orig_wsgi_url_scheme = environ_get("wsgi.url_scheme") + orig_http_host = environ_get("HTTP_HOST") + environ.update( + { + "werkzeug.proxy_fix.orig": { + "REMOTE_ADDR": orig_remote_addr, + "wsgi.url_scheme": orig_wsgi_url_scheme, + "HTTP_HOST": orig_http_host, + "SERVER_NAME": environ_get("SERVER_NAME"), + "SERVER_PORT": environ_get("SERVER_PORT"), + "SCRIPT_NAME": environ_get("SCRIPT_NAME"), + }, + # todo: remove deprecated keys + "werkzeug.proxy_fix.orig_remote_addr": orig_remote_addr, + "werkzeug.proxy_fix.orig_wsgi_url_scheme": orig_wsgi_url_scheme, + "werkzeug.proxy_fix.orig_http_host": orig_http_host, + } + ) + + x_for = self._get_trusted_comma(self.x_for, environ_get("HTTP_X_FORWARDED_FOR")) + if x_for: + environ["REMOTE_ADDR"] = x_for + + x_proto = self._get_trusted_comma( + self.x_proto, environ_get("HTTP_X_FORWARDED_PROTO") + ) + if x_proto: + environ["wsgi.url_scheme"] = x_proto + + x_host = self._get_trusted_comma( + self.x_host, environ_get("HTTP_X_FORWARDED_HOST") + ) + if x_host: + environ["HTTP_HOST"] = x_host + parts = x_host.split(":", 1) + environ["SERVER_NAME"] = parts[0] + if len(parts) == 2: + environ["SERVER_PORT"] = parts[1] + + x_port = self._get_trusted_comma( + self.x_port, environ_get("HTTP_X_FORWARDED_PORT") + ) + if x_port: + host = environ.get("HTTP_HOST") + if host: + parts = host.split(":", 1) + host = parts[0] if len(parts) == 2 else host + environ["HTTP_HOST"] = "%s:%s" % (host, x_port) + environ["SERVER_PORT"] = x_port + + x_prefix = self._get_trusted_comma( + self.x_prefix, environ_get("HTTP_X_FORWARDED_PREFIX") + ) + if x_prefix: + environ["SCRIPT_NAME"] = x_prefix + + return self.app(environ, start_response) diff --git a/brightonpy/Lib/site-packages/werkzeug/middleware/shared_data.py b/brightonpy/Lib/site-packages/werkzeug/middleware/shared_data.py new file mode 100644 index 0000000..088504a --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/middleware/shared_data.py @@ -0,0 +1,253 @@ +""" +Serve Shared Static Files +========================= + +.. autoclass:: SharedDataMiddleware + :members: is_allowed + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +import mimetypes +import os +import posixpath +from datetime import datetime +from io import BytesIO +from time import mktime +from time import time +from zlib import adler32 + +from .._compat import PY2 +from .._compat import string_types +from ..filesystem import get_filesystem_encoding +from ..http import http_date +from ..http import is_resource_modified +from ..security import safe_join +from ..wsgi import get_path_info +from ..wsgi import wrap_file + + +class SharedDataMiddleware(object): + + """A WSGI middleware that provides static content for development + environments or simple server setups. Usage is quite simple:: + + import os + from werkzeug.wsgi import SharedDataMiddleware + + app = SharedDataMiddleware(app, { + '/static': os.path.join(os.path.dirname(__file__), 'static') + }) + + The contents of the folder ``./shared`` will now be available on + ``http://example.com/shared/``. This is pretty useful during development + because a standalone media server is not required. One can also mount + files on the root folder and still continue to use the application because + the shared data middleware forwards all unhandled requests to the + application, even if the requests are below one of the shared folders. + + If `pkg_resources` is available you can also tell the middleware to serve + files from package data:: + + app = SharedDataMiddleware(app, { + '/static': ('myapplication', 'static') + }) + + This will then serve the ``static`` folder in the `myapplication` + Python package. + + The optional `disallow` parameter can be a list of :func:`~fnmatch.fnmatch` + rules for files that are not accessible from the web. If `cache` is set to + `False` no caching headers are sent. + + Currently the middleware does not support non ASCII filenames. If the + encoding on the file system happens to be the encoding of the URI it may + work but this could also be by accident. We strongly suggest using ASCII + only file names for static files. + + The middleware will guess the mimetype using the Python `mimetype` + module. If it's unable to figure out the charset it will fall back + to `fallback_mimetype`. + + .. versionchanged:: 0.5 + The cache timeout is configurable now. + + .. versionadded:: 0.6 + The `fallback_mimetype` parameter was added. + + :param app: the application to wrap. If you don't want to wrap an + application you can pass it :exc:`NotFound`. + :param exports: a list or dict of exported files and folders. + :param disallow: a list of :func:`~fnmatch.fnmatch` rules. + :param fallback_mimetype: the fallback mimetype for unknown files. + :param cache: enable or disable caching headers. + :param cache_timeout: the cache timeout in seconds for the headers. + """ + + def __init__( + self, + app, + exports, + disallow=None, + cache=True, + cache_timeout=60 * 60 * 12, + fallback_mimetype="text/plain", + ): + self.app = app + self.exports = [] + self.cache = cache + self.cache_timeout = cache_timeout + + if hasattr(exports, "items"): + exports = exports.items() + + for key, value in exports: + if isinstance(value, tuple): + loader = self.get_package_loader(*value) + elif isinstance(value, string_types): + if os.path.isfile(value): + loader = self.get_file_loader(value) + else: + loader = self.get_directory_loader(value) + else: + raise TypeError("unknown def %r" % value) + + self.exports.append((key, loader)) + + if disallow is not None: + from fnmatch import fnmatch + + self.is_allowed = lambda x: not fnmatch(x, disallow) + + self.fallback_mimetype = fallback_mimetype + + def is_allowed(self, filename): + """Subclasses can override this method to disallow the access to + certain files. However by providing `disallow` in the constructor + this method is overwritten. + """ + return True + + def _opener(self, filename): + return lambda: ( + open(filename, "rb"), + datetime.utcfromtimestamp(os.path.getmtime(filename)), + int(os.path.getsize(filename)), + ) + + def get_file_loader(self, filename): + return lambda x: (os.path.basename(filename), self._opener(filename)) + + def get_package_loader(self, package, package_path): + from pkg_resources import DefaultProvider, ResourceManager, get_provider + + loadtime = datetime.utcnow() + provider = get_provider(package) + manager = ResourceManager() + filesystem_bound = isinstance(provider, DefaultProvider) + + def loader(path): + if path is None: + return None, None + + path = safe_join(package_path, path) + + if not provider.has_resource(path): + return None, None + + basename = posixpath.basename(path) + + if filesystem_bound: + return ( + basename, + self._opener(provider.get_resource_filename(manager, path)), + ) + + s = provider.get_resource_string(manager, path) + return basename, lambda: (BytesIO(s), loadtime, len(s)) + + return loader + + def get_directory_loader(self, directory): + def loader(path): + if path is not None: + path = safe_join(directory, path) + else: + path = directory + + if os.path.isfile(path): + return os.path.basename(path), self._opener(path) + + return None, None + + return loader + + def generate_etag(self, mtime, file_size, real_filename): + if not isinstance(real_filename, bytes): + real_filename = real_filename.encode(get_filesystem_encoding()) + + return "wzsdm-%d-%s-%s" % ( + mktime(mtime.timetuple()), + file_size, + adler32(real_filename) & 0xFFFFFFFF, + ) + + def __call__(self, environ, start_response): + path = get_path_info(environ) + + if PY2: + path = path.encode(get_filesystem_encoding()) + + file_loader = None + + for search_path, loader in self.exports: + if search_path == path: + real_filename, file_loader = loader(None) + + if file_loader is not None: + break + + if not search_path.endswith("/"): + search_path += "/" + + if path.startswith(search_path): + real_filename, file_loader = loader(path[len(search_path) :]) + + if file_loader is not None: + break + + if file_loader is None or not self.is_allowed(real_filename): + return self.app(environ, start_response) + + guessed_type = mimetypes.guess_type(real_filename) + mime_type = guessed_type[0] or self.fallback_mimetype + f, mtime, file_size = file_loader() + + headers = [("Date", http_date())] + + if self.cache: + timeout = self.cache_timeout + etag = self.generate_etag(mtime, file_size, real_filename) + headers += [ + ("Etag", '"%s"' % etag), + ("Cache-Control", "max-age=%d, public" % timeout), + ] + + if not is_resource_modified(environ, etag, last_modified=mtime): + f.close() + start_response("304 Not Modified", headers) + return [] + + headers.append(("Expires", http_date(time() + timeout))) + else: + headers.append(("Cache-Control", "public")) + + headers.extend( + ( + ("Content-Type", mime_type), + ("Content-Length", str(file_size)), + ("Last-Modified", http_date(mtime)), + ) + ) + start_response("200 OK", headers) + return wrap_file(environ, f) diff --git a/brightonpy/Lib/site-packages/werkzeug/posixemulation.py b/brightonpy/Lib/site-packages/werkzeug/posixemulation.py new file mode 100644 index 0000000..696b456 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/posixemulation.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +r""" + werkzeug.posixemulation + ~~~~~~~~~~~~~~~~~~~~~~~ + + Provides a POSIX emulation for some features that are relevant to + web applications. The main purpose is to simplify support for + systems such as Windows NT that are not 100% POSIX compatible. + + Currently this only implements a :func:`rename` function that + follows POSIX semantics. Eg: if the target file already exists it + will be replaced without asking. + + This module was introduced in 0.6.1 and is not a public interface. + It might become one in later versions of Werkzeug. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import errno +import os +import random +import sys +import time + +from ._compat import to_unicode +from .filesystem import get_filesystem_encoding + +can_rename_open_file = False + +if os.name == "nt": + try: + import ctypes + + _MOVEFILE_REPLACE_EXISTING = 0x1 + _MOVEFILE_WRITE_THROUGH = 0x8 + _MoveFileEx = ctypes.windll.kernel32.MoveFileExW + + def _rename(src, dst): + src = to_unicode(src, get_filesystem_encoding()) + dst = to_unicode(dst, get_filesystem_encoding()) + if _rename_atomic(src, dst): + return True + retry = 0 + rv = False + while not rv and retry < 100: + rv = _MoveFileEx( + src, dst, _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH + ) + if not rv: + time.sleep(0.001) + retry += 1 + return rv + + # new in Vista and Windows Server 2008 + _CreateTransaction = ctypes.windll.ktmw32.CreateTransaction + _CommitTransaction = ctypes.windll.ktmw32.CommitTransaction + _MoveFileTransacted = ctypes.windll.kernel32.MoveFileTransactedW + _CloseHandle = ctypes.windll.kernel32.CloseHandle + can_rename_open_file = True + + def _rename_atomic(src, dst): + ta = _CreateTransaction(None, 0, 0, 0, 0, 1000, "Werkzeug rename") + if ta == -1: + return False + try: + retry = 0 + rv = False + while not rv and retry < 100: + rv = _MoveFileTransacted( + src, + dst, + None, + None, + _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH, + ta, + ) + if rv: + rv = _CommitTransaction(ta) + break + else: + time.sleep(0.001) + retry += 1 + return rv + finally: + _CloseHandle(ta) + + except Exception: + + def _rename(src, dst): + return False + + def _rename_atomic(src, dst): + return False + + def rename(src, dst): + # Try atomic or pseudo-atomic rename + if _rename(src, dst): + return + # Fall back to "move away and replace" + try: + os.rename(src, dst) + except OSError as e: + if e.errno != errno.EEXIST: + raise + old = "%s-%08x" % (dst, random.randint(0, sys.maxsize)) + os.rename(dst, old) + os.rename(src, dst) + try: + os.unlink(old) + except Exception: + pass + + +else: + rename = os.rename + can_rename_open_file = True diff --git a/brightonpy/Lib/site-packages/werkzeug/routing.py b/brightonpy/Lib/site-packages/werkzeug/routing.py new file mode 100644 index 0000000..8ff7df1 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/routing.py @@ -0,0 +1,2039 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.routing + ~~~~~~~~~~~~~~~~ + + When it comes to combining multiple controller or view functions (however + you want to call them) you need a dispatcher. A simple way would be + applying regular expression tests on the ``PATH_INFO`` and calling + registered callback functions that return the value then. + + This module implements a much more powerful system than simple regular + expression matching because it can also convert values in the URLs and + build URLs. + + Here a simple example that creates an URL map for an application with + two subdomains (www and kb) and some URL rules: + + >>> m = Map([ + ... # Static URLs + ... Rule('/', endpoint='static/index'), + ... Rule('/about', endpoint='static/about'), + ... Rule('/help', endpoint='static/help'), + ... # Knowledge Base + ... Subdomain('kb', [ + ... Rule('/', endpoint='kb/index'), + ... Rule('/browse/', endpoint='kb/browse'), + ... Rule('/browse//', endpoint='kb/browse'), + ... Rule('/browse//', endpoint='kb/browse') + ... ]) + ... ], default_subdomain='www') + + If the application doesn't use subdomains it's perfectly fine to not set + the default subdomain and not use the `Subdomain` rule factory. The endpoint + in the rules can be anything, for example import paths or unique + identifiers. The WSGI application can use those endpoints to get the + handler for that URL. It doesn't have to be a string at all but it's + recommended. + + Now it's possible to create a URL adapter for one of the subdomains and + build URLs: + + >>> c = m.bind('example.com') + >>> c.build("kb/browse", dict(id=42)) + 'http://kb.example.com/browse/42/' + >>> c.build("kb/browse", dict()) + 'http://kb.example.com/browse/' + >>> c.build("kb/browse", dict(id=42, page=3)) + 'http://kb.example.com/browse/42/3' + >>> c.build("static/about") + '/about' + >>> c.build("static/index", force_external=True) + 'http://www.example.com/' + + >>> c = m.bind('example.com', subdomain='kb') + >>> c.build("static/about") + 'http://www.example.com/about' + + The first argument to bind is the server name *without* the subdomain. + Per default it will assume that the script is mounted on the root, but + often that's not the case so you can provide the real mount point as + second argument: + + >>> c = m.bind('example.com', '/applications/example') + + The third argument can be the subdomain, if not given the default + subdomain is used. For more details about binding have a look at the + documentation of the `MapAdapter`. + + And here is how you can match URLs: + + >>> c = m.bind('example.com') + >>> c.match("/") + ('static/index', {}) + >>> c.match("/about") + ('static/about', {}) + >>> c = m.bind('example.com', '/', 'kb') + >>> c.match("/") + ('kb/index', {}) + >>> c.match("/browse/42/23") + ('kb/browse', {'id': 42, 'page': 23}) + + If matching fails you get a `NotFound` exception, if the rule thinks + it's a good idea to redirect (for example because the URL was defined + to have a slash at the end but the request was missing that slash) it + will raise a `RequestRedirect` exception. Both are subclasses of the + `HTTPException` so you can use those errors as responses in the + application. + + If matching succeeded but the URL rule was incompatible to the given + method (for example there were only rules for `GET` and `HEAD` and + routing system tried to match a `POST` request) a `MethodNotAllowed` + exception is raised. + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import ast +import difflib +import posixpath +import re +import uuid +from pprint import pformat +from threading import Lock + +from ._compat import implements_to_string +from ._compat import iteritems +from ._compat import itervalues +from ._compat import native_string_result +from ._compat import string_types +from ._compat import text_type +from ._compat import to_bytes +from ._compat import to_unicode +from ._compat import wsgi_decoding_dance +from ._internal import _encode_idna +from ._internal import _get_environ +from .datastructures import ImmutableDict +from .datastructures import MultiDict +from .exceptions import BadHost +from .exceptions import HTTPException +from .exceptions import MethodNotAllowed +from .exceptions import NotFound +from .urls import _fast_url_quote +from .urls import url_encode +from .urls import url_join +from .urls import url_quote +from .utils import cached_property +from .utils import format_string +from .utils import redirect +from .wsgi import get_host + +_rule_re = re.compile( + r""" + (?P[^<]*) # static rule data + < + (?: + (?P[a-zA-Z_][a-zA-Z0-9_]*) # converter name + (?:\((?P.*?)\))? # converter arguments + \: # variable delimiter + )? + (?P[a-zA-Z_][a-zA-Z0-9_]*) # variable name + > + """, + re.VERBOSE, +) +_simple_rule_re = re.compile(r"<([^>]+)>") +_converter_args_re = re.compile( + r""" + ((?P\w+)\s*=\s*)? + (?P + True|False| + \d+.\d+| + \d+.| + \d+| + [\w\d_.]+| + [urUR]?(?P"[^"]*?"|'[^']*') + )\s*, + """, + re.VERBOSE | re.UNICODE, +) + + +_PYTHON_CONSTANTS = {"None": None, "True": True, "False": False} + + +def _pythonize(value): + if value in _PYTHON_CONSTANTS: + return _PYTHON_CONSTANTS[value] + for convert in int, float: + try: + return convert(value) + except ValueError: + pass + if value[:1] == value[-1:] and value[0] in "\"'": + value = value[1:-1] + return text_type(value) + + +def parse_converter_args(argstr): + argstr += "," + args = [] + kwargs = {} + + for item in _converter_args_re.finditer(argstr): + value = item.group("stringval") + if value is None: + value = item.group("value") + value = _pythonize(value) + if not item.group("name"): + args.append(value) + else: + name = item.group("name") + kwargs[name] = value + + return tuple(args), kwargs + + +def parse_rule(rule): + """Parse a rule and return it as generator. Each iteration yields tuples + in the form ``(converter, arguments, variable)``. If the converter is + `None` it's a static url part, otherwise it's a dynamic one. + + :internal: + """ + pos = 0 + end = len(rule) + do_match = _rule_re.match + used_names = set() + while pos < end: + m = do_match(rule, pos) + if m is None: + break + data = m.groupdict() + if data["static"]: + yield None, None, data["static"] + variable = data["variable"] + converter = data["converter"] or "default" + if variable in used_names: + raise ValueError("variable name %r used twice." % variable) + used_names.add(variable) + yield converter, data["args"] or None, variable + pos = m.end() + if pos < end: + remaining = rule[pos:] + if ">" in remaining or "<" in remaining: + raise ValueError("malformed url rule: %r" % rule) + yield None, None, remaining + + +class RoutingException(Exception): + """Special exceptions that require the application to redirect, notifying + about missing urls, etc. + + :internal: + """ + + +class RequestRedirect(HTTPException, RoutingException): + """Raise if the map requests a redirect. This is for example the case if + `strict_slashes` are activated and an url that requires a trailing slash. + + The attribute `new_url` contains the absolute destination url. + """ + + code = 308 + + def __init__(self, new_url): + RoutingException.__init__(self, new_url) + self.new_url = new_url + + def get_response(self, environ): + return redirect(self.new_url, self.code) + + +class RequestSlash(RoutingException): + """Internal exception.""" + + +class RequestAliasRedirect(RoutingException): # noqa: B903 + """This rule is an alias and wants to redirect to the canonical URL.""" + + def __init__(self, matched_values): + self.matched_values = matched_values + + +@implements_to_string +class BuildError(RoutingException, LookupError): + """Raised if the build system cannot find a URL for an endpoint with the + values provided. + """ + + def __init__(self, endpoint, values, method, adapter=None): + LookupError.__init__(self, endpoint, values, method) + self.endpoint = endpoint + self.values = values + self.method = method + self.adapter = adapter + + @cached_property + def suggested(self): + return self.closest_rule(self.adapter) + + def closest_rule(self, adapter): + def _score_rule(rule): + return sum( + [ + 0.98 + * difflib.SequenceMatcher( + None, rule.endpoint, self.endpoint + ).ratio(), + 0.01 * bool(set(self.values or ()).issubset(rule.arguments)), + 0.01 * bool(rule.methods and self.method in rule.methods), + ] + ) + + if adapter and adapter.map._rules: + return max(adapter.map._rules, key=_score_rule) + + def __str__(self): + message = [] + message.append("Could not build url for endpoint %r" % self.endpoint) + if self.method: + message.append(" (%r)" % self.method) + if self.values: + message.append(" with values %r" % sorted(self.values.keys())) + message.append(".") + if self.suggested: + if self.endpoint == self.suggested.endpoint: + if self.method and self.method not in self.suggested.methods: + message.append( + " Did you mean to use methods %r?" + % sorted(self.suggested.methods) + ) + missing_values = self.suggested.arguments.union( + set(self.suggested.defaults or ()) + ) - set(self.values.keys()) + if missing_values: + message.append( + " Did you forget to specify values %r?" % sorted(missing_values) + ) + else: + message.append(" Did you mean %r instead?" % self.suggested.endpoint) + return u"".join(message) + + +class ValidationError(ValueError): + """Validation error. If a rule converter raises this exception the rule + does not match the current URL and the next URL is tried. + """ + + +class RuleFactory(object): + """As soon as you have more complex URL setups it's a good idea to use rule + factories to avoid repetitive tasks. Some of them are builtin, others can + be added by subclassing `RuleFactory` and overriding `get_rules`. + """ + + def get_rules(self, map): + """Subclasses of `RuleFactory` have to override this method and return + an iterable of rules.""" + raise NotImplementedError() + + +class Subdomain(RuleFactory): + """All URLs provided by this factory have the subdomain set to a + specific domain. For example if you want to use the subdomain for + the current language this can be a good setup:: + + url_map = Map([ + Rule('/', endpoint='#select_language'), + Subdomain('', [ + Rule('/', endpoint='index'), + Rule('/about', endpoint='about'), + Rule('/help', endpoint='help') + ]) + ]) + + All the rules except for the ``'#select_language'`` endpoint will now + listen on a two letter long subdomain that holds the language code + for the current request. + """ + + def __init__(self, subdomain, rules): + self.subdomain = subdomain + self.rules = rules + + def get_rules(self, map): + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + rule = rule.empty() + rule.subdomain = self.subdomain + yield rule + + +class Submount(RuleFactory): + """Like `Subdomain` but prefixes the URL rule with a given string:: + + url_map = Map([ + Rule('/', endpoint='index'), + Submount('/blog', [ + Rule('/', endpoint='blog/index'), + Rule('/entry/', endpoint='blog/show') + ]) + ]) + + Now the rule ``'blog/show'`` matches ``/blog/entry/``. + """ + + def __init__(self, path, rules): + self.path = path.rstrip("/") + self.rules = rules + + def get_rules(self, map): + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + rule = rule.empty() + rule.rule = self.path + rule.rule + yield rule + + +class EndpointPrefix(RuleFactory): + """Prefixes all endpoints (which must be strings for this factory) with + another string. This can be useful for sub applications:: + + url_map = Map([ + Rule('/', endpoint='index'), + EndpointPrefix('blog/', [Submount('/blog', [ + Rule('/', endpoint='index'), + Rule('/entry/', endpoint='show') + ])]) + ]) + """ + + def __init__(self, prefix, rules): + self.prefix = prefix + self.rules = rules + + def get_rules(self, map): + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + rule = rule.empty() + rule.endpoint = self.prefix + rule.endpoint + yield rule + + +class RuleTemplate(object): + """Returns copies of the rules wrapped and expands string templates in + the endpoint, rule, defaults or subdomain sections. + + Here a small example for such a rule template:: + + from werkzeug.routing import Map, Rule, RuleTemplate + + resource = RuleTemplate([ + Rule('/$name/', endpoint='$name.list'), + Rule('/$name/', endpoint='$name.show') + ]) + + url_map = Map([resource(name='user'), resource(name='page')]) + + When a rule template is called the keyword arguments are used to + replace the placeholders in all the string parameters. + """ + + def __init__(self, rules): + self.rules = list(rules) + + def __call__(self, *args, **kwargs): + return RuleTemplateFactory(self.rules, dict(*args, **kwargs)) + + +class RuleTemplateFactory(RuleFactory): + """A factory that fills in template variables into rules. Used by + `RuleTemplate` internally. + + :internal: + """ + + def __init__(self, rules, context): + self.rules = rules + self.context = context + + def get_rules(self, map): + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + new_defaults = subdomain = None + if rule.defaults: + new_defaults = {} + for key, value in iteritems(rule.defaults): + if isinstance(value, string_types): + value = format_string(value, self.context) + new_defaults[key] = value + if rule.subdomain is not None: + subdomain = format_string(rule.subdomain, self.context) + new_endpoint = rule.endpoint + if isinstance(new_endpoint, string_types): + new_endpoint = format_string(new_endpoint, self.context) + yield Rule( + format_string(rule.rule, self.context), + new_defaults, + subdomain, + rule.methods, + rule.build_only, + new_endpoint, + rule.strict_slashes, + ) + + +def _prefix_names(src): + """ast parse and prefix names with `.` to avoid collision with user vars""" + tree = ast.parse(src).body[0] + if isinstance(tree, ast.Expr): + tree = tree.value + for node in ast.walk(tree): + if isinstance(node, ast.Name): + node.id = "." + node.id + return tree + + +_CALL_CONVERTER_CODE_FMT = "self._converters[{elem!r}].to_url()" +_IF_KWARGS_URL_ENCODE_CODE = """\ +if kwargs: + q = '?' + params = self._encode_query_vars(kwargs) +else: + q = params = '' +""" +_IF_KWARGS_URL_ENCODE_AST = _prefix_names(_IF_KWARGS_URL_ENCODE_CODE) +_URL_ENCODE_AST_NAMES = (_prefix_names("q"), _prefix_names("params")) + + +@implements_to_string +class Rule(RuleFactory): + """A Rule represents one URL pattern. There are some options for `Rule` + that change the way it behaves and are passed to the `Rule` constructor. + Note that besides the rule-string all arguments *must* be keyword arguments + in order to not break the application on Werkzeug upgrades. + + `string` + Rule strings basically are just normal URL paths with placeholders in + the format ```` where the converter and the + arguments are optional. If no converter is defined the `default` + converter is used which means `string` in the normal configuration. + + URL rules that end with a slash are branch URLs, others are leaves. + If you have `strict_slashes` enabled (which is the default), all + branch URLs that are matched without a trailing slash will trigger a + redirect to the same URL with the missing slash appended. + + The converters are defined on the `Map`. + + `endpoint` + The endpoint for this rule. This can be anything. A reference to a + function, a string, a number etc. The preferred way is using a string + because the endpoint is used for URL generation. + + `defaults` + An optional dict with defaults for other rules with the same endpoint. + This is a bit tricky but useful if you want to have unique URLs:: + + url_map = Map([ + Rule('/all/', defaults={'page': 1}, endpoint='all_entries'), + Rule('/all/page/', endpoint='all_entries') + ]) + + If a user now visits ``http://example.com/all/page/1`` he will be + redirected to ``http://example.com/all/``. If `redirect_defaults` is + disabled on the `Map` instance this will only affect the URL + generation. + + `subdomain` + The subdomain rule string for this rule. If not specified the rule + only matches for the `default_subdomain` of the map. If the map is + not bound to a subdomain this feature is disabled. + + Can be useful if you want to have user profiles on different subdomains + and all subdomains are forwarded to your application:: + + url_map = Map([ + Rule('/', subdomain='', endpoint='user/homepage'), + Rule('/stats', subdomain='', endpoint='user/stats') + ]) + + `methods` + A sequence of http methods this rule applies to. If not specified, all + methods are allowed. For example this can be useful if you want different + endpoints for `POST` and `GET`. If methods are defined and the path + matches but the method matched against is not in this list or in the + list of another rule for that path the error raised is of the type + `MethodNotAllowed` rather than `NotFound`. If `GET` is present in the + list of methods and `HEAD` is not, `HEAD` is added automatically. + + .. versionchanged:: 0.6.1 + `HEAD` is now automatically added to the methods if `GET` is + present. The reason for this is that existing code often did not + work properly in servers not rewriting `HEAD` to `GET` + automatically and it was not documented how `HEAD` should be + treated. This was considered a bug in Werkzeug because of that. + + `strict_slashes` + Override the `Map` setting for `strict_slashes` only for this rule. If + not specified the `Map` setting is used. + + `build_only` + Set this to True and the rule will never match but will create a URL + that can be build. This is useful if you have resources on a subdomain + or folder that are not handled by the WSGI application (like static data) + + `redirect_to` + If given this must be either a string or callable. In case of a + callable it's called with the url adapter that triggered the match and + the values of the URL as keyword arguments and has to return the target + for the redirect, otherwise it has to be a string with placeholders in + rule syntax:: + + def foo_with_slug(adapter, id): + # ask the database for the slug for the old id. this of + # course has nothing to do with werkzeug. + return 'foo/' + Foo.get_slug_for_id(id) + + url_map = Map([ + Rule('/foo/', endpoint='foo'), + Rule('/some/old/url/', redirect_to='foo/'), + Rule('/other/old/url/', redirect_to=foo_with_slug) + ]) + + When the rule is matched the routing system will raise a + `RequestRedirect` exception with the target for the redirect. + + Keep in mind that the URL will be joined against the URL root of the + script so don't use a leading slash on the target URL unless you + really mean root of that domain. + + `alias` + If enabled this rule serves as an alias for another rule with the same + endpoint and arguments. + + `host` + If provided and the URL map has host matching enabled this can be + used to provide a match rule for the whole host. This also means + that the subdomain feature is disabled. + + .. versionadded:: 0.7 + The `alias` and `host` parameters were added. + """ + + def __init__( + self, + string, + defaults=None, + subdomain=None, + methods=None, + build_only=False, + endpoint=None, + strict_slashes=None, + redirect_to=None, + alias=False, + host=None, + ): + if not string.startswith("/"): + raise ValueError("urls must start with a leading slash") + self.rule = string + self.is_leaf = not string.endswith("/") + + self.map = None + self.strict_slashes = strict_slashes + self.subdomain = subdomain + self.host = host + self.defaults = defaults + self.build_only = build_only + self.alias = alias + if methods is None: + self.methods = None + else: + if isinstance(methods, str): + raise TypeError("param `methods` should be `Iterable[str]`, not `str`") + self.methods = set([x.upper() for x in methods]) + if "HEAD" not in self.methods and "GET" in self.methods: + self.methods.add("HEAD") + self.endpoint = endpoint + self.redirect_to = redirect_to + + if defaults: + self.arguments = set(map(str, defaults)) + else: + self.arguments = set() + self._trace = self._converters = self._regex = self._argument_weights = None + + def empty(self): + """ + Return an unbound copy of this rule. + + This can be useful if want to reuse an already bound URL for another + map. See ``get_empty_kwargs`` to override what keyword arguments are + provided to the new copy. + """ + return type(self)(self.rule, **self.get_empty_kwargs()) + + def get_empty_kwargs(self): + """ + Provides kwargs for instantiating empty copy with empty() + + Use this method to provide custom keyword arguments to the subclass of + ``Rule`` when calling ``some_rule.empty()``. Helpful when the subclass + has custom keyword arguments that are needed at instantiation. + + Must return a ``dict`` that will be provided as kwargs to the new + instance of ``Rule``, following the initial ``self.rule`` value which + is always provided as the first, required positional argument. + """ + defaults = None + if self.defaults: + defaults = dict(self.defaults) + return dict( + defaults=defaults, + subdomain=self.subdomain, + methods=self.methods, + build_only=self.build_only, + endpoint=self.endpoint, + strict_slashes=self.strict_slashes, + redirect_to=self.redirect_to, + alias=self.alias, + host=self.host, + ) + + def get_rules(self, map): + yield self + + def refresh(self): + """Rebinds and refreshes the URL. Call this if you modified the + rule in place. + + :internal: + """ + self.bind(self.map, rebind=True) + + def bind(self, map, rebind=False): + """Bind the url to a map and create a regular expression based on + the information from the rule itself and the defaults from the map. + + :internal: + """ + if self.map is not None and not rebind: + raise RuntimeError("url rule %r already bound to map %r" % (self, self.map)) + self.map = map + if self.strict_slashes is None: + self.strict_slashes = map.strict_slashes + if self.subdomain is None: + self.subdomain = map.default_subdomain + self.compile() + + def get_converter(self, variable_name, converter_name, args, kwargs): + """Looks up the converter for the given parameter. + + .. versionadded:: 0.9 + """ + if converter_name not in self.map.converters: + raise LookupError("the converter %r does not exist" % converter_name) + return self.map.converters[converter_name](self.map, *args, **kwargs) + + def _encode_query_vars(self, query_vars): + return url_encode( + query_vars, + charset=self.map.charset, + sort=self.map.sort_parameters, + key=self.map.sort_key, + ) + + def compile(self): + """Compiles the regular expression and stores it.""" + assert self.map is not None, "rule not bound" + + if self.map.host_matching: + domain_rule = self.host or "" + else: + domain_rule = self.subdomain or "" + + self._trace = [] + self._converters = {} + self._static_weights = [] + self._argument_weights = [] + regex_parts = [] + + def _build_regex(rule): + index = 0 + for converter, arguments, variable in parse_rule(rule): + if converter is None: + regex_parts.append(re.escape(variable)) + self._trace.append((False, variable)) + for part in variable.split("/"): + if part: + self._static_weights.append((index, -len(part))) + else: + if arguments: + c_args, c_kwargs = parse_converter_args(arguments) + else: + c_args = () + c_kwargs = {} + convobj = self.get_converter(variable, converter, c_args, c_kwargs) + regex_parts.append("(?P<%s>%s)" % (variable, convobj.regex)) + self._converters[variable] = convobj + self._trace.append((True, variable)) + self._argument_weights.append(convobj.weight) + self.arguments.add(str(variable)) + index = index + 1 + + _build_regex(domain_rule) + regex_parts.append("\\|") + self._trace.append((False, "|")) + _build_regex(self.rule if self.is_leaf else self.rule.rstrip("/")) + if not self.is_leaf: + self._trace.append((False, "/")) + + self._build = self._compile_builder(False).__get__(self, None) + self._build_unknown = self._compile_builder(True).__get__(self, None) + + if self.build_only: + return + regex = r"^%s%s$" % ( + u"".join(regex_parts), + (not self.is_leaf or not self.strict_slashes) + and "(?/?)" + or "", + ) + self._regex = re.compile(regex, re.UNICODE) + + def match(self, path, method=None): + """Check if the rule matches a given path. Path is a string in the + form ``"subdomain|/path"`` and is assembled by the map. If + the map is doing host matching the subdomain part will be the host + instead. + + If the rule matches a dict with the converted values is returned, + otherwise the return value is `None`. + + :internal: + """ + if not self.build_only: + m = self._regex.search(path) + if m is not None: + groups = m.groupdict() + # we have a folder like part of the url without a trailing + # slash and strict slashes enabled. raise an exception that + # tells the map to redirect to the same url but with a + # trailing slash + if ( + self.strict_slashes + and not self.is_leaf + and not groups.pop("__suffix__") + and ( + method is None or self.methods is None or method in self.methods + ) + ): + raise RequestSlash() + # if we are not in strict slashes mode we have to remove + # a __suffix__ + elif not self.strict_slashes: + del groups["__suffix__"] + + result = {} + for name, value in iteritems(groups): + try: + value = self._converters[name].to_python(value) + except ValidationError: + return + result[str(name)] = value + if self.defaults: + result.update(self.defaults) + + if self.alias and self.map.redirect_defaults: + raise RequestAliasRedirect(result) + + return result + + @staticmethod + def _get_func_code(code, name): + globs, locs = {}, {} + exec(code, globs, locs) + return locs[name] + + def _compile_builder(self, append_unknown=True): + defaults = self.defaults or {} + dom_ops = [] + url_ops = [] + + opl = dom_ops + for is_dynamic, data in self._trace: + if data == "|" and opl is dom_ops: + opl = url_ops + continue + # this seems like a silly case to ever come up but: + # if a default is given for a value that appears in the rule, + # resolve it to a constant ahead of time + if is_dynamic and data in defaults: + data = self._converters[data].to_url(defaults[data]) + opl.append((False, data)) + elif not is_dynamic: + opl.append( + (False, url_quote(to_bytes(data, self.map.charset), safe="/:|+")) + ) + else: + opl.append((True, data)) + + def _convert(elem): + ret = _prefix_names(_CALL_CONVERTER_CODE_FMT.format(elem=elem)) + ret.args = [ast.Name(str(elem), ast.Load())] # str for py2 + return ret + + def _parts(ops): + parts = [ + _convert(elem) if is_dynamic else ast.Str(s=elem) + for is_dynamic, elem in ops + ] + parts = parts or [ast.Str("")] + # constant fold + ret = [parts[0]] + for p in parts[1:]: + if isinstance(p, ast.Str) and isinstance(ret[-1], ast.Str): + ret[-1] = ast.Str(ret[-1].s + p.s) + else: + ret.append(p) + return ret + + dom_parts = _parts(dom_ops) + url_parts = _parts(url_ops) + if not append_unknown: + body = [] + else: + body = [_IF_KWARGS_URL_ENCODE_AST] + url_parts.extend(_URL_ENCODE_AST_NAMES) + + def _join(parts): + if len(parts) == 1: # shortcut + return parts[0] + elif hasattr(ast, "JoinedStr"): # py36+ + return ast.JoinedStr(parts) + else: + call = _prefix_names('"".join()') + call.args = [ast.Tuple(parts, ast.Load())] + return call + + body.append( + ast.Return(ast.Tuple([_join(dom_parts), _join(url_parts)], ast.Load())) + ) + + # str is necessary for python2 + pargs = [ + str(elem) + for is_dynamic, elem in dom_ops + url_ops + if is_dynamic and elem not in defaults + ] + kargs = [str(k) for k in defaults] + + func_ast = _prefix_names("def _(): pass") + func_ast.name = "".format(self.rule) + if hasattr(ast, "arg"): # py3 + func_ast.args.args.append(ast.arg(".self", None)) + for arg in pargs + kargs: + func_ast.args.args.append(ast.arg(arg, None)) + func_ast.args.kwarg = ast.arg(".kwargs", None) + else: + func_ast.args.args.append(ast.Name(".self", ast.Param())) + for arg in pargs + kargs: + func_ast.args.args.append(ast.Name(arg, ast.Param())) + func_ast.args.kwarg = ".kwargs" + for _ in kargs: + func_ast.args.defaults.append(ast.Str("")) + func_ast.body = body + + # use `ast.parse` instead of `ast.Module` for better portability + # python3.8 changes the signature of `ast.Module` + module = ast.parse("") + module.body = [func_ast] + + # mark everything as on line 1, offset 0 + # less error-prone than `ast.fix_missing_locations` + # bad line numbers cause an assert to fail in debug builds + for node in ast.walk(module): + if "lineno" in node._attributes: + node.lineno = 1 + if "col_offset" in node._attributes: + node.col_offset = 0 + + code = compile(module, "", "exec") + return self._get_func_code(code, func_ast.name) + + def build(self, values, append_unknown=True): + """Assembles the relative url for that rule and the subdomain. + If building doesn't work for some reasons `None` is returned. + + :internal: + """ + try: + if append_unknown: + return self._build_unknown(**values) + else: + return self._build(**values) + except ValidationError: + return None + + def provides_defaults_for(self, rule): + """Check if this rule has defaults for a given rule. + + :internal: + """ + return ( + not self.build_only + and self.defaults + and self.endpoint == rule.endpoint + and self != rule + and self.arguments == rule.arguments + ) + + def suitable_for(self, values, method=None): + """Check if the dict of values has enough data for url generation. + + :internal: + """ + # if a method was given explicitly and that method is not supported + # by this rule, this rule is not suitable. + if ( + method is not None + and self.methods is not None + and method not in self.methods + ): + return False + + defaults = self.defaults or () + + # all arguments required must be either in the defaults dict or + # the value dictionary otherwise it's not suitable + for key in self.arguments: + if key not in defaults and key not in values: + return False + + # in case defaults are given we ensure that either the value was + # skipped or the value is the same as the default value. + if defaults: + for key, value in iteritems(defaults): + if key in values and value != values[key]: + return False + + return True + + def match_compare_key(self): + """The match compare key for sorting. + + Current implementation: + + 1. rules without any arguments come first for performance + reasons only as we expect them to match faster and some + common ones usually don't have any arguments (index pages etc.) + 2. rules with more static parts come first so the second argument + is the negative length of the number of the static weights. + 3. we order by static weights, which is a combination of index + and length + 4. The more complex rules come first so the next argument is the + negative length of the number of argument weights. + 5. lastly we order by the actual argument weights. + + :internal: + """ + return ( + bool(self.arguments), + -len(self._static_weights), + self._static_weights, + -len(self._argument_weights), + self._argument_weights, + ) + + def build_compare_key(self): + """The build compare key for sorting. + + :internal: + """ + return 1 if self.alias else 0, -len(self.arguments), -len(self.defaults or ()) + + def __eq__(self, other): + return self.__class__ is other.__class__ and self._trace == other._trace + + __hash__ = None + + def __ne__(self, other): + return not self.__eq__(other) + + def __str__(self): + return self.rule + + @native_string_result + def __repr__(self): + if self.map is None: + return u"<%s (unbound)>" % self.__class__.__name__ + tmp = [] + for is_dynamic, data in self._trace: + if is_dynamic: + tmp.append(u"<%s>" % data) + else: + tmp.append(data) + return u"<%s %s%s -> %s>" % ( + self.__class__.__name__, + repr((u"".join(tmp)).lstrip(u"|")).lstrip(u"u"), + self.methods is not None and u" (%s)" % u", ".join(self.methods) or u"", + self.endpoint, + ) + + +class BaseConverter(object): + """Base class for all converters.""" + + regex = "[^/]+" + weight = 100 + + def __init__(self, map): + self.map = map + + def to_python(self, value): + return value + + def to_url(self, value): + if isinstance(value, (bytes, bytearray)): + return _fast_url_quote(value) + return _fast_url_quote(text_type(value).encode(self.map.charset)) + + +class UnicodeConverter(BaseConverter): + """This converter is the default converter and accepts any string but + only one path segment. Thus the string can not include a slash. + + This is the default validator. + + Example:: + + Rule('/pages/'), + Rule('/') + + :param map: the :class:`Map`. + :param minlength: the minimum length of the string. Must be greater + or equal 1. + :param maxlength: the maximum length of the string. + :param length: the exact length of the string. + """ + + def __init__(self, map, minlength=1, maxlength=None, length=None): + BaseConverter.__init__(self, map) + if length is not None: + length = "{%d}" % int(length) + else: + if maxlength is None: + maxlength = "" + else: + maxlength = int(maxlength) + length = "{%s,%s}" % (int(minlength), maxlength) + self.regex = "[^/]" + length + + +class AnyConverter(BaseConverter): + """Matches one of the items provided. Items can either be Python + identifiers or strings:: + + Rule('/') + + :param map: the :class:`Map`. + :param items: this function accepts the possible items as positional + arguments. + """ + + def __init__(self, map, *items): + BaseConverter.__init__(self, map) + self.regex = "(?:%s)" % "|".join([re.escape(x) for x in items]) + + +class PathConverter(BaseConverter): + """Like the default :class:`UnicodeConverter`, but it also matches + slashes. This is useful for wikis and similar applications:: + + Rule('/') + Rule('//edit') + + :param map: the :class:`Map`. + """ + + regex = "[^/].*?" + weight = 200 + + +class NumberConverter(BaseConverter): + """Baseclass for `IntegerConverter` and `FloatConverter`. + + :internal: + """ + + weight = 50 + + def __init__(self, map, fixed_digits=0, min=None, max=None, signed=False): + if signed: + self.regex = self.signed_regex + BaseConverter.__init__(self, map) + self.fixed_digits = fixed_digits + self.min = min + self.max = max + self.signed = signed + + def to_python(self, value): + if self.fixed_digits and len(value) != self.fixed_digits: + raise ValidationError() + value = self.num_convert(value) + if (self.min is not None and value < self.min) or ( + self.max is not None and value > self.max + ): + raise ValidationError() + return value + + def to_url(self, value): + value = self.num_convert(value) + if self.fixed_digits: + value = ("%%0%sd" % self.fixed_digits) % value + return str(value) + + @property + def signed_regex(self): + return r"-?" + self.regex + + +class IntegerConverter(NumberConverter): + """This converter only accepts integer values:: + + Rule("/page/") + + By default it only accepts unsigned, positive values. The ``signed`` + parameter will enable signed, negative values. :: + + Rule("/page/") + + :param map: The :class:`Map`. + :param fixed_digits: The number of fixed digits in the URL. If you + set this to ``4`` for example, the rule will only match if the + URL looks like ``/0001/``. The default is variable length. + :param min: The minimal value. + :param max: The maximal value. + :param signed: Allow signed (negative) values. + + .. versionadded:: 0.15 + The ``signed`` parameter. + """ + + regex = r"\d+" + num_convert = int + + +class FloatConverter(NumberConverter): + """This converter only accepts floating point values:: + + Rule("/probability/") + + By default it only accepts unsigned, positive values. The ``signed`` + parameter will enable signed, negative values. :: + + Rule("/offset/") + + :param map: The :class:`Map`. + :param min: The minimal value. + :param max: The maximal value. + :param signed: Allow signed (negative) values. + + .. versionadded:: 0.15 + The ``signed`` parameter. + """ + + regex = r"\d+\.\d+" + num_convert = float + + def __init__(self, map, min=None, max=None, signed=False): + NumberConverter.__init__(self, map, min=min, max=max, signed=signed) + + +class UUIDConverter(BaseConverter): + """This converter only accepts UUID strings:: + + Rule('/object/') + + .. versionadded:: 0.10 + + :param map: the :class:`Map`. + """ + + regex = ( + r"[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-" + r"[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" + ) + + def to_python(self, value): + return uuid.UUID(value) + + def to_url(self, value): + return str(value) + + +#: the default converter mapping for the map. +DEFAULT_CONVERTERS = { + "default": UnicodeConverter, + "string": UnicodeConverter, + "any": AnyConverter, + "path": PathConverter, + "int": IntegerConverter, + "float": FloatConverter, + "uuid": UUIDConverter, +} + + +class Map(object): + """The map class stores all the URL rules and some configuration + parameters. Some of the configuration values are only stored on the + `Map` instance since those affect all rules, others are just defaults + and can be overridden for each rule. Note that you have to specify all + arguments besides the `rules` as keyword arguments! + + :param rules: sequence of url rules for this map. + :param default_subdomain: The default subdomain for rules without a + subdomain defined. + :param charset: charset of the url. defaults to ``"utf-8"`` + :param strict_slashes: Take care of trailing slashes. + :param redirect_defaults: This will redirect to the default rule if it + wasn't visited that way. This helps creating + unique URLs. + :param converters: A dict of converters that adds additional converters + to the list of converters. If you redefine one + converter this will override the original one. + :param sort_parameters: If set to `True` the url parameters are sorted. + See `url_encode` for more details. + :param sort_key: The sort key function for `url_encode`. + :param encoding_errors: the error method to use for decoding + :param host_matching: if set to `True` it enables the host matching + feature and disables the subdomain one. If + enabled the `host` parameter to rules is used + instead of the `subdomain` one. + + .. versionadded:: 0.5 + `sort_parameters` and `sort_key` was added. + + .. versionadded:: 0.7 + `encoding_errors` and `host_matching` was added. + """ + + #: A dict of default converters to be used. + default_converters = ImmutableDict(DEFAULT_CONVERTERS) + + def __init__( + self, + rules=None, + default_subdomain="", + charset="utf-8", + strict_slashes=True, + redirect_defaults=True, + converters=None, + sort_parameters=False, + sort_key=None, + encoding_errors="replace", + host_matching=False, + ): + self._rules = [] + self._rules_by_endpoint = {} + self._remap = True + self._remap_lock = Lock() + + self.default_subdomain = default_subdomain + self.charset = charset + self.encoding_errors = encoding_errors + self.strict_slashes = strict_slashes + self.redirect_defaults = redirect_defaults + self.host_matching = host_matching + + self.converters = self.default_converters.copy() + if converters: + self.converters.update(converters) + + self.sort_parameters = sort_parameters + self.sort_key = sort_key + + for rulefactory in rules or (): + self.add(rulefactory) + + def is_endpoint_expecting(self, endpoint, *arguments): + """Iterate over all rules and check if the endpoint expects + the arguments provided. This is for example useful if you have + some URLs that expect a language code and others that do not and + you want to wrap the builder a bit so that the current language + code is automatically added if not provided but endpoints expect + it. + + :param endpoint: the endpoint to check. + :param arguments: this function accepts one or more arguments + as positional arguments. Each one of them is + checked. + """ + self.update() + arguments = set(arguments) + for rule in self._rules_by_endpoint[endpoint]: + if arguments.issubset(rule.arguments): + return True + return False + + def iter_rules(self, endpoint=None): + """Iterate over all rules or the rules of an endpoint. + + :param endpoint: if provided only the rules for that endpoint + are returned. + :return: an iterator + """ + self.update() + if endpoint is not None: + return iter(self._rules_by_endpoint[endpoint]) + return iter(self._rules) + + def add(self, rulefactory): + """Add a new rule or factory to the map and bind it. Requires that the + rule is not bound to another map. + + :param rulefactory: a :class:`Rule` or :class:`RuleFactory` + """ + for rule in rulefactory.get_rules(self): + rule.bind(self) + self._rules.append(rule) + self._rules_by_endpoint.setdefault(rule.endpoint, []).append(rule) + self._remap = True + + def bind( + self, + server_name, + script_name=None, + subdomain=None, + url_scheme="http", + default_method="GET", + path_info=None, + query_args=None, + ): + """Return a new :class:`MapAdapter` with the details specified to the + call. Note that `script_name` will default to ``'/'`` if not further + specified or `None`. The `server_name` at least is a requirement + because the HTTP RFC requires absolute URLs for redirects and so all + redirect exceptions raised by Werkzeug will contain the full canonical + URL. + + If no path_info is passed to :meth:`match` it will use the default path + info passed to bind. While this doesn't really make sense for + manual bind calls, it's useful if you bind a map to a WSGI + environment which already contains the path info. + + `subdomain` will default to the `default_subdomain` for this map if + no defined. If there is no `default_subdomain` you cannot use the + subdomain feature. + + .. versionadded:: 0.7 + `query_args` added + + .. versionadded:: 0.8 + `query_args` can now also be a string. + + .. versionchanged:: 0.15 + ``path_info`` defaults to ``'/'`` if ``None``. + """ + server_name = server_name.lower() + if self.host_matching: + if subdomain is not None: + raise RuntimeError("host matching enabled and a subdomain was provided") + elif subdomain is None: + subdomain = self.default_subdomain + if script_name is None: + script_name = "/" + if path_info is None: + path_info = "/" + try: + server_name = _encode_idna(server_name) + except UnicodeError: + raise BadHost() + return MapAdapter( + self, + server_name, + script_name, + subdomain, + url_scheme, + path_info, + default_method, + query_args, + ) + + def bind_to_environ(self, environ, server_name=None, subdomain=None): + """Like :meth:`bind` but you can pass it an WSGI environment and it + will fetch the information from that dictionary. Note that because of + limitations in the protocol there is no way to get the current + subdomain and real `server_name` from the environment. If you don't + provide it, Werkzeug will use `SERVER_NAME` and `SERVER_PORT` (or + `HTTP_HOST` if provided) as used `server_name` with disabled subdomain + feature. + + If `subdomain` is `None` but an environment and a server name is + provided it will calculate the current subdomain automatically. + Example: `server_name` is ``'example.com'`` and the `SERVER_NAME` + in the wsgi `environ` is ``'staging.dev.example.com'`` the calculated + subdomain will be ``'staging.dev'``. + + If the object passed as environ has an environ attribute, the value of + this attribute is used instead. This allows you to pass request + objects. Additionally `PATH_INFO` added as a default of the + :class:`MapAdapter` so that you don't have to pass the path info to + the match method. + + .. versionchanged:: 0.5 + previously this method accepted a bogus `calculate_subdomain` + parameter that did not have any effect. It was removed because + of that. + + .. versionchanged:: 0.8 + This will no longer raise a ValueError when an unexpected server + name was passed. + + :param environ: a WSGI environment. + :param server_name: an optional server name hint (see above). + :param subdomain: optionally the current subdomain (see above). + """ + environ = _get_environ(environ) + + wsgi_server_name = get_host(environ).lower() + + if server_name is None: + server_name = wsgi_server_name + else: + server_name = server_name.lower() + + if subdomain is None and not self.host_matching: + cur_server_name = wsgi_server_name.split(".") + real_server_name = server_name.split(".") + offset = -len(real_server_name) + if cur_server_name[offset:] != real_server_name: + # This can happen even with valid configs if the server was + # accesssed directly by IP address under some situations. + # Instead of raising an exception like in Werkzeug 0.7 or + # earlier we go by an invalid subdomain which will result + # in a 404 error on matching. + subdomain = "" + else: + subdomain = ".".join(filter(None, cur_server_name[:offset])) + + def _get_wsgi_string(name): + val = environ.get(name) + if val is not None: + return wsgi_decoding_dance(val, self.charset) + + script_name = _get_wsgi_string("SCRIPT_NAME") + path_info = _get_wsgi_string("PATH_INFO") + query_args = _get_wsgi_string("QUERY_STRING") + return Map.bind( + self, + server_name, + script_name, + subdomain, + environ["wsgi.url_scheme"], + environ["REQUEST_METHOD"], + path_info, + query_args=query_args, + ) + + def update(self): + """Called before matching and building to keep the compiled rules + in the correct order after things changed. + """ + if not self._remap: + return + + with self._remap_lock: + if not self._remap: + return + + self._rules.sort(key=lambda x: x.match_compare_key()) + for rules in itervalues(self._rules_by_endpoint): + rules.sort(key=lambda x: x.build_compare_key()) + self._remap = False + + def __repr__(self): + rules = self.iter_rules() + return "%s(%s)" % (self.__class__.__name__, pformat(list(rules))) + + +class MapAdapter(object): + + """Returned by :meth:`Map.bind` or :meth:`Map.bind_to_environ` and does + the URL matching and building based on runtime information. + """ + + def __init__( + self, + map, + server_name, + script_name, + subdomain, + url_scheme, + path_info, + default_method, + query_args=None, + ): + self.map = map + self.server_name = to_unicode(server_name) + script_name = to_unicode(script_name) + if not script_name.endswith(u"/"): + script_name += u"/" + self.script_name = script_name + self.subdomain = to_unicode(subdomain) + self.url_scheme = to_unicode(url_scheme) + self.path_info = to_unicode(path_info) + self.default_method = to_unicode(default_method) + self.query_args = query_args + + def dispatch( + self, view_func, path_info=None, method=None, catch_http_exceptions=False + ): + """Does the complete dispatching process. `view_func` is called with + the endpoint and a dict with the values for the view. It should + look up the view function, call it, and return a response object + or WSGI application. http exceptions are not caught by default + so that applications can display nicer error messages by just + catching them by hand. If you want to stick with the default + error messages you can pass it ``catch_http_exceptions=True`` and + it will catch the http exceptions. + + Here a small example for the dispatch usage:: + + from werkzeug.wrappers import Request, Response + from werkzeug.wsgi import responder + from werkzeug.routing import Map, Rule + + def on_index(request): + return Response('Hello from the index') + + url_map = Map([Rule('/', endpoint='index')]) + views = {'index': on_index} + + @responder + def application(environ, start_response): + request = Request(environ) + urls = url_map.bind_to_environ(environ) + return urls.dispatch(lambda e, v: views[e](request, **v), + catch_http_exceptions=True) + + Keep in mind that this method might return exception objects, too, so + use :class:`Response.force_type` to get a response object. + + :param view_func: a function that is called with the endpoint as + first argument and the value dict as second. Has + to dispatch to the actual view function with this + information. (see above) + :param path_info: the path info to use for matching. Overrides the + path info specified on binding. + :param method: the HTTP method used for matching. Overrides the + method specified on binding. + :param catch_http_exceptions: set to `True` to catch any of the + werkzeug :class:`HTTPException`\\s. + """ + try: + try: + endpoint, args = self.match(path_info, method) + except RequestRedirect as e: + return e + return view_func(endpoint, args) + except HTTPException as e: + if catch_http_exceptions: + return e + raise + + def match(self, path_info=None, method=None, return_rule=False, query_args=None): + """The usage is simple: you just pass the match method the current + path info as well as the method (which defaults to `GET`). The + following things can then happen: + + - you receive a `NotFound` exception that indicates that no URL is + matching. A `NotFound` exception is also a WSGI application you + can call to get a default page not found page (happens to be the + same object as `werkzeug.exceptions.NotFound`) + + - you receive a `MethodNotAllowed` exception that indicates that there + is a match for this URL but not for the current request method. + This is useful for RESTful applications. + + - you receive a `RequestRedirect` exception with a `new_url` + attribute. This exception is used to notify you about a request + Werkzeug requests from your WSGI application. This is for example the + case if you request ``/foo`` although the correct URL is ``/foo/`` + You can use the `RequestRedirect` instance as response-like object + similar to all other subclasses of `HTTPException`. + + - you get a tuple in the form ``(endpoint, arguments)`` if there is + a match (unless `return_rule` is True, in which case you get a tuple + in the form ``(rule, arguments)``) + + If the path info is not passed to the match method the default path + info of the map is used (defaults to the root URL if not defined + explicitly). + + All of the exceptions raised are subclasses of `HTTPException` so they + can be used as WSGI responses. They will all render generic error or + redirect pages. + + Here is a small example for matching: + + >>> m = Map([ + ... Rule('/', endpoint='index'), + ... Rule('/downloads/', endpoint='downloads/index'), + ... Rule('/downloads/', endpoint='downloads/show') + ... ]) + >>> urls = m.bind("example.com", "/") + >>> urls.match("/", "GET") + ('index', {}) + >>> urls.match("/downloads/42") + ('downloads/show', {'id': 42}) + + And here is what happens on redirect and missing URLs: + + >>> urls.match("/downloads") + Traceback (most recent call last): + ... + RequestRedirect: http://example.com/downloads/ + >>> urls.match("/missing") + Traceback (most recent call last): + ... + NotFound: 404 Not Found + + :param path_info: the path info to use for matching. Overrides the + path info specified on binding. + :param method: the HTTP method used for matching. Overrides the + method specified on binding. + :param return_rule: return the rule that matched instead of just the + endpoint (defaults to `False`). + :param query_args: optional query arguments that are used for + automatic redirects as string or dictionary. It's + currently not possible to use the query arguments + for URL matching. + + .. versionadded:: 0.6 + `return_rule` was added. + + .. versionadded:: 0.7 + `query_args` was added. + + .. versionchanged:: 0.8 + `query_args` can now also be a string. + """ + self.map.update() + if path_info is None: + path_info = self.path_info + else: + path_info = to_unicode(path_info, self.map.charset) + if query_args is None: + query_args = self.query_args + method = (method or self.default_method).upper() + + path = u"%s|%s" % ( + self.map.host_matching and self.server_name or self.subdomain, + path_info and "/%s" % path_info.lstrip("/"), + ) + + have_match_for = set() + for rule in self.map._rules: + try: + rv = rule.match(path, method) + except RequestSlash: + raise RequestRedirect( + self.make_redirect_url( + url_quote(path_info, self.map.charset, safe="/:|+") + "/", + query_args, + ) + ) + except RequestAliasRedirect as e: + raise RequestRedirect( + self.make_alias_redirect_url( + path, rule.endpoint, e.matched_values, method, query_args + ) + ) + if rv is None: + continue + if rule.methods is not None and method not in rule.methods: + have_match_for.update(rule.methods) + continue + + if self.map.redirect_defaults: + redirect_url = self.get_default_redirect(rule, method, rv, query_args) + if redirect_url is not None: + raise RequestRedirect(redirect_url) + + if rule.redirect_to is not None: + if isinstance(rule.redirect_to, string_types): + + def _handle_match(match): + value = rv[match.group(1)] + return rule._converters[match.group(1)].to_url(value) + + redirect_url = _simple_rule_re.sub(_handle_match, rule.redirect_to) + else: + redirect_url = rule.redirect_to(self, **rv) + raise RequestRedirect( + str( + url_join( + "%s://%s%s%s" + % ( + self.url_scheme or "http", + self.subdomain + "." if self.subdomain else "", + self.server_name, + self.script_name, + ), + redirect_url, + ) + ) + ) + + if return_rule: + return rule, rv + else: + return rule.endpoint, rv + + if have_match_for: + raise MethodNotAllowed(valid_methods=list(have_match_for)) + raise NotFound() + + def test(self, path_info=None, method=None): + """Test if a rule would match. Works like `match` but returns `True` + if the URL matches, or `False` if it does not exist. + + :param path_info: the path info to use for matching. Overrides the + path info specified on binding. + :param method: the HTTP method used for matching. Overrides the + method specified on binding. + """ + try: + self.match(path_info, method) + except RequestRedirect: + pass + except HTTPException: + return False + return True + + def allowed_methods(self, path_info=None): + """Returns the valid methods that match for a given path. + + .. versionadded:: 0.7 + """ + try: + self.match(path_info, method="--") + except MethodNotAllowed as e: + return e.valid_methods + except HTTPException: + pass + return [] + + def get_host(self, domain_part): + """Figures out the full host name for the given domain part. The + domain part is a subdomain in case host matching is disabled or + a full host name. + """ + if self.map.host_matching: + if domain_part is None: + return self.server_name + return to_unicode(domain_part, "ascii") + subdomain = domain_part + if subdomain is None: + subdomain = self.subdomain + else: + subdomain = to_unicode(subdomain, "ascii") + return (subdomain + u"." if subdomain else u"") + self.server_name + + def get_default_redirect(self, rule, method, values, query_args): + """A helper that returns the URL to redirect to if it finds one. + This is used for default redirecting only. + + :internal: + """ + assert self.map.redirect_defaults + for r in self.map._rules_by_endpoint[rule.endpoint]: + # every rule that comes after this one, including ourself + # has a lower priority for the defaults. We order the ones + # with the highest priority up for building. + if r is rule: + break + if r.provides_defaults_for(rule) and r.suitable_for(values, method): + values.update(r.defaults) + domain_part, path = r.build(values) + return self.make_redirect_url(path, query_args, domain_part=domain_part) + + def encode_query_args(self, query_args): + if not isinstance(query_args, string_types): + query_args = url_encode(query_args, self.map.charset) + return query_args + + def make_redirect_url(self, path_info, query_args=None, domain_part=None): + """Creates a redirect URL. + + :internal: + """ + suffix = "" + if query_args: + suffix = "?" + self.encode_query_args(query_args) + return str( + "%s://%s/%s%s" + % ( + self.url_scheme or "http", + self.get_host(domain_part), + posixpath.join( + self.script_name[:-1].lstrip("/"), path_info.lstrip("/") + ), + suffix, + ) + ) + + def make_alias_redirect_url(self, path, endpoint, values, method, query_args): + """Internally called to make an alias redirect URL.""" + url = self.build( + endpoint, values, method, append_unknown=False, force_external=True + ) + if query_args: + url += "?" + self.encode_query_args(query_args) + assert url != path, "detected invalid alias setting. No canonical URL found" + return url + + def _partial_build(self, endpoint, values, method, append_unknown): + """Helper for :meth:`build`. Returns subdomain and path for the + rule that accepts this endpoint, values and method. + + :internal: + """ + # in case the method is none, try with the default method first + if method is None: + rv = self._partial_build( + endpoint, values, self.default_method, append_unknown + ) + if rv is not None: + return rv + + # default method did not match or a specific method is passed, + # check all and go with first result. + for rule in self.map._rules_by_endpoint.get(endpoint, ()): + if rule.suitable_for(values, method): + rv = rule.build(values, append_unknown) + if rv is not None: + return rv + + def build( + self, + endpoint, + values=None, + method=None, + force_external=False, + append_unknown=True, + ): + """Building URLs works pretty much the other way round. Instead of + `match` you call `build` and pass it the endpoint and a dict of + arguments for the placeholders. + + The `build` function also accepts an argument called `force_external` + which, if you set it to `True` will force external URLs. Per default + external URLs (include the server name) will only be used if the + target URL is on a different subdomain. + + >>> m = Map([ + ... Rule('/', endpoint='index'), + ... Rule('/downloads/', endpoint='downloads/index'), + ... Rule('/downloads/', endpoint='downloads/show') + ... ]) + >>> urls = m.bind("example.com", "/") + >>> urls.build("index", {}) + '/' + >>> urls.build("downloads/show", {'id': 42}) + '/downloads/42' + >>> urls.build("downloads/show", {'id': 42}, force_external=True) + 'http://example.com/downloads/42' + + Because URLs cannot contain non ASCII data you will always get + bytestrings back. Non ASCII characters are urlencoded with the + charset defined on the map instance. + + Additional values are converted to unicode and appended to the URL as + URL querystring parameters: + + >>> urls.build("index", {'q': 'My Searchstring'}) + '/?q=My+Searchstring' + + When processing those additional values, lists are furthermore + interpreted as multiple values (as per + :py:class:`werkzeug.datastructures.MultiDict`): + + >>> urls.build("index", {'q': ['a', 'b', 'c']}) + '/?q=a&q=b&q=c' + + Passing a ``MultiDict`` will also add multiple values: + + >>> urls.build("index", MultiDict((('p', 'z'), ('q', 'a'), ('q', 'b')))) + '/?p=z&q=a&q=b' + + If a rule does not exist when building a `BuildError` exception is + raised. + + The build method accepts an argument called `method` which allows you + to specify the method you want to have an URL built for if you have + different methods for the same endpoint specified. + + .. versionadded:: 0.6 + the `append_unknown` parameter was added. + + :param endpoint: the endpoint of the URL to build. + :param values: the values for the URL to build. Unhandled values are + appended to the URL as query parameters. + :param method: the HTTP method for the rule if there are different + URLs for different methods on the same endpoint. + :param force_external: enforce full canonical external URLs. If the URL + scheme is not provided, this will generate + a protocol-relative URL. + :param append_unknown: unknown parameters are appended to the generated + URL as query string argument. Disable this + if you want the builder to ignore those. + """ + self.map.update() + + if values: + if isinstance(values, MultiDict): + temp_values = {} + # iteritems(dict, values) is like `values.lists()` + # without the call or `list()` coercion overhead. + for key, value in iteritems(dict, values): + if not value: + continue + if len(value) == 1: # flatten single item lists + value = value[0] + if value is None: # drop None + continue + temp_values[key] = value + values = temp_values + else: + # drop None + values = dict(i for i in iteritems(values) if i[1] is not None) + else: + values = {} + + rv = self._partial_build(endpoint, values, method, append_unknown) + if rv is None: + raise BuildError(endpoint, values, method, self) + domain_part, path = rv + + host = self.get_host(domain_part) + + # shortcut this. + if not force_external and ( + (self.map.host_matching and host == self.server_name) + or (not self.map.host_matching and domain_part == self.subdomain) + ): + return "%s/%s" % (self.script_name.rstrip("/"), path.lstrip("/")) + return str( + "%s//%s%s/%s" + % ( + self.url_scheme + ":" if self.url_scheme else "", + host, + self.script_name[:-1], + path.lstrip("/"), + ) + ) diff --git a/brightonpy/Lib/site-packages/werkzeug/security.py b/brightonpy/Lib/site-packages/werkzeug/security.py new file mode 100644 index 0000000..2308040 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/security.py @@ -0,0 +1,249 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.security + ~~~~~~~~~~~~~~~~~ + + Security related helpers such as secure password hashing tools. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import hashlib +import hmac +import os +import posixpath +from random import SystemRandom +from struct import Struct + +from ._compat import izip +from ._compat import PY2 +from ._compat import range_type +from ._compat import text_type +from ._compat import to_bytes +from ._compat import to_native + +SALT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" +DEFAULT_PBKDF2_ITERATIONS = 150000 + +_pack_int = Struct(">I").pack +_builtin_safe_str_cmp = getattr(hmac, "compare_digest", None) +_sys_rng = SystemRandom() +_os_alt_seps = list( + sep for sep in [os.path.sep, os.path.altsep] if sep not in (None, "/") +) + + +def pbkdf2_hex( + data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS, keylen=None, hashfunc=None +): + """Like :func:`pbkdf2_bin`, but returns a hex-encoded string. + + .. versionadded:: 0.9 + + :param data: the data to derive. + :param salt: the salt for the derivation. + :param iterations: the number of iterations. + :param keylen: the length of the resulting key. If not provided, + the digest size will be used. + :param hashfunc: the hash function to use. This can either be the + string name of a known hash function, or a function + from the hashlib module. Defaults to sha256. + """ + rv = pbkdf2_bin(data, salt, iterations, keylen, hashfunc) + return to_native(codecs.encode(rv, "hex_codec")) + + +def pbkdf2_bin( + data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS, keylen=None, hashfunc=None +): + """Returns a binary digest for the PBKDF2 hash algorithm of `data` + with the given `salt`. It iterates `iterations` times and produces a + key of `keylen` bytes. By default, SHA-256 is used as hash function; + a different hashlib `hashfunc` can be provided. + + .. versionadded:: 0.9 + + :param data: the data to derive. + :param salt: the salt for the derivation. + :param iterations: the number of iterations. + :param keylen: the length of the resulting key. If not provided + the digest size will be used. + :param hashfunc: the hash function to use. This can either be the + string name of a known hash function or a function + from the hashlib module. Defaults to sha256. + """ + if not hashfunc: + hashfunc = "sha256" + + data = to_bytes(data) + salt = to_bytes(salt) + + if callable(hashfunc): + _test_hash = hashfunc() + hash_name = getattr(_test_hash, "name", None) + else: + hash_name = hashfunc + return hashlib.pbkdf2_hmac(hash_name, data, salt, iterations, keylen) + + +def safe_str_cmp(a, b): + """This function compares strings in somewhat constant time. This + requires that the length of at least one string is known in advance. + + Returns `True` if the two strings are equal, or `False` if they are not. + + .. versionadded:: 0.7 + """ + if isinstance(a, text_type): + a = a.encode("utf-8") + if isinstance(b, text_type): + b = b.encode("utf-8") + + if _builtin_safe_str_cmp is not None: + return _builtin_safe_str_cmp(a, b) + + if len(a) != len(b): + return False + + rv = 0 + if PY2: + for x, y in izip(a, b): + rv |= ord(x) ^ ord(y) + else: + for x, y in izip(a, b): + rv |= x ^ y + + return rv == 0 + + +def gen_salt(length): + """Generate a random string of SALT_CHARS with specified ``length``.""" + if length <= 0: + raise ValueError("Salt length must be positive") + return "".join(_sys_rng.choice(SALT_CHARS) for _ in range_type(length)) + + +def _hash_internal(method, salt, password): + """Internal password hash helper. Supports plaintext without salt, + unsalted and salted passwords. In case salted passwords are used + hmac is used. + """ + if method == "plain": + return password, method + + if isinstance(password, text_type): + password = password.encode("utf-8") + + if method.startswith("pbkdf2:"): + args = method[7:].split(":") + if len(args) not in (1, 2): + raise ValueError("Invalid number of arguments for PBKDF2") + method = args.pop(0) + iterations = args and int(args[0] or 0) or DEFAULT_PBKDF2_ITERATIONS + is_pbkdf2 = True + actual_method = "pbkdf2:%s:%d" % (method, iterations) + else: + is_pbkdf2 = False + actual_method = method + + if is_pbkdf2: + if not salt: + raise ValueError("Salt is required for PBKDF2") + rv = pbkdf2_hex(password, salt, iterations, hashfunc=method) + elif salt: + if isinstance(salt, text_type): + salt = salt.encode("utf-8") + mac = _create_mac(salt, password, method) + rv = mac.hexdigest() + else: + rv = hashlib.new(method, password).hexdigest() + return rv, actual_method + + +def _create_mac(key, msg, method): + if callable(method): + return hmac.HMAC(key, msg, method) + + def hashfunc(d=b""): + return hashlib.new(method, d) + + # Python 2.7 used ``hasattr(digestmod, '__call__')`` + # to detect if hashfunc is callable + hashfunc.__call__ = hashfunc + return hmac.HMAC(key, msg, hashfunc) + + +def generate_password_hash(password, method="pbkdf2:sha256", salt_length=8): + """Hash a password with the given method and salt with a string of + the given length. The format of the string returned includes the method + that was used so that :func:`check_password_hash` can check the hash. + + The format for the hashed string looks like this:: + + method$salt$hash + + This method can **not** generate unsalted passwords but it is possible + to set param method='plain' in order to enforce plaintext passwords. + If a salt is used, hmac is used internally to salt the password. + + If PBKDF2 is wanted it can be enabled by setting the method to + ``pbkdf2:method:iterations`` where iterations is optional:: + + pbkdf2:sha256:80000$salt$hash + pbkdf2:sha256$salt$hash + + :param password: the password to hash. + :param method: the hash method to use (one that hashlib supports). Can + optionally be in the format ``pbkdf2:[:iterations]`` + to enable PBKDF2. + :param salt_length: the length of the salt in letters. + """ + salt = gen_salt(salt_length) if method != "plain" else "" + h, actual_method = _hash_internal(method, salt, password) + return "%s$%s$%s" % (actual_method, salt, h) + + +def check_password_hash(pwhash, password): + """check a password against a given salted and hashed password value. + In order to support unsalted legacy passwords this method supports + plain text passwords, md5 and sha1 hashes (both salted and unsalted). + + Returns `True` if the password matched, `False` otherwise. + + :param pwhash: a hashed string like returned by + :func:`generate_password_hash`. + :param password: the plaintext password to compare against the hash. + """ + if pwhash.count("$") < 2: + return False + method, salt, hashval = pwhash.split("$", 2) + return safe_str_cmp(_hash_internal(method, salt, password)[0], hashval) + + +def safe_join(directory, *pathnames): + """Safely join zero or more untrusted path components to a base + directory to avoid escaping the base directory. + + :param directory: The trusted base directory. + :param pathnames: The untrusted path components relative to the + base directory. + :return: A safe path, otherwise ``None``. + """ + parts = [directory] + + for filename in pathnames: + if filename != "": + filename = posixpath.normpath(filename) + + if ( + any(sep in filename for sep in _os_alt_seps) + or os.path.isabs(filename) + or filename == ".." + or filename.startswith("../") + ): + return None + + parts.append(filename) + + return posixpath.join(*parts) diff --git a/brightonpy/Lib/site-packages/werkzeug/serving.py b/brightonpy/Lib/site-packages/werkzeug/serving.py new file mode 100644 index 0000000..19ac92f --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/serving.py @@ -0,0 +1,1077 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.serving + ~~~~~~~~~~~~~~~~ + + There are many ways to serve a WSGI application. While you're developing + it you usually don't want a full blown webserver like Apache but a simple + standalone one. From Python 2.5 onwards there is the `wsgiref`_ server in + the standard library. If you're using older versions of Python you can + download the package from the cheeseshop. + + However there are some caveats. Sourcecode won't reload itself when + changed and each time you kill the server using ``^C`` you get an + `KeyboardInterrupt` error. While the latter is easy to solve the first + one can be a pain in the ass in some situations. + + The easiest way is creating a small ``start-myproject.py`` that runs the + application:: + + #!/usr/bin/env python + # -*- coding: utf-8 -*- + from myproject import make_app + from werkzeug.serving import run_simple + + app = make_app(...) + run_simple('localhost', 8080, app, use_reloader=True) + + You can also pass it a `extra_files` keyword argument with a list of + additional files (like configuration files) you want to observe. + + For bigger applications you should consider using `click` + (http://click.pocoo.org) instead of a simple start file. + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import io +import os +import signal +import socket +import sys + +from ._compat import PY2 +from ._compat import reraise +from ._compat import WIN +from ._compat import wsgi_encoding_dance +from ._internal import _log +from .exceptions import InternalServerError +from .urls import uri_to_iri +from .urls import url_parse +from .urls import url_unquote + +try: + import socketserver + from http.server import BaseHTTPRequestHandler + from http.server import HTTPServer +except ImportError: + import SocketServer as socketserver + from BaseHTTPServer import HTTPServer + from BaseHTTPServer import BaseHTTPRequestHandler + +try: + import ssl +except ImportError: + + class _SslDummy(object): + def __getattr__(self, name): + raise RuntimeError("SSL support unavailable") + + ssl = _SslDummy() + +try: + import termcolor +except ImportError: + termcolor = None + + +def _get_openssl_crypto_module(): + try: + from OpenSSL import crypto + except ImportError: + raise TypeError("Using ad-hoc certificates requires the pyOpenSSL library.") + else: + return crypto + + +ThreadingMixIn = socketserver.ThreadingMixIn +can_fork = hasattr(os, "fork") + +if can_fork: + ForkingMixIn = socketserver.ForkingMixIn +else: + + class ForkingMixIn(object): + pass + + +try: + af_unix = socket.AF_UNIX +except AttributeError: + af_unix = None + + +LISTEN_QUEUE = 128 +can_open_by_fd = not WIN and hasattr(socket, "fromfd") + +# On Python 3, ConnectionError represents the same errnos as +# socket.error from Python 2, while socket.error is an alias for the +# more generic OSError. +if PY2: + _ConnectionError = socket.error +else: + _ConnectionError = ConnectionError + + +class DechunkedInput(io.RawIOBase): + """An input stream that handles Transfer-Encoding 'chunked'""" + + def __init__(self, rfile): + self._rfile = rfile + self._done = False + self._len = 0 + + def readable(self): + return True + + def read_chunk_len(self): + try: + line = self._rfile.readline().decode("latin1") + _len = int(line.strip(), 16) + except ValueError: + raise IOError("Invalid chunk header") + if _len < 0: + raise IOError("Negative chunk length not allowed") + return _len + + def readinto(self, buf): + read = 0 + while not self._done and read < len(buf): + if self._len == 0: + # This is the first chunk or we fully consumed the previous + # one. Read the next length of the next chunk + self._len = self.read_chunk_len() + + if self._len == 0: + # Found the final chunk of size 0. The stream is now exhausted, + # but there is still a final newline that should be consumed + self._done = True + + if self._len > 0: + # There is data (left) in this chunk, so append it to the + # buffer. If this operation fully consumes the chunk, this will + # reset self._len to 0. + n = min(len(buf), self._len) + buf[read : read + n] = self._rfile.read(n) + self._len -= n + read += n + + if self._len == 0: + # Skip the terminating newline of a chunk that has been fully + # consumed. This also applies to the 0-sized final chunk + terminator = self._rfile.readline() + if terminator not in (b"\n", b"\r\n", b"\r"): + raise IOError("Missing chunk terminating newline") + + return read + + +class WSGIRequestHandler(BaseHTTPRequestHandler, object): + + """A request handler that implements WSGI dispatching.""" + + @property + def server_version(self): + from . import __version__ + + return "Werkzeug/" + __version__ + + def make_environ(self): + request_url = url_parse(self.path) + + def shutdown_server(): + self.server.shutdown_signal = True + + url_scheme = "http" if self.server.ssl_context is None else "https" + if not self.client_address: + self.client_address = "" + if isinstance(self.client_address, str): + self.client_address = (self.client_address, 0) + else: + pass + path_info = url_unquote(request_url.path) + + environ = { + "wsgi.version": (1, 0), + "wsgi.url_scheme": url_scheme, + "wsgi.input": self.rfile, + "wsgi.errors": sys.stderr, + "wsgi.multithread": self.server.multithread, + "wsgi.multiprocess": self.server.multiprocess, + "wsgi.run_once": False, + "werkzeug.server.shutdown": shutdown_server, + "SERVER_SOFTWARE": self.server_version, + "REQUEST_METHOD": self.command, + "SCRIPT_NAME": "", + "PATH_INFO": wsgi_encoding_dance(path_info), + "QUERY_STRING": wsgi_encoding_dance(request_url.query), + # Non-standard, added by mod_wsgi, uWSGI + "REQUEST_URI": wsgi_encoding_dance(self.path), + # Non-standard, added by gunicorn + "RAW_URI": wsgi_encoding_dance(self.path), + "REMOTE_ADDR": self.address_string(), + "REMOTE_PORT": self.port_integer(), + "SERVER_NAME": self.server.server_address[0], + "SERVER_PORT": str(self.server.server_address[1]), + "SERVER_PROTOCOL": self.request_version, + } + + for key, value in self.get_header_items(): + key = key.upper().replace("-", "_") + value = value.replace("\r\n", "") + if key not in ("CONTENT_TYPE", "CONTENT_LENGTH"): + key = "HTTP_" + key + if key in environ: + value = "{},{}".format(environ[key], value) + environ[key] = value + + if environ.get("HTTP_TRANSFER_ENCODING", "").strip().lower() == "chunked": + environ["wsgi.input_terminated"] = True + environ["wsgi.input"] = DechunkedInput(environ["wsgi.input"]) + + if request_url.scheme and request_url.netloc: + environ["HTTP_HOST"] = request_url.netloc + + return environ + + def run_wsgi(self): + if self.headers.get("Expect", "").lower().strip() == "100-continue": + self.wfile.write(b"HTTP/1.1 100 Continue\r\n\r\n") + + self.environ = environ = self.make_environ() + headers_set = [] + headers_sent = [] + + def write(data): + assert headers_set, "write() before start_response" + if not headers_sent: + status, response_headers = headers_sent[:] = headers_set + try: + code, msg = status.split(None, 1) + except ValueError: + code, msg = status, "" + code = int(code) + self.send_response(code, msg) + header_keys = set() + for key, value in response_headers: + self.send_header(key, value) + key = key.lower() + header_keys.add(key) + if not ( + "content-length" in header_keys + or environ["REQUEST_METHOD"] == "HEAD" + or code < 200 + or code in (204, 304) + ): + self.close_connection = True + self.send_header("Connection", "close") + if "server" not in header_keys: + self.send_header("Server", self.version_string()) + if "date" not in header_keys: + self.send_header("Date", self.date_time_string()) + self.end_headers() + + assert isinstance(data, bytes), "applications must write bytes" + if data: + # Only write data if there is any to avoid Python 3.5 SSL bug + self.wfile.write(data) + self.wfile.flush() + + def start_response(status, response_headers, exc_info=None): + if exc_info: + try: + if headers_sent: + reraise(*exc_info) + finally: + exc_info = None + elif headers_set: + raise AssertionError("Headers already set") + headers_set[:] = [status, response_headers] + return write + + def execute(app): + application_iter = app(environ, start_response) + try: + for data in application_iter: + write(data) + if not headers_sent: + write(b"") + finally: + if hasattr(application_iter, "close"): + application_iter.close() + application_iter = None + + try: + execute(self.server.app) + except (_ConnectionError, socket.timeout) as e: + self.connection_dropped(e, environ) + except Exception: + if self.server.passthrough_errors: + raise + from .debug.tbtools import get_current_traceback + + traceback = get_current_traceback(ignore_system_exceptions=True) + try: + # if we haven't yet sent the headers but they are set + # we roll back to be able to set them again. + if not headers_sent: + del headers_set[:] + execute(InternalServerError()) + except Exception: + pass + self.server.log("error", "Error on request:\n%s", traceback.plaintext) + + def handle(self): + """Handles a request ignoring dropped connections.""" + rv = None + try: + rv = BaseHTTPRequestHandler.handle(self) + except (_ConnectionError, socket.timeout) as e: + self.connection_dropped(e) + except Exception as e: + if self.server.ssl_context is None or not is_ssl_error(e): + raise + if self.server.shutdown_signal: + self.initiate_shutdown() + return rv + + def initiate_shutdown(self): + """A horrible, horrible way to kill the server for Python 2.6 and + later. It's the best we can do. + """ + # Windows does not provide SIGKILL, go with SIGTERM then. + sig = getattr(signal, "SIGKILL", signal.SIGTERM) + # reloader active + if is_running_from_reloader(): + os.kill(os.getpid(), sig) + # python 2.7 + self.server._BaseServer__shutdown_request = True + # python 2.6 + self.server._BaseServer__serving = False + + def connection_dropped(self, error, environ=None): + """Called if the connection was closed by the client. By default + nothing happens. + """ + + def handle_one_request(self): + """Handle a single HTTP request.""" + self.raw_requestline = self.rfile.readline() + if not self.raw_requestline: + self.close_connection = 1 + elif self.parse_request(): + return self.run_wsgi() + + def send_response(self, code, message=None): + """Send the response header and log the response code.""" + self.log_request(code) + if message is None: + message = code in self.responses and self.responses[code][0] or "" + if self.request_version != "HTTP/0.9": + hdr = "%s %d %s\r\n" % (self.protocol_version, code, message) + self.wfile.write(hdr.encode("ascii")) + + def version_string(self): + return BaseHTTPRequestHandler.version_string(self).strip() + + def address_string(self): + if getattr(self, "environ", None): + return self.environ["REMOTE_ADDR"] + elif not self.client_address: + return "" + elif isinstance(self.client_address, str): + return self.client_address + else: + return self.client_address[0] + + def port_integer(self): + return self.client_address[1] + + def log_request(self, code="-", size="-"): + try: + path = uri_to_iri(self.path) + msg = "%s %s %s" % (self.command, path, self.request_version) + except AttributeError: + # path isn't set if the requestline was bad + msg = self.requestline + + code = str(code) + + if termcolor: + color = termcolor.colored + + if code[0] == "1": # 1xx - Informational + msg = color(msg, attrs=["bold"]) + elif code[0] == "2": # 2xx - Success + msg = color(msg, color="white") + elif code == "304": # 304 - Resource Not Modified + msg = color(msg, color="cyan") + elif code[0] == "3": # 3xx - Redirection + msg = color(msg, color="green") + elif code == "404": # 404 - Resource Not Found + msg = color(msg, color="yellow") + elif code[0] == "4": # 4xx - Client Error + msg = color(msg, color="red", attrs=["bold"]) + else: # 5xx, or any other response + msg = color(msg, color="magenta", attrs=["bold"]) + + self.log("info", '"%s" %s %s', msg, code, size) + + def log_error(self, *args): + self.log("error", *args) + + def log_message(self, format, *args): + self.log("info", format, *args) + + def log(self, type, message, *args): + _log( + type, + "%s - - [%s] %s\n" + % (self.address_string(), self.log_date_time_string(), message % args), + ) + + def get_header_items(self): + """ + Get an iterable list of key/value pairs representing headers. + + This function provides Python 2/3 compatibility as related to the + parsing of request headers. Python 2.7 is not compliant with + RFC 3875 Section 4.1.18 which requires multiple values for headers + to be provided or RFC 2616 which allows for folding of multi-line + headers. This function will return a matching list regardless + of Python version. It can be removed once Python 2.7 support + is dropped. + + :return: List of tuples containing header hey/value pairs + """ + if PY2: + # For Python 2, process the headers manually according to + # W3C RFC 2616 Section 4.2. + items = [] + for header in self.headers.headers: + # Remove "\r\n" from the header and split on ":" to get + # the field name and value. + try: + key, value = header[0:-2].split(":", 1) + except ValueError: + # If header could not be slit with : but starts with white + # space and it follows an existing header, it's a folded + # header. + if header[0] in ("\t", " ") and items: + # Pop off the last header + key, value = items.pop() + # Append the current header to the value of the last + # header which will be placed back on the end of the + # list + value = value + header + # Otherwise it's just a bad header and should error + else: + # Re-raise the value error + raise + + # Add the key and the value once stripped of leading + # white space. The specification allows for stripping + # trailing white space but the Python 3 code does not + # strip trailing white space. Therefore, trailing space + # will be left as is to match the Python 3 behavior. + items.append((key, value.lstrip())) + else: + items = self.headers.items() + + return items + + +#: backwards compatible name if someone is subclassing it +BaseRequestHandler = WSGIRequestHandler + + +def generate_adhoc_ssl_pair(cn=None): + from random import random + + crypto = _get_openssl_crypto_module() + + # pretty damn sure that this is not actually accepted by anyone + if cn is None: + cn = "*" + + cert = crypto.X509() + cert.set_serial_number(int(random() * sys.maxsize)) + cert.gmtime_adj_notBefore(0) + cert.gmtime_adj_notAfter(60 * 60 * 24 * 365) + + subject = cert.get_subject() + subject.CN = cn + subject.O = "Dummy Certificate" # noqa: E741 + + issuer = cert.get_issuer() + issuer.CN = subject.CN + issuer.O = subject.O # noqa: E741 + + pkey = crypto.PKey() + pkey.generate_key(crypto.TYPE_RSA, 2048) + cert.set_pubkey(pkey) + cert.sign(pkey, "sha256") + + return cert, pkey + + +def make_ssl_devcert(base_path, host=None, cn=None): + """Creates an SSL key for development. This should be used instead of + the ``'adhoc'`` key which generates a new cert on each server start. + It accepts a path for where it should store the key and cert and + either a host or CN. If a host is given it will use the CN + ``*.host/CN=host``. + + For more information see :func:`run_simple`. + + .. versionadded:: 0.9 + + :param base_path: the path to the certificate and key. The extension + ``.crt`` is added for the certificate, ``.key`` is + added for the key. + :param host: the name of the host. This can be used as an alternative + for the `cn`. + :param cn: the `CN` to use. + """ + from OpenSSL import crypto + + if host is not None: + cn = "*.%s/CN=%s" % (host, host) + cert, pkey = generate_adhoc_ssl_pair(cn=cn) + + cert_file = base_path + ".crt" + pkey_file = base_path + ".key" + + with open(cert_file, "wb") as f: + f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) + with open(pkey_file, "wb") as f: + f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) + + return cert_file, pkey_file + + +def generate_adhoc_ssl_context(): + """Generates an adhoc SSL context for the development server.""" + crypto = _get_openssl_crypto_module() + import tempfile + import atexit + + cert, pkey = generate_adhoc_ssl_pair() + cert_handle, cert_file = tempfile.mkstemp() + pkey_handle, pkey_file = tempfile.mkstemp() + atexit.register(os.remove, pkey_file) + atexit.register(os.remove, cert_file) + + os.write(cert_handle, crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) + os.write(pkey_handle, crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) + os.close(cert_handle) + os.close(pkey_handle) + ctx = load_ssl_context(cert_file, pkey_file) + return ctx + + +def load_ssl_context(cert_file, pkey_file=None, protocol=None): + """Loads SSL context from cert/private key files and optional protocol. + Many parameters are directly taken from the API of + :py:class:`ssl.SSLContext`. + + :param cert_file: Path of the certificate to use. + :param pkey_file: Path of the private key to use. If not given, the key + will be obtained from the certificate file. + :param protocol: One of the ``PROTOCOL_*`` constants in the stdlib ``ssl`` + module. Defaults to ``PROTOCOL_SSLv23``. + """ + if protocol is None: + protocol = ssl.PROTOCOL_SSLv23 + ctx = _SSLContext(protocol) + ctx.load_cert_chain(cert_file, pkey_file) + return ctx + + +class _SSLContext(object): + + """A dummy class with a small subset of Python3's ``ssl.SSLContext``, only + intended to be used with and by Werkzeug.""" + + def __init__(self, protocol): + self._protocol = protocol + self._certfile = None + self._keyfile = None + self._password = None + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._certfile = certfile + self._keyfile = keyfile or certfile + self._password = password + + def wrap_socket(self, sock, **kwargs): + return ssl.wrap_socket( + sock, + keyfile=self._keyfile, + certfile=self._certfile, + ssl_version=self._protocol, + **kwargs + ) + + +def is_ssl_error(error=None): + """Checks if the given error (or the current one) is an SSL error.""" + exc_types = (ssl.SSLError,) + try: + from OpenSSL.SSL import Error + + exc_types += (Error,) + except ImportError: + pass + + if error is None: + error = sys.exc_info()[1] + return isinstance(error, exc_types) + + +def select_address_family(host, port): + """Return ``AF_INET4``, ``AF_INET6``, or ``AF_UNIX`` depending on + the host and port.""" + # disabled due to problems with current ipv6 implementations + # and various operating systems. Probably this code also is + # not supposed to work, but I can't come up with any other + # ways to implement this. + # try: + # info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, + # socket.SOCK_STREAM, 0, + # socket.AI_PASSIVE) + # if info: + # return info[0][0] + # except socket.gaierror: + # pass + if host.startswith("unix://"): + return socket.AF_UNIX + elif ":" in host and hasattr(socket, "AF_INET6"): + return socket.AF_INET6 + return socket.AF_INET + + +def get_sockaddr(host, port, family): + """Return a fully qualified socket address that can be passed to + :func:`socket.bind`.""" + if family == af_unix: + return host.split("://", 1)[1] + try: + res = socket.getaddrinfo( + host, port, family, socket.SOCK_STREAM, socket.IPPROTO_TCP + ) + except socket.gaierror: + return host, port + return res[0][4] + + +class BaseWSGIServer(HTTPServer, object): + + """Simple single-threaded, single-process WSGI server.""" + + multithread = False + multiprocess = False + request_queue_size = LISTEN_QUEUE + + def __init__( + self, + host, + port, + app, + handler=None, + passthrough_errors=False, + ssl_context=None, + fd=None, + ): + if handler is None: + handler = WSGIRequestHandler + + self.address_family = select_address_family(host, port) + + if fd is not None: + real_sock = socket.fromfd(fd, self.address_family, socket.SOCK_STREAM) + port = 0 + + server_address = get_sockaddr(host, int(port), self.address_family) + + # remove socket file if it already exists + if self.address_family == af_unix and os.path.exists(server_address): + os.unlink(server_address) + HTTPServer.__init__(self, server_address, handler) + + self.app = app + self.passthrough_errors = passthrough_errors + self.shutdown_signal = False + self.host = host + self.port = self.socket.getsockname()[1] + + # Patch in the original socket. + if fd is not None: + self.socket.close() + self.socket = real_sock + self.server_address = self.socket.getsockname() + + if ssl_context is not None: + if isinstance(ssl_context, tuple): + ssl_context = load_ssl_context(*ssl_context) + if ssl_context == "adhoc": + ssl_context = generate_adhoc_ssl_context() + # If we are on Python 2 the return value from socket.fromfd + # is an internal socket object but what we need for ssl wrap + # is the wrapper around it :( + sock = self.socket + if PY2 and not isinstance(sock, socket.socket): + sock = socket.socket(sock.family, sock.type, sock.proto, sock) + self.socket = ssl_context.wrap_socket(sock, server_side=True) + self.ssl_context = ssl_context + else: + self.ssl_context = None + + def log(self, type, message, *args): + _log(type, message, *args) + + def serve_forever(self): + self.shutdown_signal = False + try: + HTTPServer.serve_forever(self) + except KeyboardInterrupt: + pass + finally: + self.server_close() + + def handle_error(self, request, client_address): + if self.passthrough_errors: + raise + # Python 2 still causes a socket.error after the earlier + # handling, so silence it here. + if isinstance(sys.exc_info()[1], _ConnectionError): + return + return HTTPServer.handle_error(self, request, client_address) + + def get_request(self): + con, info = self.socket.accept() + return con, info + + +class ThreadedWSGIServer(ThreadingMixIn, BaseWSGIServer): + + """A WSGI server that does threading.""" + + multithread = True + daemon_threads = True + + +class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer): + + """A WSGI server that does forking.""" + + multiprocess = True + + def __init__( + self, + host, + port, + app, + processes=40, + handler=None, + passthrough_errors=False, + ssl_context=None, + fd=None, + ): + if not can_fork: + raise ValueError("Your platform does not support forking.") + BaseWSGIServer.__init__( + self, host, port, app, handler, passthrough_errors, ssl_context, fd + ) + self.max_children = processes + + +def make_server( + host=None, + port=None, + app=None, + threaded=False, + processes=1, + request_handler=None, + passthrough_errors=False, + ssl_context=None, + fd=None, +): + """Create a new server instance that is either threaded, or forks + or just processes one request after another. + """ + if threaded and processes > 1: + raise ValueError("cannot have a multithreaded and multi process server.") + elif threaded: + return ThreadedWSGIServer( + host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd + ) + elif processes > 1: + return ForkingWSGIServer( + host, + port, + app, + processes, + request_handler, + passthrough_errors, + ssl_context, + fd=fd, + ) + else: + return BaseWSGIServer( + host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd + ) + + +def is_running_from_reloader(): + """Checks if the application is running from within the Werkzeug + reloader subprocess. + + .. versionadded:: 0.10 + """ + return os.environ.get("WERKZEUG_RUN_MAIN") == "true" + + +def run_simple( + hostname, + port, + application, + use_reloader=False, + use_debugger=False, + use_evalex=True, + extra_files=None, + reloader_interval=1, + reloader_type="auto", + threaded=False, + processes=1, + request_handler=None, + static_files=None, + passthrough_errors=False, + ssl_context=None, +): + """Start a WSGI application. Optional features include a reloader, + multithreading and fork support. + + This function has a command-line interface too:: + + python -m werkzeug.serving --help + + .. versionadded:: 0.5 + `static_files` was added to simplify serving of static files as well + as `passthrough_errors`. + + .. versionadded:: 0.6 + support for SSL was added. + + .. versionadded:: 0.8 + Added support for automatically loading a SSL context from certificate + file and private key. + + .. versionadded:: 0.9 + Added command-line interface. + + .. versionadded:: 0.10 + Improved the reloader and added support for changing the backend + through the `reloader_type` parameter. See :ref:`reloader` + for more information. + + .. versionchanged:: 0.15 + Bind to a Unix socket by passing a path that starts with + ``unix://`` as the ``hostname``. + + :param hostname: The host to bind to, for example ``'localhost'``. + If the value is a path that starts with ``unix://`` it will bind + to a Unix socket instead of a TCP socket.. + :param port: The port for the server. eg: ``8080`` + :param application: the WSGI application to execute + :param use_reloader: should the server automatically restart the python + process if modules were changed? + :param use_debugger: should the werkzeug debugging system be used? + :param use_evalex: should the exception evaluation feature be enabled? + :param extra_files: a list of files the reloader should watch + additionally to the modules. For example configuration + files. + :param reloader_interval: the interval for the reloader in seconds. + :param reloader_type: the type of reloader to use. The default is + auto detection. Valid values are ``'stat'`` and + ``'watchdog'``. See :ref:`reloader` for more + information. + :param threaded: should the process handle each request in a separate + thread? + :param processes: if greater than 1 then handle each request in a new process + up to this maximum number of concurrent processes. + :param request_handler: optional parameter that can be used to replace + the default one. You can use this to replace it + with a different + :class:`~BaseHTTPServer.BaseHTTPRequestHandler` + subclass. + :param static_files: a list or dict of paths for static files. This works + exactly like :class:`SharedDataMiddleware`, it's actually + just wrapping the application in that middleware before + serving. + :param passthrough_errors: set this to `True` to disable the error catching. + This means that the server will die on errors but + it can be useful to hook debuggers in (pdb etc.) + :param ssl_context: an SSL context for the connection. Either an + :class:`ssl.SSLContext`, a tuple in the form + ``(cert_file, pkey_file)``, the string ``'adhoc'`` if + the server should automatically create one, or ``None`` + to disable SSL (which is the default). + """ + if not isinstance(port, int): + raise TypeError("port must be an integer") + if use_debugger: + from .debug import DebuggedApplication + + application = DebuggedApplication(application, use_evalex) + if static_files: + from .middleware.shared_data import SharedDataMiddleware + + application = SharedDataMiddleware(application, static_files) + + def log_startup(sock): + display_hostname = hostname if hostname not in ("", "*") else "localhost" + quit_msg = "(Press CTRL+C to quit)" + if sock.family == af_unix: + _log("info", " * Running on %s %s", display_hostname, quit_msg) + else: + if ":" in display_hostname: + display_hostname = "[%s]" % display_hostname + port = sock.getsockname()[1] + _log( + "info", + " * Running on %s://%s:%d/ %s", + "http" if ssl_context is None else "https", + display_hostname, + port, + quit_msg, + ) + + def inner(): + try: + fd = int(os.environ["WERKZEUG_SERVER_FD"]) + except (LookupError, ValueError): + fd = None + srv = make_server( + hostname, + port, + application, + threaded, + processes, + request_handler, + passthrough_errors, + ssl_context, + fd=fd, + ) + if fd is None: + log_startup(srv.socket) + srv.serve_forever() + + if use_reloader: + # If we're not running already in the subprocess that is the + # reloader we want to open up a socket early to make sure the + # port is actually available. + if not is_running_from_reloader(): + if port == 0 and not can_open_by_fd: + raise ValueError( + "Cannot bind to a random port with enabled " + "reloader if the Python interpreter does " + "not support socket opening by fd." + ) + + # Create and destroy a socket so that any exceptions are + # raised before we spawn a separate Python interpreter and + # lose this ability. + address_family = select_address_family(hostname, port) + server_address = get_sockaddr(hostname, port, address_family) + s = socket.socket(address_family, socket.SOCK_STREAM) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind(server_address) + if hasattr(s, "set_inheritable"): + s.set_inheritable(True) + + # If we can open the socket by file descriptor, then we can just + # reuse this one and our socket will survive the restarts. + if can_open_by_fd: + os.environ["WERKZEUG_SERVER_FD"] = str(s.fileno()) + s.listen(LISTEN_QUEUE) + log_startup(s) + else: + s.close() + if address_family == af_unix: + _log("info", "Unlinking %s" % server_address) + os.unlink(server_address) + + # Do not use relative imports, otherwise "python -m werkzeug.serving" + # breaks. + from ._reloader import run_with_reloader + + run_with_reloader(inner, extra_files, reloader_interval, reloader_type) + else: + inner() + + +def run_with_reloader(*args, **kwargs): + # People keep using undocumented APIs. Do not use this function + # please, we do not guarantee that it continues working. + from ._reloader import run_with_reloader + + return run_with_reloader(*args, **kwargs) + + +def main(): + """A simple command-line interface for :py:func:`run_simple`.""" + + # in contrast to argparse, this works at least under Python < 2.7 + import optparse + from .utils import import_string + + parser = optparse.OptionParser(usage="Usage: %prog [options] app_module:app_object") + parser.add_option( + "-b", + "--bind", + dest="address", + help="The hostname:port the app should listen on.", + ) + parser.add_option( + "-d", + "--debug", + dest="use_debugger", + action="store_true", + default=False, + help="Use Werkzeug's debugger.", + ) + parser.add_option( + "-r", + "--reload", + dest="use_reloader", + action="store_true", + default=False, + help="Reload Python process if modules change.", + ) + options, args = parser.parse_args() + + hostname, port = None, None + if options.address: + address = options.address.split(":") + hostname = address[0] + if len(address) > 1: + port = address[1] + + if len(args) != 1: + sys.stdout.write("No application supplied, or too much. See --help\n") + sys.exit(1) + app = import_string(args[0]) + + run_simple( + hostname=(hostname or "127.0.0.1"), + port=int(port or 5000), + application=app, + use_reloader=options.use_reloader, + use_debugger=options.use_debugger, + ) + + +if __name__ == "__main__": + main() diff --git a/brightonpy/Lib/site-packages/werkzeug/test.py b/brightonpy/Lib/site-packages/werkzeug/test.py new file mode 100644 index 0000000..6148665 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/test.py @@ -0,0 +1,1146 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.test + ~~~~~~~~~~~~~ + + This module implements a client to WSGI applications for testing. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import mimetypes +import sys +from io import BytesIO +from itertools import chain +from random import random +from tempfile import TemporaryFile +from time import time + +from ._compat import iteritems +from ._compat import iterlists +from ._compat import itervalues +from ._compat import make_literal_wrapper +from ._compat import reraise +from ._compat import string_types +from ._compat import text_type +from ._compat import to_bytes +from ._compat import wsgi_encoding_dance +from ._internal import _get_environ +from .datastructures import CallbackDict +from .datastructures import CombinedMultiDict +from .datastructures import EnvironHeaders +from .datastructures import FileMultiDict +from .datastructures import FileStorage +from .datastructures import Headers +from .datastructures import MultiDict +from .http import dump_cookie +from .http import dump_options_header +from .http import parse_options_header +from .urls import iri_to_uri +from .urls import url_encode +from .urls import url_fix +from .urls import url_parse +from .urls import url_unparse +from .urls import url_unquote +from .utils import get_content_type +from .wrappers import BaseRequest +from .wsgi import ClosingIterator +from .wsgi import get_current_url + +try: + from urllib.request import Request as U2Request +except ImportError: + from urllib2 import Request as U2Request + +try: + from http.cookiejar import CookieJar +except ImportError: + from cookielib import CookieJar + + +def stream_encode_multipart( + values, use_tempfile=True, threshold=1024 * 500, boundary=None, charset="utf-8" +): + """Encode a dict of values (either strings or file descriptors or + :class:`FileStorage` objects.) into a multipart encoded string stored + in a file descriptor. + """ + if boundary is None: + boundary = "---------------WerkzeugFormPart_%s%s" % (time(), random()) + _closure = [BytesIO(), 0, False] + + if use_tempfile: + + def write_binary(string): + stream, total_length, on_disk = _closure + if on_disk: + stream.write(string) + else: + length = len(string) + if length + _closure[1] <= threshold: + stream.write(string) + else: + new_stream = TemporaryFile("wb+") + new_stream.write(stream.getvalue()) + new_stream.write(string) + _closure[0] = new_stream + _closure[2] = True + _closure[1] = total_length + length + + else: + write_binary = _closure[0].write + + def write(string): + write_binary(string.encode(charset)) + + if not isinstance(values, MultiDict): + values = MultiDict(values) + + for key, values in iterlists(values): + for value in values: + write('--%s\r\nContent-Disposition: form-data; name="%s"' % (boundary, key)) + reader = getattr(value, "read", None) + if reader is not None: + filename = getattr(value, "filename", getattr(value, "name", None)) + content_type = getattr(value, "content_type", None) + if content_type is None: + content_type = ( + filename + and mimetypes.guess_type(filename)[0] + or "application/octet-stream" + ) + if filename is not None: + write('; filename="%s"\r\n' % filename) + else: + write("\r\n") + write("Content-Type: %s\r\n\r\n" % content_type) + while 1: + chunk = reader(16384) + if not chunk: + break + write_binary(chunk) + else: + if not isinstance(value, string_types): + value = str(value) + + value = to_bytes(value, charset) + write("\r\n\r\n") + write_binary(value) + write("\r\n") + write("--%s--\r\n" % boundary) + + length = int(_closure[0].tell()) + _closure[0].seek(0) + return _closure[0], length, boundary + + +def encode_multipart(values, boundary=None, charset="utf-8"): + """Like `stream_encode_multipart` but returns a tuple in the form + (``boundary``, ``data``) where data is a bytestring. + """ + stream, length, boundary = stream_encode_multipart( + values, use_tempfile=False, boundary=boundary, charset=charset + ) + return boundary, stream.read() + + +def File(fd, filename=None, mimetype=None): + """Backwards compat. + + .. deprecated:: 0.5 + """ + from warnings import warn + + warn( + "'werkzeug.test.File' is deprecated as of version 0.5 and will" + " be removed in version 1.0. Use 'EnvironBuilder' or" + " 'FileStorage' instead.", + DeprecationWarning, + stacklevel=2, + ) + return FileStorage(fd, filename=filename, content_type=mimetype) + + +class _TestCookieHeaders(object): + + """A headers adapter for cookielib + """ + + def __init__(self, headers): + self.headers = headers + + def getheaders(self, name): + headers = [] + name = name.lower() + for k, v in self.headers: + if k.lower() == name: + headers.append(v) + return headers + + def get_all(self, name, default=None): + rv = [] + for k, v in self.headers: + if k.lower() == name.lower(): + rv.append(v) + return rv or default or [] + + +class _TestCookieResponse(object): + + """Something that looks like a httplib.HTTPResponse, but is actually just an + adapter for our test responses to make them available for cookielib. + """ + + def __init__(self, headers): + self.headers = _TestCookieHeaders(headers) + + def info(self): + return self.headers + + +class _TestCookieJar(CookieJar): + + """A cookielib.CookieJar modified to inject and read cookie headers from + and to wsgi environments, and wsgi application responses. + """ + + def inject_wsgi(self, environ): + """Inject the cookies as client headers into the server's wsgi + environment. + """ + cvals = ["%s=%s" % (c.name, c.value) for c in self] + + if cvals: + environ["HTTP_COOKIE"] = "; ".join(cvals) + else: + environ.pop("HTTP_COOKIE", None) + + def extract_wsgi(self, environ, headers): + """Extract the server's set-cookie headers as cookies into the + cookie jar. + """ + self.extract_cookies( + _TestCookieResponse(headers), U2Request(get_current_url(environ)) + ) + + +def _iter_data(data): + """Iterates over a `dict` or :class:`MultiDict` yielding all keys and + values. + This is used to iterate over the data passed to the + :class:`EnvironBuilder`. + """ + if isinstance(data, MultiDict): + for key, values in iterlists(data): + for value in values: + yield key, value + else: + for key, values in iteritems(data): + if isinstance(values, list): + for value in values: + yield key, value + else: + yield key, values + + +class EnvironBuilder(object): + """This class can be used to conveniently create a WSGI environment + for testing purposes. It can be used to quickly create WSGI environments + or request objects from arbitrary data. + + The signature of this class is also used in some other places as of + Werkzeug 0.5 (:func:`create_environ`, :meth:`BaseResponse.from_values`, + :meth:`Client.open`). Because of this most of the functionality is + available through the constructor alone. + + Files and regular form data can be manipulated independently of each + other with the :attr:`form` and :attr:`files` attributes, but are + passed with the same argument to the constructor: `data`. + + `data` can be any of these values: + + - a `str` or `bytes` object: The object is converted into an + :attr:`input_stream`, the :attr:`content_length` is set and you have to + provide a :attr:`content_type`. + - a `dict` or :class:`MultiDict`: The keys have to be strings. The values + have to be either any of the following objects, or a list of any of the + following objects: + + - a :class:`file`-like object: These are converted into + :class:`FileStorage` objects automatically. + - a `tuple`: The :meth:`~FileMultiDict.add_file` method is called + with the key and the unpacked `tuple` items as positional + arguments. + - a `str`: The string is set as form data for the associated key. + - a file-like object: The object content is loaded in memory and then + handled like a regular `str` or a `bytes`. + + :param path: the path of the request. In the WSGI environment this will + end up as `PATH_INFO`. If the `query_string` is not defined + and there is a question mark in the `path` everything after + it is used as query string. + :param base_url: the base URL is a URL that is used to extract the WSGI + URL scheme, host (server name + server port) and the + script root (`SCRIPT_NAME`). + :param query_string: an optional string or dict with URL parameters. + :param method: the HTTP method to use, defaults to `GET`. + :param input_stream: an optional input stream. Do not specify this and + `data`. As soon as an input stream is set you can't + modify :attr:`args` and :attr:`files` unless you + set the :attr:`input_stream` to `None` again. + :param content_type: The content type for the request. As of 0.5 you + don't have to provide this when specifying files + and form data via `data`. + :param content_length: The content length for the request. You don't + have to specify this when providing data via + `data`. + :param errors_stream: an optional error stream that is used for + `wsgi.errors`. Defaults to :data:`stderr`. + :param multithread: controls `wsgi.multithread`. Defaults to `False`. + :param multiprocess: controls `wsgi.multiprocess`. Defaults to `False`. + :param run_once: controls `wsgi.run_once`. Defaults to `False`. + :param headers: an optional list or :class:`Headers` object of headers. + :param data: a string or dict of form data or a file-object. + See explanation above. + :param json: An object to be serialized and assigned to ``data``. + Defaults the content type to ``"application/json"``. + Serialized with the function assigned to :attr:`json_dumps`. + :param environ_base: an optional dict of environment defaults. + :param environ_overrides: an optional dict of environment overrides. + :param charset: the charset used to encode unicode data. + + .. versionadded:: 0.15 + The ``json`` param and :meth:`json_dumps` method. + + .. versionadded:: 0.15 + The environ has keys ``REQUEST_URI`` and ``RAW_URI`` containing + the path before perecent-decoding. This is not part of the WSGI + PEP, but many WSGI servers include it. + + .. versionchanged:: 0.6 + ``path`` and ``base_url`` can now be unicode strings that are + encoded with :func:`iri_to_uri`. + """ + + #: the server protocol to use. defaults to HTTP/1.1 + server_protocol = "HTTP/1.1" + + #: the wsgi version to use. defaults to (1, 0) + wsgi_version = (1, 0) + + #: the default request class for :meth:`get_request` + request_class = BaseRequest + + import json + + #: The serialization function used when ``json`` is passed. + json_dumps = staticmethod(json.dumps) + del json + + def __init__( + self, + path="/", + base_url=None, + query_string=None, + method="GET", + input_stream=None, + content_type=None, + content_length=None, + errors_stream=None, + multithread=False, + multiprocess=False, + run_once=False, + headers=None, + data=None, + environ_base=None, + environ_overrides=None, + charset="utf-8", + mimetype=None, + json=None, + ): + path_s = make_literal_wrapper(path) + if query_string is not None and path_s("?") in path: + raise ValueError("Query string is defined in the path and as an argument") + if query_string is None and path_s("?") in path: + path, query_string = path.split(path_s("?"), 1) + self.charset = charset + self.path = iri_to_uri(path) + if base_url is not None: + base_url = url_fix(iri_to_uri(base_url, charset), charset) + self.base_url = base_url + if isinstance(query_string, (bytes, text_type)): + self.query_string = query_string + else: + if query_string is None: + query_string = MultiDict() + elif not isinstance(query_string, MultiDict): + query_string = MultiDict(query_string) + self.args = query_string + self.method = method + if headers is None: + headers = Headers() + elif not isinstance(headers, Headers): + headers = Headers(headers) + self.headers = headers + if content_type is not None: + self.content_type = content_type + if errors_stream is None: + errors_stream = sys.stderr + self.errors_stream = errors_stream + self.multithread = multithread + self.multiprocess = multiprocess + self.run_once = run_once + self.environ_base = environ_base + self.environ_overrides = environ_overrides + self.input_stream = input_stream + self.content_length = content_length + self.closed = False + + if json is not None: + if data is not None: + raise TypeError("can't provide both json and data") + + data = self.json_dumps(json) + + if self.content_type is None: + self.content_type = "application/json" + + if data: + if input_stream is not None: + raise TypeError("can't provide input stream and data") + if hasattr(data, "read"): + data = data.read() + if isinstance(data, text_type): + data = data.encode(self.charset) + if isinstance(data, bytes): + self.input_stream = BytesIO(data) + if self.content_length is None: + self.content_length = len(data) + else: + for key, value in _iter_data(data): + if isinstance(value, (tuple, dict)) or hasattr(value, "read"): + self._add_file_from_data(key, value) + else: + self.form.setlistdefault(key).append(value) + + if mimetype is not None: + self.mimetype = mimetype + + @classmethod + def from_environ(cls, environ, **kwargs): + """Turn an environ dict back into a builder. Any extra kwargs + override the args extracted from the environ. + + .. versionadded:: 0.15 + """ + headers = Headers(EnvironHeaders(environ)) + out = { + "path": environ["PATH_INFO"], + "base_url": cls._make_base_url( + environ["wsgi.url_scheme"], headers.pop("Host"), environ["SCRIPT_NAME"] + ), + "query_string": environ["QUERY_STRING"], + "method": environ["REQUEST_METHOD"], + "input_stream": environ["wsgi.input"], + "content_type": headers.pop("Content-Type", None), + "content_length": headers.pop("Content-Length", None), + "errors_stream": environ["wsgi.errors"], + "multithread": environ["wsgi.multithread"], + "multiprocess": environ["wsgi.multiprocess"], + "run_once": environ["wsgi.run_once"], + "headers": headers, + } + out.update(kwargs) + return cls(**out) + + def _add_file_from_data(self, key, value): + """Called in the EnvironBuilder to add files from the data dict.""" + if isinstance(value, tuple): + self.files.add_file(key, *value) + elif isinstance(value, dict): + from warnings import warn + + warn( + "Passing a dict as file data is deprecated as of" + " version 0.5 and will be removed in version 1.0. Use" + " a tuple or 'FileStorage' object instead.", + DeprecationWarning, + stacklevel=2, + ) + value = dict(value) + mimetype = value.pop("mimetype", None) + if mimetype is not None: + value["content_type"] = mimetype + self.files.add_file(key, **value) + else: + self.files.add_file(key, value) + + @staticmethod + def _make_base_url(scheme, host, script_root): + return url_unparse((scheme, host, script_root, "", "")).rstrip("/") + "/" + + @property + def base_url(self): + """The base URL is used to extract the URL scheme, host name, + port, and root path. + """ + return self._make_base_url(self.url_scheme, self.host, self.script_root) + + @base_url.setter + def base_url(self, value): + if value is None: + scheme = "http" + netloc = "localhost" + script_root = "" + else: + scheme, netloc, script_root, qs, anchor = url_parse(value) + if qs or anchor: + raise ValueError("base url must not contain a query string or fragment") + self.script_root = script_root.rstrip("/") + self.host = netloc + self.url_scheme = scheme + + def _get_content_type(self): + ct = self.headers.get("Content-Type") + if ct is None and not self._input_stream: + if self._files: + return "multipart/form-data" + elif self._form: + return "application/x-www-form-urlencoded" + return None + return ct + + def _set_content_type(self, value): + if value is None: + self.headers.pop("Content-Type", None) + else: + self.headers["Content-Type"] = value + + content_type = property( + _get_content_type, + _set_content_type, + doc="""The content type for the request. Reflected from and to + the :attr:`headers`. Do not set if you set :attr:`files` or + :attr:`form` for auto detection.""", + ) + del _get_content_type, _set_content_type + + def _get_content_length(self): + return self.headers.get("Content-Length", type=int) + + def _get_mimetype(self): + ct = self.content_type + if ct: + return ct.split(";")[0].strip() + + def _set_mimetype(self, value): + self.content_type = get_content_type(value, self.charset) + + def _get_mimetype_params(self): + def on_update(d): + self.headers["Content-Type"] = dump_options_header(self.mimetype, d) + + d = parse_options_header(self.headers.get("content-type", ""))[1] + return CallbackDict(d, on_update) + + mimetype = property( + _get_mimetype, + _set_mimetype, + doc="""The mimetype (content type without charset etc.) + + .. versionadded:: 0.14 + """, + ) + mimetype_params = property( + _get_mimetype_params, + doc=""" The mimetype parameters as dict. For example if the + content type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + + .. versionadded:: 0.14 + """, + ) + del _get_mimetype, _set_mimetype, _get_mimetype_params + + def _set_content_length(self, value): + if value is None: + self.headers.pop("Content-Length", None) + else: + self.headers["Content-Length"] = str(value) + + content_length = property( + _get_content_length, + _set_content_length, + doc="""The content length as integer. Reflected from and to the + :attr:`headers`. Do not set if you set :attr:`files` or + :attr:`form` for auto detection.""", + ) + del _get_content_length, _set_content_length + + def form_property(name, storage, doc): # noqa: B902 + key = "_" + name + + def getter(self): + if self._input_stream is not None: + raise AttributeError("an input stream is defined") + rv = getattr(self, key) + if rv is None: + rv = storage() + setattr(self, key, rv) + + return rv + + def setter(self, value): + self._input_stream = None + setattr(self, key, value) + + return property(getter, setter, doc=doc) + + form = form_property("form", MultiDict, doc="A :class:`MultiDict` of form values.") + files = form_property( + "files", + FileMultiDict, + doc="""A :class:`FileMultiDict` of uploaded files. You can use + the :meth:`~FileMultiDict.add_file` method to add new files to + the dict.""", + ) + del form_property + + def _get_input_stream(self): + return self._input_stream + + def _set_input_stream(self, value): + self._input_stream = value + self._form = self._files = None + + input_stream = property( + _get_input_stream, + _set_input_stream, + doc="""An optional input stream. If you set this it will clear + :attr:`form` and :attr:`files`.""", + ) + del _get_input_stream, _set_input_stream + + def _get_query_string(self): + if self._query_string is None: + if self._args is not None: + return url_encode(self._args, charset=self.charset) + return "" + return self._query_string + + def _set_query_string(self, value): + self._query_string = value + self._args = None + + query_string = property( + _get_query_string, + _set_query_string, + doc="""The query string. If you set this to a string + :attr:`args` will no longer be available.""", + ) + del _get_query_string, _set_query_string + + def _get_args(self): + if self._query_string is not None: + raise AttributeError("a query string is defined") + if self._args is None: + self._args = MultiDict() + return self._args + + def _set_args(self, value): + self._query_string = None + self._args = value + + args = property( + _get_args, _set_args, doc="The URL arguments as :class:`MultiDict`." + ) + del _get_args, _set_args + + @property + def server_name(self): + """The server name (read-only, use :attr:`host` to set)""" + return self.host.split(":", 1)[0] + + @property + def server_port(self): + """The server port as integer (read-only, use :attr:`host` to set)""" + pieces = self.host.split(":", 1) + if len(pieces) == 2 and pieces[1].isdigit(): + return int(pieces[1]) + elif self.url_scheme == "https": + return 443 + return 80 + + def __del__(self): + try: + self.close() + except Exception: + pass + + def close(self): + """Closes all files. If you put real :class:`file` objects into the + :attr:`files` dict you can call this method to automatically close + them all in one go. + """ + if self.closed: + return + try: + files = itervalues(self.files) + except AttributeError: + files = () + for f in files: + try: + f.close() + except Exception: + pass + self.closed = True + + def get_environ(self): + """Return the built environ. + + .. versionchanged:: 0.15 + The content type and length headers are set based on + input stream detection. Previously this only set the WSGI + keys. + """ + input_stream = self.input_stream + content_length = self.content_length + + mimetype = self.mimetype + content_type = self.content_type + + if input_stream is not None: + start_pos = input_stream.tell() + input_stream.seek(0, 2) + end_pos = input_stream.tell() + input_stream.seek(start_pos) + content_length = end_pos - start_pos + elif mimetype == "multipart/form-data": + values = CombinedMultiDict([self.form, self.files]) + input_stream, content_length, boundary = stream_encode_multipart( + values, charset=self.charset + ) + content_type = mimetype + '; boundary="%s"' % boundary + elif mimetype == "application/x-www-form-urlencoded": + # XXX: py2v3 review + values = url_encode(self.form, charset=self.charset) + values = values.encode("ascii") + content_length = len(values) + input_stream = BytesIO(values) + else: + input_stream = BytesIO() + + result = {} + if self.environ_base: + result.update(self.environ_base) + + def _path_encode(x): + return wsgi_encoding_dance(url_unquote(x, self.charset), self.charset) + + qs = wsgi_encoding_dance(self.query_string) + + result.update( + { + "REQUEST_METHOD": self.method, + "SCRIPT_NAME": _path_encode(self.script_root), + "PATH_INFO": _path_encode(self.path), + "QUERY_STRING": qs, + # Non-standard, added by mod_wsgi, uWSGI + "REQUEST_URI": wsgi_encoding_dance(self.path), + # Non-standard, added by gunicorn + "RAW_URI": wsgi_encoding_dance(self.path), + "SERVER_NAME": self.server_name, + "SERVER_PORT": str(self.server_port), + "HTTP_HOST": self.host, + "SERVER_PROTOCOL": self.server_protocol, + "wsgi.version": self.wsgi_version, + "wsgi.url_scheme": self.url_scheme, + "wsgi.input": input_stream, + "wsgi.errors": self.errors_stream, + "wsgi.multithread": self.multithread, + "wsgi.multiprocess": self.multiprocess, + "wsgi.run_once": self.run_once, + } + ) + + headers = self.headers.copy() + + if content_type is not None: + result["CONTENT_TYPE"] = content_type + headers.set("Content-Type", content_type) + + if content_length is not None: + result["CONTENT_LENGTH"] = str(content_length) + headers.set("Content-Length", content_length) + + for key, value in headers.to_wsgi_list(): + result["HTTP_%s" % key.upper().replace("-", "_")] = value + + if self.environ_overrides: + result.update(self.environ_overrides) + + return result + + def get_request(self, cls=None): + """Returns a request with the data. If the request class is not + specified :attr:`request_class` is used. + + :param cls: The request wrapper to use. + """ + if cls is None: + cls = self.request_class + return cls(self.get_environ()) + + +class ClientRedirectError(Exception): + """If a redirect loop is detected when using follow_redirects=True with + the :cls:`Client`, then this exception is raised. + """ + + +class Client(object): + """This class allows you to send requests to a wrapped application. + + The response wrapper can be a class or factory function that takes + three arguments: app_iter, status and headers. The default response + wrapper just returns a tuple. + + Example:: + + class ClientResponse(BaseResponse): + ... + + client = Client(MyApplication(), response_wrapper=ClientResponse) + + The use_cookies parameter indicates whether cookies should be stored and + sent for subsequent requests. This is True by default, but passing False + will disable this behaviour. + + If you want to request some subdomain of your application you may set + `allow_subdomain_redirects` to `True` as if not no external redirects + are allowed. + + .. versionadded:: 0.5 + `use_cookies` is new in this version. Older versions did not provide + builtin cookie support. + + .. versionadded:: 0.14 + The `mimetype` parameter was added. + + .. versionadded:: 0.15 + The ``json`` parameter. + """ + + def __init__( + self, + application, + response_wrapper=None, + use_cookies=True, + allow_subdomain_redirects=False, + ): + self.application = application + self.response_wrapper = response_wrapper + if use_cookies: + self.cookie_jar = _TestCookieJar() + else: + self.cookie_jar = None + self.allow_subdomain_redirects = allow_subdomain_redirects + + def set_cookie( + self, + server_name, + key, + value="", + max_age=None, + expires=None, + path="/", + domain=None, + secure=None, + httponly=False, + charset="utf-8", + ): + """Sets a cookie in the client's cookie jar. The server name + is required and has to match the one that is also passed to + the open call. + """ + assert self.cookie_jar is not None, "cookies disabled" + header = dump_cookie( + key, value, max_age, expires, path, domain, secure, httponly, charset + ) + environ = create_environ(path, base_url="http://" + server_name) + headers = [("Set-Cookie", header)] + self.cookie_jar.extract_wsgi(environ, headers) + + def delete_cookie(self, server_name, key, path="/", domain=None): + """Deletes a cookie in the test client.""" + self.set_cookie( + server_name, key, expires=0, max_age=0, path=path, domain=domain + ) + + def run_wsgi_app(self, environ, buffered=False): + """Runs the wrapped WSGI app with the given environment.""" + if self.cookie_jar is not None: + self.cookie_jar.inject_wsgi(environ) + rv = run_wsgi_app(self.application, environ, buffered=buffered) + if self.cookie_jar is not None: + self.cookie_jar.extract_wsgi(environ, rv[2]) + return rv + + def resolve_redirect(self, response, new_location, environ, buffered=False): + """Perform a new request to the location given by the redirect + response to the previous request. + """ + scheme, netloc, path, qs, anchor = url_parse(new_location) + builder = EnvironBuilder.from_environ(environ, query_string=qs) + + to_name_parts = netloc.split(":", 1)[0].split(".") + from_name_parts = builder.server_name.split(".") + + if to_name_parts != [""]: + # The new location has a host, use it for the base URL. + builder.url_scheme = scheme + builder.host = netloc + else: + # A local redirect with autocorrect_location_header=False + # doesn't have a host, so use the request's host. + to_name_parts = from_name_parts + + # Explain why a redirect to a different server name won't be followed. + if to_name_parts != from_name_parts: + if to_name_parts[-len(from_name_parts) :] == from_name_parts: + if not self.allow_subdomain_redirects: + raise RuntimeError("Following subdomain redirects is not enabled.") + else: + raise RuntimeError("Following external redirects is not supported.") + + path_parts = path.split("/") + root_parts = builder.script_root.split("/") + + if path_parts[: len(root_parts)] == root_parts: + # Strip the script root from the path. + builder.path = path[len(builder.script_root) :] + else: + # The new location is not under the script root, so use the + # whole path and clear the previous root. + builder.path = path + builder.script_root = "" + + status_code = int(response[1].split(None, 1)[0]) + + # Only 307 and 308 preserve all of the original request. + if status_code not in {307, 308}: + # HEAD is preserved, everything else becomes GET. + if builder.method != "HEAD": + builder.method = "GET" + + # Clear the body and the headers that describe it. + builder.input_stream = None + builder.content_type = None + builder.content_length = None + builder.headers.pop("Transfer-Encoding", None) + + # Disable the response wrapper while handling redirects. Not + # thread safe, but the client should not be shared anyway. + old_response_wrapper = self.response_wrapper + self.response_wrapper = None + + try: + return self.open(builder, as_tuple=True, buffered=buffered) + finally: + self.response_wrapper = old_response_wrapper + + def open(self, *args, **kwargs): + """Takes the same arguments as the :class:`EnvironBuilder` class with + some additions: You can provide a :class:`EnvironBuilder` or a WSGI + environment as only argument instead of the :class:`EnvironBuilder` + arguments and two optional keyword arguments (`as_tuple`, `buffered`) + that change the type of the return value or the way the application is + executed. + + .. versionchanged:: 0.5 + If a dict is provided as file in the dict for the `data` parameter + the content type has to be called `content_type` now instead of + `mimetype`. This change was made for consistency with + :class:`werkzeug.FileWrapper`. + + The `follow_redirects` parameter was added to :func:`open`. + + Additional parameters: + + :param as_tuple: Returns a tuple in the form ``(environ, result)`` + :param buffered: Set this to True to buffer the application run. + This will automatically close the application for + you as well. + :param follow_redirects: Set this to True if the `Client` should + follow HTTP redirects. + """ + as_tuple = kwargs.pop("as_tuple", False) + buffered = kwargs.pop("buffered", False) + follow_redirects = kwargs.pop("follow_redirects", False) + environ = None + if not kwargs and len(args) == 1: + if isinstance(args[0], EnvironBuilder): + environ = args[0].get_environ() + elif isinstance(args[0], dict): + environ = args[0] + if environ is None: + builder = EnvironBuilder(*args, **kwargs) + try: + environ = builder.get_environ() + finally: + builder.close() + + response = self.run_wsgi_app(environ.copy(), buffered=buffered) + + # handle redirects + redirect_chain = [] + while 1: + status_code = int(response[1].split(None, 1)[0]) + if ( + status_code not in {301, 302, 303, 305, 307, 308} + or not follow_redirects + ): + break + + # Exhaust intermediate response bodies to ensure middleware + # that returns an iterator runs any cleanup code. + if not buffered: + for _ in response[0]: + pass + + new_location = response[2]["location"] + new_redirect_entry = (new_location, status_code) + if new_redirect_entry in redirect_chain: + raise ClientRedirectError("loop detected") + redirect_chain.append(new_redirect_entry) + environ, response = self.resolve_redirect( + response, new_location, environ, buffered=buffered + ) + + if self.response_wrapper is not None: + response = self.response_wrapper(*response) + if as_tuple: + return environ, response + return response + + def get(self, *args, **kw): + """Like open but method is enforced to GET.""" + kw["method"] = "GET" + return self.open(*args, **kw) + + def patch(self, *args, **kw): + """Like open but method is enforced to PATCH.""" + kw["method"] = "PATCH" + return self.open(*args, **kw) + + def post(self, *args, **kw): + """Like open but method is enforced to POST.""" + kw["method"] = "POST" + return self.open(*args, **kw) + + def head(self, *args, **kw): + """Like open but method is enforced to HEAD.""" + kw["method"] = "HEAD" + return self.open(*args, **kw) + + def put(self, *args, **kw): + """Like open but method is enforced to PUT.""" + kw["method"] = "PUT" + return self.open(*args, **kw) + + def delete(self, *args, **kw): + """Like open but method is enforced to DELETE.""" + kw["method"] = "DELETE" + return self.open(*args, **kw) + + def options(self, *args, **kw): + """Like open but method is enforced to OPTIONS.""" + kw["method"] = "OPTIONS" + return self.open(*args, **kw) + + def trace(self, *args, **kw): + """Like open but method is enforced to TRACE.""" + kw["method"] = "TRACE" + return self.open(*args, **kw) + + def __repr__(self): + return "<%s %r>" % (self.__class__.__name__, self.application) + + +def create_environ(*args, **kwargs): + """Create a new WSGI environ dict based on the values passed. The first + parameter should be the path of the request which defaults to '/'. The + second one can either be an absolute path (in that case the host is + localhost:80) or a full path to the request with scheme, netloc port and + the path to the script. + + This accepts the same arguments as the :class:`EnvironBuilder` + constructor. + + .. versionchanged:: 0.5 + This function is now a thin wrapper over :class:`EnvironBuilder` which + was added in 0.5. The `headers`, `environ_base`, `environ_overrides` + and `charset` parameters were added. + """ + builder = EnvironBuilder(*args, **kwargs) + try: + return builder.get_environ() + finally: + builder.close() + + +def run_wsgi_app(app, environ, buffered=False): + """Return a tuple in the form (app_iter, status, headers) of the + application output. This works best if you pass it an application that + returns an iterator all the time. + + Sometimes applications may use the `write()` callable returned + by the `start_response` function. This tries to resolve such edge + cases automatically. But if you don't get the expected output you + should set `buffered` to `True` which enforces buffering. + + If passed an invalid WSGI application the behavior of this function is + undefined. Never pass non-conforming WSGI applications to this function. + + :param app: the application to execute. + :param buffered: set to `True` to enforce buffering. + :return: tuple in the form ``(app_iter, status, headers)`` + """ + environ = _get_environ(environ) + response = [] + buffer = [] + + def start_response(status, headers, exc_info=None): + if exc_info is not None: + reraise(*exc_info) + response[:] = [status, headers] + return buffer.append + + app_rv = app(environ, start_response) + close_func = getattr(app_rv, "close", None) + app_iter = iter(app_rv) + + # when buffering we emit the close call early and convert the + # application iterator into a regular list + if buffered: + try: + app_iter = list(app_iter) + finally: + if close_func is not None: + close_func() + + # otherwise we iterate the application iter until we have a response, chain + # the already received data with the already collected data and wrap it in + # a new `ClosingIterator` if we need to restore a `close` callable from the + # original return value. + else: + for item in app_iter: + buffer.append(item) + if response: + break + if buffer: + app_iter = chain(buffer, app_iter) + if close_func is not None and app_iter is not app_rv: + app_iter = ClosingIterator(app_iter, close_func) + + return app_iter, response[0], Headers(response[1]) diff --git a/brightonpy/Lib/site-packages/werkzeug/testapp.py b/brightonpy/Lib/site-packages/werkzeug/testapp.py new file mode 100644 index 0000000..5ea8549 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/testapp.py @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.testapp + ~~~~~~~~~~~~~~~~ + + Provide a small test application that can be used to test a WSGI server + and check it for WSGI compliance. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import base64 +import os +import sys +from textwrap import wrap + +from . import __version__ as _werkzeug_version +from .utils import escape +from .wrappers import BaseRequest as Request +from .wrappers import BaseResponse as Response + +logo = Response( + base64.b64decode( + """ +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 +=""" + ), + mimetype="image/png", +) + + +TEMPLATE = u"""\ + +WSGI Information + +
    + +

    WSGI Information

    +

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

    Python Interpreter

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

    WSGI Environment

    + %(wsgi_env)s
    +

    Installed Eggs

    +

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

      %(python_eggs)s
    +

    System Path

    +

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

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

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

    foo bar

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

    <foo>

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

    Redirecting...

    \n" + "

    You should be redirected automatically to target URL: " + '%s. If not click the link.' + % (escape(location), display_location), + code, + mimetype="text/html", + ) + response.headers["Location"] = location + return response + + +def append_slash_redirect(environ, code=301): + """Redirects to the same URL but with a slash appended. The behavior + of this function is undefined if the path ends with a slash already. + + :param environ: the WSGI environment for the request that triggers + the redirect. + :param code: the status code for the redirect. + """ + new_path = environ["PATH_INFO"].strip("/") + "/" + query_string = environ.get("QUERY_STRING") + if query_string: + new_path += "?" + query_string + return redirect(new_path, code) + + +def import_string(import_name, silent=False): + """Imports an object based on a string. This is useful if you want to + use import paths as endpoints or something similar. An import path can + be specified either in dotted notation (``xml.sax.saxutils.escape``) + or with a colon as object delimiter (``xml.sax.saxutils:escape``). + + If `silent` is True the return value will be `None` if the import fails. + + :param import_name: the dotted name for the object to import. + :param silent: if set to `True` import errors are ignored and + `None` is returned instead. + :return: imported object + """ + # force the import name to automatically convert to strings + # __import__ is not able to handle unicode strings in the fromlist + # if the module is a package + import_name = str(import_name).replace(":", ".") + try: + try: + __import__(import_name) + except ImportError: + if "." not in import_name: + raise + else: + return sys.modules[import_name] + + module_name, obj_name = import_name.rsplit(".", 1) + module = __import__(module_name, globals(), locals(), [obj_name]) + try: + return getattr(module, obj_name) + except AttributeError as e: + raise ImportError(e) + + except ImportError as e: + if not silent: + reraise( + ImportStringError, ImportStringError(import_name, e), sys.exc_info()[2] + ) + + +def find_modules(import_path, include_packages=False, recursive=False): + """Finds all the modules below a package. This can be useful to + automatically import all views / controllers so that their metaclasses / + function decorators have a chance to register themselves on the + application. + + Packages are not returned unless `include_packages` is `True`. This can + also recursively list modules but in that case it will import all the + packages to get the correct load path of that module. + + :param import_path: the dotted name for the package to find child modules. + :param include_packages: set to `True` if packages should be returned, too. + :param recursive: set to `True` if recursion should happen. + :return: generator + """ + module = import_string(import_path) + path = getattr(module, "__path__", None) + if path is None: + raise ValueError("%r is not a package" % import_path) + basename = module.__name__ + "." + for _importer, modname, ispkg in pkgutil.iter_modules(path): + modname = basename + modname + if ispkg: + if include_packages: + yield modname + if recursive: + for item in find_modules(modname, include_packages, True): + yield item + else: + yield modname + + +def validate_arguments(func, args, kwargs, drop_extra=True): + """Checks if the function accepts the arguments and keyword arguments. + Returns a new ``(args, kwargs)`` tuple that can safely be passed to + the function without causing a `TypeError` because the function signature + is incompatible. If `drop_extra` is set to `True` (which is the default) + any extra positional or keyword arguments are dropped automatically. + + The exception raised provides three attributes: + + `missing` + A set of argument names that the function expected but where + missing. + + `extra` + A dict of keyword arguments that the function can not handle but + where provided. + + `extra_positional` + A list of values that where given by positional argument but the + function cannot accept. + + This can be useful for decorators that forward user submitted data to + a view function:: + + from werkzeug.utils import ArgumentValidationError, validate_arguments + + def sanitize(f): + def proxy(request): + data = request.values.to_dict() + try: + args, kwargs = validate_arguments(f, (request,), data) + except ArgumentValidationError: + raise BadRequest('The browser failed to transmit all ' + 'the data expected.') + return f(*args, **kwargs) + return proxy + + :param func: the function the validation is performed against. + :param args: a tuple of positional arguments. + :param kwargs: a dict of keyword arguments. + :param drop_extra: set to `False` if you don't want extra arguments + to be silently dropped. + :return: tuple in the form ``(args, kwargs)``. + """ + parser = _parse_signature(func) + args, kwargs, missing, extra, extra_positional = parser(args, kwargs)[:5] + if missing: + raise ArgumentValidationError(tuple(missing)) + elif (extra or extra_positional) and not drop_extra: + raise ArgumentValidationError(None, extra, extra_positional) + return tuple(args), kwargs + + +def bind_arguments(func, args, kwargs): + """Bind the arguments provided into a dict. When passed a function, + a tuple of arguments and a dict of keyword arguments `bind_arguments` + returns a dict of names as the function would see it. This can be useful + to implement a cache decorator that uses the function arguments to build + the cache key based on the values of the arguments. + + :param func: the function the arguments should be bound for. + :param args: tuple of positional arguments. + :param kwargs: a dict of keyword arguments. + :return: a :class:`dict` of bound keyword arguments. + """ + ( + args, + kwargs, + missing, + extra, + extra_positional, + arg_spec, + vararg_var, + kwarg_var, + ) = _parse_signature(func)(args, kwargs) + values = {} + for (name, _has_default, _default), value in zip(arg_spec, args): + values[name] = value + if vararg_var is not None: + values[vararg_var] = tuple(extra_positional) + elif extra_positional: + raise TypeError("too many positional arguments") + if kwarg_var is not None: + multikw = set(extra) & set([x[0] for x in arg_spec]) + if multikw: + raise TypeError( + "got multiple values for keyword argument " + repr(next(iter(multikw))) + ) + values[kwarg_var] = extra + elif extra: + raise TypeError("got unexpected keyword argument " + repr(next(iter(extra)))) + return values + + +class ArgumentValidationError(ValueError): + + """Raised if :func:`validate_arguments` fails to validate""" + + def __init__(self, missing=None, extra=None, extra_positional=None): + self.missing = set(missing or ()) + self.extra = extra or {} + self.extra_positional = extra_positional or [] + ValueError.__init__( + self, + "function arguments invalid. (%d missing, %d additional)" + % (len(self.missing), len(self.extra) + len(self.extra_positional)), + ) + + +class ImportStringError(ImportError): + """Provides information about a failed :func:`import_string` attempt.""" + + #: String in dotted notation that failed to be imported. + import_name = None + #: Wrapped exception. + exception = None + + def __init__(self, import_name, exception): + self.import_name = import_name + self.exception = exception + + msg = ( + "import_string() failed for %r. Possible reasons are:\n\n" + "- missing __init__.py in a package;\n" + "- package or module path not included in sys.path;\n" + "- duplicated package or module name taking precedence in " + "sys.path;\n" + "- missing module, class, function or variable;\n\n" + "Debugged import:\n\n%s\n\n" + "Original exception:\n\n%s: %s" + ) + + name = "" + tracked = [] + for part in import_name.replace(":", ".").split("."): + name += (name and ".") + part + imported = import_string(name, silent=True) + if imported: + tracked.append((name, getattr(imported, "__file__", None))) + else: + track = ["- %r found in %r." % (n, i) for n, i in tracked] + track.append("- %r not found." % name) + msg = msg % ( + import_name, + "\n".join(track), + exception.__class__.__name__, + str(exception), + ) + break + + ImportError.__init__(self, msg) + + def __repr__(self): + return "<%s(%r, %r)>" % ( + self.__class__.__name__, + self.import_name, + self.exception, + ) + + +from werkzeug import _DeprecatedImportModule + +_DeprecatedImportModule( + __name__, + { + ".datastructures": [ + "CombinedMultiDict", + "EnvironHeaders", + "Headers", + "MultiDict", + ], + ".http": ["dump_cookie", "parse_cookie"], + }, + "Werkzeug 1.0", +) +del _DeprecatedImportModule diff --git a/brightonpy/Lib/site-packages/werkzeug/wrappers/__init__.py b/brightonpy/Lib/site-packages/werkzeug/wrappers/__init__.py new file mode 100644 index 0000000..56c764a --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/wrappers/__init__.py @@ -0,0 +1,36 @@ +""" +werkzeug.wrappers +~~~~~~~~~~~~~~~~~ + +The wrappers are simple request and response objects which you can +subclass to do whatever you want them to do. The request object contains +the information transmitted by the client (webbrowser) and the response +object contains all the information sent back to the browser. + +An important detail is that the request object is created with the WSGI +environ and will act as high-level proxy whereas the response object is an +actual WSGI application. + +Like everything else in Werkzeug these objects will work correctly with +unicode data. Incoming form data parsed by the response object will be +decoded into an unicode object if possible and if it makes sense. + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +from .accept import AcceptMixin +from .auth import AuthorizationMixin +from .auth import WWWAuthenticateMixin +from .base_request import BaseRequest +from .base_response import BaseResponse +from .common_descriptors import CommonRequestDescriptorsMixin +from .common_descriptors import CommonResponseDescriptorsMixin +from .etag import ETagRequestMixin +from .etag import ETagResponseMixin +from .request import PlainRequest +from .request import Request +from .request import StreamOnlyMixin +from .response import Response +from .response import ResponseStream +from .response import ResponseStreamMixin +from .user_agent import UserAgentMixin diff --git a/brightonpy/Lib/site-packages/werkzeug/wrappers/accept.py b/brightonpy/Lib/site-packages/werkzeug/wrappers/accept.py new file mode 100644 index 0000000..d0620a0 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/wrappers/accept.py @@ -0,0 +1,50 @@ +from ..datastructures import CharsetAccept +from ..datastructures import LanguageAccept +from ..datastructures import MIMEAccept +from ..http import parse_accept_header +from ..utils import cached_property + + +class AcceptMixin(object): + """A mixin for classes with an :attr:`~BaseResponse.environ` attribute + to get all the HTTP accept headers as + :class:`~werkzeug.datastructures.Accept` objects (or subclasses + thereof). + """ + + @cached_property + def accept_mimetypes(self): + """List of mimetypes this client supports as + :class:`~werkzeug.datastructures.MIMEAccept` object. + """ + return parse_accept_header(self.environ.get("HTTP_ACCEPT"), MIMEAccept) + + @cached_property + def accept_charsets(self): + """List of charsets this client supports as + :class:`~werkzeug.datastructures.CharsetAccept` object. + """ + return parse_accept_header( + self.environ.get("HTTP_ACCEPT_CHARSET"), CharsetAccept + ) + + @cached_property + def accept_encodings(self): + """List of encodings this client accepts. Encodings in a HTTP term + are compression encodings such as gzip. For charsets have a look at + :attr:`accept_charset`. + """ + return parse_accept_header(self.environ.get("HTTP_ACCEPT_ENCODING")) + + @cached_property + def accept_languages(self): + """List of languages this client accepts as + :class:`~werkzeug.datastructures.LanguageAccept` object. + + .. versionchanged 0.5 + In previous versions this was a regular + :class:`~werkzeug.datastructures.Accept` object. + """ + return parse_accept_header( + self.environ.get("HTTP_ACCEPT_LANGUAGE"), LanguageAccept + ) diff --git a/brightonpy/Lib/site-packages/werkzeug/wrappers/auth.py b/brightonpy/Lib/site-packages/werkzeug/wrappers/auth.py new file mode 100644 index 0000000..714f755 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/wrappers/auth.py @@ -0,0 +1,33 @@ +from ..http import parse_authorization_header +from ..http import parse_www_authenticate_header +from ..utils import cached_property + + +class AuthorizationMixin(object): + """Adds an :attr:`authorization` property that represents the parsed + value of the `Authorization` header as + :class:`~werkzeug.datastructures.Authorization` object. + """ + + @cached_property + def authorization(self): + """The `Authorization` object in parsed form.""" + header = self.environ.get("HTTP_AUTHORIZATION") + return parse_authorization_header(header) + + +class WWWAuthenticateMixin(object): + """Adds a :attr:`www_authenticate` property to a response object.""" + + @property + def www_authenticate(self): + """The `WWW-Authenticate` header in a parsed form.""" + + def on_update(www_auth): + if not www_auth and "www-authenticate" in self.headers: + del self.headers["www-authenticate"] + elif www_auth: + self.headers["WWW-Authenticate"] = www_auth.to_header() + + header = self.headers.get("www-authenticate") + return parse_www_authenticate_header(header, on_update) diff --git a/brightonpy/Lib/site-packages/werkzeug/wrappers/base_request.py b/brightonpy/Lib/site-packages/werkzeug/wrappers/base_request.py new file mode 100644 index 0000000..05a634e --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/wrappers/base_request.py @@ -0,0 +1,695 @@ +import warnings +from functools import update_wrapper +from io import BytesIO + +from .._compat import to_native +from .._compat import to_unicode +from .._compat import wsgi_decoding_dance +from .._compat import wsgi_get_bytes +from ..datastructures import CombinedMultiDict +from ..datastructures import EnvironHeaders +from ..datastructures import ImmutableList +from ..datastructures import ImmutableMultiDict +from ..datastructures import ImmutableTypeConversionDict +from ..datastructures import iter_multi_items +from ..datastructures import MultiDict +from ..formparser import default_stream_factory +from ..formparser import FormDataParser +from ..http import parse_cookie +from ..http import parse_options_header +from ..urls import url_decode +from ..utils import cached_property +from ..utils import environ_property +from ..wsgi import get_content_length +from ..wsgi import get_current_url +from ..wsgi import get_host +from ..wsgi import get_input_stream + + +class BaseRequest(object): + """Very basic request object. This does not implement advanced stuff like + entity tag parsing or cache controls. The request object is created with + the WSGI environment as first argument and will add itself to the WSGI + environment as ``'werkzeug.request'`` unless it's created with + `populate_request` set to False. + + There are a couple of mixins available that add additional functionality + to the request object, there is also a class called `Request` which + subclasses `BaseRequest` and all the important mixins. + + It's a good idea to create a custom subclass of the :class:`BaseRequest` + and add missing functionality either via mixins or direct implementation. + Here an example for such subclasses:: + + from werkzeug.wrappers import BaseRequest, ETagRequestMixin + + class Request(BaseRequest, ETagRequestMixin): + pass + + Request objects are **read only**. As of 0.5 modifications are not + allowed in any place. Unlike the lower level parsing functions the + request object will use immutable objects everywhere possible. + + Per default the request object will assume all the text data is `utf-8` + encoded. Please refer to :doc:`the unicode chapter ` for more + details about customizing the behavior. + + Per default the request object will be added to the WSGI + environment as `werkzeug.request` to support the debugging system. + If you don't want that, set `populate_request` to `False`. + + If `shallow` is `True` the environment is initialized as shallow + object around the environ. Every operation that would modify the + environ in any way (such as consuming form data) raises an exception + unless the `shallow` attribute is explicitly set to `False`. This + is useful for middlewares where you don't want to consume the form + data by accident. A shallow request is not populated to the WSGI + environment. + + .. versionchanged:: 0.5 + read-only mode was enforced by using immutables classes for all + data. + """ + + #: the charset for the request, defaults to utf-8 + charset = "utf-8" + + #: the error handling procedure for errors, defaults to 'replace' + encoding_errors = "replace" + + #: the maximum content length. This is forwarded to the form data + #: parsing function (:func:`parse_form_data`). When set and the + #: :attr:`form` or :attr:`files` attribute is accessed and the + #: parsing fails because more than the specified value is transmitted + #: a :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. + #: + #: Have a look at :ref:`dealing-with-request-data` for more details. + #: + #: .. versionadded:: 0.5 + max_content_length = None + + #: the maximum form field size. This is forwarded to the form data + #: parsing function (:func:`parse_form_data`). When set and the + #: :attr:`form` or :attr:`files` attribute is accessed and the + #: data in memory for post data is longer than the specified value a + #: :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. + #: + #: Have a look at :ref:`dealing-with-request-data` for more details. + #: + #: .. versionadded:: 0.5 + max_form_memory_size = None + + #: the class to use for `args` and `form`. The default is an + #: :class:`~werkzeug.datastructures.ImmutableMultiDict` which supports + #: multiple values per key. alternatively it makes sense to use an + #: :class:`~werkzeug.datastructures.ImmutableOrderedMultiDict` which + #: preserves order or a :class:`~werkzeug.datastructures.ImmutableDict` + #: which is the fastest but only remembers the last key. It is also + #: possible to use mutable structures, but this is not recommended. + #: + #: .. versionadded:: 0.6 + parameter_storage_class = ImmutableMultiDict + + #: the type to be used for list values from the incoming WSGI environment. + #: By default an :class:`~werkzeug.datastructures.ImmutableList` is used + #: (for example for :attr:`access_list`). + #: + #: .. versionadded:: 0.6 + list_storage_class = ImmutableList + + #: the type to be used for dict values from the incoming WSGI environment. + #: By default an + #: :class:`~werkzeug.datastructures.ImmutableTypeConversionDict` is used + #: (for example for :attr:`cookies`). + #: + #: .. versionadded:: 0.6 + dict_storage_class = ImmutableTypeConversionDict + + #: The form data parser that shoud be used. Can be replaced to customize + #: the form date parsing. + form_data_parser_class = FormDataParser + + #: Optionally a list of hosts that is trusted by this request. By default + #: all hosts are trusted which means that whatever the client sends the + #: host is will be accepted. + #: + #: Because `Host` and `X-Forwarded-Host` headers can be set to any value by + #: a malicious client, it is recommended to either set this property or + #: implement similar validation in the proxy (if application is being run + #: behind one). + #: + #: .. versionadded:: 0.9 + trusted_hosts = None + + #: Indicates whether the data descriptor should be allowed to read and + #: buffer up the input stream. By default it's enabled. + #: + #: .. versionadded:: 0.9 + disable_data_descriptor = False + + def __init__(self, environ, populate_request=True, shallow=False): + self.environ = environ + if populate_request and not shallow: + self.environ["werkzeug.request"] = self + self.shallow = shallow + + def __repr__(self): + # make sure the __repr__ even works if the request was created + # from an invalid WSGI environment. If we display the request + # in a debug session we don't want the repr to blow up. + args = [] + try: + args.append("'%s'" % to_native(self.url, self.url_charset)) + args.append("[%s]" % self.method) + except Exception: + args.append("(invalid WSGI environ)") + + return "<%s %s>" % (self.__class__.__name__, " ".join(args)) + + @property + def url_charset(self): + """The charset that is assumed for URLs. Defaults to the value + of :attr:`charset`. + + .. versionadded:: 0.6 + """ + return self.charset + + @classmethod + def from_values(cls, *args, **kwargs): + """Create a new request object based on the values provided. If + environ is given missing values are filled from there. This method is + useful for small scripts when you need to simulate a request from an URL. + Do not use this method for unittesting, there is a full featured client + object (:class:`Client`) that allows to create multipart requests, + support for cookies etc. + + This accepts the same options as the + :class:`~werkzeug.test.EnvironBuilder`. + + .. versionchanged:: 0.5 + This method now accepts the same arguments as + :class:`~werkzeug.test.EnvironBuilder`. Because of this the + `environ` parameter is now called `environ_overrides`. + + :return: request object + """ + from ..test import EnvironBuilder + + charset = kwargs.pop("charset", cls.charset) + kwargs["charset"] = charset + builder = EnvironBuilder(*args, **kwargs) + try: + return builder.get_request(cls) + finally: + builder.close() + + @classmethod + def application(cls, f): + """Decorate a function as responder that accepts the request as + the last argument. This works like the :func:`responder` + decorator but the function is passed the request object as the + last argument and the request object will be closed + automatically:: + + @Request.application + def my_wsgi_app(request): + return Response('Hello World!') + + As of Werkzeug 0.14 HTTP exceptions are automatically caught and + converted to responses instead of failing. + + :param f: the WSGI callable to decorate + :return: a new WSGI callable + """ + #: return a callable that wraps the -2nd argument with the request + #: and calls the function with all the arguments up to that one and + #: the request. The return value is then called with the latest + #: two arguments. This makes it possible to use this decorator for + #: both standalone WSGI functions as well as bound methods and + #: partially applied functions. + from ..exceptions import HTTPException + + def application(*args): + request = cls(args[-2]) + with request: + try: + resp = f(*args[:-2] + (request,)) + except HTTPException as e: + resp = e.get_response(args[-2]) + return resp(*args[-2:]) + + return update_wrapper(application, f) + + def _get_file_stream( + self, total_content_length, content_type, filename=None, content_length=None + ): + """Called to get a stream for the file upload. + + This must provide a file-like class with `read()`, `readline()` + and `seek()` methods that is both writeable and readable. + + The default implementation returns a temporary file if the total + content length is higher than 500KB. Because many browsers do not + provide a content length for the files only the total content + length matters. + + :param total_content_length: the total content length of all the + data in the request combined. This value + is guaranteed to be there. + :param content_type: the mimetype of the uploaded file. + :param filename: the filename of the uploaded file. May be `None`. + :param content_length: the length of this file. This value is usually + not provided because webbrowsers do not provide + this value. + """ + return default_stream_factory( + total_content_length=total_content_length, + filename=filename, + content_type=content_type, + content_length=content_length, + ) + + @property + def want_form_data_parsed(self): + """Returns True if the request method carries content. As of + Werkzeug 0.9 this will be the case if a content type is transmitted. + + .. versionadded:: 0.8 + """ + return bool(self.environ.get("CONTENT_TYPE")) + + def make_form_data_parser(self): + """Creates the form data parser. Instantiates the + :attr:`form_data_parser_class` with some parameters. + + .. versionadded:: 0.8 + """ + return self.form_data_parser_class( + self._get_file_stream, + self.charset, + self.encoding_errors, + self.max_form_memory_size, + self.max_content_length, + self.parameter_storage_class, + ) + + def _load_form_data(self): + """Method used internally to retrieve submitted data. After calling + this sets `form` and `files` on the request object to multi dicts + filled with the incoming form data. As a matter of fact the input + stream will be empty afterwards. You can also call this method to + force the parsing of the form data. + + .. versionadded:: 0.8 + """ + # abort early if we have already consumed the stream + if "form" in self.__dict__: + return + + _assert_not_shallow(self) + + if self.want_form_data_parsed: + content_type = self.environ.get("CONTENT_TYPE", "") + content_length = get_content_length(self.environ) + mimetype, options = parse_options_header(content_type) + parser = self.make_form_data_parser() + data = parser.parse( + self._get_stream_for_parsing(), mimetype, content_length, options + ) + else: + data = ( + self.stream, + self.parameter_storage_class(), + self.parameter_storage_class(), + ) + + # inject the values into the instance dict so that we bypass + # our cached_property non-data descriptor. + d = self.__dict__ + d["stream"], d["form"], d["files"] = data + + def _get_stream_for_parsing(self): + """This is the same as accessing :attr:`stream` with the difference + that if it finds cached data from calling :meth:`get_data` first it + will create a new stream out of the cached data. + + .. versionadded:: 0.9.3 + """ + cached_data = getattr(self, "_cached_data", None) + if cached_data is not None: + return BytesIO(cached_data) + return self.stream + + def close(self): + """Closes associated resources of this request object. This + closes all file handles explicitly. You can also use the request + object in a with statement which will automatically close it. + + .. versionadded:: 0.9 + """ + files = self.__dict__.get("files") + for _key, value in iter_multi_items(files or ()): + value.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close() + + @cached_property + def stream(self): + """ + If the incoming form data was not encoded with a known mimetype + the data is stored unmodified in this stream for consumption. Most + of the time it is a better idea to use :attr:`data` which will give + you that data as a string. The stream only returns the data once. + + Unlike :attr:`input_stream` this stream is properly guarded that you + can't accidentally read past the length of the input. Werkzeug will + internally always refer to this stream to read data which makes it + possible to wrap this object with a stream that does filtering. + + .. versionchanged:: 0.9 + This stream is now always available but might be consumed by the + form parser later on. Previously the stream was only set if no + parsing happened. + """ + _assert_not_shallow(self) + return get_input_stream(self.environ) + + input_stream = environ_property( + "wsgi.input", + """The WSGI input stream. + + In general it's a bad idea to use this one because you can + easily read past the boundary. Use the :attr:`stream` + instead.""", + ) + + @cached_property + def args(self): + """The parsed URL parameters (the part in the URL after the question + mark). + + By default an + :class:`~werkzeug.datastructures.ImmutableMultiDict` + is returned from this function. This can be changed by setting + :attr:`parameter_storage_class` to a different type. This might + be necessary if the order of the form data is important. + """ + return url_decode( + wsgi_get_bytes(self.environ.get("QUERY_STRING", "")), + self.url_charset, + errors=self.encoding_errors, + cls=self.parameter_storage_class, + ) + + @cached_property + def data(self): + """ + Contains the incoming request data as string in case it came with + a mimetype Werkzeug does not handle. + """ + + if self.disable_data_descriptor: + raise AttributeError("data descriptor is disabled") + # XXX: this should eventually be deprecated. + + # We trigger form data parsing first which means that the descriptor + # will not cache the data that would otherwise be .form or .files + # data. This restores the behavior that was there in Werkzeug + # before 0.9. New code should use :meth:`get_data` explicitly as + # this will make behavior explicit. + return self.get_data(parse_form_data=True) + + def get_data(self, cache=True, as_text=False, parse_form_data=False): + """This reads the buffered incoming data from the client into one + bytestring. By default this is cached but that behavior can be + changed by setting `cache` to `False`. + + Usually it's a bad idea to call this method without checking the + content length first as a client could send dozens of megabytes or more + to cause memory problems on the server. + + Note that if the form data was already parsed this method will not + return anything as form data parsing does not cache the data like + this method does. To implicitly invoke form data parsing function + set `parse_form_data` to `True`. When this is done the return value + of this method will be an empty string if the form parser handles + the data. This generally is not necessary as if the whole data is + cached (which is the default) the form parser will used the cached + data to parse the form data. Please be generally aware of checking + the content length first in any case before calling this method + to avoid exhausting server memory. + + If `as_text` is set to `True` the return value will be a decoded + unicode string. + + .. versionadded:: 0.9 + """ + rv = getattr(self, "_cached_data", None) + if rv is None: + if parse_form_data: + self._load_form_data() + rv = self.stream.read() + if cache: + self._cached_data = rv + if as_text: + rv = rv.decode(self.charset, self.encoding_errors) + return rv + + @cached_property + def form(self): + """The form parameters. By default an + :class:`~werkzeug.datastructures.ImmutableMultiDict` + is returned from this function. This can be changed by setting + :attr:`parameter_storage_class` to a different type. This might + be necessary if the order of the form data is important. + + Please keep in mind that file uploads will not end up here, but instead + in the :attr:`files` attribute. + + .. versionchanged:: 0.9 + + Previous to Werkzeug 0.9 this would only contain form data for POST + and PUT requests. + """ + self._load_form_data() + return self.form + + @cached_property + def values(self): + """A :class:`werkzeug.datastructures.CombinedMultiDict` that combines + :attr:`args` and :attr:`form`.""" + args = [] + for d in self.args, self.form: + if not isinstance(d, MultiDict): + d = MultiDict(d) + args.append(d) + return CombinedMultiDict(args) + + @cached_property + def files(self): + """:class:`~werkzeug.datastructures.MultiDict` object containing + all uploaded files. Each key in :attr:`files` is the name from the + ````. Each value in :attr:`files` is a + Werkzeug :class:`~werkzeug.datastructures.FileStorage` object. + + It basically behaves like a standard file object you know from Python, + with the difference that it also has a + :meth:`~werkzeug.datastructures.FileStorage.save` function that can + store the file on the filesystem. + + Note that :attr:`files` will only contain data if the request method was + POST, PUT or PATCH and the ``

    `` that posted to the request had + ``enctype="multipart/form-data"``. It will be empty otherwise. + + See the :class:`~werkzeug.datastructures.MultiDict` / + :class:`~werkzeug.datastructures.FileStorage` documentation for + more details about the used data structure. + """ + self._load_form_data() + return self.files + + @cached_property + def cookies(self): + """A :class:`dict` with the contents of all cookies transmitted with + the request.""" + return parse_cookie( + self.environ, + self.charset, + self.encoding_errors, + cls=self.dict_storage_class, + ) + + @cached_property + def headers(self): + """The headers from the WSGI environ as immutable + :class:`~werkzeug.datastructures.EnvironHeaders`. + """ + return EnvironHeaders(self.environ) + + @cached_property + def path(self): + """Requested path as unicode. This works a bit like the regular path + info in the WSGI environment but will always include a leading slash, + even if the URL root is accessed. + """ + raw_path = wsgi_decoding_dance( + self.environ.get("PATH_INFO") or "", self.charset, self.encoding_errors + ) + return "/" + raw_path.lstrip("/") + + @cached_property + def full_path(self): + """Requested path as unicode, including the query string.""" + return self.path + u"?" + to_unicode(self.query_string, self.url_charset) + + @cached_property + def script_root(self): + """The root path of the script without the trailing slash.""" + raw_path = wsgi_decoding_dance( + self.environ.get("SCRIPT_NAME") or "", self.charset, self.encoding_errors + ) + return raw_path.rstrip("/") + + @cached_property + def url(self): + """The reconstructed current URL as IRI. + See also: :attr:`trusted_hosts`. + """ + return get_current_url(self.environ, trusted_hosts=self.trusted_hosts) + + @cached_property + def base_url(self): + """Like :attr:`url` but without the querystring + See also: :attr:`trusted_hosts`. + """ + return get_current_url( + self.environ, strip_querystring=True, trusted_hosts=self.trusted_hosts + ) + + @cached_property + def url_root(self): + """The full URL root (with hostname), this is the application + root as IRI. + See also: :attr:`trusted_hosts`. + """ + return get_current_url(self.environ, True, trusted_hosts=self.trusted_hosts) + + @cached_property + def host_url(self): + """Just the host with scheme as IRI. + See also: :attr:`trusted_hosts`. + """ + return get_current_url( + self.environ, host_only=True, trusted_hosts=self.trusted_hosts + ) + + @cached_property + def host(self): + """Just the host including the port if available. + See also: :attr:`trusted_hosts`. + """ + return get_host(self.environ, trusted_hosts=self.trusted_hosts) + + query_string = environ_property( + "QUERY_STRING", + "", + read_only=True, + load_func=wsgi_get_bytes, + doc="The URL parameters as raw bytestring.", + ) + method = environ_property( + "REQUEST_METHOD", + "GET", + read_only=True, + load_func=lambda x: x.upper(), + doc="The request method. (For example ``'GET'`` or ``'POST'``).", + ) + + @cached_property + def access_route(self): + """If a forwarded header exists this is a list of all ip addresses + from the client ip to the last proxy server. + """ + if "HTTP_X_FORWARDED_FOR" in self.environ: + addr = self.environ["HTTP_X_FORWARDED_FOR"].split(",") + return self.list_storage_class([x.strip() for x in addr]) + elif "REMOTE_ADDR" in self.environ: + return self.list_storage_class([self.environ["REMOTE_ADDR"]]) + return self.list_storage_class() + + @property + def remote_addr(self): + """The remote address of the client.""" + return self.environ.get("REMOTE_ADDR") + + remote_user = environ_property( + "REMOTE_USER", + doc="""If the server supports user authentication, and the + script is protected, this attribute contains the username the + user has authenticated as.""", + ) + + scheme = environ_property( + "wsgi.url_scheme", + doc=""" + URL scheme (http or https). + + .. versionadded:: 0.7""", + ) + + @property + def is_xhr(self): + """True if the request was triggered via a JavaScript XMLHttpRequest. + This only works with libraries that support the ``X-Requested-With`` + header and set it to "XMLHttpRequest". Libraries that do that are + prototype, jQuery and Mochikit and probably some more. + + .. deprecated:: 0.13 + ``X-Requested-With`` is not standard and is unreliable. You + may be able to use :attr:`AcceptMixin.accept_mimetypes` + instead. + """ + warnings.warn( + "'Request.is_xhr' is deprecated as of version 0.13 and will" + " be removed in version 1.0. The 'X-Requested-With' header" + " is not standard and is unreliable. You may be able to use" + " 'accept_mimetypes' instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.environ.get("HTTP_X_REQUESTED_WITH", "").lower() == "xmlhttprequest" + + is_secure = property( + lambda self: self.environ["wsgi.url_scheme"] == "https", + doc="`True` if the request is secure.", + ) + is_multithread = environ_property( + "wsgi.multithread", + doc="""boolean that is `True` if the application is served by a + multithreaded WSGI server.""", + ) + is_multiprocess = environ_property( + "wsgi.multiprocess", + doc="""boolean that is `True` if the application is served by a + WSGI server that spawns multiple processes.""", + ) + is_run_once = environ_property( + "wsgi.run_once", + doc="""boolean that is `True` if the application will be + executed only once in a process lifetime. This is the case for + CGI for example, but it's not guaranteed that the execution only + happens one time.""", + ) + + +def _assert_not_shallow(request): + if request.shallow: + raise RuntimeError( + "A shallow request tried to consume form data. If you really" + " want to do that, set `shallow` to False." + ) diff --git a/brightonpy/Lib/site-packages/werkzeug/wrappers/base_response.py b/brightonpy/Lib/site-packages/werkzeug/wrappers/base_response.py new file mode 100644 index 0000000..d944a7d --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/wrappers/base_response.py @@ -0,0 +1,702 @@ +import warnings + +from .._compat import integer_types +from .._compat import string_types +from .._compat import text_type +from .._compat import to_bytes +from .._compat import to_native +from ..datastructures import Headers +from ..http import dump_cookie +from ..http import HTTP_STATUS_CODES +from ..http import remove_entity_headers +from ..urls import iri_to_uri +from ..urls import url_join +from ..utils import get_content_type +from ..wsgi import ClosingIterator +from ..wsgi import get_current_url + + +def _run_wsgi_app(*args): + """This function replaces itself to ensure that the test module is not + imported unless required. DO NOT USE! + """ + global _run_wsgi_app + from ..test import run_wsgi_app as _run_wsgi_app + + return _run_wsgi_app(*args) + + +def _warn_if_string(iterable): + """Helper for the response objects to check if the iterable returned + to the WSGI server is not a string. + """ + if isinstance(iterable, string_types): + warnings.warn( + "Response iterable was set to a string. This will appear to" + " work but means that the server will send the data to the" + " client one character at a time. This is almost never" + " intended behavior, use 'response.data' to assign strings" + " to the response object.", + stacklevel=2, + ) + + +def _iter_encoded(iterable, charset): + for item in iterable: + if isinstance(item, text_type): + yield item.encode(charset) + else: + yield item + + +def _clean_accept_ranges(accept_ranges): + if accept_ranges is True: + return "bytes" + elif accept_ranges is False: + return "none" + elif isinstance(accept_ranges, text_type): + return to_native(accept_ranges) + raise ValueError("Invalid accept_ranges value") + + +class BaseResponse(object): + """Base response class. The most important fact about a response object + is that it's a regular WSGI application. It's initialized with a couple + of response parameters (headers, body, status code etc.) and will start a + valid WSGI response when called with the environ and start response + callable. + + Because it's a WSGI application itself processing usually ends before the + actual response is sent to the server. This helps debugging systems + because they can catch all the exceptions before responses are started. + + Here a small example WSGI application that takes advantage of the + response objects:: + + from werkzeug.wrappers import BaseResponse as Response + + def index(): + return Response('Index page') + + def application(environ, start_response): + path = environ.get('PATH_INFO') or '/' + if path == '/': + response = index() + else: + response = Response('Not Found', status=404) + return response(environ, start_response) + + Like :class:`BaseRequest` which object is lacking a lot of functionality + implemented in mixins. This gives you a better control about the actual + API of your response objects, so you can create subclasses and add custom + functionality. A full featured response object is available as + :class:`Response` which implements a couple of useful mixins. + + To enforce a new type of already existing responses you can use the + :meth:`force_type` method. This is useful if you're working with different + subclasses of response objects and you want to post process them with a + known interface. + + Per default the response object will assume all the text data is `utf-8` + encoded. Please refer to :doc:`the unicode chapter ` for more + details about customizing the behavior. + + Response can be any kind of iterable or string. If it's a string it's + considered being an iterable with one item which is the string passed. + Headers can be a list of tuples or a + :class:`~werkzeug.datastructures.Headers` object. + + Special note for `mimetype` and `content_type`: For most mime types + `mimetype` and `content_type` work the same, the difference affects + only 'text' mimetypes. If the mimetype passed with `mimetype` is a + mimetype starting with `text/`, the charset parameter of the response + object is appended to it. In contrast the `content_type` parameter is + always added as header unmodified. + + .. versionchanged:: 0.5 + the `direct_passthrough` parameter was added. + + :param response: a string or response iterable. + :param status: a string with a status or an integer with the status code. + :param headers: a list of headers or a + :class:`~werkzeug.datastructures.Headers` object. + :param mimetype: the mimetype for the response. See notice above. + :param content_type: the content type for the response. See notice above. + :param direct_passthrough: if set to `True` :meth:`iter_encoded` is not + called before iteration which makes it + possible to pass special iterators through + unchanged (see :func:`wrap_file` for more + details.) + """ + + #: the charset of the response. + charset = "utf-8" + + #: the default status if none is provided. + default_status = 200 + + #: the default mimetype if none is provided. + default_mimetype = "text/plain" + + #: if set to `False` accessing properties on the response object will + #: not try to consume the response iterator and convert it into a list. + #: + #: .. versionadded:: 0.6.2 + #: + #: That attribute was previously called `implicit_seqence_conversion`. + #: (Notice the typo). If you did use this feature, you have to adapt + #: your code to the name change. + implicit_sequence_conversion = True + + #: Should this response object correct the location header to be RFC + #: conformant? This is true by default. + #: + #: .. versionadded:: 0.8 + autocorrect_location_header = True + + #: Should this response object automatically set the content-length + #: header if possible? This is true by default. + #: + #: .. versionadded:: 0.8 + automatically_set_content_length = True + + #: Warn if a cookie header exceeds this size. The default, 4093, should be + #: safely `supported by most browsers `_. A cookie larger than + #: this size will still be sent, but it may be ignored or handled + #: incorrectly by some browsers. Set to 0 to disable this check. + #: + #: .. versionadded:: 0.13 + #: + #: .. _`cookie`: http://browsercookielimits.squawky.net/ + max_cookie_size = 4093 + + def __init__( + self, + response=None, + status=None, + headers=None, + mimetype=None, + content_type=None, + direct_passthrough=False, + ): + if isinstance(headers, Headers): + self.headers = headers + elif not headers: + self.headers = Headers() + else: + self.headers = Headers(headers) + + if content_type is None: + if mimetype is None and "content-type" not in self.headers: + mimetype = self.default_mimetype + if mimetype is not None: + mimetype = get_content_type(mimetype, self.charset) + content_type = mimetype + if content_type is not None: + self.headers["Content-Type"] = content_type + if status is None: + status = self.default_status + if isinstance(status, integer_types): + self.status_code = status + else: + self.status = status + + self.direct_passthrough = direct_passthrough + self._on_close = [] + + # we set the response after the headers so that if a class changes + # the charset attribute, the data is set in the correct charset. + if response is None: + self.response = [] + elif isinstance(response, (text_type, bytes, bytearray)): + self.set_data(response) + else: + self.response = response + + def call_on_close(self, func): + """Adds a function to the internal list of functions that should + be called as part of closing down the response. Since 0.7 this + function also returns the function that was passed so that this + can be used as a decorator. + + .. versionadded:: 0.6 + """ + self._on_close.append(func) + return func + + def __repr__(self): + if self.is_sequence: + body_info = "%d bytes" % sum(map(len, self.iter_encoded())) + else: + body_info = "streamed" if self.is_streamed else "likely-streamed" + return "<%s %s [%s]>" % (self.__class__.__name__, body_info, self.status) + + @classmethod + def force_type(cls, response, environ=None): + """Enforce that the WSGI response is a response object of the current + type. Werkzeug will use the :class:`BaseResponse` internally in many + situations like the exceptions. If you call :meth:`get_response` on an + exception you will get back a regular :class:`BaseResponse` object, even + if you are using a custom subclass. + + This method can enforce a given response type, and it will also + convert arbitrary WSGI callables into response objects if an environ + is provided:: + + # convert a Werkzeug response object into an instance of the + # MyResponseClass subclass. + response = MyResponseClass.force_type(response) + + # convert any WSGI application into a response object + response = MyResponseClass.force_type(response, environ) + + This is especially useful if you want to post-process responses in + the main dispatcher and use functionality provided by your subclass. + + Keep in mind that this will modify response objects in place if + possible! + + :param response: a response object or wsgi application. + :param environ: a WSGI environment object. + :return: a response object. + """ + if not isinstance(response, BaseResponse): + if environ is None: + raise TypeError( + "cannot convert WSGI application into response" + " objects without an environ" + ) + response = BaseResponse(*_run_wsgi_app(response, environ)) + response.__class__ = cls + return response + + @classmethod + def from_app(cls, app, environ, buffered=False): + """Create a new response object from an application output. This + works best if you pass it an application that returns a generator all + the time. Sometimes applications may use the `write()` callable + returned by the `start_response` function. This tries to resolve such + edge cases automatically. But if you don't get the expected output + you should set `buffered` to `True` which enforces buffering. + + :param app: the WSGI application to execute. + :param environ: the WSGI environment to execute against. + :param buffered: set to `True` to enforce buffering. + :return: a response object. + """ + return cls(*_run_wsgi_app(app, environ, buffered)) + + def _get_status_code(self): + return self._status_code + + def _set_status_code(self, code): + self._status_code = code + try: + self._status = "%d %s" % (code, HTTP_STATUS_CODES[code].upper()) + except KeyError: + self._status = "%d UNKNOWN" % code + + status_code = property( + _get_status_code, _set_status_code, doc="The HTTP Status code as number" + ) + del _get_status_code, _set_status_code + + def _get_status(self): + return self._status + + def _set_status(self, value): + try: + self._status = to_native(value) + except AttributeError: + raise TypeError("Invalid status argument") + + try: + self._status_code = int(self._status.split(None, 1)[0]) + except ValueError: + self._status_code = 0 + self._status = "0 %s" % self._status + except IndexError: + raise ValueError("Empty status argument") + + status = property(_get_status, _set_status, doc="The HTTP Status code") + del _get_status, _set_status + + def get_data(self, as_text=False): + """The string representation of the request body. Whenever you call + this property the request iterable is encoded and flattened. This + can lead to unwanted behavior if you stream big data. + + This behavior can be disabled by setting + :attr:`implicit_sequence_conversion` to `False`. + + If `as_text` is set to `True` the return value will be a decoded + unicode string. + + .. versionadded:: 0.9 + """ + self._ensure_sequence() + rv = b"".join(self.iter_encoded()) + if as_text: + rv = rv.decode(self.charset) + return rv + + def set_data(self, value): + """Sets a new string as response. The value set must either by a + unicode or bytestring. If a unicode string is set it's encoded + automatically to the charset of the response (utf-8 by default). + + .. versionadded:: 0.9 + """ + # if an unicode string is set, it's encoded directly so that we + # can set the content length + if isinstance(value, text_type): + value = value.encode(self.charset) + else: + value = bytes(value) + self.response = [value] + if self.automatically_set_content_length: + self.headers["Content-Length"] = str(len(value)) + + data = property( + get_data, + set_data, + doc="A descriptor that calls :meth:`get_data` and :meth:`set_data`.", + ) + + def calculate_content_length(self): + """Returns the content length if available or `None` otherwise.""" + try: + self._ensure_sequence() + except RuntimeError: + return None + return sum(len(x) for x in self.iter_encoded()) + + def _ensure_sequence(self, mutable=False): + """This method can be called by methods that need a sequence. If + `mutable` is true, it will also ensure that the response sequence + is a standard Python list. + + .. versionadded:: 0.6 + """ + if self.is_sequence: + # if we need a mutable object, we ensure it's a list. + if mutable and not isinstance(self.response, list): + self.response = list(self.response) + return + if self.direct_passthrough: + raise RuntimeError( + "Attempted implicit sequence conversion but the" + " response object is in direct passthrough mode." + ) + if not self.implicit_sequence_conversion: + raise RuntimeError( + "The response object required the iterable to be a" + " sequence, but the implicit conversion was disabled." + " Call make_sequence() yourself." + ) + self.make_sequence() + + def make_sequence(self): + """Converts the response iterator in a list. By default this happens + automatically if required. If `implicit_sequence_conversion` is + disabled, this method is not automatically called and some properties + might raise exceptions. This also encodes all the items. + + .. versionadded:: 0.6 + """ + if not self.is_sequence: + # if we consume an iterable we have to ensure that the close + # method of the iterable is called if available when we tear + # down the response + close = getattr(self.response, "close", None) + self.response = list(self.iter_encoded()) + if close is not None: + self.call_on_close(close) + + def iter_encoded(self): + """Iter the response encoded with the encoding of the response. + If the response object is invoked as WSGI application the return + value of this method is used as application iterator unless + :attr:`direct_passthrough` was activated. + """ + if __debug__: + _warn_if_string(self.response) + # Encode in a separate function so that self.response is fetched + # early. This allows us to wrap the response with the return + # value from get_app_iter or iter_encoded. + return _iter_encoded(self.response, self.charset) + + def set_cookie( + self, + key, + value="", + max_age=None, + expires=None, + path="/", + domain=None, + secure=False, + httponly=False, + samesite=None, + ): + """Sets a cookie. The parameters are the same as in the cookie `Morsel` + object in the Python standard library but it accepts unicode data, too. + + A warning is raised if the size of the cookie header exceeds + :attr:`max_cookie_size`, but the header will still be set. + + :param key: the key (name) of the cookie to be set. + :param value: the value of the cookie. + :param max_age: should be a number of seconds, or `None` (default) if + the cookie should last only as long as the client's + browser session. + :param expires: should be a `datetime` object or UNIX timestamp. + :param path: limits the cookie to a given path, per default it will + span the whole domain. + :param domain: if you want to set a cross-domain cookie. For example, + ``domain=".example.com"`` will set a cookie that is + readable by the domain ``www.example.com``, + ``foo.example.com`` etc. Otherwise, a cookie will only + be readable by the domain that set it. + :param secure: If `True`, the cookie will only be available via HTTPS + :param httponly: disallow JavaScript to access the cookie. This is an + extension to the cookie standard and probably not + supported by all browsers. + :param samesite: Limits the scope of the cookie such that it will only + be attached to requests if those requests are + "same-site". + """ + self.headers.add( + "Set-Cookie", + dump_cookie( + key, + value=value, + max_age=max_age, + expires=expires, + path=path, + domain=domain, + secure=secure, + httponly=httponly, + charset=self.charset, + max_size=self.max_cookie_size, + samesite=samesite, + ), + ) + + def delete_cookie(self, key, path="/", domain=None): + """Delete a cookie. Fails silently if key doesn't exist. + + :param key: the key (name) of the cookie to be deleted. + :param path: if the cookie that should be deleted was limited to a + path, the path has to be defined here. + :param domain: if the cookie that should be deleted was limited to a + domain, that domain has to be defined here. + """ + self.set_cookie(key, expires=0, max_age=0, path=path, domain=domain) + + @property + def is_streamed(self): + """If the response is streamed (the response is not an iterable with + a length information) this property is `True`. In this case streamed + means that there is no information about the number of iterations. + This is usually `True` if a generator is passed to the response object. + + This is useful for checking before applying some sort of post + filtering that should not take place for streamed responses. + """ + try: + len(self.response) + except (TypeError, AttributeError): + return True + return False + + @property + def is_sequence(self): + """If the iterator is buffered, this property will be `True`. A + response object will consider an iterator to be buffered if the + response attribute is a list or tuple. + + .. versionadded:: 0.6 + """ + return isinstance(self.response, (tuple, list)) + + def close(self): + """Close the wrapped response if possible. You can also use the object + in a with statement which will automatically close it. + + .. versionadded:: 0.9 + Can now be used in a with statement. + """ + if hasattr(self.response, "close"): + self.response.close() + for func in self._on_close: + func() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close() + + def freeze(self): + """Call this method if you want to make your response object ready for + being pickled. This buffers the generator if there is one. It will + also set the `Content-Length` header to the length of the body. + + .. versionchanged:: 0.6 + The `Content-Length` header is now set. + """ + # we explicitly set the length to a list of the *encoded* response + # iterator. Even if the implicit sequence conversion is disabled. + self.response = list(self.iter_encoded()) + self.headers["Content-Length"] = str(sum(map(len, self.response))) + + def get_wsgi_headers(self, environ): + """This is automatically called right before the response is started + and returns headers modified for the given environment. It returns a + copy of the headers from the response with some modifications applied + if necessary. + + For example the location header (if present) is joined with the root + URL of the environment. Also the content length is automatically set + to zero here for certain status codes. + + .. versionchanged:: 0.6 + Previously that function was called `fix_headers` and modified + the response object in place. Also since 0.6, IRIs in location + and content-location headers are handled properly. + + Also starting with 0.6, Werkzeug will attempt to set the content + length if it is able to figure it out on its own. This is the + case if all the strings in the response iterable are already + encoded and the iterable is buffered. + + :param environ: the WSGI environment of the request. + :return: returns a new :class:`~werkzeug.datastructures.Headers` + object. + """ + headers = Headers(self.headers) + location = None + content_location = None + content_length = None + status = self.status_code + + # iterate over the headers to find all values in one go. Because + # get_wsgi_headers is used each response that gives us a tiny + # speedup. + for key, value in headers: + ikey = key.lower() + if ikey == u"location": + location = value + elif ikey == u"content-location": + content_location = value + elif ikey == u"content-length": + content_length = value + + # make sure the location header is an absolute URL + if location is not None: + old_location = location + if isinstance(location, text_type): + # Safe conversion is necessary here as we might redirect + # to a broken URI scheme (for instance itms-services). + location = iri_to_uri(location, safe_conversion=True) + + if self.autocorrect_location_header: + current_url = get_current_url(environ, strip_querystring=True) + if isinstance(current_url, text_type): + current_url = iri_to_uri(current_url) + location = url_join(current_url, location) + if location != old_location: + headers["Location"] = location + + # make sure the content location is a URL + if content_location is not None and isinstance(content_location, text_type): + headers["Content-Location"] = iri_to_uri(content_location) + + if 100 <= status < 200 or status == 204: + # Per section 3.3.2 of RFC 7230, "a server MUST NOT send a + # Content-Length header field in any response with a status + # code of 1xx (Informational) or 204 (No Content)." + headers.remove("Content-Length") + elif status == 304: + remove_entity_headers(headers) + + # if we can determine the content length automatically, we + # should try to do that. But only if this does not involve + # flattening the iterator or encoding of unicode strings in + # the response. We however should not do that if we have a 304 + # response. + if ( + self.automatically_set_content_length + and self.is_sequence + and content_length is None + and status not in (204, 304) + and not (100 <= status < 200) + ): + try: + content_length = sum(len(to_bytes(x, "ascii")) for x in self.response) + except UnicodeError: + # aha, something non-bytestringy in there, too bad, we + # can't safely figure out the length of the response. + pass + else: + headers["Content-Length"] = str(content_length) + + return headers + + def get_app_iter(self, environ): + """Returns the application iterator for the given environ. Depending + on the request method and the current status code the return value + might be an empty response rather than the one from the response. + + If the request method is `HEAD` or the status code is in a range + where the HTTP specification requires an empty response, an empty + iterable is returned. + + .. versionadded:: 0.6 + + :param environ: the WSGI environment of the request. + :return: a response iterable. + """ + status = self.status_code + if ( + environ["REQUEST_METHOD"] == "HEAD" + or 100 <= status < 200 + or status in (204, 304) + ): + iterable = () + elif self.direct_passthrough: + if __debug__: + _warn_if_string(self.response) + return self.response + else: + iterable = self.iter_encoded() + return ClosingIterator(iterable, self.close) + + def get_wsgi_response(self, environ): + """Returns the final WSGI response as tuple. The first item in + the tuple is the application iterator, the second the status and + the third the list of headers. The response returned is created + specially for the given environment. For example if the request + method in the WSGI environment is ``'HEAD'`` the response will + be empty and only the headers and status code will be present. + + .. versionadded:: 0.6 + + :param environ: the WSGI environment of the request. + :return: an ``(app_iter, status, headers)`` tuple. + """ + headers = self.get_wsgi_headers(environ) + app_iter = self.get_app_iter(environ) + return app_iter, self.status, headers.to_wsgi_list() + + def __call__(self, environ, start_response): + """Process this response as WSGI application. + + :param environ: the WSGI environment. + :param start_response: the response callable provided by the WSGI + server. + :return: an application iterator + """ + app_iter, status, headers = self.get_wsgi_response(environ) + start_response(status, headers) + return app_iter diff --git a/brightonpy/Lib/site-packages/werkzeug/wrappers/common_descriptors.py b/brightonpy/Lib/site-packages/werkzeug/wrappers/common_descriptors.py new file mode 100644 index 0000000..e4107ee --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/wrappers/common_descriptors.py @@ -0,0 +1,322 @@ +from datetime import datetime +from datetime import timedelta + +from .._compat import string_types +from ..datastructures import CallbackDict +from ..http import dump_age +from ..http import dump_header +from ..http import dump_options_header +from ..http import http_date +from ..http import parse_age +from ..http import parse_date +from ..http import parse_options_header +from ..http import parse_set_header +from ..utils import cached_property +from ..utils import environ_property +from ..utils import get_content_type +from ..utils import header_property +from ..wsgi import get_content_length + + +class CommonRequestDescriptorsMixin(object): + """A mixin for :class:`BaseRequest` subclasses. Request objects that + mix this class in will automatically get descriptors for a couple of + HTTP headers with automatic type conversion. + + .. versionadded:: 0.5 + """ + + content_type = environ_property( + "CONTENT_TYPE", + doc="""The Content-Type entity-header field indicates the media + type of the entity-body sent to the recipient or, in the case of + the HEAD method, the media type that would have been sent had + the request been a GET.""", + ) + + @cached_property + def content_length(self): + """The Content-Length entity-header field indicates the size of the + entity-body in bytes or, in the case of the HEAD method, the size of + the entity-body that would have been sent had the request been a + GET. + """ + return get_content_length(self.environ) + + content_encoding = environ_property( + "HTTP_CONTENT_ENCODING", + doc="""The Content-Encoding entity-header field is used as a + modifier to the media-type. When present, its value indicates + what additional content codings have been applied to the + entity-body, and thus what decoding mechanisms must be applied + in order to obtain the media-type referenced by the Content-Type + header field. + + .. versionadded:: 0.9""", + ) + content_md5 = environ_property( + "HTTP_CONTENT_MD5", + doc="""The Content-MD5 entity-header field, as defined in + RFC 1864, is an MD5 digest of the entity-body for the purpose of + providing an end-to-end message integrity check (MIC) of the + entity-body. (Note: a MIC is good for detecting accidental + modification of the entity-body in transit, but is not proof + against malicious attacks.) + + .. versionadded:: 0.9""", + ) + referrer = environ_property( + "HTTP_REFERER", + doc="""The Referer[sic] request-header field allows the client + to specify, for the server's benefit, the address (URI) of the + resource from which the Request-URI was obtained (the + "referrer", although the header field is misspelled).""", + ) + date = environ_property( + "HTTP_DATE", + None, + parse_date, + doc="""The Date general-header field represents the date and + time at which the message was originated, having the same + semantics as orig-date in RFC 822.""", + ) + max_forwards = environ_property( + "HTTP_MAX_FORWARDS", + None, + int, + doc="""The Max-Forwards request-header field provides a + mechanism with the TRACE and OPTIONS methods to limit the number + of proxies or gateways that can forward the request to the next + inbound server.""", + ) + + def _parse_content_type(self): + if not hasattr(self, "_parsed_content_type"): + self._parsed_content_type = parse_options_header( + self.environ.get("CONTENT_TYPE", "") + ) + + @property + def mimetype(self): + """Like :attr:`content_type`, but without parameters (eg, without + charset, type etc.) and always lowercase. For example if the content + type is ``text/HTML; charset=utf-8`` the mimetype would be + ``'text/html'``. + """ + self._parse_content_type() + return self._parsed_content_type[0].lower() + + @property + def mimetype_params(self): + """The mimetype parameters as dict. For example if the content + type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + """ + self._parse_content_type() + return self._parsed_content_type[1] + + @cached_property + def pragma(self): + """The Pragma general-header field is used to include + implementation-specific directives that might apply to any recipient + along the request/response chain. All pragma directives specify + optional behavior from the viewpoint of the protocol; however, some + systems MAY require that behavior be consistent with the directives. + """ + return parse_set_header(self.environ.get("HTTP_PRAGMA", "")) + + +class CommonResponseDescriptorsMixin(object): + """A mixin for :class:`BaseResponse` subclasses. Response objects that + mix this class in will automatically get descriptors for a couple of + HTTP headers with automatic type conversion. + """ + + @property + def mimetype(self): + """The mimetype (content type without charset etc.)""" + ct = self.headers.get("content-type") + if ct: + return ct.split(";")[0].strip() + + @mimetype.setter + def mimetype(self, value): + self.headers["Content-Type"] = get_content_type(value, self.charset) + + @property + def mimetype_params(self): + """The mimetype parameters as dict. For example if the + content type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + + .. versionadded:: 0.5 + """ + + def on_update(d): + self.headers["Content-Type"] = dump_options_header(self.mimetype, d) + + d = parse_options_header(self.headers.get("content-type", ""))[1] + return CallbackDict(d, on_update) + + location = header_property( + "Location", + doc="""The Location response-header field is used to redirect + the recipient to a location other than the Request-URI for + completion of the request or identification of a new + resource.""", + ) + age = header_property( + "Age", + None, + parse_age, + dump_age, + doc="""The Age response-header field conveys the sender's + estimate of the amount of time since the response (or its + revalidation) was generated at the origin server. + + Age values are non-negative decimal integers, representing time + in seconds.""", + ) + content_type = header_property( + "Content-Type", + doc="""The Content-Type entity-header field indicates the media + type of the entity-body sent to the recipient or, in the case of + the HEAD method, the media type that would have been sent had + the request been a GET.""", + ) + content_length = header_property( + "Content-Length", + None, + int, + str, + doc="""The Content-Length entity-header field indicates the size + of the entity-body, in decimal number of OCTETs, sent to the + recipient or, in the case of the HEAD method, the size of the + entity-body that would have been sent had the request been a + GET.""", + ) + content_location = header_property( + "Content-Location", + doc="""The Content-Location entity-header field MAY be used to + supply the resource location for the entity enclosed in the + message when that entity is accessible from a location separate + from the requested resource's URI.""", + ) + content_encoding = header_property( + "Content-Encoding", + doc="""The Content-Encoding entity-header field is used as a + modifier to the media-type. When present, its value indicates + what additional content codings have been applied to the + entity-body, and thus what decoding mechanisms must be applied + in order to obtain the media-type referenced by the Content-Type + header field.""", + ) + content_md5 = header_property( + "Content-MD5", + doc="""The Content-MD5 entity-header field, as defined in + RFC 1864, is an MD5 digest of the entity-body for the purpose of + providing an end-to-end message integrity check (MIC) of the + entity-body. (Note: a MIC is good for detecting accidental + modification of the entity-body in transit, but is not proof + against malicious attacks.)""", + ) + date = header_property( + "Date", + None, + parse_date, + http_date, + doc="""The Date general-header field represents the date and + time at which the message was originated, having the same + semantics as orig-date in RFC 822.""", + ) + expires = header_property( + "Expires", + None, + parse_date, + http_date, + doc="""The Expires entity-header field gives the date/time after + which the response is considered stale. A stale cache entry may + not normally be returned by a cache.""", + ) + last_modified = header_property( + "Last-Modified", + None, + parse_date, + http_date, + doc="""The Last-Modified entity-header field indicates the date + and time at which the origin server believes the variant was + last modified.""", + ) + + @property + def retry_after(self): + """The Retry-After response-header field can be used with a + 503 (Service Unavailable) response to indicate how long the + service is expected to be unavailable to the requesting client. + + Time in seconds until expiration or date. + """ + value = self.headers.get("retry-after") + if value is None: + return + elif value.isdigit(): + return datetime.utcnow() + timedelta(seconds=int(value)) + return parse_date(value) + + @retry_after.setter + def retry_after(self, value): + if value is None: + if "retry-after" in self.headers: + del self.headers["retry-after"] + return + elif isinstance(value, datetime): + value = http_date(value) + else: + value = str(value) + self.headers["Retry-After"] = value + + def _set_property(name, doc=None): # noqa: B902 + def fget(self): + def on_update(header_set): + if not header_set and name in self.headers: + del self.headers[name] + elif header_set: + self.headers[name] = header_set.to_header() + + return parse_set_header(self.headers.get(name), on_update) + + def fset(self, value): + if not value: + del self.headers[name] + elif isinstance(value, string_types): + self.headers[name] = value + else: + self.headers[name] = dump_header(value) + + return property(fget, fset, doc=doc) + + vary = _set_property( + "Vary", + doc="""The Vary field value indicates the set of request-header + fields that fully determines, while the response is fresh, + whether a cache is permitted to use the response to reply to a + subsequent request without revalidation.""", + ) + content_language = _set_property( + "Content-Language", + doc="""The Content-Language entity-header field describes the + natural language(s) of the intended audience for the enclosed + entity. Note that this might not be equivalent to all the + languages used within the entity-body.""", + ) + allow = _set_property( + "Allow", + doc="""The Allow entity-header field lists the set of methods + supported by the resource identified by the Request-URI. The + purpose of this field is strictly to inform the recipient of + valid methods associated with the resource. An Allow header + field MUST be present in a 405 (Method Not Allowed) + response.""", + ) + + del _set_property diff --git a/brightonpy/Lib/site-packages/werkzeug/wrappers/etag.py b/brightonpy/Lib/site-packages/werkzeug/wrappers/etag.py new file mode 100644 index 0000000..0733506 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/wrappers/etag.py @@ -0,0 +1,304 @@ +from .._compat import string_types +from .._internal import _get_environ +from ..datastructures import ContentRange +from ..datastructures import RequestCacheControl +from ..datastructures import ResponseCacheControl +from ..http import generate_etag +from ..http import http_date +from ..http import is_resource_modified +from ..http import parse_cache_control_header +from ..http import parse_content_range_header +from ..http import parse_date +from ..http import parse_etags +from ..http import parse_if_range_header +from ..http import parse_range_header +from ..http import quote_etag +from ..http import unquote_etag +from ..utils import cached_property +from ..utils import header_property +from ..wrappers.base_response import _clean_accept_ranges +from ..wsgi import _RangeWrapper + + +class ETagRequestMixin(object): + """Add entity tag and cache descriptors to a request object or object with + a WSGI environment available as :attr:`~BaseRequest.environ`. This not + only provides access to etags but also to the cache control header. + """ + + @cached_property + def cache_control(self): + """A :class:`~werkzeug.datastructures.RequestCacheControl` object + for the incoming cache control headers. + """ + cache_control = self.environ.get("HTTP_CACHE_CONTROL") + return parse_cache_control_header(cache_control, None, RequestCacheControl) + + @cached_property + def if_match(self): + """An object containing all the etags in the `If-Match` header. + + :rtype: :class:`~werkzeug.datastructures.ETags` + """ + return parse_etags(self.environ.get("HTTP_IF_MATCH")) + + @cached_property + def if_none_match(self): + """An object containing all the etags in the `If-None-Match` header. + + :rtype: :class:`~werkzeug.datastructures.ETags` + """ + return parse_etags(self.environ.get("HTTP_IF_NONE_MATCH")) + + @cached_property + def if_modified_since(self): + """The parsed `If-Modified-Since` header as datetime object.""" + return parse_date(self.environ.get("HTTP_IF_MODIFIED_SINCE")) + + @cached_property + def if_unmodified_since(self): + """The parsed `If-Unmodified-Since` header as datetime object.""" + return parse_date(self.environ.get("HTTP_IF_UNMODIFIED_SINCE")) + + @cached_property + def if_range(self): + """The parsed `If-Range` header. + + .. versionadded:: 0.7 + + :rtype: :class:`~werkzeug.datastructures.IfRange` + """ + return parse_if_range_header(self.environ.get("HTTP_IF_RANGE")) + + @cached_property + def range(self): + """The parsed `Range` header. + + .. versionadded:: 0.7 + + :rtype: :class:`~werkzeug.datastructures.Range` + """ + return parse_range_header(self.environ.get("HTTP_RANGE")) + + +class ETagResponseMixin(object): + """Adds extra functionality to a response object for etag and cache + handling. This mixin requires an object with at least a `headers` + object that implements a dict like interface similar to + :class:`~werkzeug.datastructures.Headers`. + + If you want the :meth:`freeze` method to automatically add an etag, you + have to mixin this method before the response base class. The default + response class does not do that. + """ + + @property + def cache_control(self): + """The Cache-Control general-header field is used to specify + directives that MUST be obeyed by all caching mechanisms along the + request/response chain. + """ + + def on_update(cache_control): + if not cache_control and "cache-control" in self.headers: + del self.headers["cache-control"] + elif cache_control: + self.headers["Cache-Control"] = cache_control.to_header() + + return parse_cache_control_header( + self.headers.get("cache-control"), on_update, ResponseCacheControl + ) + + def _wrap_response(self, start, length): + """Wrap existing Response in case of Range Request context.""" + if self.status_code == 206: + self.response = _RangeWrapper(self.response, start, length) + + def _is_range_request_processable(self, environ): + """Return ``True`` if `Range` header is present and if underlying + resource is considered unchanged when compared with `If-Range` header. + """ + return ( + "HTTP_IF_RANGE" not in environ + or not is_resource_modified( + environ, + self.headers.get("etag"), + None, + self.headers.get("last-modified"), + ignore_if_range=False, + ) + ) and "HTTP_RANGE" in environ + + def _process_range_request(self, environ, complete_length=None, accept_ranges=None): + """Handle Range Request related headers (RFC7233). If `Accept-Ranges` + header is valid, and Range Request is processable, we set the headers + as described by the RFC, and wrap the underlying response in a + RangeWrapper. + + Returns ``True`` if Range Request can be fulfilled, ``False`` otherwise. + + :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` + if `Range` header could not be parsed or satisfied. + """ + from ..exceptions import RequestedRangeNotSatisfiable + + if accept_ranges is None: + return False + self.headers["Accept-Ranges"] = accept_ranges + if not self._is_range_request_processable(environ) or complete_length is None: + return False + parsed_range = parse_range_header(environ.get("HTTP_RANGE")) + if parsed_range is None: + raise RequestedRangeNotSatisfiable(complete_length) + range_tuple = parsed_range.range_for_length(complete_length) + content_range_header = parsed_range.to_content_range_header(complete_length) + if range_tuple is None or content_range_header is None: + raise RequestedRangeNotSatisfiable(complete_length) + content_length = range_tuple[1] - range_tuple[0] + # Be sure not to send 206 response + # if requested range is the full content. + if content_length != complete_length: + self.headers["Content-Length"] = content_length + self.content_range = content_range_header + self.status_code = 206 + self._wrap_response(range_tuple[0], content_length) + return True + return False + + def make_conditional( + self, request_or_environ, accept_ranges=False, complete_length=None + ): + """Make the response conditional to the request. This method works + best if an etag was defined for the response already. The `add_etag` + method can be used to do that. If called without etag just the date + header is set. + + This does nothing if the request method in the request or environ is + anything but GET or HEAD. + + For optimal performance when handling range requests, it's recommended + that your response data object implements `seekable`, `seek` and `tell` + methods as described by :py:class:`io.IOBase`. Objects returned by + :meth:`~werkzeug.wsgi.wrap_file` automatically implement those methods. + + It does not remove the body of the response because that's something + the :meth:`__call__` function does for us automatically. + + Returns self so that you can do ``return resp.make_conditional(req)`` + but modifies the object in-place. + + :param request_or_environ: a request object or WSGI environment to be + used to make the response conditional + against. + :param accept_ranges: This parameter dictates the value of + `Accept-Ranges` header. If ``False`` (default), + the header is not set. If ``True``, it will be set + to ``"bytes"``. If ``None``, it will be set to + ``"none"``. If it's a string, it will use this + value. + :param complete_length: Will be used only in valid Range Requests. + It will set `Content-Range` complete length + value and compute `Content-Length` real value. + This parameter is mandatory for successful + Range Requests completion. + :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` + if `Range` header could not be parsed or satisfied. + """ + environ = _get_environ(request_or_environ) + if environ["REQUEST_METHOD"] in ("GET", "HEAD"): + # if the date is not in the headers, add it now. We however + # will not override an already existing header. Unfortunately + # this header will be overriden by many WSGI servers including + # wsgiref. + if "date" not in self.headers: + self.headers["Date"] = http_date() + accept_ranges = _clean_accept_ranges(accept_ranges) + is206 = self._process_range_request(environ, complete_length, accept_ranges) + if not is206 and not is_resource_modified( + environ, + self.headers.get("etag"), + None, + self.headers.get("last-modified"), + ): + if parse_etags(environ.get("HTTP_IF_MATCH")): + self.status_code = 412 + else: + self.status_code = 304 + if ( + self.automatically_set_content_length + and "content-length" not in self.headers + ): + length = self.calculate_content_length() + if length is not None: + self.headers["Content-Length"] = length + return self + + def add_etag(self, overwrite=False, weak=False): + """Add an etag for the current response if there is none yet.""" + if overwrite or "etag" not in self.headers: + self.set_etag(generate_etag(self.get_data()), weak) + + def set_etag(self, etag, weak=False): + """Set the etag, and override the old one if there was one.""" + self.headers["ETag"] = quote_etag(etag, weak) + + def get_etag(self): + """Return a tuple in the form ``(etag, is_weak)``. If there is no + ETag the return value is ``(None, None)``. + """ + return unquote_etag(self.headers.get("ETag")) + + def freeze(self, no_etag=False): + """Call this method if you want to make your response object ready for + pickeling. This buffers the generator if there is one. This also + sets the etag unless `no_etag` is set to `True`. + """ + if not no_etag: + self.add_etag() + super(ETagResponseMixin, self).freeze() + + accept_ranges = header_property( + "Accept-Ranges", + doc="""The `Accept-Ranges` header. Even though the name would + indicate that multiple values are supported, it must be one + string token only. + + The values ``'bytes'`` and ``'none'`` are common. + + .. versionadded:: 0.7""", + ) + + def _get_content_range(self): + def on_update(rng): + if not rng: + del self.headers["content-range"] + else: + self.headers["Content-Range"] = rng.to_header() + + rv = parse_content_range_header(self.headers.get("content-range"), on_update) + # always provide a content range object to make the descriptor + # more user friendly. It provides an unset() method that can be + # used to remove the header quickly. + if rv is None: + rv = ContentRange(None, None, None, on_update=on_update) + return rv + + def _set_content_range(self, value): + if not value: + del self.headers["content-range"] + elif isinstance(value, string_types): + self.headers["Content-Range"] = value + else: + self.headers["Content-Range"] = value.to_header() + + content_range = property( + _get_content_range, + _set_content_range, + doc="""The ``Content-Range`` header as + :class:`~werkzeug.datastructures.ContentRange` object. Even if + the header is not set it wil provide such an object for easier + manipulation. + + .. versionadded:: 0.7""", + ) + del _get_content_range, _set_content_range diff --git a/brightonpy/Lib/site-packages/werkzeug/wrappers/json.py b/brightonpy/Lib/site-packages/werkzeug/wrappers/json.py new file mode 100644 index 0000000..6d5dc33 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/wrappers/json.py @@ -0,0 +1,145 @@ +from __future__ import absolute_import + +import datetime +import uuid + +from .._compat import text_type +from ..exceptions import BadRequest +from ..utils import detect_utf_encoding + +try: + import simplejson as _json +except ImportError: + import json as _json + + +class _JSONModule(object): + @staticmethod + def _default(o): + if isinstance(o, datetime.date): + return o.isoformat() + + if isinstance(o, uuid.UUID): + return str(o) + + if hasattr(o, "__html__"): + return text_type(o.__html__()) + + raise TypeError() + + @classmethod + def dumps(cls, obj, **kw): + kw.setdefault("separators", (",", ":")) + kw.setdefault("default", cls._default) + kw.setdefault("sort_keys", True) + return _json.dumps(obj, **kw) + + @staticmethod + def loads(s, **kw): + if isinstance(s, bytes): + # Needed for Python < 3.6 + encoding = detect_utf_encoding(s) + s = s.decode(encoding) + + return _json.loads(s, **kw) + + +class JSONMixin(object): + """Mixin to parse :attr:`data` as JSON. Can be mixed in for both + :class:`~werkzeug.wrappers.Request` and + :class:`~werkzeug.wrappers.Response` classes. + + If `simplejson`_ is installed it is preferred over Python's built-in + :mod:`json` module. + + .. _simplejson: https://simplejson.readthedocs.io/en/latest/ + """ + + #: A module or other object that has ``dumps`` and ``loads`` + #: functions that match the API of the built-in :mod:`json` module. + json_module = _JSONModule + + @property + def json(self): + """The parsed JSON data if :attr:`mimetype` indicates JSON + (:mimetype:`application/json`, see :meth:`is_json`). + + Calls :meth:`get_json` with default arguments. + """ + return self.get_json() + + @property + def is_json(self): + """Check if the mimetype indicates JSON data, either + :mimetype:`application/json` or :mimetype:`application/*+json`. + """ + mt = self.mimetype + return ( + mt == "application/json" + or mt.startswith("application/") + and mt.endswith("+json") + ) + + def _get_data_for_json(self, cache): + try: + return self.get_data(cache=cache) + except TypeError: + # Response doesn't have cache param. + return self.get_data() + + # Cached values for ``(silent=False, silent=True)``. Initialized + # with sentinel values. + _cached_json = (Ellipsis, Ellipsis) + + def get_json(self, force=False, silent=False, cache=True): + """Parse :attr:`data` as JSON. + + If the mimetype does not indicate JSON + (:mimetype:`application/json`, see :meth:`is_json`), this + returns ``None``. + + If parsing fails, :meth:`on_json_loading_failed` is called and + its return value is used as the return value. + + :param force: Ignore the mimetype and always try to parse JSON. + :param silent: Silence parsing errors and return ``None`` + instead. + :param cache: Store the parsed JSON to return for subsequent + calls. + """ + if cache and self._cached_json[silent] is not Ellipsis: + return self._cached_json[silent] + + if not (force or self.is_json): + return None + + data = self._get_data_for_json(cache=cache) + + try: + rv = self.json_module.loads(data) + except ValueError as e: + if silent: + rv = None + + if cache: + normal_rv, _ = self._cached_json + self._cached_json = (normal_rv, rv) + else: + rv = self.on_json_loading_failed(e) + + if cache: + _, silent_rv = self._cached_json + self._cached_json = (rv, silent_rv) + else: + if cache: + self._cached_json = (rv, rv) + + return rv + + def on_json_loading_failed(self, e): + """Called if :meth:`get_json` parsing fails and isn't silenced. + If this method returns a value, it is used as the return value + for :meth:`get_json`. The default implementation raises + :exc:`~werkzeug.exceptions.BadRequest`. + """ + raise BadRequest("Failed to decode JSON object: {0}".format(e)) diff --git a/brightonpy/Lib/site-packages/werkzeug/wrappers/request.py b/brightonpy/Lib/site-packages/werkzeug/wrappers/request.py new file mode 100644 index 0000000..d1c71b6 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/wrappers/request.py @@ -0,0 +1,44 @@ +from .accept import AcceptMixin +from .auth import AuthorizationMixin +from .base_request import BaseRequest +from .common_descriptors import CommonRequestDescriptorsMixin +from .etag import ETagRequestMixin +from .user_agent import UserAgentMixin + + +class Request( + BaseRequest, + AcceptMixin, + ETagRequestMixin, + UserAgentMixin, + AuthorizationMixin, + CommonRequestDescriptorsMixin, +): + """Full featured request object implementing the following mixins: + + - :class:`AcceptMixin` for accept header parsing + - :class:`ETagRequestMixin` for etag and cache control handling + - :class:`UserAgentMixin` for user agent introspection + - :class:`AuthorizationMixin` for http auth handling + - :class:`CommonRequestDescriptorsMixin` for common headers + """ + + +class StreamOnlyMixin(object): + """If mixed in before the request object this will change the bahavior + of it to disable handling of form parsing. This disables the + :attr:`files`, :attr:`form` attributes and will just provide a + :attr:`stream` attribute that however is always available. + + .. versionadded:: 0.9 + """ + + disable_data_descriptor = True + want_form_data_parsed = False + + +class PlainRequest(StreamOnlyMixin, Request): + """A request object without special form parsing capabilities. + + .. versionadded:: 0.9 + """ diff --git a/brightonpy/Lib/site-packages/werkzeug/wrappers/response.py b/brightonpy/Lib/site-packages/werkzeug/wrappers/response.py new file mode 100644 index 0000000..cd86cac --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/wrappers/response.py @@ -0,0 +1,78 @@ +from ..utils import cached_property +from .auth import WWWAuthenticateMixin +from .base_response import BaseResponse +from .common_descriptors import CommonResponseDescriptorsMixin +from .etag import ETagResponseMixin + + +class ResponseStream(object): + """A file descriptor like object used by the :class:`ResponseStreamMixin` to + represent the body of the stream. It directly pushes into the response + iterable of the response object. + """ + + mode = "wb+" + + def __init__(self, response): + self.response = response + self.closed = False + + def write(self, value): + if self.closed: + raise ValueError("I/O operation on closed file") + self.response._ensure_sequence(mutable=True) + self.response.response.append(value) + self.response.headers.pop("Content-Length", None) + return len(value) + + def writelines(self, seq): + for item in seq: + self.write(item) + + def close(self): + self.closed = True + + def flush(self): + if self.closed: + raise ValueError("I/O operation on closed file") + + def isatty(self): + if self.closed: + raise ValueError("I/O operation on closed file") + return False + + def tell(self): + self.response._ensure_sequence() + return sum(map(len, self.response.response)) + + @property + def encoding(self): + return self.response.charset + + +class ResponseStreamMixin(object): + """Mixin for :class:`BaseRequest` subclasses. Classes that inherit from + this mixin will automatically get a :attr:`stream` property that provides + a write-only interface to the response iterable. + """ + + @cached_property + def stream(self): + """The response iterable as write-only stream.""" + return ResponseStream(self) + + +class Response( + BaseResponse, + ETagResponseMixin, + ResponseStreamMixin, + CommonResponseDescriptorsMixin, + WWWAuthenticateMixin, +): + """Full featured response object implementing the following mixins: + + - :class:`ETagResponseMixin` for etag and cache control handling + - :class:`ResponseStreamMixin` to add support for the `stream` property + - :class:`CommonResponseDescriptorsMixin` for various HTTP descriptors + - :class:`WWWAuthenticateMixin` for HTTP authentication support + """ diff --git a/brightonpy/Lib/site-packages/werkzeug/wrappers/user_agent.py b/brightonpy/Lib/site-packages/werkzeug/wrappers/user_agent.py new file mode 100644 index 0000000..a32d8ac --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/wrappers/user_agent.py @@ -0,0 +1,14 @@ +from ..useragents import UserAgent +from ..utils import cached_property + + +class UserAgentMixin(object): + """Adds a `user_agent` attribute to the request object which + contains the parsed user agent of the browser that triggered the + request as a :class:`~werkzeug.useragents.UserAgent` object. + """ + + @cached_property + def user_agent(self): + """The current user agent.""" + return UserAgent(self.environ) diff --git a/brightonpy/Lib/site-packages/werkzeug/wsgi.py b/brightonpy/Lib/site-packages/werkzeug/wsgi.py new file mode 100644 index 0000000..7411955 --- /dev/null +++ b/brightonpy/Lib/site-packages/werkzeug/wsgi.py @@ -0,0 +1,1013 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.wsgi + ~~~~~~~~~~~~~ + + This module implements WSGI related helpers. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import io +import re +from functools import partial +from functools import update_wrapper +from itertools import chain + +from ._compat import BytesIO +from ._compat import implements_iterator +from ._compat import make_literal_wrapper +from ._compat import string_types +from ._compat import text_type +from ._compat import to_bytes +from ._compat import to_unicode +from ._compat import try_coerce_native +from ._compat import wsgi_get_bytes +from ._internal import _encode_idna +from .urls import uri_to_iri +from .urls import url_join +from .urls import url_parse +from .urls import url_quote + + +def responder(f): + """Marks a function as responder. Decorate a function with it and it + will automatically call the return value as WSGI application. + + Example:: + + @responder + def application(environ, start_response): + return Response('Hello World!') + """ + return update_wrapper(lambda *a: f(*a)(*a[-2:]), f) + + +def get_current_url( + environ, + root_only=False, + strip_querystring=False, + host_only=False, + trusted_hosts=None, +): + """A handy helper function that recreates the full URL as IRI for the + current request or parts of it. Here's an example: + + >>> from werkzeug.test import create_environ + >>> env = create_environ("/?param=foo", "http://localhost/script") + >>> get_current_url(env) + 'http://localhost/script/?param=foo' + >>> get_current_url(env, root_only=True) + 'http://localhost/script/' + >>> get_current_url(env, host_only=True) + 'http://localhost/' + >>> get_current_url(env, strip_querystring=True) + 'http://localhost/script/' + + This optionally it verifies that the host is in a list of trusted hosts. + If the host is not in there it will raise a + :exc:`~werkzeug.exceptions.SecurityError`. + + Note that the string returned might contain unicode characters as the + representation is an IRI not an URI. If you need an ASCII only + representation you can use the :func:`~werkzeug.urls.iri_to_uri` + function: + + >>> from werkzeug.urls import iri_to_uri + >>> iri_to_uri(get_current_url(env)) + 'http://localhost/script/?param=foo' + + :param environ: the WSGI environment to get the current URL from. + :param root_only: set `True` if you only want the root URL. + :param strip_querystring: set to `True` if you don't want the querystring. + :param host_only: set to `True` if the host URL should be returned. + :param trusted_hosts: a list of trusted hosts, see :func:`host_is_trusted` + for more information. + """ + tmp = [environ["wsgi.url_scheme"], "://", get_host(environ, trusted_hosts)] + cat = tmp.append + if host_only: + return uri_to_iri("".join(tmp) + "/") + cat(url_quote(wsgi_get_bytes(environ.get("SCRIPT_NAME", ""))).rstrip("/")) + cat("/") + if not root_only: + cat(url_quote(wsgi_get_bytes(environ.get("PATH_INFO", "")).lstrip(b"/"))) + if not strip_querystring: + qs = get_query_string(environ) + if qs: + cat("?" + qs) + return uri_to_iri("".join(tmp)) + + +def host_is_trusted(hostname, trusted_list): + """Checks if a host is trusted against a list. This also takes care + of port normalization. + + .. versionadded:: 0.9 + + :param hostname: the hostname to check + :param trusted_list: a list of hostnames to check against. If a + hostname starts with a dot it will match against + all subdomains as well. + """ + if not hostname: + return False + + if isinstance(trusted_list, string_types): + trusted_list = [trusted_list] + + def _normalize(hostname): + if ":" in hostname: + hostname = hostname.rsplit(":", 1)[0] + return _encode_idna(hostname) + + try: + hostname = _normalize(hostname) + except UnicodeError: + return False + for ref in trusted_list: + if ref.startswith("."): + ref = ref[1:] + suffix_match = True + else: + suffix_match = False + try: + ref = _normalize(ref) + except UnicodeError: + return False + if ref == hostname: + return True + if suffix_match and hostname.endswith(b"." + ref): + return True + return False + + +def get_host(environ, trusted_hosts=None): + """Return the host for the given WSGI environment. This first checks + the ``Host`` header. If it's not present, then ``SERVER_NAME`` and + ``SERVER_PORT`` are used. The host will only contain the port if it + is different than the standard port for the protocol. + + Optionally, verify that the host is trusted using + :func:`host_is_trusted` and raise a + :exc:`~werkzeug.exceptions.SecurityError` if it is not. + + :param environ: The WSGI environment to get the host from. + :param trusted_hosts: A list of trusted hosts. + :return: Host, with port if necessary. + :raise ~werkzeug.exceptions.SecurityError: If the host is not + trusted. + """ + if "HTTP_HOST" in environ: + rv = environ["HTTP_HOST"] + if environ["wsgi.url_scheme"] == "http" and rv.endswith(":80"): + rv = rv[:-3] + elif environ["wsgi.url_scheme"] == "https" and rv.endswith(":443"): + rv = rv[:-4] + else: + rv = environ["SERVER_NAME"] + if (environ["wsgi.url_scheme"], environ["SERVER_PORT"]) not in ( + ("https", "443"), + ("http", "80"), + ): + rv += ":" + environ["SERVER_PORT"] + if trusted_hosts is not None: + if not host_is_trusted(rv, trusted_hosts): + from .exceptions import SecurityError + + raise SecurityError('Host "%s" is not trusted' % rv) + return rv + + +def get_content_length(environ): + """Returns the content length from the WSGI environment as + integer. If it's not available or chunked transfer encoding is used, + ``None`` is returned. + + .. versionadded:: 0.9 + + :param environ: the WSGI environ to fetch the content length from. + """ + if environ.get("HTTP_TRANSFER_ENCODING", "") == "chunked": + return None + + content_length = environ.get("CONTENT_LENGTH") + if content_length is not None: + try: + return max(0, int(content_length)) + except (ValueError, TypeError): + pass + + +def get_input_stream(environ, safe_fallback=True): + """Returns the input stream from the WSGI environment and wraps it + in the most sensible way possible. The stream returned is not the + raw WSGI stream in most cases but one that is safe to read from + without taking into account the content length. + + If content length is not set, the stream will be empty for safety reasons. + If the WSGI server supports chunked or infinite streams, it should set + the ``wsgi.input_terminated`` value in the WSGI environ to indicate that. + + .. versionadded:: 0.9 + + :param environ: the WSGI environ to fetch the stream from. + :param safe_fallback: use an empty stream as a safe fallback when the + content length is not set. Disabling this allows infinite streams, + which can be a denial-of-service risk. + """ + stream = environ["wsgi.input"] + content_length = get_content_length(environ) + + # A wsgi extension that tells us if the input is terminated. In + # that case we return the stream unchanged as we know we can safely + # read it until the end. + if environ.get("wsgi.input_terminated"): + return stream + + # If the request doesn't specify a content length, returning the stream is + # potentially dangerous because it could be infinite, malicious or not. If + # safe_fallback is true, return an empty stream instead for safety. + if content_length is None: + return BytesIO() if safe_fallback else stream + + # Otherwise limit the stream to the content length + return LimitedStream(stream, content_length) + + +def get_query_string(environ): + """Returns the `QUERY_STRING` from the WSGI environment. This also takes + care about the WSGI decoding dance on Python 3 environments as a + native string. The string returned will be restricted to ASCII + characters. + + .. versionadded:: 0.9 + + :param environ: the WSGI environment object to get the query string from. + """ + qs = wsgi_get_bytes(environ.get("QUERY_STRING", "")) + # QUERY_STRING really should be ascii safe but some browsers + # will send us some unicode stuff (I am looking at you IE). + # In that case we want to urllib quote it badly. + return try_coerce_native(url_quote(qs, safe=":&%=+$!*'(),")) + + +def get_path_info(environ, charset="utf-8", errors="replace"): + """Returns the `PATH_INFO` from the WSGI environment and properly + decodes it. This also takes care about the WSGI decoding dance + on Python 3 environments. if the `charset` is set to `None` a + bytestring is returned. + + .. versionadded:: 0.9 + + :param environ: the WSGI environment object to get the path from. + :param charset: the charset for the path info, or `None` if no + decoding should be performed. + :param errors: the decoding error handling. + """ + path = wsgi_get_bytes(environ.get("PATH_INFO", "")) + return to_unicode(path, charset, errors, allow_none_charset=True) + + +def get_script_name(environ, charset="utf-8", errors="replace"): + """Returns the `SCRIPT_NAME` from the WSGI environment and properly + decodes it. This also takes care about the WSGI decoding dance + on Python 3 environments. if the `charset` is set to `None` a + bytestring is returned. + + .. versionadded:: 0.9 + + :param environ: the WSGI environment object to get the path from. + :param charset: the charset for the path, or `None` if no + decoding should be performed. + :param errors: the decoding error handling. + """ + path = wsgi_get_bytes(environ.get("SCRIPT_NAME", "")) + return to_unicode(path, charset, errors, allow_none_charset=True) + + +def pop_path_info(environ, charset="utf-8", errors="replace"): + """Removes and returns the next segment of `PATH_INFO`, pushing it onto + `SCRIPT_NAME`. Returns `None` if there is nothing left on `PATH_INFO`. + + If the `charset` is set to `None` a bytestring is returned. + + If there are empty segments (``'/foo//bar``) these are ignored but + properly pushed to the `SCRIPT_NAME`: + + >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} + >>> pop_path_info(env) + 'a' + >>> env['SCRIPT_NAME'] + '/foo/a' + >>> pop_path_info(env) + 'b' + >>> env['SCRIPT_NAME'] + '/foo/a/b' + + .. versionadded:: 0.5 + + .. versionchanged:: 0.9 + The path is now decoded and a charset and encoding + parameter can be provided. + + :param environ: the WSGI environment that is modified. + """ + path = environ.get("PATH_INFO") + if not path: + return None + + script_name = environ.get("SCRIPT_NAME", "") + + # shift multiple leading slashes over + old_path = path + path = path.lstrip("/") + if path != old_path: + script_name += "/" * (len(old_path) - len(path)) + + if "/" not in path: + environ["PATH_INFO"] = "" + environ["SCRIPT_NAME"] = script_name + path + rv = wsgi_get_bytes(path) + else: + segment, path = path.split("/", 1) + environ["PATH_INFO"] = "/" + path + environ["SCRIPT_NAME"] = script_name + segment + rv = wsgi_get_bytes(segment) + + return to_unicode(rv, charset, errors, allow_none_charset=True) + + +def peek_path_info(environ, charset="utf-8", errors="replace"): + """Returns the next segment on the `PATH_INFO` or `None` if there + is none. Works like :func:`pop_path_info` without modifying the + environment: + + >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} + >>> peek_path_info(env) + 'a' + >>> peek_path_info(env) + 'a' + + If the `charset` is set to `None` a bytestring is returned. + + .. versionadded:: 0.5 + + .. versionchanged:: 0.9 + The path is now decoded and a charset and encoding + parameter can be provided. + + :param environ: the WSGI environment that is checked. + """ + segments = environ.get("PATH_INFO", "").lstrip("/").split("/", 1) + if segments: + return to_unicode( + wsgi_get_bytes(segments[0]), charset, errors, allow_none_charset=True + ) + + +def extract_path_info( + environ_or_baseurl, + path_or_url, + charset="utf-8", + errors="werkzeug.url_quote", + collapse_http_schemes=True, +): + """Extracts the path info from the given URL (or WSGI environment) and + path. The path info returned is a unicode string, not a bytestring + suitable for a WSGI environment. The URLs might also be IRIs. + + If the path info could not be determined, `None` is returned. + + Some examples: + + >>> extract_path_info('http://example.com/app', '/app/hello') + u'/hello' + >>> extract_path_info('http://example.com/app', + ... 'https://example.com/app/hello') + u'/hello' + >>> extract_path_info('http://example.com/app', + ... 'https://example.com/app/hello', + ... collapse_http_schemes=False) is None + True + + Instead of providing a base URL you can also pass a WSGI environment. + + :param environ_or_baseurl: a WSGI environment dict, a base URL or + base IRI. This is the root of the + application. + :param path_or_url: an absolute path from the server root, a + relative path (in which case it's the path info) + or a full URL. Also accepts IRIs and unicode + parameters. + :param charset: the charset for byte data in URLs + :param errors: the error handling on decode + :param collapse_http_schemes: if set to `False` the algorithm does + not assume that http and https on the + same server point to the same + resource. + + .. versionchanged:: 0.15 + The ``errors`` parameter defaults to leaving invalid bytes + quoted instead of replacing them. + + .. versionadded:: 0.6 + """ + + def _normalize_netloc(scheme, netloc): + parts = netloc.split(u"@", 1)[-1].split(u":", 1) + if len(parts) == 2: + netloc, port = parts + if (scheme == u"http" and port == u"80") or ( + scheme == u"https" and port == u"443" + ): + port = None + else: + netloc = parts[0] + port = None + if port is not None: + netloc += u":" + port + return netloc + + # make sure whatever we are working on is a IRI and parse it + path = uri_to_iri(path_or_url, charset, errors) + if isinstance(environ_or_baseurl, dict): + environ_or_baseurl = get_current_url(environ_or_baseurl, root_only=True) + base_iri = uri_to_iri(environ_or_baseurl, charset, errors) + base_scheme, base_netloc, base_path = url_parse(base_iri)[:3] + cur_scheme, cur_netloc, cur_path, = url_parse(url_join(base_iri, path))[:3] + + # normalize the network location + base_netloc = _normalize_netloc(base_scheme, base_netloc) + cur_netloc = _normalize_netloc(cur_scheme, cur_netloc) + + # is that IRI even on a known HTTP scheme? + if collapse_http_schemes: + for scheme in base_scheme, cur_scheme: + if scheme not in (u"http", u"https"): + return None + else: + if not (base_scheme in (u"http", u"https") and base_scheme == cur_scheme): + return None + + # are the netlocs compatible? + if base_netloc != cur_netloc: + return None + + # are we below the application path? + base_path = base_path.rstrip(u"/") + if not cur_path.startswith(base_path): + return None + + return u"/" + cur_path[len(base_path) :].lstrip(u"/") + + +@implements_iterator +class ClosingIterator(object): + """The WSGI specification requires that all middlewares and gateways + respect the `close` callback of the iterable returned by the application. + Because it is useful to add another close action to a returned iterable + and adding a custom iterable is a boring task this class can be used for + that:: + + return ClosingIterator(app(environ, start_response), [cleanup_session, + cleanup_locals]) + + If there is just one close function it can be passed instead of the list. + + A closing iterator is not needed if the application uses response objects + and finishes the processing if the response is started:: + + try: + return response(environ, start_response) + finally: + cleanup_session() + cleanup_locals() + """ + + def __init__(self, iterable, callbacks=None): + iterator = iter(iterable) + self._next = partial(next, iterator) + if callbacks is None: + callbacks = [] + elif callable(callbacks): + callbacks = [callbacks] + else: + callbacks = list(callbacks) + iterable_close = getattr(iterable, "close", None) + if iterable_close: + callbacks.insert(0, iterable_close) + self._callbacks = callbacks + + def __iter__(self): + return self + + def __next__(self): + return self._next() + + def close(self): + for callback in self._callbacks: + callback() + + +def wrap_file(environ, file, buffer_size=8192): + """Wraps a file. This uses the WSGI server's file wrapper if available + or otherwise the generic :class:`FileWrapper`. + + .. versionadded:: 0.5 + + If the file wrapper from the WSGI server is used it's important to not + iterate over it from inside the application but to pass it through + unchanged. If you want to pass out a file wrapper inside a response + object you have to set :attr:`~BaseResponse.direct_passthrough` to `True`. + + More information about file wrappers are available in :pep:`333`. + + :param file: a :class:`file`-like object with a :meth:`~file.read` method. + :param buffer_size: number of bytes for one iteration. + """ + return environ.get("wsgi.file_wrapper", FileWrapper)(file, buffer_size) + + +@implements_iterator +class FileWrapper(object): + """This class can be used to convert a :class:`file`-like object into + an iterable. It yields `buffer_size` blocks until the file is fully + read. + + You should not use this class directly but rather use the + :func:`wrap_file` function that uses the WSGI server's file wrapper + support if it's available. + + .. versionadded:: 0.5 + + If you're using this object together with a :class:`BaseResponse` you have + to use the `direct_passthrough` mode. + + :param file: a :class:`file`-like object with a :meth:`~file.read` method. + :param buffer_size: number of bytes for one iteration. + """ + + def __init__(self, file, buffer_size=8192): + self.file = file + self.buffer_size = buffer_size + + def close(self): + if hasattr(self.file, "close"): + self.file.close() + + def seekable(self): + if hasattr(self.file, "seekable"): + return self.file.seekable() + if hasattr(self.file, "seek"): + return True + return False + + def seek(self, *args): + if hasattr(self.file, "seek"): + self.file.seek(*args) + + def tell(self): + if hasattr(self.file, "tell"): + return self.file.tell() + return None + + def __iter__(self): + return self + + def __next__(self): + data = self.file.read(self.buffer_size) + if data: + return data + raise StopIteration() + + +@implements_iterator +class _RangeWrapper(object): + # private for now, but should we make it public in the future ? + + """This class can be used to convert an iterable object into + an iterable that will only yield a piece of the underlying content. + It yields blocks until the underlying stream range is fully read. + The yielded blocks will have a size that can't exceed the original + iterator defined block size, but that can be smaller. + + If you're using this object together with a :class:`BaseResponse` you have + to use the `direct_passthrough` mode. + + :param iterable: an iterable object with a :meth:`__next__` method. + :param start_byte: byte from which read will start. + :param byte_range: how many bytes to read. + """ + + def __init__(self, iterable, start_byte=0, byte_range=None): + self.iterable = iter(iterable) + self.byte_range = byte_range + self.start_byte = start_byte + self.end_byte = None + if byte_range is not None: + self.end_byte = self.start_byte + self.byte_range + self.read_length = 0 + self.seekable = hasattr(iterable, "seekable") and iterable.seekable() + self.end_reached = False + + def __iter__(self): + return self + + def _next_chunk(self): + try: + chunk = next(self.iterable) + self.read_length += len(chunk) + return chunk + except StopIteration: + self.end_reached = True + raise + + def _first_iteration(self): + chunk = None + if self.seekable: + self.iterable.seek(self.start_byte) + self.read_length = self.iterable.tell() + contextual_read_length = self.read_length + else: + while self.read_length <= self.start_byte: + chunk = self._next_chunk() + if chunk is not None: + chunk = chunk[self.start_byte - self.read_length :] + contextual_read_length = self.start_byte + return chunk, contextual_read_length + + def _next(self): + if self.end_reached: + raise StopIteration() + chunk = None + contextual_read_length = self.read_length + if self.read_length == 0: + chunk, contextual_read_length = self._first_iteration() + if chunk is None: + chunk = self._next_chunk() + if self.end_byte is not None and self.read_length >= self.end_byte: + self.end_reached = True + return chunk[: self.end_byte - contextual_read_length] + return chunk + + def __next__(self): + chunk = self._next() + if chunk: + return chunk + self.end_reached = True + raise StopIteration() + + def close(self): + if hasattr(self.iterable, "close"): + self.iterable.close() + + +def _make_chunk_iter(stream, limit, buffer_size): + """Helper for the line and chunk iter functions.""" + if isinstance(stream, (bytes, bytearray, text_type)): + raise TypeError( + "Passed a string or byte object instead of true iterator or stream." + ) + if not hasattr(stream, "read"): + for item in stream: + if item: + yield item + return + if not isinstance(stream, LimitedStream) and limit is not None: + stream = LimitedStream(stream, limit) + _read = stream.read + while 1: + item = _read(buffer_size) + if not item: + break + yield item + + +def make_line_iter(stream, limit=None, buffer_size=10 * 1024, cap_at_buffer=False): + """Safely iterates line-based over an input stream. If the input stream + is not a :class:`LimitedStream` the `limit` parameter is mandatory. + + This uses the stream's :meth:`~file.read` method internally as opposite + to the :meth:`~file.readline` method that is unsafe and can only be used + in violation of the WSGI specification. The same problem applies to the + `__iter__` function of the input stream which calls :meth:`~file.readline` + without arguments. + + If you need line-by-line processing it's strongly recommended to iterate + over the input stream using this helper function. + + .. versionchanged:: 0.8 + This function now ensures that the limit was reached. + + .. versionadded:: 0.9 + added support for iterators as input stream. + + .. versionadded:: 0.11.10 + added support for the `cap_at_buffer` parameter. + + :param stream: the stream or iterate to iterate over. + :param limit: the limit in bytes for the stream. (Usually + content length. Not necessary if the `stream` + is a :class:`LimitedStream`. + :param buffer_size: The optional buffer size. + :param cap_at_buffer: if this is set chunks are split if they are longer + than the buffer size. Internally this is implemented + that the buffer size might be exhausted by a factor + of two however. + """ + _iter = _make_chunk_iter(stream, limit, buffer_size) + + first_item = next(_iter, "") + if not first_item: + return + + s = make_literal_wrapper(first_item) + empty = s("") + cr = s("\r") + lf = s("\n") + crlf = s("\r\n") + + _iter = chain((first_item,), _iter) + + def _iter_basic_lines(): + _join = empty.join + buffer = [] + while 1: + new_data = next(_iter, "") + if not new_data: + break + new_buf = [] + buf_size = 0 + for item in chain(buffer, new_data.splitlines(True)): + new_buf.append(item) + buf_size += len(item) + if item and item[-1:] in crlf: + yield _join(new_buf) + new_buf = [] + elif cap_at_buffer and buf_size >= buffer_size: + rv = _join(new_buf) + while len(rv) >= buffer_size: + yield rv[:buffer_size] + rv = rv[buffer_size:] + new_buf = [rv] + buffer = new_buf + if buffer: + yield _join(buffer) + + # This hackery is necessary to merge 'foo\r' and '\n' into one item + # of 'foo\r\n' if we were unlucky and we hit a chunk boundary. + previous = empty + for item in _iter_basic_lines(): + if item == lf and previous[-1:] == cr: + previous += item + item = empty + if previous: + yield previous + previous = item + if previous: + yield previous + + +def make_chunk_iter( + stream, separator, limit=None, buffer_size=10 * 1024, cap_at_buffer=False +): + """Works like :func:`make_line_iter` but accepts a separator + which divides chunks. If you want newline based processing + you should use :func:`make_line_iter` instead as it + supports arbitrary newline markers. + + .. versionadded:: 0.8 + + .. versionadded:: 0.9 + added support for iterators as input stream. + + .. versionadded:: 0.11.10 + added support for the `cap_at_buffer` parameter. + + :param stream: the stream or iterate to iterate over. + :param separator: the separator that divides chunks. + :param limit: the limit in bytes for the stream. (Usually + content length. Not necessary if the `stream` + is otherwise already limited). + :param buffer_size: The optional buffer size. + :param cap_at_buffer: if this is set chunks are split if they are longer + than the buffer size. Internally this is implemented + that the buffer size might be exhausted by a factor + of two however. + """ + _iter = _make_chunk_iter(stream, limit, buffer_size) + + first_item = next(_iter, "") + if not first_item: + return + + _iter = chain((first_item,), _iter) + if isinstance(first_item, text_type): + separator = to_unicode(separator) + _split = re.compile(r"(%s)" % re.escape(separator)).split + _join = u"".join + else: + separator = to_bytes(separator) + _split = re.compile(b"(" + re.escape(separator) + b")").split + _join = b"".join + + buffer = [] + while 1: + new_data = next(_iter, "") + if not new_data: + break + chunks = _split(new_data) + new_buf = [] + buf_size = 0 + for item in chain(buffer, chunks): + if item == separator: + yield _join(new_buf) + new_buf = [] + buf_size = 0 + else: + buf_size += len(item) + new_buf.append(item) + + if cap_at_buffer and buf_size >= buffer_size: + rv = _join(new_buf) + while len(rv) >= buffer_size: + yield rv[:buffer_size] + rv = rv[buffer_size:] + new_buf = [rv] + buf_size = len(rv) + + buffer = new_buf + if buffer: + yield _join(buffer) + + +@implements_iterator +class LimitedStream(io.IOBase): + """Wraps a stream so that it doesn't read more than n bytes. If the + stream is exhausted and the caller tries to get more bytes from it + :func:`on_exhausted` is called which by default returns an empty + string. The return value of that function is forwarded + to the reader function. So if it returns an empty string + :meth:`read` will return an empty string as well. + + The limit however must never be higher than what the stream can + output. Otherwise :meth:`readlines` will try to read past the + limit. + + .. admonition:: Note on WSGI compliance + + calls to :meth:`readline` and :meth:`readlines` are not + WSGI compliant because it passes a size argument to the + readline methods. Unfortunately the WSGI PEP is not safely + implementable without a size argument to :meth:`readline` + because there is no EOF marker in the stream. As a result + of that the use of :meth:`readline` is discouraged. + + For the same reason iterating over the :class:`LimitedStream` + is not portable. It internally calls :meth:`readline`. + + We strongly suggest using :meth:`read` only or using the + :func:`make_line_iter` which safely iterates line-based + over a WSGI input stream. + + :param stream: the stream to wrap. + :param limit: the limit for the stream, must not be longer than + what the string can provide if the stream does not + end with `EOF` (like `wsgi.input`) + """ + + def __init__(self, stream, limit): + self._read = stream.read + self._readline = stream.readline + self._pos = 0 + self.limit = limit + + def __iter__(self): + return self + + @property + def is_exhausted(self): + """If the stream is exhausted this attribute is `True`.""" + return self._pos >= self.limit + + def on_exhausted(self): + """This is called when the stream tries to read past the limit. + The return value of this function is returned from the reading + function. + """ + # Read null bytes from the stream so that we get the + # correct end of stream marker. + return self._read(0) + + def on_disconnect(self): + """What should happen if a disconnect is detected? The return + value of this function is returned from read functions in case + the client went away. By default a + :exc:`~werkzeug.exceptions.ClientDisconnected` exception is raised. + """ + from .exceptions import ClientDisconnected + + raise ClientDisconnected() + + def exhaust(self, chunk_size=1024 * 64): + """Exhaust the stream. This consumes all the data left until the + limit is reached. + + :param chunk_size: the size for a chunk. It will read the chunk + until the stream is exhausted and throw away + the results. + """ + to_read = self.limit - self._pos + chunk = chunk_size + while to_read > 0: + chunk = min(to_read, chunk) + self.read(chunk) + to_read -= chunk + + def read(self, size=None): + """Read `size` bytes or if size is not provided everything is read. + + :param size: the number of bytes read. + """ + if self._pos >= self.limit: + return self.on_exhausted() + if size is None or size == -1: # -1 is for consistence with file + size = self.limit + to_read = min(self.limit - self._pos, size) + try: + read = self._read(to_read) + except (IOError, ValueError): + return self.on_disconnect() + if to_read and len(read) != to_read: + return self.on_disconnect() + self._pos += len(read) + return read + + def readline(self, size=None): + """Reads one line from the stream.""" + if self._pos >= self.limit: + return self.on_exhausted() + if size is None: + size = self.limit - self._pos + else: + size = min(size, self.limit - self._pos) + try: + line = self._readline(size) + except (ValueError, IOError): + return self.on_disconnect() + if size and not line: + return self.on_disconnect() + self._pos += len(line) + return line + + def readlines(self, size=None): + """Reads a file into a list of strings. It calls :meth:`readline` + until the file is read to the end. It does support the optional + `size` argument if the underlaying stream supports it for + `readline`. + """ + last_pos = self._pos + result = [] + if size is not None: + end = min(self.limit, last_pos + size) + else: + end = self.limit + while 1: + if size is not None: + size -= last_pos - self._pos + if self._pos >= end: + break + result.append(self.readline(size)) + if size is not None: + last_pos = self._pos + return result + + def tell(self): + """Returns the position of the stream. + + .. versionadded:: 0.9 + """ + return self._pos + + def __next__(self): + line = self.readline() + if not line: + raise StopIteration() + return line + + def readable(self): + return True + + +from werkzeug import _DeprecatedImportModule + +_DeprecatedImportModule( + __name__, + { + ".middleware.dispatcher": ["DispatcherMiddleware"], + ".middleware.http_proxy": ["ProxyMiddleware"], + ".middleware.shared_data": ["SharedDataMiddleware"], + }, + "Werkzeug 1.0", +) diff --git a/brightonpy/Lib/site-packages/yaml/__init__.py b/brightonpy/Lib/site-packages/yaml/__init__.py new file mode 100644 index 0000000..d7d27fe --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/__init__.py @@ -0,0 +1,312 @@ + +from .error import * + +from .tokens import * +from .events import * +from .nodes import * + +from .loader import * +from .dumper import * + +__version__ = '3.12' +try: + from .cyaml import * + __with_libyaml__ = True +except ImportError: + __with_libyaml__ = False + +import io + +def scan(stream, Loader=Loader): + """ + Scan a YAML stream and produce scanning tokens. + """ + loader = Loader(stream) + try: + while loader.check_token(): + yield loader.get_token() + finally: + loader.dispose() + +def parse(stream, Loader=Loader): + """ + Parse a YAML stream and produce parsing events. + """ + loader = Loader(stream) + try: + while loader.check_event(): + yield loader.get_event() + finally: + loader.dispose() + +def compose(stream, Loader=Loader): + """ + Parse the first YAML document in a stream + and produce the corresponding representation tree. + """ + loader = Loader(stream) + try: + return loader.get_single_node() + finally: + loader.dispose() + +def compose_all(stream, Loader=Loader): + """ + Parse all YAML documents in a stream + and produce corresponding representation trees. + """ + loader = Loader(stream) + try: + while loader.check_node(): + yield loader.get_node() + finally: + loader.dispose() + +def load(stream, Loader=Loader): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + """ + loader = Loader(stream) + try: + return loader.get_single_data() + finally: + loader.dispose() + +def load_all(stream, Loader=Loader): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + """ + loader = Loader(stream) + try: + while loader.check_data(): + yield loader.get_data() + finally: + loader.dispose() + +def safe_load(stream): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + Resolve only basic YAML tags. + """ + return load(stream, SafeLoader) + +def safe_load_all(stream): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + Resolve only basic YAML tags. + """ + return load_all(stream, SafeLoader) + +def emit(events, stream=None, Dumper=Dumper, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None): + """ + Emit YAML parsing events into a stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + stream = io.StringIO() + getvalue = stream.getvalue + dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + try: + for event in events: + dumper.emit(event) + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def serialize_all(nodes, stream=None, Dumper=Dumper, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + """ + Serialize a sequence of representation trees into a YAML stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + if encoding is None: + stream = io.StringIO() + else: + stream = io.BytesIO() + getvalue = stream.getvalue + dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break, + encoding=encoding, version=version, tags=tags, + explicit_start=explicit_start, explicit_end=explicit_end) + try: + dumper.open() + for node in nodes: + dumper.serialize(node) + dumper.close() + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def serialize(node, stream=None, Dumper=Dumper, **kwds): + """ + Serialize a representation tree into a YAML stream. + If stream is None, return the produced string instead. + """ + return serialize_all([node], stream, Dumper=Dumper, **kwds) + +def dump_all(documents, stream=None, Dumper=Dumper, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + """ + Serialize a sequence of Python objects into a YAML stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + if encoding is None: + stream = io.StringIO() + else: + stream = io.BytesIO() + getvalue = stream.getvalue + dumper = Dumper(stream, default_style=default_style, + default_flow_style=default_flow_style, + canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break, + encoding=encoding, version=version, tags=tags, + explicit_start=explicit_start, explicit_end=explicit_end) + try: + dumper.open() + for data in documents: + dumper.represent(data) + dumper.close() + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def dump(data, stream=None, Dumper=Dumper, **kwds): + """ + Serialize a Python object into a YAML stream. + If stream is None, return the produced string instead. + """ + return dump_all([data], stream, Dumper=Dumper, **kwds) + +def safe_dump_all(documents, stream=None, **kwds): + """ + Serialize a sequence of Python objects into a YAML stream. + Produce only basic YAML tags. + If stream is None, return the produced string instead. + """ + return dump_all(documents, stream, Dumper=SafeDumper, **kwds) + +def safe_dump(data, stream=None, **kwds): + """ + Serialize a Python object into a YAML stream. + Produce only basic YAML tags. + If stream is None, return the produced string instead. + """ + return dump_all([data], stream, Dumper=SafeDumper, **kwds) + +def add_implicit_resolver(tag, regexp, first=None, + Loader=Loader, Dumper=Dumper): + """ + Add an implicit scalar detector. + If an implicit scalar value matches the given regexp, + the corresponding tag is assigned to the scalar. + first is a sequence of possible initial characters or None. + """ + Loader.add_implicit_resolver(tag, regexp, first) + Dumper.add_implicit_resolver(tag, regexp, first) + +def add_path_resolver(tag, path, kind=None, Loader=Loader, Dumper=Dumper): + """ + Add a path based resolver for the given tag. + A path is a list of keys that forms a path + to a node in the representation tree. + Keys can be string values, integers, or None. + """ + Loader.add_path_resolver(tag, path, kind) + Dumper.add_path_resolver(tag, path, kind) + +def add_constructor(tag, constructor, Loader=Loader): + """ + Add a constructor for the given tag. + Constructor is a function that accepts a Loader instance + and a node object and produces the corresponding Python object. + """ + Loader.add_constructor(tag, constructor) + +def add_multi_constructor(tag_prefix, multi_constructor, Loader=Loader): + """ + Add a multi-constructor for the given tag prefix. + Multi-constructor is called for a node if its tag starts with tag_prefix. + Multi-constructor accepts a Loader instance, a tag suffix, + and a node object and produces the corresponding Python object. + """ + Loader.add_multi_constructor(tag_prefix, multi_constructor) + +def add_representer(data_type, representer, Dumper=Dumper): + """ + Add a representer for the given type. + Representer is a function accepting a Dumper instance + and an instance of the given data type + and producing the corresponding representation node. + """ + Dumper.add_representer(data_type, representer) + +def add_multi_representer(data_type, multi_representer, Dumper=Dumper): + """ + Add a representer for the given type. + Multi-representer is a function accepting a Dumper instance + and an instance of the given data type or subtype + and producing the corresponding representation node. + """ + Dumper.add_multi_representer(data_type, multi_representer) + +class YAMLObjectMetaclass(type): + """ + The metaclass for YAMLObject. + """ + def __init__(cls, name, bases, kwds): + super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds) + if 'yaml_tag' in kwds and kwds['yaml_tag'] is not None: + cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml) + cls.yaml_dumper.add_representer(cls, cls.to_yaml) + +class YAMLObject(metaclass=YAMLObjectMetaclass): + """ + An object that can dump itself to a YAML stream + and load itself from a YAML stream. + """ + + __slots__ = () # no direct instantiation, so allow immutable subclasses + + yaml_loader = Loader + yaml_dumper = Dumper + + yaml_tag = None + yaml_flow_style = None + + @classmethod + def from_yaml(cls, loader, node): + """ + Convert a representation node to a Python object. + """ + return loader.construct_yaml_object(node, cls) + + @classmethod + def to_yaml(cls, dumper, data): + """ + Convert a Python object to a representation node. + """ + return dumper.represent_yaml_object(cls.yaml_tag, data, cls, + flow_style=cls.yaml_flow_style) + diff --git a/brightonpy/Lib/site-packages/yaml/composer.py b/brightonpy/Lib/site-packages/yaml/composer.py new file mode 100644 index 0000000..d5c6a7a --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/composer.py @@ -0,0 +1,139 @@ + +__all__ = ['Composer', 'ComposerError'] + +from .error import MarkedYAMLError +from .events import * +from .nodes import * + +class ComposerError(MarkedYAMLError): + pass + +class Composer: + + def __init__(self): + self.anchors = {} + + def check_node(self): + # Drop the STREAM-START event. + if self.check_event(StreamStartEvent): + self.get_event() + + # If there are more documents available? + return not self.check_event(StreamEndEvent) + + def get_node(self): + # Get the root node of the next document. + if not self.check_event(StreamEndEvent): + return self.compose_document() + + def get_single_node(self): + # Drop the STREAM-START event. + self.get_event() + + # Compose a document if the stream is not empty. + document = None + if not self.check_event(StreamEndEvent): + document = self.compose_document() + + # Ensure that the stream contains no more documents. + if not self.check_event(StreamEndEvent): + event = self.get_event() + raise ComposerError("expected a single document in the stream", + document.start_mark, "but found another document", + event.start_mark) + + # Drop the STREAM-END event. + self.get_event() + + return document + + def compose_document(self): + # Drop the DOCUMENT-START event. + self.get_event() + + # Compose the root node. + node = self.compose_node(None, None) + + # Drop the DOCUMENT-END event. + self.get_event() + + self.anchors = {} + return node + + def compose_node(self, parent, index): + if self.check_event(AliasEvent): + event = self.get_event() + anchor = event.anchor + if anchor not in self.anchors: + raise ComposerError(None, None, "found undefined alias %r" + % anchor, event.start_mark) + return self.anchors[anchor] + event = self.peek_event() + anchor = event.anchor + if anchor is not None: + if anchor in self.anchors: + raise ComposerError("found duplicate anchor %r; first occurence" + % anchor, self.anchors[anchor].start_mark, + "second occurence", event.start_mark) + self.descend_resolver(parent, index) + if self.check_event(ScalarEvent): + node = self.compose_scalar_node(anchor) + elif self.check_event(SequenceStartEvent): + node = self.compose_sequence_node(anchor) + elif self.check_event(MappingStartEvent): + node = self.compose_mapping_node(anchor) + self.ascend_resolver() + return node + + def compose_scalar_node(self, anchor): + event = self.get_event() + tag = event.tag + if tag is None or tag == '!': + tag = self.resolve(ScalarNode, event.value, event.implicit) + node = ScalarNode(tag, event.value, + event.start_mark, event.end_mark, style=event.style) + if anchor is not None: + self.anchors[anchor] = node + return node + + def compose_sequence_node(self, anchor): + start_event = self.get_event() + tag = start_event.tag + if tag is None or tag == '!': + tag = self.resolve(SequenceNode, None, start_event.implicit) + node = SequenceNode(tag, [], + start_event.start_mark, None, + flow_style=start_event.flow_style) + if anchor is not None: + self.anchors[anchor] = node + index = 0 + while not self.check_event(SequenceEndEvent): + node.value.append(self.compose_node(node, index)) + index += 1 + end_event = self.get_event() + node.end_mark = end_event.end_mark + return node + + def compose_mapping_node(self, anchor): + start_event = self.get_event() + tag = start_event.tag + if tag is None or tag == '!': + tag = self.resolve(MappingNode, None, start_event.implicit) + node = MappingNode(tag, [], + start_event.start_mark, None, + flow_style=start_event.flow_style) + if anchor is not None: + self.anchors[anchor] = node + while not self.check_event(MappingEndEvent): + #key_event = self.peek_event() + item_key = self.compose_node(node, None) + #if item_key in node.value: + # raise ComposerError("while composing a mapping", start_event.start_mark, + # "found duplicate key", key_event.start_mark) + item_value = self.compose_node(node, item_key) + #node.value[item_key] = item_value + node.value.append((item_key, item_value)) + end_event = self.get_event() + node.end_mark = end_event.end_mark + return node + diff --git a/brightonpy/Lib/site-packages/yaml/constructor.py b/brightonpy/Lib/site-packages/yaml/constructor.py new file mode 100644 index 0000000..981543a --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/constructor.py @@ -0,0 +1,686 @@ + +__all__ = ['BaseConstructor', 'SafeConstructor', 'Constructor', + 'ConstructorError'] + +from .error import * +from .nodes import * + +import collections, datetime, base64, binascii, re, sys, types + +class ConstructorError(MarkedYAMLError): + pass + +class BaseConstructor: + + yaml_constructors = {} + yaml_multi_constructors = {} + + def __init__(self): + self.constructed_objects = {} + self.recursive_objects = {} + self.state_generators = [] + self.deep_construct = False + + def check_data(self): + # If there are more documents available? + return self.check_node() + + def get_data(self): + # Construct and return the next document. + if self.check_node(): + return self.construct_document(self.get_node()) + + def get_single_data(self): + # Ensure that the stream contains a single document and construct it. + node = self.get_single_node() + if node is not None: + return self.construct_document(node) + return None + + def construct_document(self, node): + data = self.construct_object(node) + while self.state_generators: + state_generators = self.state_generators + self.state_generators = [] + for generator in state_generators: + for dummy in generator: + pass + self.constructed_objects = {} + self.recursive_objects = {} + self.deep_construct = False + return data + + def construct_object(self, node, deep=False): + if node in self.constructed_objects: + return self.constructed_objects[node] + if deep: + old_deep = self.deep_construct + self.deep_construct = True + if node in self.recursive_objects: + raise ConstructorError(None, None, + "found unconstructable recursive node", node.start_mark) + self.recursive_objects[node] = None + constructor = None + tag_suffix = None + if node.tag in self.yaml_constructors: + constructor = self.yaml_constructors[node.tag] + else: + for tag_prefix in self.yaml_multi_constructors: + if node.tag.startswith(tag_prefix): + tag_suffix = node.tag[len(tag_prefix):] + constructor = self.yaml_multi_constructors[tag_prefix] + break + else: + if None in self.yaml_multi_constructors: + tag_suffix = node.tag + constructor = self.yaml_multi_constructors[None] + elif None in self.yaml_constructors: + constructor = self.yaml_constructors[None] + elif isinstance(node, ScalarNode): + constructor = self.__class__.construct_scalar + elif isinstance(node, SequenceNode): + constructor = self.__class__.construct_sequence + elif isinstance(node, MappingNode): + constructor = self.__class__.construct_mapping + if tag_suffix is None: + data = constructor(self, node) + else: + data = constructor(self, tag_suffix, node) + if isinstance(data, types.GeneratorType): + generator = data + data = next(generator) + if self.deep_construct: + for dummy in generator: + pass + else: + self.state_generators.append(generator) + self.constructed_objects[node] = data + del self.recursive_objects[node] + if deep: + self.deep_construct = old_deep + return data + + def construct_scalar(self, node): + if not isinstance(node, ScalarNode): + raise ConstructorError(None, None, + "expected a scalar node, but found %s" % node.id, + node.start_mark) + return node.value + + def construct_sequence(self, node, deep=False): + if not isinstance(node, SequenceNode): + raise ConstructorError(None, None, + "expected a sequence node, but found %s" % node.id, + node.start_mark) + return [self.construct_object(child, deep=deep) + for child in node.value] + + def construct_mapping(self, node, deep=False): + if not isinstance(node, MappingNode): + raise ConstructorError(None, None, + "expected a mapping node, but found %s" % node.id, + node.start_mark) + mapping = {} + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + if not isinstance(key, collections.Hashable): + raise ConstructorError("while constructing a mapping", node.start_mark, + "found unhashable key", key_node.start_mark) + value = self.construct_object(value_node, deep=deep) + mapping[key] = value + return mapping + + def construct_pairs(self, node, deep=False): + if not isinstance(node, MappingNode): + raise ConstructorError(None, None, + "expected a mapping node, but found %s" % node.id, + node.start_mark) + pairs = [] + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + value = self.construct_object(value_node, deep=deep) + pairs.append((key, value)) + return pairs + + @classmethod + def add_constructor(cls, tag, constructor): + if not 'yaml_constructors' in cls.__dict__: + cls.yaml_constructors = cls.yaml_constructors.copy() + cls.yaml_constructors[tag] = constructor + + @classmethod + def add_multi_constructor(cls, tag_prefix, multi_constructor): + if not 'yaml_multi_constructors' in cls.__dict__: + cls.yaml_multi_constructors = cls.yaml_multi_constructors.copy() + cls.yaml_multi_constructors[tag_prefix] = multi_constructor + +class SafeConstructor(BaseConstructor): + + def construct_scalar(self, node): + if isinstance(node, MappingNode): + for key_node, value_node in node.value: + if key_node.tag == 'tag:yaml.org,2002:value': + return self.construct_scalar(value_node) + return super().construct_scalar(node) + + def flatten_mapping(self, node): + merge = [] + index = 0 + while index < len(node.value): + key_node, value_node = node.value[index] + if key_node.tag == 'tag:yaml.org,2002:merge': + del node.value[index] + if isinstance(value_node, MappingNode): + self.flatten_mapping(value_node) + merge.extend(value_node.value) + elif isinstance(value_node, SequenceNode): + submerge = [] + for subnode in value_node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing a mapping", + node.start_mark, + "expected a mapping for merging, but found %s" + % subnode.id, subnode.start_mark) + self.flatten_mapping(subnode) + submerge.append(subnode.value) + submerge.reverse() + for value in submerge: + merge.extend(value) + else: + raise ConstructorError("while constructing a mapping", node.start_mark, + "expected a mapping or list of mappings for merging, but found %s" + % value_node.id, value_node.start_mark) + elif key_node.tag == 'tag:yaml.org,2002:value': + key_node.tag = 'tag:yaml.org,2002:str' + index += 1 + else: + index += 1 + if merge: + node.value = merge + node.value + + def construct_mapping(self, node, deep=False): + if isinstance(node, MappingNode): + self.flatten_mapping(node) + return super().construct_mapping(node, deep=deep) + + def construct_yaml_null(self, node): + self.construct_scalar(node) + return None + + bool_values = { + 'yes': True, + 'no': False, + 'true': True, + 'false': False, + 'on': True, + 'off': False, + } + + def construct_yaml_bool(self, node): + value = self.construct_scalar(node) + return self.bool_values[value.lower()] + + def construct_yaml_int(self, node): + value = self.construct_scalar(node) + value = value.replace('_', '') + sign = +1 + if value[0] == '-': + sign = -1 + if value[0] in '+-': + value = value[1:] + if value == '0': + return 0 + elif value.startswith('0b'): + return sign*int(value[2:], 2) + elif value.startswith('0x'): + return sign*int(value[2:], 16) + elif value[0] == '0': + return sign*int(value, 8) + elif ':' in value: + digits = [int(part) for part in value.split(':')] + digits.reverse() + base = 1 + value = 0 + for digit in digits: + value += digit*base + base *= 60 + return sign*value + else: + return sign*int(value) + + inf_value = 1e300 + while inf_value != inf_value*inf_value: + inf_value *= inf_value + nan_value = -inf_value/inf_value # Trying to make a quiet NaN (like C99). + + def construct_yaml_float(self, node): + value = self.construct_scalar(node) + value = value.replace('_', '').lower() + sign = +1 + if value[0] == '-': + sign = -1 + if value[0] in '+-': + value = value[1:] + if value == '.inf': + return sign*self.inf_value + elif value == '.nan': + return self.nan_value + elif ':' in value: + digits = [float(part) for part in value.split(':')] + digits.reverse() + base = 1 + value = 0.0 + for digit in digits: + value += digit*base + base *= 60 + return sign*value + else: + return sign*float(value) + + def construct_yaml_binary(self, node): + try: + value = self.construct_scalar(node).encode('ascii') + except UnicodeEncodeError as exc: + raise ConstructorError(None, None, + "failed to convert base64 data into ascii: %s" % exc, + node.start_mark) + try: + if hasattr(base64, 'decodebytes'): + return base64.decodebytes(value) + else: + return base64.decodestring(value) + except binascii.Error as exc: + raise ConstructorError(None, None, + "failed to decode base64 data: %s" % exc, node.start_mark) + + timestamp_regexp = re.compile( + r'''^(?P[0-9][0-9][0-9][0-9]) + -(?P[0-9][0-9]?) + -(?P[0-9][0-9]?) + (?:(?:[Tt]|[ \t]+) + (?P[0-9][0-9]?) + :(?P[0-9][0-9]) + :(?P[0-9][0-9]) + (?:\.(?P[0-9]*))? + (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) + (?::(?P[0-9][0-9]))?))?)?$''', re.X) + + def construct_yaml_timestamp(self, node): + value = self.construct_scalar(node) + match = self.timestamp_regexp.match(node.value) + values = match.groupdict() + year = int(values['year']) + month = int(values['month']) + day = int(values['day']) + if not values['hour']: + return datetime.date(year, month, day) + hour = int(values['hour']) + minute = int(values['minute']) + second = int(values['second']) + fraction = 0 + if values['fraction']: + fraction = values['fraction'][:6] + while len(fraction) < 6: + fraction += '0' + fraction = int(fraction) + delta = None + if values['tz_sign']: + tz_hour = int(values['tz_hour']) + tz_minute = int(values['tz_minute'] or 0) + delta = datetime.timedelta(hours=tz_hour, minutes=tz_minute) + if values['tz_sign'] == '-': + delta = -delta + data = datetime.datetime(year, month, day, hour, minute, second, fraction) + if delta: + data -= delta + return data + + def construct_yaml_omap(self, node): + # Note: we do not check for duplicate keys, because it's too + # CPU-expensive. + omap = [] + yield omap + if not isinstance(node, SequenceNode): + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a sequence, but found %s" % node.id, node.start_mark) + for subnode in node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a mapping of length 1, but found %s" % subnode.id, + subnode.start_mark) + if len(subnode.value) != 1: + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a single mapping item, but found %d items" % len(subnode.value), + subnode.start_mark) + key_node, value_node = subnode.value[0] + key = self.construct_object(key_node) + value = self.construct_object(value_node) + omap.append((key, value)) + + def construct_yaml_pairs(self, node): + # Note: the same code as `construct_yaml_omap`. + pairs = [] + yield pairs + if not isinstance(node, SequenceNode): + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a sequence, but found %s" % node.id, node.start_mark) + for subnode in node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a mapping of length 1, but found %s" % subnode.id, + subnode.start_mark) + if len(subnode.value) != 1: + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a single mapping item, but found %d items" % len(subnode.value), + subnode.start_mark) + key_node, value_node = subnode.value[0] + key = self.construct_object(key_node) + value = self.construct_object(value_node) + pairs.append((key, value)) + + def construct_yaml_set(self, node): + data = set() + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_yaml_str(self, node): + return self.construct_scalar(node) + + def construct_yaml_seq(self, node): + data = [] + yield data + data.extend(self.construct_sequence(node)) + + def construct_yaml_map(self, node): + data = {} + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_yaml_object(self, node, cls): + data = cls.__new__(cls) + yield data + if hasattr(data, '__setstate__'): + state = self.construct_mapping(node, deep=True) + data.__setstate__(state) + else: + state = self.construct_mapping(node) + data.__dict__.update(state) + + def construct_undefined(self, node): + raise ConstructorError(None, None, + "could not determine a constructor for the tag %r" % node.tag, + node.start_mark) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:null', + SafeConstructor.construct_yaml_null) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:bool', + SafeConstructor.construct_yaml_bool) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:int', + SafeConstructor.construct_yaml_int) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:float', + SafeConstructor.construct_yaml_float) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:binary', + SafeConstructor.construct_yaml_binary) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:timestamp', + SafeConstructor.construct_yaml_timestamp) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:omap', + SafeConstructor.construct_yaml_omap) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:pairs', + SafeConstructor.construct_yaml_pairs) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:set', + SafeConstructor.construct_yaml_set) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:str', + SafeConstructor.construct_yaml_str) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:seq', + SafeConstructor.construct_yaml_seq) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:map', + SafeConstructor.construct_yaml_map) + +SafeConstructor.add_constructor(None, + SafeConstructor.construct_undefined) + +class Constructor(SafeConstructor): + + def construct_python_str(self, node): + return self.construct_scalar(node) + + def construct_python_unicode(self, node): + return self.construct_scalar(node) + + def construct_python_bytes(self, node): + try: + value = self.construct_scalar(node).encode('ascii') + except UnicodeEncodeError as exc: + raise ConstructorError(None, None, + "failed to convert base64 data into ascii: %s" % exc, + node.start_mark) + try: + if hasattr(base64, 'decodebytes'): + return base64.decodebytes(value) + else: + return base64.decodestring(value) + except binascii.Error as exc: + raise ConstructorError(None, None, + "failed to decode base64 data: %s" % exc, node.start_mark) + + def construct_python_long(self, node): + return self.construct_yaml_int(node) + + def construct_python_complex(self, node): + return complex(self.construct_scalar(node)) + + def construct_python_tuple(self, node): + return tuple(self.construct_sequence(node)) + + def find_python_module(self, name, mark): + if not name: + raise ConstructorError("while constructing a Python module", mark, + "expected non-empty name appended to the tag", mark) + try: + __import__(name) + except ImportError as exc: + raise ConstructorError("while constructing a Python module", mark, + "cannot find module %r (%s)" % (name, exc), mark) + return sys.modules[name] + + def find_python_name(self, name, mark): + if not name: + raise ConstructorError("while constructing a Python object", mark, + "expected non-empty name appended to the tag", mark) + if '.' in name: + module_name, object_name = name.rsplit('.', 1) + else: + module_name = 'builtins' + object_name = name + try: + __import__(module_name) + except ImportError as exc: + raise ConstructorError("while constructing a Python object", mark, + "cannot find module %r (%s)" % (module_name, exc), mark) + module = sys.modules[module_name] + if not hasattr(module, object_name): + raise ConstructorError("while constructing a Python object", mark, + "cannot find %r in the module %r" + % (object_name, module.__name__), mark) + return getattr(module, object_name) + + def construct_python_name(self, suffix, node): + value = self.construct_scalar(node) + if value: + raise ConstructorError("while constructing a Python name", node.start_mark, + "expected the empty value, but found %r" % value, node.start_mark) + return self.find_python_name(suffix, node.start_mark) + + def construct_python_module(self, suffix, node): + value = self.construct_scalar(node) + if value: + raise ConstructorError("while constructing a Python module", node.start_mark, + "expected the empty value, but found %r" % value, node.start_mark) + return self.find_python_module(suffix, node.start_mark) + + def make_python_instance(self, suffix, node, + args=None, kwds=None, newobj=False): + if not args: + args = [] + if not kwds: + kwds = {} + cls = self.find_python_name(suffix, node.start_mark) + if newobj and isinstance(cls, type): + return cls.__new__(cls, *args, **kwds) + else: + return cls(*args, **kwds) + + def set_python_instance_state(self, instance, state): + if hasattr(instance, '__setstate__'): + instance.__setstate__(state) + else: + slotstate = {} + if isinstance(state, tuple) and len(state) == 2: + state, slotstate = state + if hasattr(instance, '__dict__'): + instance.__dict__.update(state) + elif state: + slotstate.update(state) + for key, value in slotstate.items(): + setattr(object, key, value) + + def construct_python_object(self, suffix, node): + # Format: + # !!python/object:module.name { ... state ... } + instance = self.make_python_instance(suffix, node, newobj=True) + yield instance + deep = hasattr(instance, '__setstate__') + state = self.construct_mapping(node, deep=deep) + self.set_python_instance_state(instance, state) + + def construct_python_object_apply(self, suffix, node, newobj=False): + # Format: + # !!python/object/apply # (or !!python/object/new) + # args: [ ... arguments ... ] + # kwds: { ... keywords ... } + # state: ... state ... + # listitems: [ ... listitems ... ] + # dictitems: { ... dictitems ... } + # or short format: + # !!python/object/apply [ ... arguments ... ] + # The difference between !!python/object/apply and !!python/object/new + # is how an object is created, check make_python_instance for details. + if isinstance(node, SequenceNode): + args = self.construct_sequence(node, deep=True) + kwds = {} + state = {} + listitems = [] + dictitems = {} + else: + value = self.construct_mapping(node, deep=True) + args = value.get('args', []) + kwds = value.get('kwds', {}) + state = value.get('state', {}) + listitems = value.get('listitems', []) + dictitems = value.get('dictitems', {}) + instance = self.make_python_instance(suffix, node, args, kwds, newobj) + if state: + self.set_python_instance_state(instance, state) + if listitems: + instance.extend(listitems) + if dictitems: + for key in dictitems: + instance[key] = dictitems[key] + return instance + + def construct_python_object_new(self, suffix, node): + return self.construct_python_object_apply(suffix, node, newobj=True) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/none', + Constructor.construct_yaml_null) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/bool', + Constructor.construct_yaml_bool) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/str', + Constructor.construct_python_str) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/unicode', + Constructor.construct_python_unicode) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/bytes', + Constructor.construct_python_bytes) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/int', + Constructor.construct_yaml_int) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/long', + Constructor.construct_python_long) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/float', + Constructor.construct_yaml_float) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/complex', + Constructor.construct_python_complex) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/list', + Constructor.construct_yaml_seq) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/tuple', + Constructor.construct_python_tuple) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/dict', + Constructor.construct_yaml_map) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/name:', + Constructor.construct_python_name) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/module:', + Constructor.construct_python_module) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/object:', + Constructor.construct_python_object) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/object/apply:', + Constructor.construct_python_object_apply) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/object/new:', + Constructor.construct_python_object_new) + diff --git a/brightonpy/Lib/site-packages/yaml/cyaml.py b/brightonpy/Lib/site-packages/yaml/cyaml.py new file mode 100644 index 0000000..d5cb87e --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/cyaml.py @@ -0,0 +1,85 @@ + +__all__ = ['CBaseLoader', 'CSafeLoader', 'CLoader', + 'CBaseDumper', 'CSafeDumper', 'CDumper'] + +from _yaml import CParser, CEmitter + +from .constructor import * + +from .serializer import * +from .representer import * + +from .resolver import * + +class CBaseLoader(CParser, BaseConstructor, BaseResolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + BaseConstructor.__init__(self) + BaseResolver.__init__(self) + +class CSafeLoader(CParser, SafeConstructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + SafeConstructor.__init__(self) + Resolver.__init__(self) + +class CLoader(CParser, Constructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + Constructor.__init__(self) + Resolver.__init__(self) + +class CBaseDumper(CEmitter, BaseRepresenter, BaseResolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class CSafeDumper(CEmitter, SafeRepresenter, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + SafeRepresenter.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class CDumper(CEmitter, Serializer, Representer, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + diff --git a/brightonpy/Lib/site-packages/yaml/dumper.py b/brightonpy/Lib/site-packages/yaml/dumper.py new file mode 100644 index 0000000..0b69128 --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/dumper.py @@ -0,0 +1,62 @@ + +__all__ = ['BaseDumper', 'SafeDumper', 'Dumper'] + +from .emitter import * +from .serializer import * +from .representer import * +from .resolver import * + +class BaseDumper(Emitter, Serializer, BaseRepresenter, BaseResolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class SafeDumper(Emitter, Serializer, SafeRepresenter, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + SafeRepresenter.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class Dumper(Emitter, Serializer, Representer, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + diff --git a/brightonpy/Lib/site-packages/yaml/emitter.py b/brightonpy/Lib/site-packages/yaml/emitter.py new file mode 100644 index 0000000..34cb145 --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/emitter.py @@ -0,0 +1,1137 @@ + +# Emitter expects events obeying the following grammar: +# stream ::= STREAM-START document* STREAM-END +# document ::= DOCUMENT-START node DOCUMENT-END +# node ::= SCALAR | sequence | mapping +# sequence ::= SEQUENCE-START node* SEQUENCE-END +# mapping ::= MAPPING-START (node node)* MAPPING-END + +__all__ = ['Emitter', 'EmitterError'] + +from .error import YAMLError +from .events import * + +class EmitterError(YAMLError): + pass + +class ScalarAnalysis: + def __init__(self, scalar, empty, multiline, + allow_flow_plain, allow_block_plain, + allow_single_quoted, allow_double_quoted, + allow_block): + self.scalar = scalar + self.empty = empty + self.multiline = multiline + self.allow_flow_plain = allow_flow_plain + self.allow_block_plain = allow_block_plain + self.allow_single_quoted = allow_single_quoted + self.allow_double_quoted = allow_double_quoted + self.allow_block = allow_block + +class Emitter: + + DEFAULT_TAG_PREFIXES = { + '!' : '!', + 'tag:yaml.org,2002:' : '!!', + } + + def __init__(self, stream, canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None): + + # The stream should have the methods `write` and possibly `flush`. + self.stream = stream + + # Encoding can be overriden by STREAM-START. + self.encoding = None + + # Emitter is a state machine with a stack of states to handle nested + # structures. + self.states = [] + self.state = self.expect_stream_start + + # Current event and the event queue. + self.events = [] + self.event = None + + # The current indentation level and the stack of previous indents. + self.indents = [] + self.indent = None + + # Flow level. + self.flow_level = 0 + + # Contexts. + self.root_context = False + self.sequence_context = False + self.mapping_context = False + self.simple_key_context = False + + # Characteristics of the last emitted character: + # - current position. + # - is it a whitespace? + # - is it an indention character + # (indentation space, '-', '?', or ':')? + self.line = 0 + self.column = 0 + self.whitespace = True + self.indention = True + + # Whether the document requires an explicit document indicator + self.open_ended = False + + # Formatting details. + self.canonical = canonical + self.allow_unicode = allow_unicode + self.best_indent = 2 + if indent and 1 < indent < 10: + self.best_indent = indent + self.best_width = 80 + if width and width > self.best_indent*2: + self.best_width = width + self.best_line_break = '\n' + if line_break in ['\r', '\n', '\r\n']: + self.best_line_break = line_break + + # Tag prefixes. + self.tag_prefixes = None + + # Prepared anchor and tag. + self.prepared_anchor = None + self.prepared_tag = None + + # Scalar analysis and style. + self.analysis = None + self.style = None + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def emit(self, event): + self.events.append(event) + while not self.need_more_events(): + self.event = self.events.pop(0) + self.state() + self.event = None + + # In some cases, we wait for a few next events before emitting. + + def need_more_events(self): + if not self.events: + return True + event = self.events[0] + if isinstance(event, DocumentStartEvent): + return self.need_events(1) + elif isinstance(event, SequenceStartEvent): + return self.need_events(2) + elif isinstance(event, MappingStartEvent): + return self.need_events(3) + else: + return False + + def need_events(self, count): + level = 0 + for event in self.events[1:]: + if isinstance(event, (DocumentStartEvent, CollectionStartEvent)): + level += 1 + elif isinstance(event, (DocumentEndEvent, CollectionEndEvent)): + level -= 1 + elif isinstance(event, StreamEndEvent): + level = -1 + if level < 0: + return False + return (len(self.events) < count+1) + + def increase_indent(self, flow=False, indentless=False): + self.indents.append(self.indent) + if self.indent is None: + if flow: + self.indent = self.best_indent + else: + self.indent = 0 + elif not indentless: + self.indent += self.best_indent + + # States. + + # Stream handlers. + + def expect_stream_start(self): + if isinstance(self.event, StreamStartEvent): + if self.event.encoding and not hasattr(self.stream, 'encoding'): + self.encoding = self.event.encoding + self.write_stream_start() + self.state = self.expect_first_document_start + else: + raise EmitterError("expected StreamStartEvent, but got %s" + % self.event) + + def expect_nothing(self): + raise EmitterError("expected nothing, but got %s" % self.event) + + # Document handlers. + + def expect_first_document_start(self): + return self.expect_document_start(first=True) + + def expect_document_start(self, first=False): + if isinstance(self.event, DocumentStartEvent): + if (self.event.version or self.event.tags) and self.open_ended: + self.write_indicator('...', True) + self.write_indent() + if self.event.version: + version_text = self.prepare_version(self.event.version) + self.write_version_directive(version_text) + self.tag_prefixes = self.DEFAULT_TAG_PREFIXES.copy() + if self.event.tags: + handles = sorted(self.event.tags.keys()) + for handle in handles: + prefix = self.event.tags[handle] + self.tag_prefixes[prefix] = handle + handle_text = self.prepare_tag_handle(handle) + prefix_text = self.prepare_tag_prefix(prefix) + self.write_tag_directive(handle_text, prefix_text) + implicit = (first and not self.event.explicit and not self.canonical + and not self.event.version and not self.event.tags + and not self.check_empty_document()) + if not implicit: + self.write_indent() + self.write_indicator('---', True) + if self.canonical: + self.write_indent() + self.state = self.expect_document_root + elif isinstance(self.event, StreamEndEvent): + if self.open_ended: + self.write_indicator('...', True) + self.write_indent() + self.write_stream_end() + self.state = self.expect_nothing + else: + raise EmitterError("expected DocumentStartEvent, but got %s" + % self.event) + + def expect_document_end(self): + if isinstance(self.event, DocumentEndEvent): + self.write_indent() + if self.event.explicit: + self.write_indicator('...', True) + self.write_indent() + self.flush_stream() + self.state = self.expect_document_start + else: + raise EmitterError("expected DocumentEndEvent, but got %s" + % self.event) + + def expect_document_root(self): + self.states.append(self.expect_document_end) + self.expect_node(root=True) + + # Node handlers. + + def expect_node(self, root=False, sequence=False, mapping=False, + simple_key=False): + self.root_context = root + self.sequence_context = sequence + self.mapping_context = mapping + self.simple_key_context = simple_key + if isinstance(self.event, AliasEvent): + self.expect_alias() + elif isinstance(self.event, (ScalarEvent, CollectionStartEvent)): + self.process_anchor('&') + self.process_tag() + if isinstance(self.event, ScalarEvent): + self.expect_scalar() + elif isinstance(self.event, SequenceStartEvent): + if self.flow_level or self.canonical or self.event.flow_style \ + or self.check_empty_sequence(): + self.expect_flow_sequence() + else: + self.expect_block_sequence() + elif isinstance(self.event, MappingStartEvent): + if self.flow_level or self.canonical or self.event.flow_style \ + or self.check_empty_mapping(): + self.expect_flow_mapping() + else: + self.expect_block_mapping() + else: + raise EmitterError("expected NodeEvent, but got %s" % self.event) + + def expect_alias(self): + if self.event.anchor is None: + raise EmitterError("anchor is not specified for alias") + self.process_anchor('*') + self.state = self.states.pop() + + def expect_scalar(self): + self.increase_indent(flow=True) + self.process_scalar() + self.indent = self.indents.pop() + self.state = self.states.pop() + + # Flow sequence handlers. + + def expect_flow_sequence(self): + self.write_indicator('[', True, whitespace=True) + self.flow_level += 1 + self.increase_indent(flow=True) + self.state = self.expect_first_flow_sequence_item + + def expect_first_flow_sequence_item(self): + if isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + self.write_indicator(']', False) + self.state = self.states.pop() + else: + if self.canonical or self.column > self.best_width: + self.write_indent() + self.states.append(self.expect_flow_sequence_item) + self.expect_node(sequence=True) + + def expect_flow_sequence_item(self): + if isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + if self.canonical: + self.write_indicator(',', False) + self.write_indent() + self.write_indicator(']', False) + self.state = self.states.pop() + else: + self.write_indicator(',', False) + if self.canonical or self.column > self.best_width: + self.write_indent() + self.states.append(self.expect_flow_sequence_item) + self.expect_node(sequence=True) + + # Flow mapping handlers. + + def expect_flow_mapping(self): + self.write_indicator('{', True, whitespace=True) + self.flow_level += 1 + self.increase_indent(flow=True) + self.state = self.expect_first_flow_mapping_key + + def expect_first_flow_mapping_key(self): + if isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + self.write_indicator('}', False) + self.state = self.states.pop() + else: + if self.canonical or self.column > self.best_width: + self.write_indent() + if not self.canonical and self.check_simple_key(): + self.states.append(self.expect_flow_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator('?', True) + self.states.append(self.expect_flow_mapping_value) + self.expect_node(mapping=True) + + def expect_flow_mapping_key(self): + if isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + if self.canonical: + self.write_indicator(',', False) + self.write_indent() + self.write_indicator('}', False) + self.state = self.states.pop() + else: + self.write_indicator(',', False) + if self.canonical or self.column > self.best_width: + self.write_indent() + if not self.canonical and self.check_simple_key(): + self.states.append(self.expect_flow_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator('?', True) + self.states.append(self.expect_flow_mapping_value) + self.expect_node(mapping=True) + + def expect_flow_mapping_simple_value(self): + self.write_indicator(':', False) + self.states.append(self.expect_flow_mapping_key) + self.expect_node(mapping=True) + + def expect_flow_mapping_value(self): + if self.canonical or self.column > self.best_width: + self.write_indent() + self.write_indicator(':', True) + self.states.append(self.expect_flow_mapping_key) + self.expect_node(mapping=True) + + # Block sequence handlers. + + def expect_block_sequence(self): + indentless = (self.mapping_context and not self.indention) + self.increase_indent(flow=False, indentless=indentless) + self.state = self.expect_first_block_sequence_item + + def expect_first_block_sequence_item(self): + return self.expect_block_sequence_item(first=True) + + def expect_block_sequence_item(self, first=False): + if not first and isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.state = self.states.pop() + else: + self.write_indent() + self.write_indicator('-', True, indention=True) + self.states.append(self.expect_block_sequence_item) + self.expect_node(sequence=True) + + # Block mapping handlers. + + def expect_block_mapping(self): + self.increase_indent(flow=False) + self.state = self.expect_first_block_mapping_key + + def expect_first_block_mapping_key(self): + return self.expect_block_mapping_key(first=True) + + def expect_block_mapping_key(self, first=False): + if not first and isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.state = self.states.pop() + else: + self.write_indent() + if self.check_simple_key(): + self.states.append(self.expect_block_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator('?', True, indention=True) + self.states.append(self.expect_block_mapping_value) + self.expect_node(mapping=True) + + def expect_block_mapping_simple_value(self): + self.write_indicator(':', False) + self.states.append(self.expect_block_mapping_key) + self.expect_node(mapping=True) + + def expect_block_mapping_value(self): + self.write_indent() + self.write_indicator(':', True, indention=True) + self.states.append(self.expect_block_mapping_key) + self.expect_node(mapping=True) + + # Checkers. + + def check_empty_sequence(self): + return (isinstance(self.event, SequenceStartEvent) and self.events + and isinstance(self.events[0], SequenceEndEvent)) + + def check_empty_mapping(self): + return (isinstance(self.event, MappingStartEvent) and self.events + and isinstance(self.events[0], MappingEndEvent)) + + def check_empty_document(self): + if not isinstance(self.event, DocumentStartEvent) or not self.events: + return False + event = self.events[0] + return (isinstance(event, ScalarEvent) and event.anchor is None + and event.tag is None and event.implicit and event.value == '') + + def check_simple_key(self): + length = 0 + if isinstance(self.event, NodeEvent) and self.event.anchor is not None: + if self.prepared_anchor is None: + self.prepared_anchor = self.prepare_anchor(self.event.anchor) + length += len(self.prepared_anchor) + if isinstance(self.event, (ScalarEvent, CollectionStartEvent)) \ + and self.event.tag is not None: + if self.prepared_tag is None: + self.prepared_tag = self.prepare_tag(self.event.tag) + length += len(self.prepared_tag) + if isinstance(self.event, ScalarEvent): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + length += len(self.analysis.scalar) + return (length < 128 and (isinstance(self.event, AliasEvent) + or (isinstance(self.event, ScalarEvent) + and not self.analysis.empty and not self.analysis.multiline) + or self.check_empty_sequence() or self.check_empty_mapping())) + + # Anchor, Tag, and Scalar processors. + + def process_anchor(self, indicator): + if self.event.anchor is None: + self.prepared_anchor = None + return + if self.prepared_anchor is None: + self.prepared_anchor = self.prepare_anchor(self.event.anchor) + if self.prepared_anchor: + self.write_indicator(indicator+self.prepared_anchor, True) + self.prepared_anchor = None + + def process_tag(self): + tag = self.event.tag + if isinstance(self.event, ScalarEvent): + if self.style is None: + self.style = self.choose_scalar_style() + if ((not self.canonical or tag is None) and + ((self.style == '' and self.event.implicit[0]) + or (self.style != '' and self.event.implicit[1]))): + self.prepared_tag = None + return + if self.event.implicit[0] and tag is None: + tag = '!' + self.prepared_tag = None + else: + if (not self.canonical or tag is None) and self.event.implicit: + self.prepared_tag = None + return + if tag is None: + raise EmitterError("tag is not specified") + if self.prepared_tag is None: + self.prepared_tag = self.prepare_tag(tag) + if self.prepared_tag: + self.write_indicator(self.prepared_tag, True) + self.prepared_tag = None + + def choose_scalar_style(self): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + if self.event.style == '"' or self.canonical: + return '"' + if not self.event.style and self.event.implicit[0]: + if (not (self.simple_key_context and + (self.analysis.empty or self.analysis.multiline)) + and (self.flow_level and self.analysis.allow_flow_plain + or (not self.flow_level and self.analysis.allow_block_plain))): + return '' + if self.event.style and self.event.style in '|>': + if (not self.flow_level and not self.simple_key_context + and self.analysis.allow_block): + return self.event.style + if not self.event.style or self.event.style == '\'': + if (self.analysis.allow_single_quoted and + not (self.simple_key_context and self.analysis.multiline)): + return '\'' + return '"' + + def process_scalar(self): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + if self.style is None: + self.style = self.choose_scalar_style() + split = (not self.simple_key_context) + #if self.analysis.multiline and split \ + # and (not self.style or self.style in '\'\"'): + # self.write_indent() + if self.style == '"': + self.write_double_quoted(self.analysis.scalar, split) + elif self.style == '\'': + self.write_single_quoted(self.analysis.scalar, split) + elif self.style == '>': + self.write_folded(self.analysis.scalar) + elif self.style == '|': + self.write_literal(self.analysis.scalar) + else: + self.write_plain(self.analysis.scalar, split) + self.analysis = None + self.style = None + + # Analyzers. + + def prepare_version(self, version): + major, minor = version + if major != 1: + raise EmitterError("unsupported YAML version: %d.%d" % (major, minor)) + return '%d.%d' % (major, minor) + + def prepare_tag_handle(self, handle): + if not handle: + raise EmitterError("tag handle must not be empty") + if handle[0] != '!' or handle[-1] != '!': + raise EmitterError("tag handle must start and end with '!': %r" % handle) + for ch in handle[1:-1]: + if not ('0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_'): + raise EmitterError("invalid character %r in the tag handle: %r" + % (ch, handle)) + return handle + + def prepare_tag_prefix(self, prefix): + if not prefix: + raise EmitterError("tag prefix must not be empty") + chunks = [] + start = end = 0 + if prefix[0] == '!': + end = 1 + while end < len(prefix): + ch = prefix[end] + if '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-;/?!:@&=+$,_.~*\'()[]': + end += 1 + else: + if start < end: + chunks.append(prefix[start:end]) + start = end = end+1 + data = ch.encode('utf-8') + for ch in data: + chunks.append('%%%02X' % ord(ch)) + if start < end: + chunks.append(prefix[start:end]) + return ''.join(chunks) + + def prepare_tag(self, tag): + if not tag: + raise EmitterError("tag must not be empty") + if tag == '!': + return tag + handle = None + suffix = tag + prefixes = sorted(self.tag_prefixes.keys()) + for prefix in prefixes: + if tag.startswith(prefix) \ + and (prefix == '!' or len(prefix) < len(tag)): + handle = self.tag_prefixes[prefix] + suffix = tag[len(prefix):] + chunks = [] + start = end = 0 + while end < len(suffix): + ch = suffix[end] + if '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-;/?:@&=+$,_.~*\'()[]' \ + or (ch == '!' and handle != '!'): + end += 1 + else: + if start < end: + chunks.append(suffix[start:end]) + start = end = end+1 + data = ch.encode('utf-8') + for ch in data: + chunks.append('%%%02X' % ord(ch)) + if start < end: + chunks.append(suffix[start:end]) + suffix_text = ''.join(chunks) + if handle: + return '%s%s' % (handle, suffix_text) + else: + return '!<%s>' % suffix_text + + def prepare_anchor(self, anchor): + if not anchor: + raise EmitterError("anchor must not be empty") + for ch in anchor: + if not ('0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_'): + raise EmitterError("invalid character %r in the anchor: %r" + % (ch, anchor)) + return anchor + + def analyze_scalar(self, scalar): + + # Empty scalar is a special case. + if not scalar: + return ScalarAnalysis(scalar=scalar, empty=True, multiline=False, + allow_flow_plain=False, allow_block_plain=True, + allow_single_quoted=True, allow_double_quoted=True, + allow_block=False) + + # Indicators and special characters. + block_indicators = False + flow_indicators = False + line_breaks = False + special_characters = False + + # Important whitespace combinations. + leading_space = False + leading_break = False + trailing_space = False + trailing_break = False + break_space = False + space_break = False + + # Check document indicators. + if scalar.startswith('---') or scalar.startswith('...'): + block_indicators = True + flow_indicators = True + + # First character or preceded by a whitespace. + preceeded_by_whitespace = True + + # Last character or followed by a whitespace. + followed_by_whitespace = (len(scalar) == 1 or + scalar[1] in '\0 \t\r\n\x85\u2028\u2029') + + # The previous character is a space. + previous_space = False + + # The previous character is a break. + previous_break = False + + index = 0 + while index < len(scalar): + ch = scalar[index] + + # Check for indicators. + if index == 0: + # Leading indicators are special characters. + if ch in '#,[]{}&*!|>\'\"%@`': + flow_indicators = True + block_indicators = True + if ch in '?:': + flow_indicators = True + if followed_by_whitespace: + block_indicators = True + if ch == '-' and followed_by_whitespace: + flow_indicators = True + block_indicators = True + else: + # Some indicators cannot appear within a scalar as well. + if ch in ',?[]{}': + flow_indicators = True + if ch == ':': + flow_indicators = True + if followed_by_whitespace: + block_indicators = True + if ch == '#' and preceeded_by_whitespace: + flow_indicators = True + block_indicators = True + + # Check for line breaks, special, and unicode characters. + if ch in '\n\x85\u2028\u2029': + line_breaks = True + if not (ch == '\n' or '\x20' <= ch <= '\x7E'): + if (ch == '\x85' or '\xA0' <= ch <= '\uD7FF' + or '\uE000' <= ch <= '\uFFFD') and ch != '\uFEFF': + unicode_characters = True + if not self.allow_unicode: + special_characters = True + else: + special_characters = True + + # Detect important whitespace combinations. + if ch == ' ': + if index == 0: + leading_space = True + if index == len(scalar)-1: + trailing_space = True + if previous_break: + break_space = True + previous_space = True + previous_break = False + elif ch in '\n\x85\u2028\u2029': + if index == 0: + leading_break = True + if index == len(scalar)-1: + trailing_break = True + if previous_space: + space_break = True + previous_space = False + previous_break = True + else: + previous_space = False + previous_break = False + + # Prepare for the next character. + index += 1 + preceeded_by_whitespace = (ch in '\0 \t\r\n\x85\u2028\u2029') + followed_by_whitespace = (index+1 >= len(scalar) or + scalar[index+1] in '\0 \t\r\n\x85\u2028\u2029') + + # Let's decide what styles are allowed. + allow_flow_plain = True + allow_block_plain = True + allow_single_quoted = True + allow_double_quoted = True + allow_block = True + + # Leading and trailing whitespaces are bad for plain scalars. + if (leading_space or leading_break + or trailing_space or trailing_break): + allow_flow_plain = allow_block_plain = False + + # We do not permit trailing spaces for block scalars. + if trailing_space: + allow_block = False + + # Spaces at the beginning of a new line are only acceptable for block + # scalars. + if break_space: + allow_flow_plain = allow_block_plain = allow_single_quoted = False + + # Spaces followed by breaks, as well as special character are only + # allowed for double quoted scalars. + if space_break or special_characters: + allow_flow_plain = allow_block_plain = \ + allow_single_quoted = allow_block = False + + # Although the plain scalar writer supports breaks, we never emit + # multiline plain scalars. + if line_breaks: + allow_flow_plain = allow_block_plain = False + + # Flow indicators are forbidden for flow plain scalars. + if flow_indicators: + allow_flow_plain = False + + # Block indicators are forbidden for block plain scalars. + if block_indicators: + allow_block_plain = False + + return ScalarAnalysis(scalar=scalar, + empty=False, multiline=line_breaks, + allow_flow_plain=allow_flow_plain, + allow_block_plain=allow_block_plain, + allow_single_quoted=allow_single_quoted, + allow_double_quoted=allow_double_quoted, + allow_block=allow_block) + + # Writers. + + def flush_stream(self): + if hasattr(self.stream, 'flush'): + self.stream.flush() + + def write_stream_start(self): + # Write BOM if needed. + if self.encoding and self.encoding.startswith('utf-16'): + self.stream.write('\uFEFF'.encode(self.encoding)) + + def write_stream_end(self): + self.flush_stream() + + def write_indicator(self, indicator, need_whitespace, + whitespace=False, indention=False): + if self.whitespace or not need_whitespace: + data = indicator + else: + data = ' '+indicator + self.whitespace = whitespace + self.indention = self.indention and indention + self.column += len(data) + self.open_ended = False + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_indent(self): + indent = self.indent or 0 + if not self.indention or self.column > indent \ + or (self.column == indent and not self.whitespace): + self.write_line_break() + if self.column < indent: + self.whitespace = True + data = ' '*(indent-self.column) + self.column = indent + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_line_break(self, data=None): + if data is None: + data = self.best_line_break + self.whitespace = True + self.indention = True + self.line += 1 + self.column = 0 + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_version_directive(self, version_text): + data = '%%YAML %s' % version_text + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_line_break() + + def write_tag_directive(self, handle_text, prefix_text): + data = '%%TAG %s %s' % (handle_text, prefix_text) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_line_break() + + # Scalar streams. + + def write_single_quoted(self, text, split=True): + self.write_indicator('\'', True) + spaces = False + breaks = False + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if spaces: + if ch is None or ch != ' ': + if start+1 == end and self.column > self.best_width and split \ + and start != 0 and end != len(text): + self.write_indent() + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + elif breaks: + if ch is None or ch not in '\n\x85\u2028\u2029': + if text[start] == '\n': + self.write_line_break() + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + self.write_indent() + start = end + else: + if ch is None or ch in ' \n\x85\u2028\u2029' or ch == '\'': + if start < end: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch == '\'': + data = '\'\'' + self.column += 2 + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + 1 + if ch is not None: + spaces = (ch == ' ') + breaks = (ch in '\n\x85\u2028\u2029') + end += 1 + self.write_indicator('\'', False) + + ESCAPE_REPLACEMENTS = { + '\0': '0', + '\x07': 'a', + '\x08': 'b', + '\x09': 't', + '\x0A': 'n', + '\x0B': 'v', + '\x0C': 'f', + '\x0D': 'r', + '\x1B': 'e', + '\"': '\"', + '\\': '\\', + '\x85': 'N', + '\xA0': '_', + '\u2028': 'L', + '\u2029': 'P', + } + + def write_double_quoted(self, text, split=True): + self.write_indicator('"', True) + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if ch is None or ch in '"\\\x85\u2028\u2029\uFEFF' \ + or not ('\x20' <= ch <= '\x7E' + or (self.allow_unicode + and ('\xA0' <= ch <= '\uD7FF' + or '\uE000' <= ch <= '\uFFFD'))): + if start < end: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch is not None: + if ch in self.ESCAPE_REPLACEMENTS: + data = '\\'+self.ESCAPE_REPLACEMENTS[ch] + elif ch <= '\xFF': + data = '\\x%02X' % ord(ch) + elif ch <= '\uFFFF': + data = '\\u%04X' % ord(ch) + else: + data = '\\U%08X' % ord(ch) + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end+1 + if 0 < end < len(text)-1 and (ch == ' ' or start >= end) \ + and self.column+(end-start) > self.best_width and split: + data = text[start:end]+'\\' + if start < end: + start = end + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_indent() + self.whitespace = False + self.indention = False + if text[start] == ' ': + data = '\\' + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + end += 1 + self.write_indicator('"', False) + + def determine_block_hints(self, text): + hints = '' + if text: + if text[0] in ' \n\x85\u2028\u2029': + hints += str(self.best_indent) + if text[-1] not in '\n\x85\u2028\u2029': + hints += '-' + elif len(text) == 1 or text[-2] in '\n\x85\u2028\u2029': + hints += '+' + return hints + + def write_folded(self, text): + hints = self.determine_block_hints(text) + self.write_indicator('>'+hints, True) + if hints[-1:] == '+': + self.open_ended = True + self.write_line_break() + leading_space = True + spaces = False + breaks = True + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if breaks: + if ch is None or ch not in '\n\x85\u2028\u2029': + if not leading_space and ch is not None and ch != ' ' \ + and text[start] == '\n': + self.write_line_break() + leading_space = (ch == ' ') + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + if ch is not None: + self.write_indent() + start = end + elif spaces: + if ch != ' ': + if start+1 == end and self.column > self.best_width: + self.write_indent() + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + else: + if ch is None or ch in ' \n\x85\u2028\u2029': + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + if ch is None: + self.write_line_break() + start = end + if ch is not None: + breaks = (ch in '\n\x85\u2028\u2029') + spaces = (ch == ' ') + end += 1 + + def write_literal(self, text): + hints = self.determine_block_hints(text) + self.write_indicator('|'+hints, True) + if hints[-1:] == '+': + self.open_ended = True + self.write_line_break() + breaks = True + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if breaks: + if ch is None or ch not in '\n\x85\u2028\u2029': + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + if ch is not None: + self.write_indent() + start = end + else: + if ch is None or ch in '\n\x85\u2028\u2029': + data = text[start:end] + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + if ch is None: + self.write_line_break() + start = end + if ch is not None: + breaks = (ch in '\n\x85\u2028\u2029') + end += 1 + + def write_plain(self, text, split=True): + if self.root_context: + self.open_ended = True + if not text: + return + if not self.whitespace: + data = ' ' + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.whitespace = False + self.indention = False + spaces = False + breaks = False + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if spaces: + if ch != ' ': + if start+1 == end and self.column > self.best_width and split: + self.write_indent() + self.whitespace = False + self.indention = False + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + elif breaks: + if ch not in '\n\x85\u2028\u2029': + if text[start] == '\n': + self.write_line_break() + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + self.write_indent() + self.whitespace = False + self.indention = False + start = end + else: + if ch is None or ch in ' \n\x85\u2028\u2029': + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch is not None: + spaces = (ch == ' ') + breaks = (ch in '\n\x85\u2028\u2029') + end += 1 + diff --git a/brightonpy/Lib/site-packages/yaml/error.py b/brightonpy/Lib/site-packages/yaml/error.py new file mode 100644 index 0000000..b796b4d --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/error.py @@ -0,0 +1,75 @@ + +__all__ = ['Mark', 'YAMLError', 'MarkedYAMLError'] + +class Mark: + + def __init__(self, name, index, line, column, buffer, pointer): + self.name = name + self.index = index + self.line = line + self.column = column + self.buffer = buffer + self.pointer = pointer + + def get_snippet(self, indent=4, max_length=75): + if self.buffer is None: + return None + head = '' + start = self.pointer + while start > 0 and self.buffer[start-1] not in '\0\r\n\x85\u2028\u2029': + start -= 1 + if self.pointer-start > max_length/2-1: + head = ' ... ' + start += 5 + break + tail = '' + end = self.pointer + while end < len(self.buffer) and self.buffer[end] not in '\0\r\n\x85\u2028\u2029': + end += 1 + if end-self.pointer > max_length/2-1: + tail = ' ... ' + end -= 5 + break + snippet = self.buffer[start:end] + return ' '*indent + head + snippet + tail + '\n' \ + + ' '*(indent+self.pointer-start+len(head)) + '^' + + def __str__(self): + snippet = self.get_snippet() + where = " in \"%s\", line %d, column %d" \ + % (self.name, self.line+1, self.column+1) + if snippet is not None: + where += ":\n"+snippet + return where + +class YAMLError(Exception): + pass + +class MarkedYAMLError(YAMLError): + + def __init__(self, context=None, context_mark=None, + problem=None, problem_mark=None, note=None): + self.context = context + self.context_mark = context_mark + self.problem = problem + self.problem_mark = problem_mark + self.note = note + + def __str__(self): + lines = [] + if self.context is not None: + lines.append(self.context) + if self.context_mark is not None \ + and (self.problem is None or self.problem_mark is None + or self.context_mark.name != self.problem_mark.name + or self.context_mark.line != self.problem_mark.line + or self.context_mark.column != self.problem_mark.column): + lines.append(str(self.context_mark)) + if self.problem is not None: + lines.append(self.problem) + if self.problem_mark is not None: + lines.append(str(self.problem_mark)) + if self.note is not None: + lines.append(self.note) + return '\n'.join(lines) + diff --git a/brightonpy/Lib/site-packages/yaml/events.py b/brightonpy/Lib/site-packages/yaml/events.py new file mode 100644 index 0000000..f79ad38 --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/events.py @@ -0,0 +1,86 @@ + +# Abstract classes. + +class Event(object): + def __init__(self, start_mark=None, end_mark=None): + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + attributes = [key for key in ['anchor', 'tag', 'implicit', 'value'] + if hasattr(self, key)] + arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) + for key in attributes]) + return '%s(%s)' % (self.__class__.__name__, arguments) + +class NodeEvent(Event): + def __init__(self, anchor, start_mark=None, end_mark=None): + self.anchor = anchor + self.start_mark = start_mark + self.end_mark = end_mark + +class CollectionStartEvent(NodeEvent): + def __init__(self, anchor, tag, implicit, start_mark=None, end_mark=None, + flow_style=None): + self.anchor = anchor + self.tag = tag + self.implicit = implicit + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + +class CollectionEndEvent(Event): + pass + +# Implementations. + +class StreamStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + +class StreamEndEvent(Event): + pass + +class DocumentStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, + explicit=None, version=None, tags=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + self.version = version + self.tags = tags + +class DocumentEndEvent(Event): + def __init__(self, start_mark=None, end_mark=None, + explicit=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + +class AliasEvent(NodeEvent): + pass + +class ScalarEvent(NodeEvent): + def __init__(self, anchor, tag, implicit, value, + start_mark=None, end_mark=None, style=None): + self.anchor = anchor + self.tag = tag + self.implicit = implicit + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + +class SequenceStartEvent(CollectionStartEvent): + pass + +class SequenceEndEvent(CollectionEndEvent): + pass + +class MappingStartEvent(CollectionStartEvent): + pass + +class MappingEndEvent(CollectionEndEvent): + pass + diff --git a/brightonpy/Lib/site-packages/yaml/loader.py b/brightonpy/Lib/site-packages/yaml/loader.py new file mode 100644 index 0000000..08c8f01 --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/loader.py @@ -0,0 +1,40 @@ + +__all__ = ['BaseLoader', 'SafeLoader', 'Loader'] + +from .reader import * +from .scanner import * +from .parser import * +from .composer import * +from .constructor import * +from .resolver import * + +class BaseLoader(Reader, Scanner, Parser, Composer, BaseConstructor, BaseResolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + BaseConstructor.__init__(self) + BaseResolver.__init__(self) + +class SafeLoader(Reader, Scanner, Parser, Composer, SafeConstructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + SafeConstructor.__init__(self) + Resolver.__init__(self) + +class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + Constructor.__init__(self) + Resolver.__init__(self) + diff --git a/brightonpy/Lib/site-packages/yaml/nodes.py b/brightonpy/Lib/site-packages/yaml/nodes.py new file mode 100644 index 0000000..c4f070c --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/nodes.py @@ -0,0 +1,49 @@ + +class Node(object): + def __init__(self, tag, value, start_mark, end_mark): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + value = self.value + #if isinstance(value, list): + # if len(value) == 0: + # value = '' + # elif len(value) == 1: + # value = '<1 item>' + # else: + # value = '<%d items>' % len(value) + #else: + # if len(value) > 75: + # value = repr(value[:70]+u' ... ') + # else: + # value = repr(value) + value = repr(value) + return '%s(tag=%r, value=%s)' % (self.__class__.__name__, self.tag, value) + +class ScalarNode(Node): + id = 'scalar' + def __init__(self, tag, value, + start_mark=None, end_mark=None, style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + +class CollectionNode(Node): + def __init__(self, tag, value, + start_mark=None, end_mark=None, flow_style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + +class SequenceNode(CollectionNode): + id = 'sequence' + +class MappingNode(CollectionNode): + id = 'mapping' + diff --git a/brightonpy/Lib/site-packages/yaml/parser.py b/brightonpy/Lib/site-packages/yaml/parser.py new file mode 100644 index 0000000..13a5995 --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/parser.py @@ -0,0 +1,589 @@ + +# The following YAML grammar is LL(1) and is parsed by a recursive descent +# parser. +# +# stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +# implicit_document ::= block_node DOCUMENT-END* +# explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +# block_node_or_indentless_sequence ::= +# ALIAS +# | properties (block_content | indentless_block_sequence)? +# | block_content +# | indentless_block_sequence +# block_node ::= ALIAS +# | properties block_content? +# | block_content +# flow_node ::= ALIAS +# | properties flow_content? +# | flow_content +# properties ::= TAG ANCHOR? | ANCHOR TAG? +# block_content ::= block_collection | flow_collection | SCALAR +# flow_content ::= flow_collection | SCALAR +# block_collection ::= block_sequence | block_mapping +# flow_collection ::= flow_sequence | flow_mapping +# block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +# indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +# block_mapping ::= BLOCK-MAPPING_START +# ((KEY block_node_or_indentless_sequence?)? +# (VALUE block_node_or_indentless_sequence?)?)* +# BLOCK-END +# flow_sequence ::= FLOW-SEQUENCE-START +# (flow_sequence_entry FLOW-ENTRY)* +# flow_sequence_entry? +# FLOW-SEQUENCE-END +# flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +# flow_mapping ::= FLOW-MAPPING-START +# (flow_mapping_entry FLOW-ENTRY)* +# flow_mapping_entry? +# FLOW-MAPPING-END +# flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +# +# FIRST sets: +# +# stream: { STREAM-START } +# explicit_document: { DIRECTIVE DOCUMENT-START } +# implicit_document: FIRST(block_node) +# block_node: { ALIAS TAG ANCHOR SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START } +# flow_node: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START } +# block_content: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } +# flow_content: { FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } +# block_collection: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START } +# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } +# block_sequence: { BLOCK-SEQUENCE-START } +# block_mapping: { BLOCK-MAPPING-START } +# block_node_or_indentless_sequence: { ALIAS ANCHOR TAG SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START BLOCK-ENTRY } +# indentless_sequence: { ENTRY } +# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } +# flow_sequence: { FLOW-SEQUENCE-START } +# flow_mapping: { FLOW-MAPPING-START } +# flow_sequence_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } +# flow_mapping_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } + +__all__ = ['Parser', 'ParserError'] + +from .error import MarkedYAMLError +from .tokens import * +from .events import * +from .scanner import * + +class ParserError(MarkedYAMLError): + pass + +class Parser: + # Since writing a recursive-descendant parser is a straightforward task, we + # do not give many comments here. + + DEFAULT_TAGS = { + '!': '!', + '!!': 'tag:yaml.org,2002:', + } + + def __init__(self): + self.current_event = None + self.yaml_version = None + self.tag_handles = {} + self.states = [] + self.marks = [] + self.state = self.parse_stream_start + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def check_event(self, *choices): + # Check the type of the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + if self.current_event is not None: + if not choices: + return True + for choice in choices: + if isinstance(self.current_event, choice): + return True + return False + + def peek_event(self): + # Get the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + return self.current_event + + def get_event(self): + # Get the next event and proceed further. + if self.current_event is None: + if self.state: + self.current_event = self.state() + value = self.current_event + self.current_event = None + return value + + # stream ::= STREAM-START implicit_document? explicit_document* STREAM-END + # implicit_document ::= block_node DOCUMENT-END* + # explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* + + def parse_stream_start(self): + + # Parse the stream start. + token = self.get_token() + event = StreamStartEvent(token.start_mark, token.end_mark, + encoding=token.encoding) + + # Prepare the next state. + self.state = self.parse_implicit_document_start + + return event + + def parse_implicit_document_start(self): + + # Parse an implicit document. + if not self.check_token(DirectiveToken, DocumentStartToken, + StreamEndToken): + self.tag_handles = self.DEFAULT_TAGS + token = self.peek_token() + start_mark = end_mark = token.start_mark + event = DocumentStartEvent(start_mark, end_mark, + explicit=False) + + # Prepare the next state. + self.states.append(self.parse_document_end) + self.state = self.parse_block_node + + return event + + else: + return self.parse_document_start() + + def parse_document_start(self): + + # Parse any extra document end indicators. + while self.check_token(DocumentEndToken): + self.get_token() + + # Parse an explicit document. + if not self.check_token(StreamEndToken): + token = self.peek_token() + start_mark = token.start_mark + version, tags = self.process_directives() + if not self.check_token(DocumentStartToken): + raise ParserError(None, None, + "expected '', but found %r" + % self.peek_token().id, + self.peek_token().start_mark) + token = self.get_token() + end_mark = token.end_mark + event = DocumentStartEvent(start_mark, end_mark, + explicit=True, version=version, tags=tags) + self.states.append(self.parse_document_end) + self.state = self.parse_document_content + else: + # Parse the end of the stream. + token = self.get_token() + event = StreamEndEvent(token.start_mark, token.end_mark) + assert not self.states + assert not self.marks + self.state = None + return event + + def parse_document_end(self): + + # Parse the document end. + token = self.peek_token() + start_mark = end_mark = token.start_mark + explicit = False + if self.check_token(DocumentEndToken): + token = self.get_token() + end_mark = token.end_mark + explicit = True + event = DocumentEndEvent(start_mark, end_mark, + explicit=explicit) + + # Prepare the next state. + self.state = self.parse_document_start + + return event + + def parse_document_content(self): + if self.check_token(DirectiveToken, + DocumentStartToken, DocumentEndToken, StreamEndToken): + event = self.process_empty_scalar(self.peek_token().start_mark) + self.state = self.states.pop() + return event + else: + return self.parse_block_node() + + def process_directives(self): + self.yaml_version = None + self.tag_handles = {} + while self.check_token(DirectiveToken): + token = self.get_token() + if token.name == 'YAML': + if self.yaml_version is not None: + raise ParserError(None, None, + "found duplicate YAML directive", token.start_mark) + major, minor = token.value + if major != 1: + raise ParserError(None, None, + "found incompatible YAML document (version 1.* is required)", + token.start_mark) + self.yaml_version = token.value + elif token.name == 'TAG': + handle, prefix = token.value + if handle in self.tag_handles: + raise ParserError(None, None, + "duplicate tag handle %r" % handle, + token.start_mark) + self.tag_handles[handle] = prefix + if self.tag_handles: + value = self.yaml_version, self.tag_handles.copy() + else: + value = self.yaml_version, None + for key in self.DEFAULT_TAGS: + if key not in self.tag_handles: + self.tag_handles[key] = self.DEFAULT_TAGS[key] + return value + + # block_node_or_indentless_sequence ::= ALIAS + # | properties (block_content | indentless_block_sequence)? + # | block_content + # | indentless_block_sequence + # block_node ::= ALIAS + # | properties block_content? + # | block_content + # flow_node ::= ALIAS + # | properties flow_content? + # | flow_content + # properties ::= TAG ANCHOR? | ANCHOR TAG? + # block_content ::= block_collection | flow_collection | SCALAR + # flow_content ::= flow_collection | SCALAR + # block_collection ::= block_sequence | block_mapping + # flow_collection ::= flow_sequence | flow_mapping + + def parse_block_node(self): + return self.parse_node(block=True) + + def parse_flow_node(self): + return self.parse_node() + + def parse_block_node_or_indentless_sequence(self): + return self.parse_node(block=True, indentless_sequence=True) + + def parse_node(self, block=False, indentless_sequence=False): + if self.check_token(AliasToken): + token = self.get_token() + event = AliasEvent(token.value, token.start_mark, token.end_mark) + self.state = self.states.pop() + else: + anchor = None + tag = None + start_mark = end_mark = tag_mark = None + if self.check_token(AnchorToken): + token = self.get_token() + start_mark = token.start_mark + end_mark = token.end_mark + anchor = token.value + if self.check_token(TagToken): + token = self.get_token() + tag_mark = token.start_mark + end_mark = token.end_mark + tag = token.value + elif self.check_token(TagToken): + token = self.get_token() + start_mark = tag_mark = token.start_mark + end_mark = token.end_mark + tag = token.value + if self.check_token(AnchorToken): + token = self.get_token() + end_mark = token.end_mark + anchor = token.value + if tag is not None: + handle, suffix = tag + if handle is not None: + if handle not in self.tag_handles: + raise ParserError("while parsing a node", start_mark, + "found undefined tag handle %r" % handle, + tag_mark) + tag = self.tag_handles[handle]+suffix + else: + tag = suffix + #if tag == '!': + # raise ParserError("while parsing a node", start_mark, + # "found non-specific tag '!'", tag_mark, + # "Please check 'http://pyyaml.org/wiki/YAMLNonSpecificTag' and share your opinion.") + if start_mark is None: + start_mark = end_mark = self.peek_token().start_mark + event = None + implicit = (tag is None or tag == '!') + if indentless_sequence and self.check_token(BlockEntryToken): + end_mark = self.peek_token().end_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark) + self.state = self.parse_indentless_sequence_entry + else: + if self.check_token(ScalarToken): + token = self.get_token() + end_mark = token.end_mark + if (token.plain and tag is None) or tag == '!': + implicit = (True, False) + elif tag is None: + implicit = (False, True) + else: + implicit = (False, False) + event = ScalarEvent(anchor, tag, implicit, token.value, + start_mark, end_mark, style=token.style) + self.state = self.states.pop() + elif self.check_token(FlowSequenceStartToken): + end_mark = self.peek_token().end_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_sequence_first_entry + elif self.check_token(FlowMappingStartToken): + end_mark = self.peek_token().end_mark + event = MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_mapping_first_key + elif block and self.check_token(BlockSequenceStartToken): + end_mark = self.peek_token().start_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=False) + self.state = self.parse_block_sequence_first_entry + elif block and self.check_token(BlockMappingStartToken): + end_mark = self.peek_token().start_mark + event = MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=False) + self.state = self.parse_block_mapping_first_key + elif anchor is not None or tag is not None: + # Empty scalars are allowed even if a tag or an anchor is + # specified. + event = ScalarEvent(anchor, tag, (implicit, False), '', + start_mark, end_mark) + self.state = self.states.pop() + else: + if block: + node = 'block' + else: + node = 'flow' + token = self.peek_token() + raise ParserError("while parsing a %s node" % node, start_mark, + "expected the node content, but found %r" % token.id, + token.start_mark) + return event + + # block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END + + def parse_block_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_block_sequence_entry() + + def parse_block_sequence_entry(self): + if self.check_token(BlockEntryToken): + token = self.get_token() + if not self.check_token(BlockEntryToken, BlockEndToken): + self.states.append(self.parse_block_sequence_entry) + return self.parse_block_node() + else: + self.state = self.parse_block_sequence_entry + return self.process_empty_scalar(token.end_mark) + if not self.check_token(BlockEndToken): + token = self.peek_token() + raise ParserError("while parsing a block collection", self.marks[-1], + "expected , but found %r" % token.id, token.start_mark) + token = self.get_token() + event = SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + # indentless_sequence ::= (BLOCK-ENTRY block_node?)+ + + def parse_indentless_sequence_entry(self): + if self.check_token(BlockEntryToken): + token = self.get_token() + if not self.check_token(BlockEntryToken, + KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_indentless_sequence_entry) + return self.parse_block_node() + else: + self.state = self.parse_indentless_sequence_entry + return self.process_empty_scalar(token.end_mark) + token = self.peek_token() + event = SequenceEndEvent(token.start_mark, token.start_mark) + self.state = self.states.pop() + return event + + # block_mapping ::= BLOCK-MAPPING_START + # ((KEY block_node_or_indentless_sequence?)? + # (VALUE block_node_or_indentless_sequence?)?)* + # BLOCK-END + + def parse_block_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_block_mapping_key() + + def parse_block_mapping_key(self): + if self.check_token(KeyToken): + token = self.get_token() + if not self.check_token(KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_block_mapping_value) + return self.parse_block_node_or_indentless_sequence() + else: + self.state = self.parse_block_mapping_value + return self.process_empty_scalar(token.end_mark) + if not self.check_token(BlockEndToken): + token = self.peek_token() + raise ParserError("while parsing a block mapping", self.marks[-1], + "expected , but found %r" % token.id, token.start_mark) + token = self.get_token() + event = MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_block_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_block_mapping_key) + return self.parse_block_node_or_indentless_sequence() + else: + self.state = self.parse_block_mapping_key + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_block_mapping_key + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + # flow_sequence ::= FLOW-SEQUENCE-START + # (flow_sequence_entry FLOW-ENTRY)* + # flow_sequence_entry? + # FLOW-SEQUENCE-END + # flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + # + # Note that while production rules for both flow_sequence_entry and + # flow_mapping_entry are equal, their interpretations are different. + # For `flow_sequence_entry`, the part `KEY flow_node? (VALUE flow_node?)?` + # generate an inline mapping (set syntax). + + def parse_flow_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_sequence_entry(first=True) + + def parse_flow_sequence_entry(self, first=False): + if not self.check_token(FlowSequenceEndToken): + if not first: + if self.check_token(FlowEntryToken): + self.get_token() + else: + token = self.peek_token() + raise ParserError("while parsing a flow sequence", self.marks[-1], + "expected ',' or ']', but got %r" % token.id, token.start_mark) + + if self.check_token(KeyToken): + token = self.peek_token() + event = MappingStartEvent(None, None, True, + token.start_mark, token.end_mark, + flow_style=True) + self.state = self.parse_flow_sequence_entry_mapping_key + return event + elif not self.check_token(FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry) + return self.parse_flow_node() + token = self.get_token() + event = SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_sequence_entry_mapping_key(self): + token = self.get_token() + if not self.check_token(ValueToken, + FlowEntryToken, FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry_mapping_value) + return self.parse_flow_node() + else: + self.state = self.parse_flow_sequence_entry_mapping_value + return self.process_empty_scalar(token.end_mark) + + def parse_flow_sequence_entry_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(FlowEntryToken, FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry_mapping_end) + return self.parse_flow_node() + else: + self.state = self.parse_flow_sequence_entry_mapping_end + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_flow_sequence_entry_mapping_end + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + def parse_flow_sequence_entry_mapping_end(self): + self.state = self.parse_flow_sequence_entry + token = self.peek_token() + return MappingEndEvent(token.start_mark, token.start_mark) + + # flow_mapping ::= FLOW-MAPPING-START + # (flow_mapping_entry FLOW-ENTRY)* + # flow_mapping_entry? + # FLOW-MAPPING-END + # flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + + def parse_flow_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_mapping_key(first=True) + + def parse_flow_mapping_key(self, first=False): + if not self.check_token(FlowMappingEndToken): + if not first: + if self.check_token(FlowEntryToken): + self.get_token() + else: + token = self.peek_token() + raise ParserError("while parsing a flow mapping", self.marks[-1], + "expected ',' or '}', but got %r" % token.id, token.start_mark) + if self.check_token(KeyToken): + token = self.get_token() + if not self.check_token(ValueToken, + FlowEntryToken, FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_value) + return self.parse_flow_node() + else: + self.state = self.parse_flow_mapping_value + return self.process_empty_scalar(token.end_mark) + elif not self.check_token(FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_empty_value) + return self.parse_flow_node() + token = self.get_token() + event = MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(FlowEntryToken, FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_key) + return self.parse_flow_node() + else: + self.state = self.parse_flow_mapping_key + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_flow_mapping_key + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + def parse_flow_mapping_empty_value(self): + self.state = self.parse_flow_mapping_key + return self.process_empty_scalar(self.peek_token().start_mark) + + def process_empty_scalar(self, mark): + return ScalarEvent(None, None, (True, False), '', mark, mark) + diff --git a/brightonpy/Lib/site-packages/yaml/reader.py b/brightonpy/Lib/site-packages/yaml/reader.py new file mode 100644 index 0000000..f70e920 --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/reader.py @@ -0,0 +1,192 @@ +# This module contains abstractions for the input stream. You don't have to +# looks further, there are no pretty code. +# +# We define two classes here. +# +# Mark(source, line, column) +# It's just a record and its only use is producing nice error messages. +# Parser does not use it for any other purposes. +# +# Reader(source, data) +# Reader determines the encoding of `data` and converts it to unicode. +# Reader provides the following methods and attributes: +# reader.peek(length=1) - return the next `length` characters +# reader.forward(length=1) - move the current position to `length` characters. +# reader.index - the number of the current character. +# reader.line, stream.column - the line and the column of the current character. + +__all__ = ['Reader', 'ReaderError'] + +from .error import YAMLError, Mark + +import codecs, re + +class ReaderError(YAMLError): + + def __init__(self, name, position, character, encoding, reason): + self.name = name + self.character = character + self.position = position + self.encoding = encoding + self.reason = reason + + def __str__(self): + if isinstance(self.character, bytes): + return "'%s' codec can't decode byte #x%02x: %s\n" \ + " in \"%s\", position %d" \ + % (self.encoding, ord(self.character), self.reason, + self.name, self.position) + else: + return "unacceptable character #x%04x: %s\n" \ + " in \"%s\", position %d" \ + % (self.character, self.reason, + self.name, self.position) + +class Reader(object): + # Reader: + # - determines the data encoding and converts it to a unicode string, + # - checks if characters are in allowed range, + # - adds '\0' to the end. + + # Reader accepts + # - a `bytes` object, + # - a `str` object, + # - a file-like object with its `read` method returning `str`, + # - a file-like object with its `read` method returning `unicode`. + + # Yeah, it's ugly and slow. + + def __init__(self, stream): + self.name = None + self.stream = None + self.stream_pointer = 0 + self.eof = True + self.buffer = '' + self.pointer = 0 + self.raw_buffer = None + self.raw_decode = None + self.encoding = None + self.index = 0 + self.line = 0 + self.column = 0 + if isinstance(stream, str): + self.name = "" + self.check_printable(stream) + self.buffer = stream+'\0' + elif isinstance(stream, bytes): + self.name = "" + self.raw_buffer = stream + self.determine_encoding() + else: + self.stream = stream + self.name = getattr(stream, 'name', "") + self.eof = False + self.raw_buffer = None + self.determine_encoding() + + def peek(self, index=0): + try: + return self.buffer[self.pointer+index] + except IndexError: + self.update(index+1) + return self.buffer[self.pointer+index] + + def prefix(self, length=1): + if self.pointer+length >= len(self.buffer): + self.update(length) + return self.buffer[self.pointer:self.pointer+length] + + def forward(self, length=1): + if self.pointer+length+1 >= len(self.buffer): + self.update(length+1) + while length: + ch = self.buffer[self.pointer] + self.pointer += 1 + self.index += 1 + if ch in '\n\x85\u2028\u2029' \ + or (ch == '\r' and self.buffer[self.pointer] != '\n'): + self.line += 1 + self.column = 0 + elif ch != '\uFEFF': + self.column += 1 + length -= 1 + + def get_mark(self): + if self.stream is None: + return Mark(self.name, self.index, self.line, self.column, + self.buffer, self.pointer) + else: + return Mark(self.name, self.index, self.line, self.column, + None, None) + + def determine_encoding(self): + while not self.eof and (self.raw_buffer is None or len(self.raw_buffer) < 2): + self.update_raw() + if isinstance(self.raw_buffer, bytes): + if self.raw_buffer.startswith(codecs.BOM_UTF16_LE): + self.raw_decode = codecs.utf_16_le_decode + self.encoding = 'utf-16-le' + elif self.raw_buffer.startswith(codecs.BOM_UTF16_BE): + self.raw_decode = codecs.utf_16_be_decode + self.encoding = 'utf-16-be' + else: + self.raw_decode = codecs.utf_8_decode + self.encoding = 'utf-8' + self.update(1) + + NON_PRINTABLE = re.compile('[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uD7FF\uE000-\uFFFD]') + def check_printable(self, data): + match = self.NON_PRINTABLE.search(data) + if match: + character = match.group() + position = self.index+(len(self.buffer)-self.pointer)+match.start() + raise ReaderError(self.name, position, ord(character), + 'unicode', "special characters are not allowed") + + def update(self, length): + if self.raw_buffer is None: + return + self.buffer = self.buffer[self.pointer:] + self.pointer = 0 + while len(self.buffer) < length: + if not self.eof: + self.update_raw() + if self.raw_decode is not None: + try: + data, converted = self.raw_decode(self.raw_buffer, + 'strict', self.eof) + except UnicodeDecodeError as exc: + character = self.raw_buffer[exc.start] + if self.stream is not None: + position = self.stream_pointer-len(self.raw_buffer)+exc.start + else: + position = exc.start + raise ReaderError(self.name, position, character, + exc.encoding, exc.reason) + else: + data = self.raw_buffer + converted = len(data) + self.check_printable(data) + self.buffer += data + self.raw_buffer = self.raw_buffer[converted:] + if self.eof: + self.buffer += '\0' + self.raw_buffer = None + break + + def update_raw(self, size=4096): + data = self.stream.read(size) + if self.raw_buffer is None: + self.raw_buffer = data + else: + self.raw_buffer += data + self.stream_pointer += len(data) + if not data: + self.eof = True + +#try: +# import psyco +# psyco.bind(Reader) +#except ImportError: +# pass + diff --git a/brightonpy/Lib/site-packages/yaml/representer.py b/brightonpy/Lib/site-packages/yaml/representer.py new file mode 100644 index 0000000..b9e65c5 --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/representer.py @@ -0,0 +1,387 @@ + +__all__ = ['BaseRepresenter', 'SafeRepresenter', 'Representer', + 'RepresenterError'] + +from .error import * +from .nodes import * + +import datetime, sys, copyreg, types, base64, collections + +class RepresenterError(YAMLError): + pass + +class BaseRepresenter: + + yaml_representers = {} + yaml_multi_representers = {} + + def __init__(self, default_style=None, default_flow_style=None): + self.default_style = default_style + self.default_flow_style = default_flow_style + self.represented_objects = {} + self.object_keeper = [] + self.alias_key = None + + def represent(self, data): + node = self.represent_data(data) + self.serialize(node) + self.represented_objects = {} + self.object_keeper = [] + self.alias_key = None + + def represent_data(self, data): + if self.ignore_aliases(data): + self.alias_key = None + else: + self.alias_key = id(data) + if self.alias_key is not None: + if self.alias_key in self.represented_objects: + node = self.represented_objects[self.alias_key] + #if node is None: + # raise RepresenterError("recursive objects are not allowed: %r" % data) + return node + #self.represented_objects[alias_key] = None + self.object_keeper.append(data) + data_types = type(data).__mro__ + if data_types[0] in self.yaml_representers: + node = self.yaml_representers[data_types[0]](self, data) + else: + for data_type in data_types: + if data_type in self.yaml_multi_representers: + node = self.yaml_multi_representers[data_type](self, data) + break + else: + if None in self.yaml_multi_representers: + node = self.yaml_multi_representers[None](self, data) + elif None in self.yaml_representers: + node = self.yaml_representers[None](self, data) + else: + node = ScalarNode(None, str(data)) + #if alias_key is not None: + # self.represented_objects[alias_key] = node + return node + + @classmethod + def add_representer(cls, data_type, representer): + if not 'yaml_representers' in cls.__dict__: + cls.yaml_representers = cls.yaml_representers.copy() + cls.yaml_representers[data_type] = representer + + @classmethod + def add_multi_representer(cls, data_type, representer): + if not 'yaml_multi_representers' in cls.__dict__: + cls.yaml_multi_representers = cls.yaml_multi_representers.copy() + cls.yaml_multi_representers[data_type] = representer + + def represent_scalar(self, tag, value, style=None): + if style is None: + style = self.default_style + node = ScalarNode(tag, value, style=style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + return node + + def represent_sequence(self, tag, sequence, flow_style=None): + value = [] + node = SequenceNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + for item in sequence: + node_item = self.represent_data(item) + if not (isinstance(node_item, ScalarNode) and not node_item.style): + best_style = False + value.append(node_item) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + def represent_mapping(self, tag, mapping, flow_style=None): + value = [] + node = MappingNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + if hasattr(mapping, 'items'): + mapping = list(mapping.items()) + try: + mapping = sorted(mapping) + except TypeError: + pass + for item_key, item_value in mapping: + node_key = self.represent_data(item_key) + node_value = self.represent_data(item_value) + if not (isinstance(node_key, ScalarNode) and not node_key.style): + best_style = False + if not (isinstance(node_value, ScalarNode) and not node_value.style): + best_style = False + value.append((node_key, node_value)) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + def ignore_aliases(self, data): + return False + +class SafeRepresenter(BaseRepresenter): + + def ignore_aliases(self, data): + if data is None: + return True + if isinstance(data, tuple) and data == (): + return True + if isinstance(data, (str, bytes, bool, int, float)): + return True + + def represent_none(self, data): + return self.represent_scalar('tag:yaml.org,2002:null', 'null') + + def represent_str(self, data): + return self.represent_scalar('tag:yaml.org,2002:str', data) + + def represent_binary(self, data): + if hasattr(base64, 'encodebytes'): + data = base64.encodebytes(data).decode('ascii') + else: + data = base64.encodestring(data).decode('ascii') + return self.represent_scalar('tag:yaml.org,2002:binary', data, style='|') + + def represent_bool(self, data): + if data: + value = 'true' + else: + value = 'false' + return self.represent_scalar('tag:yaml.org,2002:bool', value) + + def represent_int(self, data): + return self.represent_scalar('tag:yaml.org,2002:int', str(data)) + + inf_value = 1e300 + while repr(inf_value) != repr(inf_value*inf_value): + inf_value *= inf_value + + def represent_float(self, data): + if data != data or (data == 0.0 and data == 1.0): + value = '.nan' + elif data == self.inf_value: + value = '.inf' + elif data == -self.inf_value: + value = '-.inf' + else: + value = repr(data).lower() + # Note that in some cases `repr(data)` represents a float number + # without the decimal parts. For instance: + # >>> repr(1e17) + # '1e17' + # Unfortunately, this is not a valid float representation according + # to the definition of the `!!float` tag. We fix this by adding + # '.0' before the 'e' symbol. + if '.' not in value and 'e' in value: + value = value.replace('e', '.0e', 1) + return self.represent_scalar('tag:yaml.org,2002:float', value) + + def represent_list(self, data): + #pairs = (len(data) > 0 and isinstance(data, list)) + #if pairs: + # for item in data: + # if not isinstance(item, tuple) or len(item) != 2: + # pairs = False + # break + #if not pairs: + return self.represent_sequence('tag:yaml.org,2002:seq', data) + #value = [] + #for item_key, item_value in data: + # value.append(self.represent_mapping(u'tag:yaml.org,2002:map', + # [(item_key, item_value)])) + #return SequenceNode(u'tag:yaml.org,2002:pairs', value) + + def represent_dict(self, data): + return self.represent_mapping('tag:yaml.org,2002:map', data) + + def represent_set(self, data): + value = {} + for key in data: + value[key] = None + return self.represent_mapping('tag:yaml.org,2002:set', value) + + def represent_date(self, data): + value = data.isoformat() + return self.represent_scalar('tag:yaml.org,2002:timestamp', value) + + def represent_datetime(self, data): + value = data.isoformat(' ') + return self.represent_scalar('tag:yaml.org,2002:timestamp', value) + + def represent_yaml_object(self, tag, data, cls, flow_style=None): + if hasattr(data, '__getstate__'): + state = data.__getstate__() + else: + state = data.__dict__.copy() + return self.represent_mapping(tag, state, flow_style=flow_style) + + def represent_undefined(self, data): + raise RepresenterError("cannot represent an object: %s" % data) + +SafeRepresenter.add_representer(type(None), + SafeRepresenter.represent_none) + +SafeRepresenter.add_representer(str, + SafeRepresenter.represent_str) + +SafeRepresenter.add_representer(bytes, + SafeRepresenter.represent_binary) + +SafeRepresenter.add_representer(bool, + SafeRepresenter.represent_bool) + +SafeRepresenter.add_representer(int, + SafeRepresenter.represent_int) + +SafeRepresenter.add_representer(float, + SafeRepresenter.represent_float) + +SafeRepresenter.add_representer(list, + SafeRepresenter.represent_list) + +SafeRepresenter.add_representer(tuple, + SafeRepresenter.represent_list) + +SafeRepresenter.add_representer(dict, + SafeRepresenter.represent_dict) + +SafeRepresenter.add_representer(set, + SafeRepresenter.represent_set) + +SafeRepresenter.add_representer(datetime.date, + SafeRepresenter.represent_date) + +SafeRepresenter.add_representer(datetime.datetime, + SafeRepresenter.represent_datetime) + +SafeRepresenter.add_representer(None, + SafeRepresenter.represent_undefined) + +class Representer(SafeRepresenter): + + def represent_complex(self, data): + if data.imag == 0.0: + data = '%r' % data.real + elif data.real == 0.0: + data = '%rj' % data.imag + elif data.imag > 0: + data = '%r+%rj' % (data.real, data.imag) + else: + data = '%r%rj' % (data.real, data.imag) + return self.represent_scalar('tag:yaml.org,2002:python/complex', data) + + def represent_tuple(self, data): + return self.represent_sequence('tag:yaml.org,2002:python/tuple', data) + + def represent_name(self, data): + name = '%s.%s' % (data.__module__, data.__name__) + return self.represent_scalar('tag:yaml.org,2002:python/name:'+name, '') + + def represent_module(self, data): + return self.represent_scalar( + 'tag:yaml.org,2002:python/module:'+data.__name__, '') + + def represent_object(self, data): + # We use __reduce__ API to save the data. data.__reduce__ returns + # a tuple of length 2-5: + # (function, args, state, listitems, dictitems) + + # For reconstructing, we calls function(*args), then set its state, + # listitems, and dictitems if they are not None. + + # A special case is when function.__name__ == '__newobj__'. In this + # case we create the object with args[0].__new__(*args). + + # Another special case is when __reduce__ returns a string - we don't + # support it. + + # We produce a !!python/object, !!python/object/new or + # !!python/object/apply node. + + cls = type(data) + if cls in copyreg.dispatch_table: + reduce = copyreg.dispatch_table[cls](data) + elif hasattr(data, '__reduce_ex__'): + reduce = data.__reduce_ex__(2) + elif hasattr(data, '__reduce__'): + reduce = data.__reduce__() + else: + raise RepresenterError("cannot represent object: %r" % data) + reduce = (list(reduce)+[None]*5)[:5] + function, args, state, listitems, dictitems = reduce + args = list(args) + if state is None: + state = {} + if listitems is not None: + listitems = list(listitems) + if dictitems is not None: + dictitems = dict(dictitems) + if function.__name__ == '__newobj__': + function = args[0] + args = args[1:] + tag = 'tag:yaml.org,2002:python/object/new:' + newobj = True + else: + tag = 'tag:yaml.org,2002:python/object/apply:' + newobj = False + function_name = '%s.%s' % (function.__module__, function.__name__) + if not args and not listitems and not dictitems \ + and isinstance(state, dict) and newobj: + return self.represent_mapping( + 'tag:yaml.org,2002:python/object:'+function_name, state) + if not listitems and not dictitems \ + and isinstance(state, dict) and not state: + return self.represent_sequence(tag+function_name, args) + value = {} + if args: + value['args'] = args + if state or not isinstance(state, dict): + value['state'] = state + if listitems: + value['listitems'] = listitems + if dictitems: + value['dictitems'] = dictitems + return self.represent_mapping(tag+function_name, value) + + def represent_ordered_dict(self, data): + # Provide uniform representation across different Python versions. + data_type = type(data) + tag = 'tag:yaml.org,2002:python/object/apply:%s.%s' \ + % (data_type.__module__, data_type.__name__) + items = [[key, value] for key, value in data.items()] + return self.represent_sequence(tag, [items]) + +Representer.add_representer(complex, + Representer.represent_complex) + +Representer.add_representer(tuple, + Representer.represent_tuple) + +Representer.add_representer(type, + Representer.represent_name) + +Representer.add_representer(collections.OrderedDict, + Representer.represent_ordered_dict) + +Representer.add_representer(types.FunctionType, + Representer.represent_name) + +Representer.add_representer(types.BuiltinFunctionType, + Representer.represent_name) + +Representer.add_representer(types.ModuleType, + Representer.represent_module) + +Representer.add_multi_representer(object, + Representer.represent_object) + diff --git a/brightonpy/Lib/site-packages/yaml/resolver.py b/brightonpy/Lib/site-packages/yaml/resolver.py new file mode 100644 index 0000000..02b82e7 --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/resolver.py @@ -0,0 +1,227 @@ + +__all__ = ['BaseResolver', 'Resolver'] + +from .error import * +from .nodes import * + +import re + +class ResolverError(YAMLError): + pass + +class BaseResolver: + + DEFAULT_SCALAR_TAG = 'tag:yaml.org,2002:str' + DEFAULT_SEQUENCE_TAG = 'tag:yaml.org,2002:seq' + DEFAULT_MAPPING_TAG = 'tag:yaml.org,2002:map' + + yaml_implicit_resolvers = {} + yaml_path_resolvers = {} + + def __init__(self): + self.resolver_exact_paths = [] + self.resolver_prefix_paths = [] + + @classmethod + def add_implicit_resolver(cls, tag, regexp, first): + if not 'yaml_implicit_resolvers' in cls.__dict__: + implicit_resolvers = {} + for key in cls.yaml_implicit_resolvers: + implicit_resolvers[key] = cls.yaml_implicit_resolvers[key][:] + cls.yaml_implicit_resolvers = implicit_resolvers + if first is None: + first = [None] + for ch in first: + cls.yaml_implicit_resolvers.setdefault(ch, []).append((tag, regexp)) + + @classmethod + def add_path_resolver(cls, tag, path, kind=None): + # Note: `add_path_resolver` is experimental. The API could be changed. + # `new_path` is a pattern that is matched against the path from the + # root to the node that is being considered. `node_path` elements are + # tuples `(node_check, index_check)`. `node_check` is a node class: + # `ScalarNode`, `SequenceNode`, `MappingNode` or `None`. `None` + # matches any kind of a node. `index_check` could be `None`, a boolean + # value, a string value, or a number. `None` and `False` match against + # any _value_ of sequence and mapping nodes. `True` matches against + # any _key_ of a mapping node. A string `index_check` matches against + # a mapping value that corresponds to a scalar key which content is + # equal to the `index_check` value. An integer `index_check` matches + # against a sequence value with the index equal to `index_check`. + if not 'yaml_path_resolvers' in cls.__dict__: + cls.yaml_path_resolvers = cls.yaml_path_resolvers.copy() + new_path = [] + for element in path: + if isinstance(element, (list, tuple)): + if len(element) == 2: + node_check, index_check = element + elif len(element) == 1: + node_check = element[0] + index_check = True + else: + raise ResolverError("Invalid path element: %s" % element) + else: + node_check = None + index_check = element + if node_check is str: + node_check = ScalarNode + elif node_check is list: + node_check = SequenceNode + elif node_check is dict: + node_check = MappingNode + elif node_check not in [ScalarNode, SequenceNode, MappingNode] \ + and not isinstance(node_check, str) \ + and node_check is not None: + raise ResolverError("Invalid node checker: %s" % node_check) + if not isinstance(index_check, (str, int)) \ + and index_check is not None: + raise ResolverError("Invalid index checker: %s" % index_check) + new_path.append((node_check, index_check)) + if kind is str: + kind = ScalarNode + elif kind is list: + kind = SequenceNode + elif kind is dict: + kind = MappingNode + elif kind not in [ScalarNode, SequenceNode, MappingNode] \ + and kind is not None: + raise ResolverError("Invalid node kind: %s" % kind) + cls.yaml_path_resolvers[tuple(new_path), kind] = tag + + def descend_resolver(self, current_node, current_index): + if not self.yaml_path_resolvers: + return + exact_paths = {} + prefix_paths = [] + if current_node: + depth = len(self.resolver_prefix_paths) + for path, kind in self.resolver_prefix_paths[-1]: + if self.check_resolver_prefix(depth, path, kind, + current_node, current_index): + if len(path) > depth: + prefix_paths.append((path, kind)) + else: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + for path, kind in self.yaml_path_resolvers: + if not path: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + prefix_paths.append((path, kind)) + self.resolver_exact_paths.append(exact_paths) + self.resolver_prefix_paths.append(prefix_paths) + + def ascend_resolver(self): + if not self.yaml_path_resolvers: + return + self.resolver_exact_paths.pop() + self.resolver_prefix_paths.pop() + + def check_resolver_prefix(self, depth, path, kind, + current_node, current_index): + node_check, index_check = path[depth-1] + if isinstance(node_check, str): + if current_node.tag != node_check: + return + elif node_check is not None: + if not isinstance(current_node, node_check): + return + if index_check is True and current_index is not None: + return + if (index_check is False or index_check is None) \ + and current_index is None: + return + if isinstance(index_check, str): + if not (isinstance(current_index, ScalarNode) + and index_check == current_index.value): + return + elif isinstance(index_check, int) and not isinstance(index_check, bool): + if index_check != current_index: + return + return True + + def resolve(self, kind, value, implicit): + if kind is ScalarNode and implicit[0]: + if value == '': + resolvers = self.yaml_implicit_resolvers.get('', []) + else: + resolvers = self.yaml_implicit_resolvers.get(value[0], []) + resolvers += self.yaml_implicit_resolvers.get(None, []) + for tag, regexp in resolvers: + if regexp.match(value): + return tag + implicit = implicit[1] + if self.yaml_path_resolvers: + exact_paths = self.resolver_exact_paths[-1] + if kind in exact_paths: + return exact_paths[kind] + if None in exact_paths: + return exact_paths[None] + if kind is ScalarNode: + return self.DEFAULT_SCALAR_TAG + elif kind is SequenceNode: + return self.DEFAULT_SEQUENCE_TAG + elif kind is MappingNode: + return self.DEFAULT_MAPPING_TAG + +class Resolver(BaseResolver): + pass + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:bool', + re.compile(r'''^(?:yes|Yes|YES|no|No|NO + |true|True|TRUE|false|False|FALSE + |on|On|ON|off|Off|OFF)$''', re.X), + list('yYnNtTfFoO')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:float', + re.compile(r'''^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)? + |\.[0-9_]+(?:[eE][-+][0-9]+)? + |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]* + |[-+]?\.(?:inf|Inf|INF) + |\.(?:nan|NaN|NAN))$''', re.X), + list('-+0123456789.')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:int', + re.compile(r'''^(?:[-+]?0b[0-1_]+ + |[-+]?0[0-7_]+ + |[-+]?(?:0|[1-9][0-9_]*) + |[-+]?0x[0-9a-fA-F_]+ + |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X), + list('-+0123456789')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:merge', + re.compile(r'^(?:<<)$'), + ['<']) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:null', + re.compile(r'''^(?: ~ + |null|Null|NULL + | )$''', re.X), + ['~', 'n', 'N', '']) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:timestamp', + re.compile(r'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] + |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]? + (?:[Tt]|[ \t]+)[0-9][0-9]? + :[0-9][0-9] :[0-9][0-9] (?:\.[0-9]*)? + (?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$''', re.X), + list('0123456789')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:value', + re.compile(r'^(?:=)$'), + ['=']) + +# The following resolver is only for documentation purposes. It cannot work +# because plain scalars cannot start with '!', '&', or '*'. +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:yaml', + re.compile(r'^(?:!|&|\*)$'), + list('!&*')) + diff --git a/brightonpy/Lib/site-packages/yaml/scanner.py b/brightonpy/Lib/site-packages/yaml/scanner.py new file mode 100644 index 0000000..c8d127b --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/scanner.py @@ -0,0 +1,1444 @@ + +# Scanner produces tokens of the following types: +# STREAM-START +# STREAM-END +# DIRECTIVE(name, value) +# DOCUMENT-START +# DOCUMENT-END +# BLOCK-SEQUENCE-START +# BLOCK-MAPPING-START +# BLOCK-END +# FLOW-SEQUENCE-START +# FLOW-MAPPING-START +# FLOW-SEQUENCE-END +# FLOW-MAPPING-END +# BLOCK-ENTRY +# FLOW-ENTRY +# KEY +# VALUE +# ALIAS(value) +# ANCHOR(value) +# TAG(value) +# SCALAR(value, plain, style) +# +# Read comments in the Scanner code for more details. +# + +__all__ = ['Scanner', 'ScannerError'] + +from .error import MarkedYAMLError +from .tokens import * + +class ScannerError(MarkedYAMLError): + pass + +class SimpleKey: + # See below simple keys treatment. + + def __init__(self, token_number, required, index, line, column, mark): + self.token_number = token_number + self.required = required + self.index = index + self.line = line + self.column = column + self.mark = mark + +class Scanner: + + def __init__(self): + """Initialize the scanner.""" + # It is assumed that Scanner and Reader will have a common descendant. + # Reader do the dirty work of checking for BOM and converting the + # input data to Unicode. It also adds NUL to the end. + # + # Reader supports the following methods + # self.peek(i=0) # peek the next i-th character + # self.prefix(l=1) # peek the next l characters + # self.forward(l=1) # read the next l characters and move the pointer. + + # Had we reached the end of the stream? + self.done = False + + # The number of unclosed '{' and '['. `flow_level == 0` means block + # context. + self.flow_level = 0 + + # List of processed tokens that are not yet emitted. + self.tokens = [] + + # Add the STREAM-START token. + self.fetch_stream_start() + + # Number of tokens that were emitted through the `get_token` method. + self.tokens_taken = 0 + + # The current indentation level. + self.indent = -1 + + # Past indentation levels. + self.indents = [] + + # Variables related to simple keys treatment. + + # A simple key is a key that is not denoted by the '?' indicator. + # Example of simple keys: + # --- + # block simple key: value + # ? not a simple key: + # : { flow simple key: value } + # We emit the KEY token before all keys, so when we find a potential + # simple key, we try to locate the corresponding ':' indicator. + # Simple keys should be limited to a single line and 1024 characters. + + # Can a simple key start at the current position? A simple key may + # start: + # - at the beginning of the line, not counting indentation spaces + # (in block context), + # - after '{', '[', ',' (in the flow context), + # - after '?', ':', '-' (in the block context). + # In the block context, this flag also signifies if a block collection + # may start at the current position. + self.allow_simple_key = True + + # Keep track of possible simple keys. This is a dictionary. The key + # is `flow_level`; there can be no more that one possible simple key + # for each level. The value is a SimpleKey record: + # (token_number, required, index, line, column, mark) + # A simple key may start with ALIAS, ANCHOR, TAG, SCALAR(flow), + # '[', or '{' tokens. + self.possible_simple_keys = {} + + # Public methods. + + def check_token(self, *choices): + # Check if the next token is one of the given types. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + if not choices: + return True + for choice in choices: + if isinstance(self.tokens[0], choice): + return True + return False + + def peek_token(self): + # Return the next token, but do not delete if from the queue. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + return self.tokens[0] + + def get_token(self): + # Return the next token. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + self.tokens_taken += 1 + return self.tokens.pop(0) + + # Private methods. + + def need_more_tokens(self): + if self.done: + return False + if not self.tokens: + return True + # The current token may be a potential simple key, so we + # need to look further. + self.stale_possible_simple_keys() + if self.next_possible_simple_key() == self.tokens_taken: + return True + + def fetch_more_tokens(self): + + # Eat whitespaces and comments until we reach the next token. + self.scan_to_next_token() + + # Remove obsolete possible simple keys. + self.stale_possible_simple_keys() + + # Compare the current indentation and column. It may add some tokens + # and decrease the current indentation level. + self.unwind_indent(self.column) + + # Peek the next character. + ch = self.peek() + + # Is it the end of stream? + if ch == '\0': + return self.fetch_stream_end() + + # Is it a directive? + if ch == '%' and self.check_directive(): + return self.fetch_directive() + + # Is it the document start? + if ch == '-' and self.check_document_start(): + return self.fetch_document_start() + + # Is it the document end? + if ch == '.' and self.check_document_end(): + return self.fetch_document_end() + + # TODO: support for BOM within a stream. + #if ch == '\uFEFF': + # return self.fetch_bom() <-- issue BOMToken + + # Note: the order of the following checks is NOT significant. + + # Is it the flow sequence start indicator? + if ch == '[': + return self.fetch_flow_sequence_start() + + # Is it the flow mapping start indicator? + if ch == '{': + return self.fetch_flow_mapping_start() + + # Is it the flow sequence end indicator? + if ch == ']': + return self.fetch_flow_sequence_end() + + # Is it the flow mapping end indicator? + if ch == '}': + return self.fetch_flow_mapping_end() + + # Is it the flow entry indicator? + if ch == ',': + return self.fetch_flow_entry() + + # Is it the block entry indicator? + if ch == '-' and self.check_block_entry(): + return self.fetch_block_entry() + + # Is it the key indicator? + if ch == '?' and self.check_key(): + return self.fetch_key() + + # Is it the value indicator? + if ch == ':' and self.check_value(): + return self.fetch_value() + + # Is it an alias? + if ch == '*': + return self.fetch_alias() + + # Is it an anchor? + if ch == '&': + return self.fetch_anchor() + + # Is it a tag? + if ch == '!': + return self.fetch_tag() + + # Is it a literal scalar? + if ch == '|' and not self.flow_level: + return self.fetch_literal() + + # Is it a folded scalar? + if ch == '>' and not self.flow_level: + return self.fetch_folded() + + # Is it a single quoted scalar? + if ch == '\'': + return self.fetch_single() + + # Is it a double quoted scalar? + if ch == '\"': + return self.fetch_double() + + # It must be a plain scalar then. + if self.check_plain(): + return self.fetch_plain() + + # No? It's an error. Let's produce a nice error message. + raise ScannerError("while scanning for the next token", None, + "found character %r that cannot start any token" % ch, + self.get_mark()) + + # Simple keys treatment. + + def next_possible_simple_key(self): + # Return the number of the nearest possible simple key. Actually we + # don't need to loop through the whole dictionary. We may replace it + # with the following code: + # if not self.possible_simple_keys: + # return None + # return self.possible_simple_keys[ + # min(self.possible_simple_keys.keys())].token_number + min_token_number = None + for level in self.possible_simple_keys: + key = self.possible_simple_keys[level] + if min_token_number is None or key.token_number < min_token_number: + min_token_number = key.token_number + return min_token_number + + def stale_possible_simple_keys(self): + # Remove entries that are no longer possible simple keys. According to + # the YAML specification, simple keys + # - should be limited to a single line, + # - should be no longer than 1024 characters. + # Disabling this procedure will allow simple keys of any length and + # height (may cause problems if indentation is broken though). + for level in list(self.possible_simple_keys): + key = self.possible_simple_keys[level] + if key.line != self.line \ + or self.index-key.index > 1024: + if key.required: + raise ScannerError("while scanning a simple key", key.mark, + "could not find expected ':'", self.get_mark()) + del self.possible_simple_keys[level] + + def save_possible_simple_key(self): + # The next token may start a simple key. We check if it's possible + # and save its position. This function is called for + # ALIAS, ANCHOR, TAG, SCALAR(flow), '[', and '{'. + + # Check if a simple key is required at the current position. + required = not self.flow_level and self.indent == self.column + + # The next token might be a simple key. Let's save it's number and + # position. + if self.allow_simple_key: + self.remove_possible_simple_key() + token_number = self.tokens_taken+len(self.tokens) + key = SimpleKey(token_number, required, + self.index, self.line, self.column, self.get_mark()) + self.possible_simple_keys[self.flow_level] = key + + def remove_possible_simple_key(self): + # Remove the saved possible key position at the current flow level. + if self.flow_level in self.possible_simple_keys: + key = self.possible_simple_keys[self.flow_level] + + if key.required: + raise ScannerError("while scanning a simple key", key.mark, + "could not find expected ':'", self.get_mark()) + + del self.possible_simple_keys[self.flow_level] + + # Indentation functions. + + def unwind_indent(self, column): + + ## In flow context, tokens should respect indentation. + ## Actually the condition should be `self.indent >= column` according to + ## the spec. But this condition will prohibit intuitively correct + ## constructions such as + ## key : { + ## } + #if self.flow_level and self.indent > column: + # raise ScannerError(None, None, + # "invalid intendation or unclosed '[' or '{'", + # self.get_mark()) + + # In the flow context, indentation is ignored. We make the scanner less + # restrictive then specification requires. + if self.flow_level: + return + + # In block context, we may need to issue the BLOCK-END tokens. + while self.indent > column: + mark = self.get_mark() + self.indent = self.indents.pop() + self.tokens.append(BlockEndToken(mark, mark)) + + def add_indent(self, column): + # Check if we need to increase indentation. + if self.indent < column: + self.indents.append(self.indent) + self.indent = column + return True + return False + + # Fetchers. + + def fetch_stream_start(self): + # We always add STREAM-START as the first token and STREAM-END as the + # last token. + + # Read the token. + mark = self.get_mark() + + # Add STREAM-START. + self.tokens.append(StreamStartToken(mark, mark, + encoding=self.encoding)) + + + def fetch_stream_end(self): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + self.possible_simple_keys = {} + + # Read the token. + mark = self.get_mark() + + # Add STREAM-END. + self.tokens.append(StreamEndToken(mark, mark)) + + # The steam is finished. + self.done = True + + def fetch_directive(self): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + + # Scan and add DIRECTIVE. + self.tokens.append(self.scan_directive()) + + def fetch_document_start(self): + self.fetch_document_indicator(DocumentStartToken) + + def fetch_document_end(self): + self.fetch_document_indicator(DocumentEndToken) + + def fetch_document_indicator(self, TokenClass): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. Note that there could not be a block collection + # after '---'. + self.remove_possible_simple_key() + self.allow_simple_key = False + + # Add DOCUMENT-START or DOCUMENT-END. + start_mark = self.get_mark() + self.forward(3) + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_start(self): + self.fetch_flow_collection_start(FlowSequenceStartToken) + + def fetch_flow_mapping_start(self): + self.fetch_flow_collection_start(FlowMappingStartToken) + + def fetch_flow_collection_start(self, TokenClass): + + # '[' and '{' may start a simple key. + self.save_possible_simple_key() + + # Increase the flow level. + self.flow_level += 1 + + # Simple keys are allowed after '[' and '{'. + self.allow_simple_key = True + + # Add FLOW-SEQUENCE-START or FLOW-MAPPING-START. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_end(self): + self.fetch_flow_collection_end(FlowSequenceEndToken) + + def fetch_flow_mapping_end(self): + self.fetch_flow_collection_end(FlowMappingEndToken) + + def fetch_flow_collection_end(self, TokenClass): + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Decrease the flow level. + self.flow_level -= 1 + + # No simple keys after ']' or '}'. + self.allow_simple_key = False + + # Add FLOW-SEQUENCE-END or FLOW-MAPPING-END. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_entry(self): + + # Simple keys are allowed after ','. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add FLOW-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(FlowEntryToken(start_mark, end_mark)) + + def fetch_block_entry(self): + + # Block context needs additional checks. + if not self.flow_level: + + # Are we allowed to start a new entry? + if not self.allow_simple_key: + raise ScannerError(None, None, + "sequence entries are not allowed here", + self.get_mark()) + + # We may need to add BLOCK-SEQUENCE-START. + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockSequenceStartToken(mark, mark)) + + # It's an error for the block entry to occur in the flow context, + # but we let the parser detect this. + else: + pass + + # Simple keys are allowed after '-'. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add BLOCK-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(BlockEntryToken(start_mark, end_mark)) + + def fetch_key(self): + + # Block context needs additional checks. + if not self.flow_level: + + # Are we allowed to start a key (not nessesary a simple)? + if not self.allow_simple_key: + raise ScannerError(None, None, + "mapping keys are not allowed here", + self.get_mark()) + + # We may need to add BLOCK-MAPPING-START. + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockMappingStartToken(mark, mark)) + + # Simple keys are allowed after '?' in the block context. + self.allow_simple_key = not self.flow_level + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add KEY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(KeyToken(start_mark, end_mark)) + + def fetch_value(self): + + # Do we determine a simple key? + if self.flow_level in self.possible_simple_keys: + + # Add KEY. + key = self.possible_simple_keys[self.flow_level] + del self.possible_simple_keys[self.flow_level] + self.tokens.insert(key.token_number-self.tokens_taken, + KeyToken(key.mark, key.mark)) + + # If this key starts a new block mapping, we need to add + # BLOCK-MAPPING-START. + if not self.flow_level: + if self.add_indent(key.column): + self.tokens.insert(key.token_number-self.tokens_taken, + BlockMappingStartToken(key.mark, key.mark)) + + # There cannot be two simple keys one after another. + self.allow_simple_key = False + + # It must be a part of a complex key. + else: + + # Block context needs additional checks. + # (Do we really need them? They will be catched by the parser + # anyway.) + if not self.flow_level: + + # We are allowed to start a complex value if and only if + # we can start a simple key. + if not self.allow_simple_key: + raise ScannerError(None, None, + "mapping values are not allowed here", + self.get_mark()) + + # If this value starts a new block mapping, we need to add + # BLOCK-MAPPING-START. It will be detected as an error later by + # the parser. + if not self.flow_level: + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockMappingStartToken(mark, mark)) + + # Simple keys are allowed after ':' in the block context. + self.allow_simple_key = not self.flow_level + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add VALUE. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(ValueToken(start_mark, end_mark)) + + def fetch_alias(self): + + # ALIAS could be a simple key. + self.save_possible_simple_key() + + # No simple keys after ALIAS. + self.allow_simple_key = False + + # Scan and add ALIAS. + self.tokens.append(self.scan_anchor(AliasToken)) + + def fetch_anchor(self): + + # ANCHOR could start a simple key. + self.save_possible_simple_key() + + # No simple keys after ANCHOR. + self.allow_simple_key = False + + # Scan and add ANCHOR. + self.tokens.append(self.scan_anchor(AnchorToken)) + + def fetch_tag(self): + + # TAG could start a simple key. + self.save_possible_simple_key() + + # No simple keys after TAG. + self.allow_simple_key = False + + # Scan and add TAG. + self.tokens.append(self.scan_tag()) + + def fetch_literal(self): + self.fetch_block_scalar(style='|') + + def fetch_folded(self): + self.fetch_block_scalar(style='>') + + def fetch_block_scalar(self, style): + + # A simple key may follow a block scalar. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Scan and add SCALAR. + self.tokens.append(self.scan_block_scalar(style)) + + def fetch_single(self): + self.fetch_flow_scalar(style='\'') + + def fetch_double(self): + self.fetch_flow_scalar(style='"') + + def fetch_flow_scalar(self, style): + + # A flow scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after flow scalars. + self.allow_simple_key = False + + # Scan and add SCALAR. + self.tokens.append(self.scan_flow_scalar(style)) + + def fetch_plain(self): + + # A plain scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after plain scalars. But note that `scan_plain` will + # change this flag if the scan is finished at the beginning of the + # line. + self.allow_simple_key = False + + # Scan and add SCALAR. May change `allow_simple_key`. + self.tokens.append(self.scan_plain()) + + # Checkers. + + def check_directive(self): + + # DIRECTIVE: ^ '%' ... + # The '%' indicator is already checked. + if self.column == 0: + return True + + def check_document_start(self): + + # DOCUMENT-START: ^ '---' (' '|'\n') + if self.column == 0: + if self.prefix(3) == '---' \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return True + + def check_document_end(self): + + # DOCUMENT-END: ^ '...' (' '|'\n') + if self.column == 0: + if self.prefix(3) == '...' \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return True + + def check_block_entry(self): + + # BLOCK-ENTRY: '-' (' '|'\n') + return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' + + def check_key(self): + + # KEY(flow context): '?' + if self.flow_level: + return True + + # KEY(block context): '?' (' '|'\n') + else: + return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' + + def check_value(self): + + # VALUE(flow context): ':' + if self.flow_level: + return True + + # VALUE(block context): ':' (' '|'\n') + else: + return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' + + def check_plain(self): + + # A plain scalar may start with any non-space character except: + # '-', '?', ':', ',', '[', ']', '{', '}', + # '#', '&', '*', '!', '|', '>', '\'', '\"', + # '%', '@', '`'. + # + # It may also start with + # '-', '?', ':' + # if it is followed by a non-space character. + # + # Note that we limit the last rule to the block context (except the + # '-' character) because we want the flow context to be space + # independent. + ch = self.peek() + return ch not in '\0 \t\r\n\x85\u2028\u2029-?:,[]{}#&*!|>\'\"%@`' \ + or (self.peek(1) not in '\0 \t\r\n\x85\u2028\u2029' + and (ch == '-' or (not self.flow_level and ch in '?:'))) + + # Scanners. + + def scan_to_next_token(self): + # We ignore spaces, line breaks and comments. + # If we find a line break in the block context, we set the flag + # `allow_simple_key` on. + # The byte order mark is stripped if it's the first character in the + # stream. We do not yet support BOM inside the stream as the + # specification requires. Any such mark will be considered as a part + # of the document. + # + # TODO: We need to make tab handling rules more sane. A good rule is + # Tabs cannot precede tokens + # BLOCK-SEQUENCE-START, BLOCK-MAPPING-START, BLOCK-END, + # KEY(block), VALUE(block), BLOCK-ENTRY + # So the checking code is + # if : + # self.allow_simple_keys = False + # We also need to add the check for `allow_simple_keys == True` to + # `unwind_indent` before issuing BLOCK-END. + # Scanners for block, flow, and plain scalars need to be modified. + + if self.index == 0 and self.peek() == '\uFEFF': + self.forward() + found = False + while not found: + while self.peek() == ' ': + self.forward() + if self.peek() == '#': + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + if self.scan_line_break(): + if not self.flow_level: + self.allow_simple_key = True + else: + found = True + + def scan_directive(self): + # See the specification for details. + start_mark = self.get_mark() + self.forward() + name = self.scan_directive_name(start_mark) + value = None + if name == 'YAML': + value = self.scan_yaml_directive_value(start_mark) + end_mark = self.get_mark() + elif name == 'TAG': + value = self.scan_tag_directive_value(start_mark) + end_mark = self.get_mark() + else: + end_mark = self.get_mark() + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + self.scan_directive_ignored_line(start_mark) + return DirectiveToken(name, value, start_mark, end_mark) + + def scan_directive_name(self, start_mark): + # See the specification for details. + length = 0 + ch = self.peek(length) + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_': + length += 1 + ch = self.peek(length) + if not length: + raise ScannerError("while scanning a directive", start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + value = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + return value + + def scan_yaml_directive_value(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + major = self.scan_yaml_directive_number(start_mark) + if self.peek() != '.': + raise ScannerError("while scanning a directive", start_mark, + "expected a digit or '.', but found %r" % self.peek(), + self.get_mark()) + self.forward() + minor = self.scan_yaml_directive_number(start_mark) + if self.peek() not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected a digit or ' ', but found %r" % self.peek(), + self.get_mark()) + return (major, minor) + + def scan_yaml_directive_number(self, start_mark): + # See the specification for details. + ch = self.peek() + if not ('0' <= ch <= '9'): + raise ScannerError("while scanning a directive", start_mark, + "expected a digit, but found %r" % ch, self.get_mark()) + length = 0 + while '0' <= self.peek(length) <= '9': + length += 1 + value = int(self.prefix(length)) + self.forward(length) + return value + + def scan_tag_directive_value(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + handle = self.scan_tag_directive_handle(start_mark) + while self.peek() == ' ': + self.forward() + prefix = self.scan_tag_directive_prefix(start_mark) + return (handle, prefix) + + def scan_tag_directive_handle(self, start_mark): + # See the specification for details. + value = self.scan_tag_handle('directive', start_mark) + ch = self.peek() + if ch != ' ': + raise ScannerError("while scanning a directive", start_mark, + "expected ' ', but found %r" % ch, self.get_mark()) + return value + + def scan_tag_directive_prefix(self, start_mark): + # See the specification for details. + value = self.scan_tag_uri('directive', start_mark) + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected ' ', but found %r" % ch, self.get_mark()) + return value + + def scan_directive_ignored_line(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + if self.peek() == '#': + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + ch = self.peek() + if ch not in '\0\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected a comment or a line break, but found %r" + % ch, self.get_mark()) + self.scan_line_break() + + def scan_anchor(self, TokenClass): + # The specification does not restrict characters for anchors and + # aliases. This may lead to problems, for instance, the document: + # [ *alias, value ] + # can be interpteted in two ways, as + # [ "value" ] + # and + # [ *alias , "value" ] + # Therefore we restrict aliases to numbers and ASCII letters. + start_mark = self.get_mark() + indicator = self.peek() + if indicator == '*': + name = 'alias' + else: + name = 'anchor' + self.forward() + length = 0 + ch = self.peek(length) + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_': + length += 1 + ch = self.peek(length) + if not length: + raise ScannerError("while scanning an %s" % name, start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + value = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch not in '\0 \t\r\n\x85\u2028\u2029?:,]}%@`': + raise ScannerError("while scanning an %s" % name, start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + end_mark = self.get_mark() + return TokenClass(value, start_mark, end_mark) + + def scan_tag(self): + # See the specification for details. + start_mark = self.get_mark() + ch = self.peek(1) + if ch == '<': + handle = None + self.forward(2) + suffix = self.scan_tag_uri('tag', start_mark) + if self.peek() != '>': + raise ScannerError("while parsing a tag", start_mark, + "expected '>', but found %r" % self.peek(), + self.get_mark()) + self.forward() + elif ch in '\0 \t\r\n\x85\u2028\u2029': + handle = None + suffix = '!' + self.forward() + else: + length = 1 + use_handle = False + while ch not in '\0 \r\n\x85\u2028\u2029': + if ch == '!': + use_handle = True + break + length += 1 + ch = self.peek(length) + handle = '!' + if use_handle: + handle = self.scan_tag_handle('tag', start_mark) + else: + handle = '!' + self.forward() + suffix = self.scan_tag_uri('tag', start_mark) + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a tag", start_mark, + "expected ' ', but found %r" % ch, self.get_mark()) + value = (handle, suffix) + end_mark = self.get_mark() + return TagToken(value, start_mark, end_mark) + + def scan_block_scalar(self, style): + # See the specification for details. + + if style == '>': + folded = True + else: + folded = False + + chunks = [] + start_mark = self.get_mark() + + # Scan the header. + self.forward() + chomping, increment = self.scan_block_scalar_indicators(start_mark) + self.scan_block_scalar_ignored_line(start_mark) + + # Determine the indentation level and go to the first non-empty line. + min_indent = self.indent+1 + if min_indent < 1: + min_indent = 1 + if increment is None: + breaks, max_indent, end_mark = self.scan_block_scalar_indentation() + indent = max(min_indent, max_indent) + else: + indent = min_indent+increment-1 + breaks, end_mark = self.scan_block_scalar_breaks(indent) + line_break = '' + + # Scan the inner part of the block scalar. + while self.column == indent and self.peek() != '\0': + chunks.extend(breaks) + leading_non_space = self.peek() not in ' \t' + length = 0 + while self.peek(length) not in '\0\r\n\x85\u2028\u2029': + length += 1 + chunks.append(self.prefix(length)) + self.forward(length) + line_break = self.scan_line_break() + breaks, end_mark = self.scan_block_scalar_breaks(indent) + if self.column == indent and self.peek() != '\0': + + # Unfortunately, folding rules are ambiguous. + # + # This is the folding according to the specification: + + if folded and line_break == '\n' \ + and leading_non_space and self.peek() not in ' \t': + if not breaks: + chunks.append(' ') + else: + chunks.append(line_break) + + # This is Clark Evans's interpretation (also in the spec + # examples): + # + #if folded and line_break == '\n': + # if not breaks: + # if self.peek() not in ' \t': + # chunks.append(' ') + # else: + # chunks.append(line_break) + #else: + # chunks.append(line_break) + else: + break + + # Chomp the tail. + if chomping is not False: + chunks.append(line_break) + if chomping is True: + chunks.extend(breaks) + + # We are done. + return ScalarToken(''.join(chunks), False, start_mark, end_mark, + style) + + def scan_block_scalar_indicators(self, start_mark): + # See the specification for details. + chomping = None + increment = None + ch = self.peek() + if ch in '+-': + if ch == '+': + chomping = True + else: + chomping = False + self.forward() + ch = self.peek() + if ch in '0123456789': + increment = int(ch) + if increment == 0: + raise ScannerError("while scanning a block scalar", start_mark, + "expected indentation indicator in the range 1-9, but found 0", + self.get_mark()) + self.forward() + elif ch in '0123456789': + increment = int(ch) + if increment == 0: + raise ScannerError("while scanning a block scalar", start_mark, + "expected indentation indicator in the range 1-9, but found 0", + self.get_mark()) + self.forward() + ch = self.peek() + if ch in '+-': + if ch == '+': + chomping = True + else: + chomping = False + self.forward() + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a block scalar", start_mark, + "expected chomping or indentation indicators, but found %r" + % ch, self.get_mark()) + return chomping, increment + + def scan_block_scalar_ignored_line(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + if self.peek() == '#': + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + ch = self.peek() + if ch not in '\0\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a block scalar", start_mark, + "expected a comment or a line break, but found %r" % ch, + self.get_mark()) + self.scan_line_break() + + def scan_block_scalar_indentation(self): + # See the specification for details. + chunks = [] + max_indent = 0 + end_mark = self.get_mark() + while self.peek() in ' \r\n\x85\u2028\u2029': + if self.peek() != ' ': + chunks.append(self.scan_line_break()) + end_mark = self.get_mark() + else: + self.forward() + if self.column > max_indent: + max_indent = self.column + return chunks, max_indent, end_mark + + def scan_block_scalar_breaks(self, indent): + # See the specification for details. + chunks = [] + end_mark = self.get_mark() + while self.column < indent and self.peek() == ' ': + self.forward() + while self.peek() in '\r\n\x85\u2028\u2029': + chunks.append(self.scan_line_break()) + end_mark = self.get_mark() + while self.column < indent and self.peek() == ' ': + self.forward() + return chunks, end_mark + + def scan_flow_scalar(self, style): + # See the specification for details. + # Note that we loose indentation rules for quoted scalars. Quoted + # scalars don't need to adhere indentation because " and ' clearly + # mark the beginning and the end of them. Therefore we are less + # restrictive then the specification requires. We only need to check + # that document separators are not included in scalars. + if style == '"': + double = True + else: + double = False + chunks = [] + start_mark = self.get_mark() + quote = self.peek() + self.forward() + chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) + while self.peek() != quote: + chunks.extend(self.scan_flow_scalar_spaces(double, start_mark)) + chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) + self.forward() + end_mark = self.get_mark() + return ScalarToken(''.join(chunks), False, start_mark, end_mark, + style) + + ESCAPE_REPLACEMENTS = { + '0': '\0', + 'a': '\x07', + 'b': '\x08', + 't': '\x09', + '\t': '\x09', + 'n': '\x0A', + 'v': '\x0B', + 'f': '\x0C', + 'r': '\x0D', + 'e': '\x1B', + ' ': '\x20', + '\"': '\"', + '\\': '\\', + 'N': '\x85', + '_': '\xA0', + 'L': '\u2028', + 'P': '\u2029', + } + + ESCAPE_CODES = { + 'x': 2, + 'u': 4, + 'U': 8, + } + + def scan_flow_scalar_non_spaces(self, double, start_mark): + # See the specification for details. + chunks = [] + while True: + length = 0 + while self.peek(length) not in '\'\"\\\0 \t\r\n\x85\u2028\u2029': + length += 1 + if length: + chunks.append(self.prefix(length)) + self.forward(length) + ch = self.peek() + if not double and ch == '\'' and self.peek(1) == '\'': + chunks.append('\'') + self.forward(2) + elif (double and ch == '\'') or (not double and ch in '\"\\'): + chunks.append(ch) + self.forward() + elif double and ch == '\\': + self.forward() + ch = self.peek() + if ch in self.ESCAPE_REPLACEMENTS: + chunks.append(self.ESCAPE_REPLACEMENTS[ch]) + self.forward() + elif ch in self.ESCAPE_CODES: + length = self.ESCAPE_CODES[ch] + self.forward() + for k in range(length): + if self.peek(k) not in '0123456789ABCDEFabcdef': + raise ScannerError("while scanning a double-quoted scalar", start_mark, + "expected escape sequence of %d hexdecimal numbers, but found %r" % + (length, self.peek(k)), self.get_mark()) + code = int(self.prefix(length), 16) + chunks.append(chr(code)) + self.forward(length) + elif ch in '\r\n\x85\u2028\u2029': + self.scan_line_break() + chunks.extend(self.scan_flow_scalar_breaks(double, start_mark)) + else: + raise ScannerError("while scanning a double-quoted scalar", start_mark, + "found unknown escape character %r" % ch, self.get_mark()) + else: + return chunks + + def scan_flow_scalar_spaces(self, double, start_mark): + # See the specification for details. + chunks = [] + length = 0 + while self.peek(length) in ' \t': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch == '\0': + raise ScannerError("while scanning a quoted scalar", start_mark, + "found unexpected end of stream", self.get_mark()) + elif ch in '\r\n\x85\u2028\u2029': + line_break = self.scan_line_break() + breaks = self.scan_flow_scalar_breaks(double, start_mark) + if line_break != '\n': + chunks.append(line_break) + elif not breaks: + chunks.append(' ') + chunks.extend(breaks) + else: + chunks.append(whitespaces) + return chunks + + def scan_flow_scalar_breaks(self, double, start_mark): + # See the specification for details. + chunks = [] + while True: + # Instead of checking indentation, we check for document + # separators. + prefix = self.prefix(3) + if (prefix == '---' or prefix == '...') \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a quoted scalar", start_mark, + "found unexpected document separator", self.get_mark()) + while self.peek() in ' \t': + self.forward() + if self.peek() in '\r\n\x85\u2028\u2029': + chunks.append(self.scan_line_break()) + else: + return chunks + + def scan_plain(self): + # See the specification for details. + # We add an additional restriction for the flow context: + # plain scalars in the flow context cannot contain ',', ':' and '?'. + # We also keep track of the `allow_simple_key` flag here. + # Indentation rules are loosed for the flow context. + chunks = [] + start_mark = self.get_mark() + end_mark = start_mark + indent = self.indent+1 + # We allow zero indentation for scalars, but then we need to check for + # document separators at the beginning of the line. + #if indent == 0: + # indent = 1 + spaces = [] + while True: + length = 0 + if self.peek() == '#': + break + while True: + ch = self.peek(length) + if ch in '\0 \t\r\n\x85\u2028\u2029' \ + or (not self.flow_level and ch == ':' and + self.peek(length+1) in '\0 \t\r\n\x85\u2028\u2029') \ + or (self.flow_level and ch in ',:?[]{}'): + break + length += 1 + # It's not clear what we should do with ':' in the flow context. + if (self.flow_level and ch == ':' + and self.peek(length+1) not in '\0 \t\r\n\x85\u2028\u2029,[]{}'): + self.forward(length) + raise ScannerError("while scanning a plain scalar", start_mark, + "found unexpected ':'", self.get_mark(), + "Please check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.") + if length == 0: + break + self.allow_simple_key = False + chunks.extend(spaces) + chunks.append(self.prefix(length)) + self.forward(length) + end_mark = self.get_mark() + spaces = self.scan_plain_spaces(indent, start_mark) + if not spaces or self.peek() == '#' \ + or (not self.flow_level and self.column < indent): + break + return ScalarToken(''.join(chunks), True, start_mark, end_mark) + + def scan_plain_spaces(self, indent, start_mark): + # See the specification for details. + # The specification is really confusing about tabs in plain scalars. + # We just forbid them completely. Do not use tabs in YAML! + chunks = [] + length = 0 + while self.peek(length) in ' ': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch in '\r\n\x85\u2028\u2029': + line_break = self.scan_line_break() + self.allow_simple_key = True + prefix = self.prefix(3) + if (prefix == '---' or prefix == '...') \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return + breaks = [] + while self.peek() in ' \r\n\x85\u2028\u2029': + if self.peek() == ' ': + self.forward() + else: + breaks.append(self.scan_line_break()) + prefix = self.prefix(3) + if (prefix == '---' or prefix == '...') \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return + if line_break != '\n': + chunks.append(line_break) + elif not breaks: + chunks.append(' ') + chunks.extend(breaks) + elif whitespaces: + chunks.append(whitespaces) + return chunks + + def scan_tag_handle(self, name, start_mark): + # See the specification for details. + # For some strange reasons, the specification does not allow '_' in + # tag handles. I have allowed it anyway. + ch = self.peek() + if ch != '!': + raise ScannerError("while scanning a %s" % name, start_mark, + "expected '!', but found %r" % ch, self.get_mark()) + length = 1 + ch = self.peek(length) + if ch != ' ': + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_': + length += 1 + ch = self.peek(length) + if ch != '!': + self.forward(length) + raise ScannerError("while scanning a %s" % name, start_mark, + "expected '!', but found %r" % ch, self.get_mark()) + length += 1 + value = self.prefix(length) + self.forward(length) + return value + + def scan_tag_uri(self, name, start_mark): + # See the specification for details. + # Note: we do not check if URI is well-formed. + chunks = [] + length = 0 + ch = self.peek(length) + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-;/?:@&=+$,_.!~*\'()[]%': + if ch == '%': + chunks.append(self.prefix(length)) + self.forward(length) + length = 0 + chunks.append(self.scan_uri_escapes(name, start_mark)) + else: + length += 1 + ch = self.peek(length) + if length: + chunks.append(self.prefix(length)) + self.forward(length) + length = 0 + if not chunks: + raise ScannerError("while parsing a %s" % name, start_mark, + "expected URI, but found %r" % ch, self.get_mark()) + return ''.join(chunks) + + def scan_uri_escapes(self, name, start_mark): + # See the specification for details. + codes = [] + mark = self.get_mark() + while self.peek() == '%': + self.forward() + for k in range(2): + if self.peek(k) not in '0123456789ABCDEFabcdef': + raise ScannerError("while scanning a %s" % name, start_mark, + "expected URI escape sequence of 2 hexdecimal numbers, but found %r" + % self.peek(k), self.get_mark()) + codes.append(int(self.prefix(2), 16)) + self.forward(2) + try: + value = bytes(codes).decode('utf-8') + except UnicodeDecodeError as exc: + raise ScannerError("while scanning a %s" % name, start_mark, str(exc), mark) + return value + + def scan_line_break(self): + # Transforms: + # '\r\n' : '\n' + # '\r' : '\n' + # '\n' : '\n' + # '\x85' : '\n' + # '\u2028' : '\u2028' + # '\u2029 : '\u2029' + # default : '' + ch = self.peek() + if ch in '\r\n\x85': + if self.prefix(2) == '\r\n': + self.forward(2) + else: + self.forward() + return '\n' + elif ch in '\u2028\u2029': + self.forward() + return ch + return '' + +#try: +# import psyco +# psyco.bind(Scanner) +#except ImportError: +# pass + diff --git a/brightonpy/Lib/site-packages/yaml/serializer.py b/brightonpy/Lib/site-packages/yaml/serializer.py new file mode 100644 index 0000000..fe911e6 --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/serializer.py @@ -0,0 +1,111 @@ + +__all__ = ['Serializer', 'SerializerError'] + +from .error import YAMLError +from .events import * +from .nodes import * + +class SerializerError(YAMLError): + pass + +class Serializer: + + ANCHOR_TEMPLATE = 'id%03d' + + def __init__(self, encoding=None, + explicit_start=None, explicit_end=None, version=None, tags=None): + self.use_encoding = encoding + self.use_explicit_start = explicit_start + self.use_explicit_end = explicit_end + self.use_version = version + self.use_tags = tags + self.serialized_nodes = {} + self.anchors = {} + self.last_anchor_id = 0 + self.closed = None + + def open(self): + if self.closed is None: + self.emit(StreamStartEvent(encoding=self.use_encoding)) + self.closed = False + elif self.closed: + raise SerializerError("serializer is closed") + else: + raise SerializerError("serializer is already opened") + + def close(self): + if self.closed is None: + raise SerializerError("serializer is not opened") + elif not self.closed: + self.emit(StreamEndEvent()) + self.closed = True + + #def __del__(self): + # self.close() + + def serialize(self, node): + if self.closed is None: + raise SerializerError("serializer is not opened") + elif self.closed: + raise SerializerError("serializer is closed") + self.emit(DocumentStartEvent(explicit=self.use_explicit_start, + version=self.use_version, tags=self.use_tags)) + self.anchor_node(node) + self.serialize_node(node, None, None) + self.emit(DocumentEndEvent(explicit=self.use_explicit_end)) + self.serialized_nodes = {} + self.anchors = {} + self.last_anchor_id = 0 + + def anchor_node(self, node): + if node in self.anchors: + if self.anchors[node] is None: + self.anchors[node] = self.generate_anchor(node) + else: + self.anchors[node] = None + if isinstance(node, SequenceNode): + for item in node.value: + self.anchor_node(item) + elif isinstance(node, MappingNode): + for key, value in node.value: + self.anchor_node(key) + self.anchor_node(value) + + def generate_anchor(self, node): + self.last_anchor_id += 1 + return self.ANCHOR_TEMPLATE % self.last_anchor_id + + def serialize_node(self, node, parent, index): + alias = self.anchors[node] + if node in self.serialized_nodes: + self.emit(AliasEvent(alias)) + else: + self.serialized_nodes[node] = True + self.descend_resolver(parent, index) + if isinstance(node, ScalarNode): + detected_tag = self.resolve(ScalarNode, node.value, (True, False)) + default_tag = self.resolve(ScalarNode, node.value, (False, True)) + implicit = (node.tag == detected_tag), (node.tag == default_tag) + self.emit(ScalarEvent(alias, node.tag, implicit, node.value, + style=node.style)) + elif isinstance(node, SequenceNode): + implicit = (node.tag + == self.resolve(SequenceNode, node.value, True)) + self.emit(SequenceStartEvent(alias, node.tag, implicit, + flow_style=node.flow_style)) + index = 0 + for item in node.value: + self.serialize_node(item, node, index) + index += 1 + self.emit(SequenceEndEvent()) + elif isinstance(node, MappingNode): + implicit = (node.tag + == self.resolve(MappingNode, node.value, True)) + self.emit(MappingStartEvent(alias, node.tag, implicit, + flow_style=node.flow_style)) + for key, value in node.value: + self.serialize_node(key, node, None) + self.serialize_node(value, node, key) + self.emit(MappingEndEvent()) + self.ascend_resolver() + diff --git a/brightonpy/Lib/site-packages/yaml/tokens.py b/brightonpy/Lib/site-packages/yaml/tokens.py new file mode 100644 index 0000000..4d0b48a --- /dev/null +++ b/brightonpy/Lib/site-packages/yaml/tokens.py @@ -0,0 +1,104 @@ + +class Token(object): + def __init__(self, start_mark, end_mark): + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + attributes = [key for key in self.__dict__ + if not key.endswith('_mark')] + attributes.sort() + arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) + for key in attributes]) + return '%s(%s)' % (self.__class__.__name__, arguments) + +#class BOMToken(Token): +# id = '' + +class DirectiveToken(Token): + id = '' + def __init__(self, name, value, start_mark, end_mark): + self.name = name + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class DocumentStartToken(Token): + id = '' + +class DocumentEndToken(Token): + id = '' + +class StreamStartToken(Token): + id = '' + def __init__(self, start_mark=None, end_mark=None, + encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + +class StreamEndToken(Token): + id = '' + +class BlockSequenceStartToken(Token): + id = '' + +class BlockMappingStartToken(Token): + id = '' + +class BlockEndToken(Token): + id = '' + +class FlowSequenceStartToken(Token): + id = '[' + +class FlowMappingStartToken(Token): + id = '{' + +class FlowSequenceEndToken(Token): + id = ']' + +class FlowMappingEndToken(Token): + id = '}' + +class KeyToken(Token): + id = '?' + +class ValueToken(Token): + id = ':' + +class BlockEntryToken(Token): + id = '-' + +class FlowEntryToken(Token): + id = ',' + +class AliasToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class AnchorToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class TagToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class ScalarToken(Token): + id = '' + def __init__(self, value, plain, start_mark, end_mark, style=None): + self.value = value + self.plain = plain + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + diff --git a/brightonpy/Scripts/Activate.ps1 b/brightonpy/Scripts/Activate.ps1 new file mode 100644 index 0000000..b04e26a --- /dev/null +++ b/brightonpy/Scripts/Activate.ps1 @@ -0,0 +1,51 @@ +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + if (Test-Path function:_OLD_VIRTUAL_PROMPT) { + copy-item function:_OLD_VIRTUAL_PROMPT function:prompt + remove-item function:_OLD_VIRTUAL_PROMPT + } + + if (Test-Path env:_OLD_VIRTUAL_PYTHONHOME) { + copy-item env:_OLD_VIRTUAL_PYTHONHOME env:PYTHONHOME + remove-item env:_OLD_VIRTUAL_PYTHONHOME + } + + if (Test-Path env:_OLD_VIRTUAL_PATH) { + copy-item env:_OLD_VIRTUAL_PATH env:PATH + remove-item env:_OLD_VIRTUAL_PATH + } + + if (Test-Path env:VIRTUAL_ENV) { + remove-item env:VIRTUAL_ENV + } + + if (!$NonDestructive) { + # Self destruct! + remove-item function:deactivate + } +} + +deactivate -nondestructive + +$env:VIRTUAL_ENV="F:\brightonpy.org\brightonpy" + +if (! $env:VIRTUAL_ENV_DISABLE_PROMPT) { + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT {""} + copy-item function:prompt function:_OLD_VIRTUAL_PROMPT + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green '(brightonpy) ' + _OLD_VIRTUAL_PROMPT + } +} + +# Clear PYTHONHOME +if (Test-Path env:PYTHONHOME) { + copy-item env:PYTHONHOME env:_OLD_VIRTUAL_PYTHONHOME + remove-item env:PYTHONHOME +} + +# Add the venv to the PATH +copy-item env:PATH env:_OLD_VIRTUAL_PATH +$env:PATH = "$env:VIRTUAL_ENV\Scripts;$env:PATH" diff --git a/brightonpy/Scripts/activate b/brightonpy/Scripts/activate new file mode 100644 index 0000000..3b085ed --- /dev/null +++ b/brightonpy/Scripts/activate @@ -0,0 +1,76 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="F:\brightonpy.org\brightonpy" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/Scripts:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + if [ "x(brightonpy) " != x ] ; then + PS1="(brightonpy) ${PS1:-}" + else + if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" + fi + fi + export PS1 +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r +fi diff --git a/brightonpy/Scripts/activate.bat b/brightonpy/Scripts/activate.bat new file mode 100644 index 0000000..81753c3 --- /dev/null +++ b/brightonpy/Scripts/activate.bat @@ -0,0 +1,33 @@ +@echo off + +rem This file is UTF-8 encoded, so we need to update the current code page while executing it +for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do ( + set _OLD_CODEPAGE=%%a +) +if defined _OLD_CODEPAGE ( + "%SystemRoot%\System32\chcp.com" 65001 > nul +) + +set VIRTUAL_ENV=F:\brightonpy.org\brightonpy + +if not defined PROMPT set PROMPT=$P$G + +if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT% +if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME% + +set _OLD_VIRTUAL_PROMPT=%PROMPT% +set PROMPT=(brightonpy) %PROMPT% + +if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME% +set PYTHONHOME= + +if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% +if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH% + +set PATH=%VIRTUAL_ENV%\Scripts;%PATH% + +:END +if defined _OLD_CODEPAGE ( + "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul + set _OLD_CODEPAGE= +) diff --git a/brightonpy/Scripts/deactivate.bat b/brightonpy/Scripts/deactivate.bat new file mode 100644 index 0000000..1205c61 --- /dev/null +++ b/brightonpy/Scripts/deactivate.bat @@ -0,0 +1,21 @@ +@echo off + +if defined _OLD_VIRTUAL_PROMPT ( + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" +) +set _OLD_VIRTUAL_PROMPT= + +if defined _OLD_VIRTUAL_PYTHONHOME ( + set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" + set _OLD_VIRTUAL_PYTHONHOME= +) + +if defined _OLD_VIRTUAL_PATH ( + set "PATH=%_OLD_VIRTUAL_PATH%" +) + +set _OLD_VIRTUAL_PATH= + +set VIRTUAL_ENV= + +:END diff --git a/brightonpy/Scripts/easy_install-3.7.exe b/brightonpy/Scripts/easy_install-3.7.exe new file mode 100644 index 0000000000000000000000000000000000000000..d6147a42876cf7558827a12a2c03271cfa47186f GIT binary patch literal 106367 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 literal 0 HcmV?d00001 diff --git a/brightonpy/Scripts/easy_install.exe b/brightonpy/Scripts/easy_install.exe new file mode 100644 index 0000000000000000000000000000000000000000..d6147a42876cf7558827a12a2c03271cfa47186f GIT binary patch literal 106367 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 literal 0 HcmV?d00001 diff --git a/brightonpy/Scripts/flask.exe b/brightonpy/Scripts/flask.exe new file mode 100644 index 0000000000000000000000000000000000000000..395c2e20ebdf80bb7aa7debbfbbf4171606ba5c5 GIT binary patch literal 106345 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
    T}ok-+ymkef8DXuf6u#;~#$b;dYJn9WbKvU(&a> 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 destination.html + +Run "markdown --help" to see more options. + +See markdown/__init__.py for information on using Python Markdown as a module. + +## Authors and License + +Started by [Manfred Stienstra](http://www.dwerg.net/). Continued and +maintained by [Yuri Takhteyev](http://www.freewisdom.org), [Waylan +Limberg](http://achinghead.com/) and [Artem Yunusov](http://blog.splyer.com). + +Contact: markdown@freewisdom.org + +Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) +Copyright 200? Django Software Foundation (OrderedDict implementation) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see docs/LICENSE for details). +""" + +if __name__ == '__main__': + from markdown.__main__ import run + run() diff --git a/brightonpy/Scripts/markdown_py.bat b/brightonpy/Scripts/markdown_py.bat new file mode 100644 index 0000000..7ba422d --- /dev/null +++ b/brightonpy/Scripts/markdown_py.bat @@ -0,0 +1 @@ +@"c:\users\aleks\envs\brightonpy\scripts\python.exe" "c:\users\aleks\envs\brightonpy\Scripts\markdown_py" %* \ No newline at end of file diff --git a/brightonpy/Scripts/pip.exe b/brightonpy/Scripts/pip.exe new file mode 100644 index 0000000000000000000000000000000000000000..7df88eecfaf87a60c38e08e545432af2fed07224 GIT binary patch literal 106358 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 pTutJVL`v}?{!p?o$aVgdcCvC{{mRt1v&r# literal 0 HcmV?d00001 diff --git a/brightonpy/Scripts/pip3.7.exe b/brightonpy/Scripts/pip3.7.exe new file mode 100644 index 0000000000000000000000000000000000000000..7df88eecfaf87a60c38e08e545432af2fed07224 GIT binary patch literal 106358 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 pTutJVL`v}?{!p?o$aVgdcCvC{{mRt1v&r# literal 0 HcmV?d00001 diff --git a/brightonpy/Scripts/pip3.exe b/brightonpy/Scripts/pip3.exe new file mode 100644 index 0000000000000000000000000000000000000000..7df88eecfaf87a60c38e08e545432af2fed07224 GIT binary patch literal 106358 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 pTutJVL`v}?{!p?o$aVgdcCvC{{mRt1v&r# literal 0 HcmV?d00001 diff --git a/brightonpy/Scripts/python.exe b/brightonpy/Scripts/python.exe new file mode 100644 index 0000000000000000000000000000000000000000..45552d924fc72fea5c5fcd974fd179894fe785cc GIT binary patch literal 522768 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%0AgsWbVdX_fWlN@ln;|kZ=*vJ#dwo%IJ#~}{ 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

    oJgn%<-2FW0|u`Hp>Tl-1>UI_Uu|c%g^}- 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 z z%oB!2C{0CjE_UzBQg?z6;R33h)k3m{9WW5-r*0-z{UjJu5>XmO_S2WOpiQM$Cp|vZ z9hQnI_|y>U$DY< z1%QUDni?*wq3VX%kZ1ZGP503g9n=?=x~|r+j$XYYi35*Kub`uheG}w#jXT+p2v?-p0$(LaE#nXMaH4Rr#@rqE5)?$C`-yx+5{g8D`Ui2qlLdljp zopuQIv#R9CK``c=Q!!r7f@vus{cCL>HidEU4)QhCyY{;7q#VdR6%8gD6K=ZC;g3FS zJF&j0N|>~;3B4p#S<9O5bEl~_qz2Q1HL#9gh)D@9OgiH$jfj@R2PL?jI7^;ZAhh)V zdvC1U?7ueTTow$E4?q7)e zNpY_i_tWBjR@}c4cU9caiTiir{)4zTiTed{|5@BGihHxT|0eFgi~ALES4^ZyFLCz~ z_jcm07k7Vg4;1%~;%*f8&f?xx+`EZ;u(=u;f>^Txwuz~`)=G(g&c}WvW`bF zjq$Fa(?1N`EnP7kAKwlYdT=x*KJl)0lQS+bCgMo0ztg7oJ`fX8o7>Uaf^*=?%~25t zb5A1=kU!c*?+)4*l5srygpBWgL)-tcI$EJODSKbrkgu@7kWB7J1x;(*3{Fcw+JKGE zBe_1X>Dt0@s4Vt2ZQd1Y!sDW_#5y!)f8>kpqgTxvmhAGXKKPW7h1^e zJdA@}tt527NlCeEOwctP_&oaOBs|y=&IZ@v(QprWIPfXVb+5NDcASrK!ZlhyJydHH`_dbhzVrvJd3IkO;SH&cE^OB4_Ptoq z-rhB}ypR4>Wy4EQbm4@MXr1C^SpO~n zCZA(5Zv?NS;ja_JV@E1Z>Cwm=vS`BYf+43`kwKLss8p-LjVU2GglZf3BVw{&sEov_)mL>yGM$qHJ`Dr~+vZ;^M(ti^k-Py|ZXmJOV3!v9i0E^JD>$R}uL<|X+n+eJQ<`I@8ay1m5EV}Q z(xrXd`iIhxG7T?GyWHaPdDMQvZTN9K%0A8sqt{>Zwm24@{aBm29w%wooa+nV5N|R$ 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%0Au~<|%{i5`pBFzq>38AaygjlztcQlGni;KBTq8}} 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 z%0A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⪙+PLP04^doR9WqE&tC6mHjAX`EUS2~_POm?)*@s?+e)#~ zW4bC?Iz$$z6+zs~VHeT2jnT%Era>G1uDsgT+Xm$YAp9X+R_zzT*jV>k-=KzW&Q|vsH4?Av)Dl4yy~qt z`J|Z z8Dp-uj1M>tXfS_f2c(}fApLeeAUn#s#enQ6>lOndqha%n==)`QEny{nLA79N5a)vz z)CBmUNP2g{JM8<-S_{exhZWcY^%i3&N7zm6n(&#LDeD9tpjaxbjq21)g)Y0oNFOcZ z6!|T)D9zShQtMBVLcIl5=4}PKQDozCtjfrg!wMn;f(>3~Nip<8g4AS7o5xn^#VO-2 z!5;Xk@=|>dnw)W?k3MU9amac*XmzrFa*H^p+0{=tNK$7FF1J)Dwl9aW!a;~F#lh3T z&zkXr<_8Neao1c~H0z%=SGs3+2XQQ6#Tbi4KUH$u`RvmhMtHdIy3jAzkBlkyTOM&H z*e@6#%X!LzV9nC-UTjLEO9%UER$Ti5f3Evk&?+j2uw%i7P>Y9dF!wpz$Q4A|2z3=p zF1XflsxG|bVtegj`CSu?<%0;peq>;pGX)lUY9G{q514l#(+cgU)9BLsvRCV2c-Tdb+Pg|YNm z>-_NxQe&8p!FW+@WX%ju(X77m=xInXEjVh|npLG-`395ZXvk&pt96e)yf6e!bX73ZIX^-8ho3)nu(8mJ? zmVszHI9zuvE8HXHjewNo{Nsug@qi@eIz{BSQnG`D3WN~>+wl0y%g_kaw146=W(V?& z!1|!|JWEfN;SqJE^|NyH;(7A1&Ley+H$0e{ezIoovi7HAT@fRpG$$5Ty+nM7jqfs! zp1K}En#b;;Z^SNQr!&6IsE9C!UYcyojPebvT8;DV*Qv&!n0zr~b0md^ zetN8IY`BM%*=SnL-9RDF^=3o!M&}v%r&&4A(~YN^JzDY&v;?hMujEDl7U&YWd?H>^ zBBW2XJvUxxBwAtFJqw;f*6WLIp9 zMmdMqJt$fVeQtIUC^DklG%PN3vHskrk`G6BUXYdG$@U(7Ygwc+B-eh%Po8x+wsgIv z=1y@fb8$&C8$3sp;6PZ@3BtfzZ#zNwwt0crG!XO>*IcJZqdAe+t zC+ot~Cq_KurkQSErC)B4(JQ=GJ{UFTodX}~nc{*Dv3jOnY^+38XMU%v$RPs%LK#z&v2FL3qh599z%! zfz6%F6S=0ULh35hLW+9$U?B}HS;$TlMX5TIR(n z$Ob{Vb0PX1_ZVU)(4IL({Y$@$snXsIII$L*_3Fldb14P@u^{UW6kM4{0u$-UWW#Q+ zqcE?t50ym#ja=5#Mu#N=OX+`;CmV-0fw;W9^Ckqv-iP}u;@iic{OV$Dy(6D-Xrp|G z!4Q!vh>i66N&GFl{tT3F*9{mGFY=f*oyN_>z<+SgX31;ZA~!=Ai;uMCyYljl=+6;+ zlJ`%x|E1ewFJ6nBP{87uUuz5sL9OU^8AohU_3qAO{UTPL$SQc?0fw!X8#VW zzmz^S&(h_Kbnznc%lp%{yifMWyhR=9cPZb;Nu+!qB(4I>uC|zJ?OKbS_MRGzPe~pZ zHD%j(n(h#IC}$Uu_S5w|J=&>v^fEIOY8@Rv3XlA{#Tg20jK#}N84WXpaGp&vtf^@HMGDL#b$4C&RM zdyU_3PE@dZYkCY8c1mA2n$d(udajQMI*|lfiwO0(BC=7V(~YjJzYj`bQVSwkK4gurYcLP0lTB~F&nn7~ZvHB= z7vvbUR;pHL#$NdCbzk3U%Qjd2*fva<4I>VcJ(t(=y9qC2Z<7SD2 z#kGZfe#Buq&O`AQf%mZy$fzDmb-TAHb9*@%+cAwK{c766n59NQI zC|lRF*OT3I%2z$TC~VXA!DBRyBTMy7?ufg(#)yxUmzo*<$wt5-YTCG|urYk1Z&M$S7&2TR#Mmw{ zxJbd*jzJ1WAJg=0$`IYkJ`#_+E@t55C7TM};RAzKT?MpZG>JV$XXz^sc=`>eM!au> z)_5`ir$n688InBIHH<`~@RC}%8I@Ud)?l~M{5$zxeTLEWb9t}^2ICXl$}>eIo<4~< zX};=NrC}r3aB-=6RUBdC#f3?Z+^ps<6$}tVGmz-rnE-n$g~&cw*RP3vt(0ql`tepsGX2r}Yf zQKrn$B2T3~;vMRDM;36Gp8R=0{`^$_{D?pE)qMGzrTJYLf43fgw_1smyVdyL2)>>1 z*M=z>e+D*p{Ldpx^-aZ*e$_V>8S$WgE7BBD>`=gnqFfSq@74?nToZIi;CM>u;X6tm zY!ay7G@|I6)4&s8eMdAnI z66S+i@reMu-fS2J(V_}E&mFYRtWfL3vB7HdiPsg=X|2q*r;bMKth9^$aNEW1w~ILi zZlJ(?n?Gn{K1A*no`aEAtvH-6Y`KPQ0sq9JYzH8<6O|juWXle?w+%_jHahU1ifjkg ze7wzmzuBPs?Q~!v1-91#w{$?pAgynklB>L}4_VKYFOU_)O2|!$aT77Bo9%#(JNhcT zLiNQxCuH4L-lj3UQ4|CVdBhwV9;nxuF7fi(A04#v2(S%f&<1nU(w*g) z1+3><@bMP*XClE0PURN+D&%nMH6E}Aza)pN*lYRO>u!9XX5;oIhEG>|9W|RTqrY|Z zhr8RK!d>c5Kk1KGq=|+xo;}eYKL?3+p+9N+TCT1+KBXOfV7Fk?nt3@oXO!&A0xi64 z2%Pu@yE%_-xy{GzTaW1j@LwQ zD#e%h8J?^WWygu;jpG}}tq)5h(VHssjOGV;RF^`YW^{TPDv@c_pw5wZYhsxS>W48^ zz>y!ardHsycAgr$kwX=_k;oy^K%_LM@@d2732I}qrTL{Jhe*wn+I_~ zuwG!hT$QKpp(h;ZFA*}FR4&g%a;9|R82%8*?L0F!6Mv`3Tj`$7N8+}7b_-8AjT^T{ zNWj0&Up=kZxaBUE3%^x2O&q5J;s9Ist}^fpMdkZ0`@X=lla1@vyC)m7+G+wRBRZMv zAtKlMt;-028hFshT#65FG%Yz$glnzo5u02ne$wrs!l~{6?0w$86baPKDl+C3^W?Ke z7R$ZqsQ=Bv3DEv{u4tMkGRJ#hd33z^QGVFyzKEK?6{X$%YJ+TL&BPz`XbO!Bcx9=CPvsmCUbya_S^V=dvSOLq7 z2JS9Ob;bf#bKC4rU+Q^(&DHb54W>2z=>!UyRBPZG-;<1J;5<$AFa`(P#elto8r`v!)yYJ zQVu`e$HZCGTF10fu784;x@$NLEO=qfm32%EWOUrrAv0thvzIVre3mdtByI^5l{_^% zyEyOq6B=h;lNY&O&?k5WM^)TS0}_MQE4);KWqqbpBTk`~%~S8z>#2vg>u_0f%fJvy z*>0fAh}#5rk%0a$sQpj|Ld4Iiuk^vClDjWJw2}88ehcN8DmuuP$GzjnX~Ug!F!rkQ zPSzEPduCd$_phRe*ck#9=&xmk4_WV-){_tLB+B#H_?EzlkR)p~`g@id>BRIp>uuCh z^(^iiQEkX7qt$q07x%t^U%}@tyWVyF_AwZ1dyq4N(Qe}&f2ZSj+*Y{!wi(&M^UWx>f?O* zBp0LHBDaA0t+=ps7Pn6A-Cy^Rn#-hMaeGJ>xA{4XTbmK>A}ed@{9trhsZW-!pOfIz zOV`~z*}!b12kH+4Xg08sg^Zz}#OCQnbt24kt7XbxK1J=H{=horw}yF=C#XI;DO5fs zXOW86VLy;Xs!{FLS1(eR`7jelsiFvRfA&fcu~GSn!=aa|tI8)uEPpG6M*4g;=}j@_ zwN(f1F>bC->C;f<$kL}2@-EZgmV9K{5Z0v<7iubH_WN1ME5s7^aTQ5(o|E~ST>-w6UIGSl z&PXHWb4CewoFFkB3FQukB{Ai`eA?tZRl3<0N87zqK3-#kSi1Wm3xRiX7QZM4*6j?uwTfRq{ z-+ID!VMOs=&v`&Iep`7X$PHL8s|Bm1StE+;tZ8m$%=_%k8rh0s+Zx;w zD*TuoUJ*e}>KY~&sRE8s1Ph-_x`wu)x)Ei=ffCevph~>MhlVr7FId*HM$i~J2R(u} z63Ri7Kq{mv1_^{|5usU`Cdwa)uLM~N0=+V(RrZ-lAxxX~s)6k9(&&w$C7NMu#V-{6LPimO@yz5jzi_9i<|8J`JyfODSif%M zNn$AiX+4A_WH&|3C{vB5C#gd9y+A;GbiQQMlr&B#>FO$*k`hABLP@7PlytH~Nd#D- z!aAFYqC_INKV)R{e(klOezUV;JD_|E!Z8W1>JZP2H1WtdA-7Co9{yam zaTpw@t3ps|1sQeNBDBMNNIfE`8dT=sETQ2uI^^6(a!G_lj=Kbkq*L_Uk*sAv!Z~=vF`a z+txVj&f?ImBE2(c9Ezy4X%sp!2Z@iRk!VV0jYRY@4ifFOEs*F2i3e^Yv!v|~5>L00 z*av9b+}uw-&d$c%K+dNT0ciJSWQe)ZiUproU{rsHx;HO!%ADb{i4K3edcTM#I=j>$!1$cm^|FBuAKNKqv$%6hxeTs;fIE7RoI>c|CRmDM7#B0Cgs~JOy z(|96)QALtVt}%O3?~Ce3uOX#~<8kz+VxoLGFzapCwPn$p%JR5cq865l_CvN@8Vgz# z%(m;`Ob?Blm(U|?M0yt{Qj(3I$Ti@m@Y?THpH+7KB-0vI8J&)#zqcxoI<2!RLk)Ou z%I1rc)^#jvUgIg7OS3y-A(G9JutLoo#J5_@NUKSaMO#*?ptztQ&7?{mA4>RyGt#+p zcUN|9{PLXQt#%X0c5q3`sup(53qb77HC!PxMBHIAnB$zuMS}jt2Ux z_Y3#i)Thj7{u1bH+BuA;P{T+zN~c$+zDmh47?99q7LL!^FI7AHrRv`MC96YJ4S%49 zYP@>@$Y}nRU2z%An0FeCG_bja?8J#tjbq0Pk!i~NnH0O2X(`*ZoiumB7i*J#&V|P> zrx02js>5YoDMZr5i6lvH%`A=jNRo~mweyZ-Y92rtP0hcw&xeR^=-5}GW-&t}RSM%` zZm(1G$XJc3Dgq|i4M;cwhc>U(w0YH>*<~`huSfYYs>^KdEqg@1hU6(=%%SaP*fxA<3S-*(5f-SNc2LkT|_@suj$uSfmP zEu)ckAjeFZ~NR!%^jIN9 z4r5~$KbEB9os@FJI9P@s)N10Fdzko9*GzqL-aluchs@=j4kSTiL>Ut>nPtw9f@ZV$bmmG zjXjV2KFl6Xet-G4{`KanH1&BTF4p6^G878_!))7D=rB>q@*?Z4nm0xib5q#suzOZ> zc;iq^nTal-O?PG5STpv7HgUlhOlNJs#4AifUd)g+P3w1IGB2o=BVqNYOC7PPW$GmT zFtI`n(Y1~(Gp%zfgdx?d%hpM&-Fop4RnMLnK4^K9HoU>5^3>;}1qySj8M{pb>02nf zO|2UV5r(~g3C0(?Kdq#Pszh(M8{==sK zEOglP2l)Sxx+5r~P_Os7rfSx2Q_zU%e%b@SSy!4JZ+sp`RS4!8Z<`$Id6*(8Q>;5Z)VGcDz;}%L}xcrJMvSBfTg*WT&V5$4eaN^#FEDlMn_eIO{7RegmTPT}gpOs(J9=XUDy@B;$g3t1m z`G&MXnz9_!Rs^ek6_EkU z7K80_dK+qUPCv6EtWJs{%Hp;U(FZB+$7CP%G`qiK+GZW!91vArJ{yUgYEAWnhj^VgM}|y!}7KI zdT+isNzobksDTersV$w0S^T})o?Vr~Cica`qG0}*fakV-aXw<4~R=bwN)FP*r zKkzFNiS1_12LJv=A@P91H_^9HaLT0;#BouHe)9OD`YrjBs04nccg?~b8tGGr^?j<$ z*9uwafxJ9XNcYt=W?yuAW!@~ex{Ak?DfkGxz{TwHEQ~k6$6)V{1DG?rewE6{+vh&{ zo4ZEaJLGQK}w6{^1h{5hQ{RL}w z_#iVr>;N-=Un|3B577}k+skymkGMMcb6vlm4;xtFneH^ju2ZLhpyaoM*1o>zmlBwx z!CyWjWEFXE8PJb~OVdRb36ZM{G(tr#>U~ZJl>jOqQDUvyR|~8IcT4u@{t+=GW&>>_X~L5|X$br3=0GGV9cOQBYNh z3eOSry=gf+?Z4cqj-en;KJ1l_YxDa9JX#Z{t9$r$%Z}$5xo(`-0^J2#RUJ> z`(NR0oV)+srUjnE^=ZG}ZTd3XPQBV6RxGZ86E_V_Ri8F%hALbI_N}g<6+i=6UmT1+ z#|rj0_5KT)WW>N?>)8IyAIvh%hUKC7u*P8fy9H{c&apn&P*jflpL$SU#e#-VjZ=n|CC*KvAth4b2AK*)(qS?t=_q7VoUUUi3 zw+nHNL2x)o0ujhnW&2AE$-#stipbFyTTJnYh{92p+*gDKPgdyJrpiJZ5LpG0d{x4D z$KH>P0sCqE+51N8d=Ge2XE5`u^VqGvuD7ab0#5G{t)-&$(pKL|znK38&!JT~Otb#^a3(w9F=MFFD zV{U+8AI1GQ9PtEvQ`ReN5OEf8c zvB^Op)DH3UP?dD5i~l3Z9X`UB69l4iLf0`R zY*+;VNI47{_ERt7tL0p8lkTm}W3(KWzIL+SsBje?EBdk5jfw&N^iz*N=stqrI`67<5h1BL-d#S>~au-Zyb(3`fHEzsg z6*o&+vAFDooj0;EitPuXT8A=eXFTn28Xo%1i8)1VsMB?Nd#~6~1f&Ye@+|YE1jzMT zX%*O-@2njn6eA?ms^00n=@Whv?w=}IQ3AfQRJv-F)h|&k4h|WbY&`u~_&MgZ`{}6O zqu%P;ixkGfa&uhgBzkbi2nmHH;i;^WPsJ&#ri*LohAstK0-g+gS-f681X`5+o%O`s zDu!7{2#`78W!}_X|6)^xf;kH1%4K$^%NWK7?8}e(U?sE_FFDOl8X`%rOA@QHWFNT9 zHJA3FiV>b={Al*2Hh(0$G~Ji|_ogp;IRIzESBAFD>CrCYXx%e?go+(}EE>E8K4cJ6 zCBGmU`=SnKqb%C%Q-!R(avR%*PXC_Y)74E(=r$J$FN~ukc>R zvm$(FH_sJ3Z)5_j*WJUzrYjbBB^Fq(f^e|tOzhkGxOzQE;bv6oq{{TTa@0J@D6?4! zS6pUVMMu{2&6@uVf7{=4Z(5ok8I&q8X+~=_JW+>DL$;H~pE}L9n)m z<)fylRnW07KDHns`ZuBj4my{$VX?58p)35vu1P46E`-iYe&P*YpucpPRlHiRb>nj4 z(|^~i=e*BqTjZsZX!r0TouO*iV)8`xHrK8U4(%e2-NU?UT&N>IL~_@2DKSe|Zr7ck zn97@$%j&HC>nu0PwyN1GmEVex9-Em@gyfRj`|I1^w%W(WJ zj@K^3XcN&+>H6!A*?;HO|Jn8D>yFc&rkAg~4(>7>{};`zEoEyoH)`AsS|VJnW?g~6 zv6*O2Dnyd#3Nr$Bn&)h*{66XOtyiYY7w=B_wbPyU-<*^#zlx+?ZvT#S`CF!>%ip#; z<;SJVe>OQ?KD0aK_eqzZby>Q6@wUp_dlVw_=uHa0y>=;o6;VedF=sEcy?l}MZe}O> z2JB+KU+-eOe-_ba7vOs}C*PLwT^->ad-BVX5_KhexaE1A#K}`(JkFS9$dX^Y=n453By0Ee~pmQx{)ckwJ@I-+@98_$(IZ&tV4Fx1=e-L{Si+Z&F* zBl9|Nyw65q55loxx8V3r7LG}K7LNSgf@3YaI0qkp>Ay$uu}A_DMxWcoaT$|^(9 z#~*eJj*dYYe5~rXNAdAJVn^oUV=G;zXhBfma&ig#E3V}%&SHFyd|Q1x3)HDLP_kNk zMK@`RZgQ+>k|t6)hSd%NP@rxl_$Pl-krECWaP;Gia4~P;zJHdTDh7oQ)a#ytJmS4P zWL4-e0QywsYKco-udUp&#hIcFjb_bP*K;5G$b2Q&LlK52JdFK%>_(QHWrgx?G+)WH zic#V6yu+zKF@bl?PpXyz%ltJd$rV{?M!!l$R;lljFIsiD(TuV$rN;3Vt4JKp^Om*~ z;@fDHU}((6N2q#I`P9gyZ+qfQlRojTo9Q+!7`GfRa}PCH*xv1WScJ z>wVQ}XpB7UV8m8RV;I%Jx-&?bo_?7 zZ=1U@)M`{YQSl)i2|8b@HsXTrO!1yR8c~U%fFSgM`fgMBP1Cw-tZei!D0e=4VyS$p;AWX!t0=sN|G{{9y90YYysjtCLU9K`?|V1@^9Isr#J zuSu#Iie1(sh?`cT92l&6h-*VX#q1dk%Qj(uG{ljb!x|r^d z{kn?;_4v&cZb0+8DID}|TAm+1T*l80@|&9=J$r{&~Y4*H)SONQ_P8P8wr>Uf^YsTOBE$80g4x8#oJ(TwLYGM+~! ze<0&|xs2!jjAtL3J1S|U@g2UL_wteH5iJH^yEvk2zTCwTy-$xQ%}kp0Rq{vN@sK$e zujl6ja{g`3`}Nwp&b9Wq^q7uCvm#L((zjL+^xB@EW8weK{5&5=GenYv96po|X69#` zsAcs0d}mzmG5y^EGNxbT&d;l4e!i>crx>p?^D`PZsfN>XOw(vQWIyW#-($KGtC_8j+Ozdhd$vx>%+^O`w(@zs%$L}`GHsMG zhv&@PeQp=$ZmQSZ{dVuUdu(Rz9u5|1PvG!Z!2-51cVz@*?!Jp#J#$w^DC6X}!?}A^ zuem$kUWa>+b8^T|$9W2@+ZpE{kY*>PrgWhP(EO#V7!{cb!n z*39c(W4(iUo$5WWzrDr0J~lJ2PXd>_INCkjAhS!Ootf8H^`6(;3EJg<2?uGHksEu;JX9I_8#w-_x+zx|`-U)p221HM~(X791=Q}RDOmb=Y&Kff(Ap8pek_fGJ&iz9merd=G- z%=}FAUAaM~l1-8X6B{NL?NddgaH5C;dh5c@ChaY$o+hLL(n6uVWr>uj*I~7`V4mDd zy{KRGUSi$ndU$0s#pxQoC(*l*p*Sw=QcL@9vRj%Qs}cFWOij&gsUh3aRZdHKD@Sws z%u95U8<8?E(q~~F8w(`PIe8*3uTf$L%zlG!WWM2iBF|C|bDL@S@t4@@-S&0J_}hWG zGIJq41%i}f064KNdEwAaX8hQ_&FVi$)scSYoG%5I>-(8Czmp?Ov=>CKb4}*V&z3%t zX*jWgJ8&MH3+E+-1OU|be-`Wls5RRF^<8S)7O1O9-#)0e9ltWVh^s;K@+142QD2!G zud1>Tm(6Vs#R?K~VB2iaCbj71hU*8b$*_HA6}hG-UvT_`=pwPAv2`l)M#kZpHq4CQ z-a?AMHRv+$^7j^wFgB`@8aUyMMpHF?9$aLcowLlE{5Vp4G?iTF7gB~5&A7=-<=U{*I5(joO+rrtj@bzK8 zeM`Lm3-;^4{^_S0_Um%-K0X)k#?!&t4B|^{#KS4KhxtRl>p+?PB_-B z9nj5I@P9j7_o;gr{!1=(;9vPw21jc*?GS#4(0ygll(`v-iuK3eN)!LrO4}YS5^&s} zM{~Cv&qK1XehXNk#i_aDxm)w-l-zmr5k4hE*Lp`i1Cw_s=6RgDvZKj~;hbr--8EqQ zuwR<3`ATZubFg1_p#ytfwuOG*2=@6~;{7*YWU%tszcuXF=Hh)f=TR@rzjl!WeQmal zF|@H=%x`}lWpKY0{O`bVol*VplRXRne(6>0=4=}lZR`O4%$zZvN>3wryfcr!M%wn~ zQOJ09JN#%JPU{Xn-uhVMV-NA8-=aj+^C+BcVJ0nPv0)m|=1!#Dhy8$T%}4A}*bhG6 zfqfwi)WJ?WZf{>7_N~_Qi?cOfPR*Mr1hr75~r$QnZMPy+22x-VCU3ZteXc< zc2Io}&SVVd_j8xU-C{>4<+7to&vlS-T(*T%Xd#P?R(H#GWV&5|`!#r{19vx$qI(YR z*U>xc=^x3qFpCzp4R>a&T4nTFxEU&EOmotDk4skG=Ejum$O)TZe@+KeALtJ5Avs~i zIZg-f%(ieZEo3`rJe|9|?Lbc09_*)OYaX#jVLv@hRO?}{4tCyt|C_+R6`!4zt@&1J zhOqXSobXthv<}F&am0?G-~RfRp_{GXUjpNHFta?lXW{>Ff%e|{wuPV2!q6JaTeH`OeUD9}Dd`1lExgsi&tGt3-yZZk zqnWK>zbRX96ZP)NCEyV(V4Az^mu;hL2e4=O3*Pe1b~QVHzDC;iaDf&7_4VP9Ivjw11;vPvKL>TbjSIBeU2{h4?6B^0eX z{nX3+*<-L@m0r1CgKs+c>Hf#|Vb9DTD>Hqv^XF@%Z4Vb*@~P*~R_dPPvv5`cC%D*U zF%H{YZ?$P!=^!6eLC~SW7vaDTCf5Bu7Zc_d6KJ<#zb;$z3~JtUuwOsgfqhW6g#*43 z>|3qjPs55GthD`2!@leMNATNQZQ2X-YK#N@xNI92(nfan_s0Cr@V*u7pTjU6*o*cs z?8l~8uDi2sJn;7RVb9DT;&^P$fA&n;&hWF>EP!d-FuQQf6pO2&7E(^ws12o zY;R<9!_ZNTNv;8hlbB}r1HtwN~Z`$vj^>M4YY-HOn zwfne-_~YMv&d5Fr+jX$`)L*vW!|ltL+vV-!vNc~w&3leNP8i|9{t-;kf&H^Lz6tDG z(bnDBnjfHMVBcf>vD5EBKQ!CMupL0ZGn&~7_BUXP4p#p0`ksZoIK2{1%eK)-8{c$Z z?CQGF8yEXH#e!uY8y?^0t+lsnVBHQTUf-}aCU&H~#jf64y3`RgFv`mZ^{X?SF}x<* z!gN~5;sJ>A7UX|y3@UKkO}5yd?G*NsY|V%4QP@kp4(yM^x*hC1v;LdFzSXLAezxXI zshQam&fOL7aCav7?JZsQ!hCCb-TDs<*n$45*LDQ`j%j8q*ze8O`y1-rld!*3>tMb* z+eYmUVb9D9$jOU~aJGe`XdyeJdhZ&(20!Y6fjY3SdUa32zHFES`**V~TtN$8ANH-*^uF1eJvQvS z&W{AYy=PP}%vYt?vR}fa9sE4<%J!k(8O>}3`tngib?tv4?AbE?7~FLqzntb)W=Gw4egrUPjoAl)4*%-

    ~Fy`9qg!=z6tDGQDJko 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 z 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�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 PPnJov+I-#|{Q>?5i>43z literal 0 HcmV?d00001 diff --git a/brightonpy/Scripts/waitress-serve.exe b/brightonpy/Scripts/waitress-serve.exe new file mode 100644 index 0000000000000000000000000000000000000000..c32f502f7075cf099c09540bd95b5c9d123a8799 GIT binary patch literal 106349 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 literal 0 HcmV?d00001 diff --git a/brightonpy/pyvenv.cfg b/brightonpy/pyvenv.cfg new file mode 100644 index 0000000..f980e7a --- /dev/null +++ b/brightonpy/pyvenv.cfg @@ -0,0 +1,3 @@ +home = C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64 +include-system-site-packages = false +version = 3.7.8 diff --git a/requirements.txt b/requirements.txt index 94684a4..ccc8754 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ Flask==0.12.2 Markdown==2.6.8 PyYAML==3.12 -waitress==1.0.2 \ No newline at end of file +waitress==1.0.2 +werkzeug < 1 \ No newline at end of file From fb2cd9a66b8c1a656d88b1ec9a201dea85bcd0c2 Mon Sep 17 00:00:00 2001 From: Aleks Date: Tue, 22 Sep 2020 18:10:19 +0300 Subject: [PATCH 3/6] =?UTF-8?q?=D0=9F=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/brightonpy.org/v16/.suo | Bin 23040 -> 31232 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.vs/brightonpy.org/v16/.suo b/.vs/brightonpy.org/v16/.suo index c1f5e760f49a3002784e5d56eb910b82f6732d01..591b8ddca5c6bac4d3649b9a88cfc0028cac6448 100644 GIT binary patch delta 1242 zcmcIj&1(};5Z~EG8`8J!rroq@8?`oRNMj0{7K;5)EJZAWW)q9x!74>i!H=SQu))Kg zJb6fW{(+K1(Od2F4=6MjKTy0#@gREj)I)?8p><}nsX;}0ap1?k_nVowznM4Bc?nJx zN+zgF+1@~tq9`&OS_N0V(`tVEa&^7*5i&%sAIG9vgeUl2&56TABnW$C_@N_#cGI(| zHX?S3U}uN#tB!qv`Hw39ZRI7Z)b!UUm<@FK5!vX*~* zJ*cearU_fqdD9dJXP)n*LbAPDOfaK5s{U4WP3lShF3Pk}0_0a;%V%UtxYBC0>XGU;C&7z&LL=Q!iP)2rvqWB>&2#9wQ`r`6}HR%_xtx9ZRp zN@&5Iftdq{HVg7|vLDul9njy6emXmE6>`bPZ@n62X=Lk97E2=w2W!Z`&h}0*=uY^7 z4>VS28m ijBz$u`EsBY0#)QiX1Z@Y6TbLVcr*+2opmoMPC@klbLNNgMfOdoKv;y{ml|i45 zsWqw}M*o^>+k-PmwO(Lr%Pu7V=54~U4Wx{59hSvbc7P&fY{9Ge7R(O4`bi&!z4471<$dqpeHBqG$0Gu|`s9iNh=|7h+ zOpi*a%PQI^ta;NSi2~Yd(;1UuB*eaS&9UhNC)i5&99!m-hSpOh!ZnCtIe*#N7+-Cj z0_j?a8K7j*mu-X(dXb6t~P?{`zZ1YHiVD z;F!lOAi50iz6%bxR}GGutg<6s#V}<`pp-{JnawK+B|kEiy_`A8Dw3a-28P-FRG<6R z(EFno)bX^Oe>s0>-{Xr$aX3d7l>!k4v}ui1k`eZ%f19z8Tx&(xLh=-P=&zZjKV<$F zHl>3>Jy#IVLzDRPa2(;(dJocmnjCC2mSOACkmC+4MX-M=y!v&c92 Date: Tue, 22 Sep 2020 18:13:41 +0300 Subject: [PATCH 4/6] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .vs/slnx.sqlite | Bin 1560576 -> 1560576 bytes 2 files changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3eafbe6..129e0a7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.swp *.pyc +.vs env/ settings.json diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite index 2aa0dbcab900dcaa563535709f74a57eb956a50d..853c5135ab4469dd63daed3aab1f00189c7bb743 100644 GIT binary patch delta 88 zcmV~$$q|A;006;SPVoZ4R2kGP}CppVSuF}gOHyLG;yFBE%^2*x|G_)Pl delta 88 zcmV~$$rXYy06@VPR&fKt<)GbINPa1J_&G}lX@WXviJ3XaImiDyq~-Gs>4yX1B|cj55hx9`amy Date: Tue, 22 Sep 2020 18:34:03 +0300 Subject: [PATCH 5/6] =?UTF-8?q?=D0=B8=D0=B3=D0=BD=D0=BE=D1=80=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20.vs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/slnx.sqlite | Bin 1560576 -> 1560576 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite index 853c5135ab4469dd63daed3aab1f00189c7bb743..9d080a4e9773a9c76b3101acc4920e59698706ee 100644 GIT binary patch delta 36820 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 a|ELl`g#fbLy66l;Ffd~8&tLn|iT@9QX(#&t delta 35485 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 Date: Wed, 23 Sep 2020 09:57:42 +0300 Subject: [PATCH 6/6] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20.vs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/VSWorkspaceState.json | 5 ++--- .vs/brightonpy.org/v16/.suo | Bin 31232 -> 32256 bytes .vs/slnx.sqlite | Bin 1560576 -> 1560576 bytes 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json index 9e83989..5ddea5d 100644 --- a/.vs/VSWorkspaceState.json +++ b/.vs/VSWorkspaceState.json @@ -1,8 +1,7 @@ { "ExpandedNodes": [ - "", - "\\templates" + "" ], - "SelectedNode": "\\brighton.py", + "SelectedNode": "\\.gitignore", "PreviewInSolutionExplorer": false } \ No newline at end of file diff --git a/.vs/brightonpy.org/v16/.suo b/.vs/brightonpy.org/v16/.suo index 591b8ddca5c6bac4d3649b9a88cfc0028cac6448..4ab0dee9d1dcdaf82866b295a484034e6abd72ca 100644 GIT binary patch delta 3505 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 diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite index 9d080a4e9773a9c76b3101acc4920e59698706ee..5dd17d978484660ea290e09c9be6065a453face5 100644 GIT binary patch delta 88 zcmV~$$q|A;006;SPVoZ4R2kGP}CppVSuF}gOHyLG;yFBE%^2*x|H?bYv delta 88 zcmV~$$rXYy06@VPR&fKt<)GbINPa1J_@`W?gET=Mw8YGu