From f6a269a9f2d6a2895c4cbd0b1454ff090aa2e0ee Mon Sep 17 00:00:00 2001 From: Michael James Date: Mon, 30 Oct 2017 16:18:55 -0400 Subject: [PATCH] python package builds moved from awips2-builds to awips2-rpm --- pythonPackages/.project | 17 - pythonPackages/.pydevproject | 7 - .../org.eclipse.core.resources.prefs | 3 - pythonPackages/README | 6 - pythonPackages/VERSIONS | 23 - pythonPackages/Werkzeug-0.12.1/AUTHORS | 60 - pythonPackages/Werkzeug-0.12.1/CHANGES | 1172 ------- pythonPackages/Werkzeug-0.12.1/LICENSE | 29 - pythonPackages/Werkzeug-0.12.1/MANIFEST.in | 10 - pythonPackages/Werkzeug-0.12.1/Makefile | 35 - pythonPackages/Werkzeug-0.12.1/PKG-INFO | 78 - pythonPackages/Werkzeug-0.12.1/README.rst | 40 - .../Werkzeug.egg-info/PKG-INFO | 78 - .../Werkzeug.egg-info/SOURCES.txt | 292 -- .../Werkzeug.egg-info/dependency_links.txt | 1 - .../Werkzeug.egg-info/not-zip-safe | 1 - .../Werkzeug.egg-info/requires.txt | 6 - .../Werkzeug.egg-info/top_level.txt | 1 - .../Werkzeug-0.12.1/artwork/logo.png | Bin 35069 -> 0 bytes .../Werkzeug-0.12.1/artwork/logo.svg | 88 - pythonPackages/Werkzeug-0.12.1/docs/Makefile | 118 - .../docs/_static/background.png | Bin 73096 -> 0 bytes .../docs/_static/codebackground.png | Bin 8307 -> 0 bytes .../Werkzeug-0.12.1/docs/_static/contents.png | Bin 5527 -> 0 bytes .../docs/_static/debug-screenshot.png | Bin 209112 -> 0 bytes .../Werkzeug-0.12.1/docs/_static/favicon.ico | Bin 1150 -> 0 bytes .../Werkzeug-0.12.1/docs/_static/header.png | Bin 86871 -> 0 bytes .../docs/_static/navigation.png | Bin 218 -> 0 bytes .../docs/_static/navigation_active.png | Bin 231 -> 0 bytes .../Werkzeug-0.12.1/docs/_static/shortly.png | Bin 67757 -> 0 bytes .../docs/_static/shorty-screenshot.png | Bin 85078 -> 0 bytes .../Werkzeug-0.12.1/docs/_static/style.css | 423 --- .../Werkzeug-0.12.1/docs/_static/werkzeug.js | 10 - .../Werkzeug-0.12.1/docs/_static/werkzeug.png | Bin 19109 -> 0 bytes .../docs/_templates/sidebarintro.html | 19 - .../docs/_templates/sidebarlogo.html | 3 - .../Werkzeug-0.12.1/docs/changes.rst | 109 - pythonPackages/Werkzeug-0.12.1/docs/conf.py | 214 -- .../Werkzeug-0.12.1/docs/contents.rst.inc | 85 - .../Werkzeug-0.12.1/docs/contrib/atom.rst | 10 - .../Werkzeug-0.12.1/docs/contrib/cache.rst | 36 - .../Werkzeug-0.12.1/docs/contrib/fixers.rst | 16 - .../Werkzeug-0.12.1/docs/contrib/index.rst | 19 - .../Werkzeug-0.12.1/docs/contrib/iterio.rst | 8 - .../Werkzeug-0.12.1/docs/contrib/lint.rst | 9 - .../Werkzeug-0.12.1/docs/contrib/profiler.rst | 11 - .../docs/contrib/securecookie.rst | 55 - .../Werkzeug-0.12.1/docs/contrib/sessions.rst | 50 - .../Werkzeug-0.12.1/docs/contrib/wrappers.rst | 23 - .../Werkzeug-0.12.1/docs/datastructures.rst | 137 - pythonPackages/Werkzeug-0.12.1/docs/debug.rst | 89 - .../Werkzeug-0.12.1/docs/deployment/cgi.rst | 44 - .../docs/deployment/fastcgi.rst | 142 - .../Werkzeug-0.12.1/docs/deployment/index.rst | 16 - .../docs/deployment/mod_wsgi.rst | 82 - .../docs/deployment/proxying.rst | 54 - .../Werkzeug-0.12.1/docs/exceptions.rst | 147 - .../Werkzeug-0.12.1/docs/filesystem.rst | 11 - pythonPackages/Werkzeug-0.12.1/docs/http.rst | 156 - pythonPackages/Werkzeug-0.12.1/docs/index.rst | 7 - .../Werkzeug-0.12.1/docs/installation.rst | 133 - .../Werkzeug-0.12.1/docs/latexindex.rst | 6 - .../Werkzeug-0.12.1/docs/levels.rst | 70 - pythonPackages/Werkzeug-0.12.1/docs/local.rst | 94 - pythonPackages/Werkzeug-0.12.1/docs/logo.pdf | Bin 5395 -> 0 bytes pythonPackages/Werkzeug-0.12.1/docs/make.bat | 95 - .../Werkzeug-0.12.1/docs/makearchive.py | 7 - .../Werkzeug-0.12.1/docs/middlewares.rst | 19 - .../Werkzeug-0.12.1/docs/python3.rst | 73 - .../Werkzeug-0.12.1/docs/quickstart.rst | 323 -- .../Werkzeug-0.12.1/docs/request_data.rst | 116 - .../Werkzeug-0.12.1/docs/routing.rst | 205 -- .../Werkzeug-0.12.1/docs/serving.rst | 227 -- pythonPackages/Werkzeug-0.12.1/docs/terms.rst | 44 - pythonPackages/Werkzeug-0.12.1/docs/test.rst | 172 -- .../Werkzeug-0.12.1/docs/transition.rst | 73 - .../Werkzeug-0.12.1/docs/tutorial.rst | 475 --- .../Werkzeug-0.12.1/docs/unicode.rst | 158 - pythonPackages/Werkzeug-0.12.1/docs/urls.rst | 6 - pythonPackages/Werkzeug-0.12.1/docs/utils.rst | 80 - .../Werkzeug-0.12.1/docs/werkzeugext.py | 15 - .../Werkzeug-0.12.1/docs/werkzeugstyle.sty | 119 - .../Werkzeug-0.12.1/docs/wrappers.rst | 178 -- pythonPackages/Werkzeug-0.12.1/docs/wsgi.rst | 66 - .../Werkzeug-0.12.1/examples/README | 103 - .../Werkzeug-0.12.1/examples/contrib/README | 1 - .../examples/contrib/securecookie.py | 50 - .../examples/contrib/sessions.py | 43 - .../Werkzeug-0.12.1/examples/cookieauth.py | 108 - .../examples/coolmagic/__init__.py | 11 - .../examples/coolmagic/application.py | 78 - .../examples/coolmagic/helpers.py | 18 - .../examples/coolmagic/public/style.css | 10 - .../examples/coolmagic/templates/layout.html | 13 - .../coolmagic/templates/static/about.html | 10 - .../coolmagic/templates/static/index.html | 13 - .../coolmagic/templates/static/not_found.html | 8 - .../examples/coolmagic/utils.py | 107 - .../examples/coolmagic/views/__init__.py | 10 - .../examples/coolmagic/views/static.py | 36 - .../Werkzeug-0.12.1/examples/couchy/README | 8 - .../examples/couchy/__init__.py | 0 .../examples/couchy/application.py | 45 - .../Werkzeug-0.12.1/examples/couchy/models.py | 43 - .../examples/couchy/static/style.css | 108 - .../examples/couchy/templates/display.html | 8 - .../examples/couchy/templates/layout.html | 17 - .../examples/couchy/templates/list.html | 19 - .../examples/couchy/templates/new.html | 14 - .../examples/couchy/templates/not_found.html | 8 - .../Werkzeug-0.12.1/examples/couchy/utils.py | 65 - .../Werkzeug-0.12.1/examples/couchy/views.py | 61 - .../examples/cupoftee/__init__.py | 11 - .../examples/cupoftee/application.py | 112 - .../Werkzeug-0.12.1/examples/cupoftee/db.py | 76 - .../examples/cupoftee/network.py | 133 - .../examples/cupoftee/pages.py | 84 - .../examples/cupoftee/shared/content.png | Bin 230 -> 0 bytes .../examples/cupoftee/shared/down.png | Bin 376 -> 0 bytes .../examples/cupoftee/shared/favicon.ico | Bin 48558 -> 0 bytes .../examples/cupoftee/shared/header.png | Bin 7936 -> 0 bytes .../examples/cupoftee/shared/logo.png | Bin 50158 -> 0 bytes .../examples/cupoftee/shared/style.css | 122 - .../examples/cupoftee/shared/up.png | Bin 389 -> 0 bytes .../examples/cupoftee/templates/layout.html | 21 - .../cupoftee/templates/missingpage.html | 8 - .../examples/cupoftee/templates/search.html | 36 - .../examples/cupoftee/templates/server.html | 29 - .../cupoftee/templates/serverlist.html | 59 - .../examples/cupoftee/utils.py | 19 - .../Werkzeug-0.12.1/examples/httpbasicauth.py | 45 - .../examples/i18nurls/__init__.py | 1 - .../examples/i18nurls/application.py | 86 - .../examples/i18nurls/templates/about.html | 4 - .../examples/i18nurls/templates/blog.html | 4 - .../examples/i18nurls/templates/index.html | 5 - .../examples/i18nurls/templates/layout.html | 22 - .../Werkzeug-0.12.1/examples/i18nurls/urls.py | 11 - .../examples/i18nurls/views.py | 22 - .../examples/manage-coolmagic.py | 20 - .../Werkzeug-0.12.1/examples/manage-couchy.py | 17 - .../examples/manage-cupoftee.py | 19 - .../examples/manage-i18nurls.py | 20 - .../Werkzeug-0.12.1/examples/manage-plnt.py | 65 - .../Werkzeug-0.12.1/examples/manage-shorty.py | 20 - .../examples/manage-simplewiki.py | 46 - .../examples/manage-webpylike.py | 26 - .../Werkzeug-0.12.1/examples/partial/README | 3 - .../examples/partial/complex_routing.py | 19 - .../Werkzeug-0.12.1/examples/plnt/__init__.py | 11 - .../Werkzeug-0.12.1/examples/plnt/database.py | 69 - .../examples/plnt/shared/style.css | 133 - .../Werkzeug-0.12.1/examples/plnt/sync.py | 105 - .../examples/plnt/templates/about.html | 19 - .../examples/plnt/templates/index.html | 26 - .../examples/plnt/templates/layout.html | 23 - .../Werkzeug-0.12.1/examples/plnt/utils.py | 127 - .../Werkzeug-0.12.1/examples/plnt/views.py | 40 - .../Werkzeug-0.12.1/examples/plnt/webapp.py | 55 - .../examples/shortly/shortly.py | 141 - .../examples/shortly/static/style.css | 17 - .../examples/shortly/templates/404.html | 6 - .../examples/shortly/templates/layout.html | 8 - .../examples/shortly/templates/new_url.html | 13 - .../shortly/templates/short_link_details.html | 13 - .../examples/shorty/__init__.py | 0 .../examples/shorty/application.py | 42 - .../Werkzeug-0.12.1/examples/shorty/models.py | 35 - .../examples/shorty/static/style.css | 108 - .../examples/shorty/templates/display.html | 8 - .../examples/shorty/templates/layout.html | 17 - .../examples/shorty/templates/list.html | 19 - .../examples/shorty/templates/new.html | 14 - .../examples/shorty/templates/not_found.html | 8 - .../Werkzeug-0.12.1/examples/shorty/utils.py | 74 - .../Werkzeug-0.12.1/examples/shorty/views.py | 52 - .../examples/simplewiki/__init__.py | 12 - .../examples/simplewiki/actions.py | 187 -- .../examples/simplewiki/application.py | 98 - .../examples/simplewiki/database.py | 131 - .../examples/simplewiki/shared/style.css | 210 -- .../examples/simplewiki/specialpages.py | 49 - .../simplewiki/templates/action_diff.html | 27 - .../simplewiki/templates/action_edit.html | 26 - .../simplewiki/templates/action_log.html | 44 - .../simplewiki/templates/action_revert.html | 31 - .../simplewiki/templates/action_show.html | 12 - .../examples/simplewiki/templates/layout.html | 46 - .../examples/simplewiki/templates/macros.xml | 18 - .../simplewiki/templates/missing_action.html | 12 - .../simplewiki/templates/page_index.html | 18 - .../simplewiki/templates/page_missing.html | 24 - .../simplewiki/templates/recent_changes.html | 26 - .../examples/simplewiki/utils.py | 147 - .../Werkzeug-0.12.1/examples/upload.py | 44 - .../examples/webpylike/example.py | 30 - .../examples/webpylike/webpylike.py | 69 - pythonPackages/Werkzeug-0.12.1/setup.cfg | 22 - pythonPackages/Werkzeug-0.12.1/setup.py | 120 - .../Werkzeug-0.12.1/tests/__init__.py | 25 - .../Werkzeug-0.12.1/tests/conftest.py | 165 - .../Werkzeug-0.12.1/tests/contrib/__init__.py | 10 - .../tests/contrib/test_atom.py | 114 - .../tests/contrib/test_cache.py | 269 -- .../tests/contrib/test_fixers.py | 186 -- .../tests/contrib/test_iterio.py | 183 -- .../tests/contrib/test_securecookie.py | 54 - .../tests/contrib/test_sessions.py | 76 - .../tests/contrib/test_wrappers.py | 97 - .../tests/hypothesis/__init__.py | 0 .../tests/hypothesis/test_urls.py | 33 - .../multipart/firefox3-2png1txt/file1.png | Bin 523 -> 0 bytes .../multipart/firefox3-2png1txt/file2.png | Bin 703 -> 0 bytes .../multipart/firefox3-2png1txt/request.txt | Bin 1739 -> 0 bytes .../multipart/firefox3-2png1txt/text.txt | 1 - .../multipart/firefox3-2pnglongtext/file1.png | Bin 781 -> 0 bytes .../multipart/firefox3-2pnglongtext/file2.png | Bin 733 -> 0 bytes .../firefox3-2pnglongtext/request.txt | Bin 2042 -> 0 bytes .../multipart/firefox3-2pnglongtext/text.txt | 3 - .../tests/multipart/ie6-2png1txt/file1.png | Bin 523 -> 0 bytes .../tests/multipart/ie6-2png1txt/file2.png | Bin 703 -> 0 bytes .../tests/multipart/ie6-2png1txt/request.txt | Bin 1798 -> 0 bytes .../tests/multipart/ie6-2png1txt/text.txt | 1 - .../tests/multipart/ie7_full_path_request.txt | Bin 30044 -> 0 bytes .../tests/multipart/opera8-2png1txt/file1.png | Bin 582 -> 0 bytes .../tests/multipart/opera8-2png1txt/file2.png | Bin 733 -> 0 bytes .../multipart/opera8-2png1txt/request.txt | Bin 1740 -> 0 bytes .../tests/multipart/opera8-2png1txt/text.txt | 1 - .../tests/multipart/test_collect.py | 57 - .../multipart/webkit3-2png1txt/file1.png | Bin 1002 -> 0 bytes .../multipart/webkit3-2png1txt/file2.png | Bin 952 -> 0 bytes .../multipart/webkit3-2png1txt/request.txt | Bin 2408 -> 0 bytes .../tests/multipart/webkit3-2png1txt/text.txt | 1 - .../Werkzeug-0.12.1/tests/res/test.txt | 1 - .../Werkzeug-0.12.1/tests/test_compat.py | 35 - .../tests/test_datastructures.py | 978 ------ .../Werkzeug-0.12.1/tests/test_debug.py | 266 -- .../Werkzeug-0.12.1/tests/test_exceptions.py | 92 - .../Werkzeug-0.12.1/tests/test_formparser.py | 445 --- .../Werkzeug-0.12.1/tests/test_http.py | 529 ---- .../Werkzeug-0.12.1/tests/test_internal.py | 74 - .../Werkzeug-0.12.1/tests/test_local.py | 207 -- .../Werkzeug-0.12.1/tests/test_routing.py | 928 ------ .../Werkzeug-0.12.1/tests/test_security.py | 145 - .../Werkzeug-0.12.1/tests/test_serving.py | 280 -- .../Werkzeug-0.12.1/tests/test_test.py | 651 ---- .../Werkzeug-0.12.1/tests/test_urls.py | 409 --- .../Werkzeug-0.12.1/tests/test_utils.py | 297 -- .../Werkzeug-0.12.1/tests/test_wrappers.py | 1125 ------- .../Werkzeug-0.12.1/tests/test_wsgi.py | 460 --- .../Werkzeug-0.12.1/werkzeug/__init__.py | 151 - .../Werkzeug-0.12.1/werkzeug/_compat.py | 206 -- .../Werkzeug-0.12.1/werkzeug/_internal.py | 418 --- .../Werkzeug-0.12.1/werkzeug/_reloader.py | 267 -- .../werkzeug/contrib/__init__.py | 16 - .../Werkzeug-0.12.1/werkzeug/contrib/atom.py | 355 --- .../Werkzeug-0.12.1/werkzeug/contrib/cache.py | 858 ------ .../werkzeug/contrib/fixers.py | 254 -- .../werkzeug/contrib/iterio.py | 352 --- .../werkzeug/contrib/jsrouting.py | 264 -- .../werkzeug/contrib/limiter.py | 41 - .../Werkzeug-0.12.1/werkzeug/contrib/lint.py | 343 --- .../werkzeug/contrib/profiler.py | 147 - .../werkzeug/contrib/securecookie.py | 323 -- .../werkzeug/contrib/sessions.py | 352 --- .../werkzeug/contrib/testtools.py | 73 - .../werkzeug/contrib/wrappers.py | 284 -- .../werkzeug/datastructures.py | 2740 ----------------- .../werkzeug/debug/__init__.py | 466 --- .../Werkzeug-0.12.1/werkzeug/debug/console.py | 215 -- .../Werkzeug-0.12.1/werkzeug/debug/repr.py | 280 -- .../werkzeug/debug/shared/FONT_LICENSE | 96 - .../werkzeug/debug/shared/console.png | Bin 507 -> 0 bytes .../werkzeug/debug/shared/debugger.js | 205 -- .../werkzeug/debug/shared/jquery.js | 5 - .../werkzeug/debug/shared/less.png | Bin 191 -> 0 bytes .../werkzeug/debug/shared/more.png | Bin 200 -> 0 bytes .../werkzeug/debug/shared/source.png | Bin 818 -> 0 bytes .../werkzeug/debug/shared/style.css | 143 - .../werkzeug/debug/shared/ubuntu.ttf | Bin 70220 -> 0 bytes .../Werkzeug-0.12.1/werkzeug/debug/tbtools.py | 556 ---- .../Werkzeug-0.12.1/werkzeug/exceptions.py | 719 ----- .../Werkzeug-0.12.1/werkzeug/filesystem.py | 66 - .../Werkzeug-0.12.1/werkzeug/formparser.py | 522 ---- .../Werkzeug-0.12.1/werkzeug/http.py | 1054 ------- .../Werkzeug-0.12.1/werkzeug/local.py | 420 --- .../werkzeug/posixemulation.py | 106 - .../Werkzeug-0.12.1/werkzeug/routing.py | 1784 ----------- .../Werkzeug-0.12.1/werkzeug/script.py | 332 -- .../Werkzeug-0.12.1/werkzeug/security.py | 264 -- .../Werkzeug-0.12.1/werkzeug/serving.py | 784 ----- .../Werkzeug-0.12.1/werkzeug/test.py | 909 ------ .../Werkzeug-0.12.1/werkzeug/testapp.py | 230 -- .../Werkzeug-0.12.1/werkzeug/urls.py | 1004 ------ .../Werkzeug-0.12.1/werkzeug/useragents.py | 202 -- .../Werkzeug-0.12.1/werkzeug/utils.py | 628 ---- .../Werkzeug-0.12.1/werkzeug/wrappers.py | 1970 ------------ .../Werkzeug-0.12.1/werkzeug/wsgi.py | 1195 ------- pythonPackages/cherrypy/PKG-INFO | 19 - pythonPackages/cherrypy/README.txt | 13 - pythonPackages/cherrypy/cherrypy/LICENSE.txt | 25 - pythonPackages/cherrypy/cherrypy/__init__.py | 561 ---- pythonPackages/cherrypy/cherrypy/_cpcgifs.py | 79 - .../cherrypy/cherrypy/_cpchecker.py | 269 -- pythonPackages/cherrypy/cherrypy/_cpconfig.py | 385 --- .../cherrypy/cherrypy/_cpdispatch.py | 516 ---- pythonPackages/cherrypy/cherrypy/_cperror.py | 386 --- .../cherrypy/cherrypy/_cplogging.py | 245 -- pythonPackages/cherrypy/cherrypy/_cpmodpy.py | 330 -- .../cherrypy/cherrypy/_cprequest.py | 901 ------ pythonPackages/cherrypy/cherrypy/_cpserver.py | 118 - .../cherrypy/cherrypy/_cpthreadinglocal.py | 239 -- pythonPackages/cherrypy/cherrypy/_cptools.py | 492 --- pythonPackages/cherrypy/cherrypy/_cptree.py | 240 -- pythonPackages/cherrypy/cherrypy/_cpwsgi.py | 330 -- .../cherrypy/cherrypy/_cpwsgi_server.py | 55 - pythonPackages/cherrypy/cherrypy/cherryd | 96 - pythonPackages/cherrypy/cherrypy/favicon.ico | Bin 1406 -> 0 bytes .../cherrypy/cherrypy/lib/__init__.py | 158 - pythonPackages/cherrypy/cherrypy/lib/auth.py | 75 - .../cherrypy/cherrypy/lib/caching.py | 245 -- .../cherrypy/cherrypy/lib/covercp.py | 361 --- .../cherrypy/cherrypy/lib/cptools.py | 434 --- .../cherrypy/cherrypy/lib/encoding.py | 265 -- pythonPackages/cherrypy/cherrypy/lib/http.py | 405 --- .../cherrypy/cherrypy/lib/httpauth.py | 363 --- .../cherrypy/cherrypy/lib/profiler.py | 199 -- .../cherrypy/cherrypy/lib/safemime.py | 128 - .../cherrypy/cherrypy/lib/sessions.py | 690 ----- .../cherrypy/cherrypy/lib/static.py | 236 -- pythonPackages/cherrypy/cherrypy/lib/tidy.py | 184 -- .../cherrypy/cherrypy/lib/wsgiapp.py | 77 - .../cherrypy/cherrypy/lib/xmlrpc.py | 49 - .../cherrypy/cherrypy/process/__init__.py | 14 - .../cherrypy/cherrypy/process/plugins.py | 529 ---- .../cherrypy/cherrypy/process/servers.py | 266 -- .../cherrypy/cherrypy/process/win32.py | 175 -- .../cherrypy/cherrypy/process/wspbus.py | 345 --- .../cherrypy/cherrypy/scaffold/__init__.py | 61 - .../cherrypy/cherrypy/scaffold/example.conf | 3 - .../cherrypy/cherrypy/scaffold/site.conf | 8 - .../static/made_with_cherrypy_small.png | Bin 7455 -> 0 bytes .../cherrypy/cherrypy/test/__init__.py | 5 - .../cherrypy/cherrypy/test/benchmark.py | 404 --- .../cherrypy/cherrypy/test/checkerdemo.py | 43 - .../cherrypy/cherrypy/test/helper.py | 333 -- .../cherrypy/cherrypy/test/logtest.py | 177 -- .../cherrypy/cherrypy/test/modfcgid.py | 117 - .../cherrypy/cherrypy/test/modpy.py | 195 -- .../cherrypy/cherrypy/test/modwsgi.py | 174 -- pythonPackages/cherrypy/cherrypy/test/py25.py | 40 - .../cherrypy/cherrypy/test/static/dirback.jpg | Bin 18238 -> 0 bytes .../cherrypy/cherrypy/test/static/index.html | 1 - .../cherrypy/cherrypy/test/style.css | 1 - .../cherrypy/cherrypy/test/test.pem | 38 - pythonPackages/cherrypy/cherrypy/test/test.py | 423 --- .../cherrypy/cherrypy/test/test_caching.py | 214 -- .../cherrypy/cherrypy/test/test_config.py | 204 -- .../cherrypy/cherrypy/test/test_conn.py | 615 ---- .../cherrypy/cherrypy/test/test_core.py | 1245 -------- .../cherrypy/cherrypy/test/test_encoding.py | 172 -- .../cherrypy/cherrypy/test/test_etags.py | 89 - .../cherrypy/cherrypy/test/test_http.py | 144 - .../cherrypy/cherrypy/test/test_httpauth.py | 157 - .../cherrypy/cherrypy/test/test_httplib.py | 32 - .../cherrypy/cherrypy/test/test_logging.py | 155 - .../cherrypy/cherrypy/test/test_misc_tools.py | 182 -- .../cherrypy/test/test_objectmapping.py | 354 --- .../cherrypy/cherrypy/test/test_proxy.py | 132 - .../cherrypy/cherrypy/test/test_refleaks.py | 125 - .../cherrypy/cherrypy/test/test_routes.py | 71 - .../cherrypy/test/test_safe_multipart.py | 75 - .../cherrypy/cherrypy/test/test_session.py | 395 --- .../cherrypy/test/test_sessionauthenticate.py | 71 - .../cherrypy/cherrypy/test/test_states.py | 557 ---- .../cherrypy/test/test_states_demo.py | 58 - .../cherrypy/cherrypy/test/test_static.py | 173 -- .../cherrypy/cherrypy/test/test_tidy.py | 77 - .../cherrypy/cherrypy/test/test_tools.py | 386 --- .../cherrypy/cherrypy/test/test_tutorials.py | 214 -- .../cherrypy/test/test_virtualhost.py | 115 - .../cherrypy/cherrypy/test/test_wsgi_ns.py | 91 - .../cherrypy/cherrypy/test/test_wsgi_vhost.py | 49 - .../cherrypy/cherrypy/test/test_wsgiapps.py | 122 - .../cherrypy/cherrypy/test/test_xmlrpc.py | 177 -- .../cherrypy/cherrypy/test/webtest.py | 576 ---- .../cherrypy/cherrypy/tutorial/README.txt | 16 - .../cherrypy/cherrypy/tutorial/__init__.py | 3 - .../cherrypy/tutorial/bonus-sqlobject.py | 168 - .../cherrypy/tutorial/custom_error.html | 14 - .../cherrypy/cherrypy/tutorial/pdf_file.pdf | Bin 85698 -> 0 bytes .../cherrypy/tutorial/tut01_helloworld.py | 35 - .../cherrypy/tutorial/tut02_expose_methods.py | 28 - .../cherrypy/tutorial/tut03_get_and_post.py | 49 - .../cherrypy/tutorial/tut04_complex_site.py | 92 - .../tutorial/tut05_derived_objects.py | 78 - .../cherrypy/tutorial/tut06_default_method.py | 59 - .../cherrypy/tutorial/tut07_sessions.py | 39 - .../tutorial/tut08_generators_and_yield.py | 41 - .../cherrypy/cherrypy/tutorial/tut09_files.py | 99 - .../cherrypy/tutorial/tut10_http_errors.py | 77 - .../cherrypy/cherrypy/tutorial/tutorial.conf | 4 - .../cherrypy/cherrypy/wsgiserver/__init__.py | 1794 ----------- pythonPackages/cherrypy/setup.py | 122 - pythonPackages/cycler/cycler-0.10.0.tar.gz | Bin 16553 -> 0 bytes pythonPackages/cython/Cython-0.25.2.tar.gz | Bin 1703315 -> 0 bytes pythonPackages/nose/AUTHORS | 27 - pythonPackages/nose/CHANGELOG | 886 ------ pythonPackages/nose/MANIFEST.in | 15 - pythonPackages/nose/NEWS | 14 - pythonPackages/nose/PKG-INFO | 38 - pythonPackages/nose/README.txt | 535 ---- pythonPackages/nose/bin/nosetests | 6 - pythonPackages/nose/distribute_setup.py | 546 ---- pythonPackages/nose/doc/.static/nose.css | 74 - pythonPackages/nose/doc/.templates/index.html | 52 - .../nose/doc/.templates/indexsidebar.html | 44 - .../nose/doc/.templates/layout.html | 18 - pythonPackages/nose/doc/.templates/page.html | 7 - pythonPackages/nose/doc/Makefile | 89 - pythonPackages/nose/doc/api.rst | 20 - pythonPackages/nose/doc/api/commands.rst | 2 - pythonPackages/nose/doc/api/config.rst | 5 - pythonPackages/nose/doc/api/core.rst | 5 - pythonPackages/nose/doc/api/importer.rst | 5 - pythonPackages/nose/doc/api/inspector.rst | 5 - pythonPackages/nose/doc/api/loader.rst | 2 - .../nose/doc/api/plugin_manager.rst | 2 - pythonPackages/nose/doc/api/proxy.rst | 2 - pythonPackages/nose/doc/api/result.rst | 2 - pythonPackages/nose/doc/api/selector.rst | 2 - pythonPackages/nose/doc/api/suite.rst | 2 - pythonPackages/nose/doc/api/test_cases.rst | 8 - pythonPackages/nose/doc/api/twistedtools.rst | 2 - pythonPackages/nose/doc/api/util.rst | 5 - pythonPackages/nose/doc/conf.py | 242 -- pythonPackages/nose/doc/contributing.rst | 50 - pythonPackages/nose/doc/developing.rst | 25 - pythonPackages/nose/doc/docstring.py | 25 - pythonPackages/nose/doc/finding_tests.rst | 32 - pythonPackages/nose/doc/further_reading.rst | 34 - pythonPackages/nose/doc/index.html | 8 - pythonPackages/nose/doc/index.rst | 79 - pythonPackages/nose/doc/man.rst | 17 - pythonPackages/nose/doc/manbuilder.py | 24 - pythonPackages/nose/doc/manpage.py | 1117 ------- pythonPackages/nose/doc/more_info.rst | 48 - pythonPackages/nose/doc/news.rst | 4 - pythonPackages/nose/doc/plugins.rst | 70 - .../nose/doc/plugins/allmodules.rst | 4 - pythonPackages/nose/doc/plugins/attrib.rst | 4 - pythonPackages/nose/doc/plugins/builtin.rst | 30 - pythonPackages/nose/doc/plugins/capture.rst | 5 - pythonPackages/nose/doc/plugins/collect.rst | 4 - pythonPackages/nose/doc/plugins/cover.rst | 14 - pythonPackages/nose/doc/plugins/debug.rst | 4 - .../nose/doc/plugins/deprecated.rst | 4 - pythonPackages/nose/doc/plugins/doctests.rst | 4 - .../nose/doc/plugins/documenting.rst | 62 - .../nose/doc/plugins/errorclasses.rst | 7 - .../nose/doc/plugins/failuredetail.rst | 4 - pythonPackages/nose/doc/plugins/interface.rst | 122 - pythonPackages/nose/doc/plugins/isolate.rst | 4 - .../nose/doc/plugins/logcapture.rst | 4 - .../nose/doc/plugins/multiprocess.rst | 5 - pythonPackages/nose/doc/plugins/other.rst | 6 - pythonPackages/nose/doc/plugins/prof.rst | 4 - pythonPackages/nose/doc/plugins/skip.rst | 5 - pythonPackages/nose/doc/plugins/testid.rst | 4 - pythonPackages/nose/doc/plugins/testing.rst | 7 - pythonPackages/nose/doc/plugins/writing.rst | 1 - pythonPackages/nose/doc/plugins/xunit.rst | 4 - pythonPackages/nose/doc/rtd-requirements.txt | 3 - .../nose/doc/setuptools_integration.rst | 38 - pythonPackages/nose/doc/testing.rst | 55 - pythonPackages/nose/doc/testing_tools.rst | 11 - pythonPackages/nose/doc/usage.rst | 47 - pythonPackages/nose/doc/writing_tests.rst | 172 -- pythonPackages/nose/examples/attrib_plugin.py | 82 - .../nose/examples/html_plugin/htmlplug.py | 92 - .../nose/examples/html_plugin/setup.py | 24 - pythonPackages/nose/examples/plugin/plug.py | 4 - pythonPackages/nose/examples/plugin/setup.py | 27 - .../doc_tests/test_addplugins/support/test.py | 2 - .../test_addplugins/test_addplugins.rst | 80 - .../doc_tests/test_allmodules/support/mod.py | 5 - .../doc_tests/test_allmodules/support/test.py | 2 - .../test_allmodules/test_allmodules.rst | 67 - .../doctest_fixtures.rst | 122 - .../doctest_fixtures_fixtures.py | 17 - .../doc_tests/test_init_plugin/example.cfg | 3 - .../test_init_plugin/init_plugin.rst | 166 - .../init_plugin.rst.py3.patch | 10 - .../support/unwanted_package/__init__.py | 1 - .../support/unwanted_package/test_spam.py | 3 - .../support/wanted_package/__init__.py | 1 - .../support/wanted_package/test_eggs.py | 3 - .../test_issue089/unwanted_package.rst | 70 - .../test_issue097/plugintest_environment.rst | 160 - .../test_issue107/plugin_exceptions.rst | 149 - .../test_issue107/support/test_spam.py | 5 - .../doc_tests/test_issue119/empty_plugin.rst | 57 - .../doc_tests/test_issue119/test_zeronine.py | 26 - .../test_issue142/errorclass_failure.rst | 124 - .../support/errorclass_failing_test.py | 7 - .../support/errorclass_failure_plugin.py | 16 - .../test_issue142/support/errorclass_tests.py | 20 - .../test_issue145/imported_tests.rst | 117 - .../support/package1/__init__.py | 2 - .../support/package1/test_module.py | 12 - .../support/package2c/__init__.py | 2 - .../support/package2c/test_module.py | 1 - .../support/package2f/__init__.py | 2 - .../support/package2f/test_module.py | 1 - .../test_multiprocess/multiprocess.rst | 270 -- .../multiprocess_fixtures.py | 16 - .../support/test_can_split.py | 30 - .../support/test_not_shared.py | 30 - .../test_multiprocess/support/test_shared.py | 54 - .../restricted_plugin_options.rst | 89 - .../restricted_plugin_options.rst.py3.patch | 9 - .../support/bad.cfg | 2 - .../support/start.cfg | 2 - .../support/test.py | 2 - .../test_selector_plugin/selector_plugin.rst | 119 - .../test_selector_plugin/support/mymodule.py | 2 - .../support/mypackage/__init__.py | 1 - .../support/mypackage/math/__init__.py | 1 - .../support/mypackage/math/basic.py | 5 - .../support/mypackage/strings.py | 2 - .../support/tests/math/basic.py | 17 - .../support/tests/mymodule/my_function.py | 7 - .../support/tests/strings/cat.py | 12 - .../support/tests/testlib.py | 6 - .../test_xunit_plugin/support/nosetests.xml | 18 - .../test_xunit_plugin/support/test_skip.py | 13 - .../test_xunit_plugin/test_skips.rst | 42 - .../nose/functional_tests/nosetests.xml | 2 - .../functional_tests/support/att/test_attr.py | 96 - .../support/attrib-static/test.py | 4 - .../functional_tests/support/coverage/blah.py | 6 - .../support/coverage/tests/test_covered.py | 4 - .../support/coverage2/.coverage | Bin 3896 -> 0 bytes .../support/coverage2/blah.py | 6 - .../functional_tests/support/coverage2/moo.py | 2 - .../support/coverage2/tests/test_covered.py | 8 - .../support/ctx/mod_import_skip.py | 9 - .../support/ctx/mod_setup_fails.py | 12 - .../support/ctx/mod_setup_skip.py | 14 - .../nose/functional_tests/support/dir1/mod.py | 1 - .../support/dir1/pak/__init__.py | 1 - .../functional_tests/support/dir1/pak/mod.py | 1 - .../support/dir1/pak/sub/__init__.py | 1 - .../nose/functional_tests/support/dir2/mod.py | 1 - .../support/dir2/pak/__init__.py | 1 - .../functional_tests/support/dir2/pak/mod.py | 1 - .../support/dir2/pak/sub/__init__.py | 1 - .../functional_tests/support/dir3/.hidden | 0 .../functional_tests/support/dtt/docs/doc.txt | 6 - .../support/dtt/docs/errdoc.txt | 7 - .../support/dtt/docs/nodoc.txt | 1 - .../functional_tests/support/dtt/some_mod.py | 17 - .../functional_tests/support/empty/.hidden | 0 .../support/ep/Some_plugin.egg-info/PKG-INFO | 10 - .../ep/Some_plugin.egg-info/SOURCES.txt | 6 - .../Some_plugin.egg-info/dependency_links.txt | 1 - .../ep/Some_plugin.egg-info/entry_points.txt | 3 - .../ep/Some_plugin.egg-info/top_level.txt | 1 - .../nose/functional_tests/support/ep/setup.py | 10 - .../functional_tests/support/ep/someplugin.py | 4 - .../functional_tests/support/fdp/test_fdp.py | 10 - .../support/fdp/test_fdp_no_capt.py | 9 - .../nose/functional_tests/support/gen/test.py | 12 - .../support/id_fails/test_a.py | 1 - .../support/id_fails/test_b.py | 5 - .../nose/functional_tests/support/idp/exm.py | 21 - .../functional_tests/support/idp/tests.py | 38 - .../support/ipt/test1/ipthelp.py | 4 - .../support/ipt/test1/tests.py | 7 - .../support/ipt/test2/ipthelp.py | 5 - .../support/ipt/test2/tests.py | 8 - .../functional_tests/support/issue038/test.py | 9 - .../functional_tests/support/issue072/test.py | 4 - .../support/issue082/_mypackage/__init__.py | 1 - .../support/issue082/_mypackage/_eggs.py | 8 - .../support/issue082/_mypackage/bacon.py | 8 - .../issue082/mypublicpackage/__init__.py | 1 - .../support/issue082/mypublicpackage/_foo.py | 8 - .../support/issue082/mypublicpackage/bar.py | 8 - .../functional_tests/support/issue130/test.py | 5 - .../functional_tests/support/issue134/test.py | 3 - .../issue143/not-a-package/__init__.py | 1 - .../support/issue143/not-a-package/test.py | 2 - .../issue191/UNKNOWN.egg-info/PKG-INFO | 10 - .../issue191/UNKNOWN.egg-info/SOURCES.txt | 6 - .../UNKNOWN.egg-info/dependency_links.txt | 1 - .../issue191/UNKNOWN.egg-info/top_level.txt | 1 - .../support/issue191/setup.cfg | 2 - .../support/issue191/setup.py | 3 - .../functional_tests/support/issue191/test.py | 2 - .../support/issue269/test_bad_class.py | 5 - .../support/issue279/test_mod_setup_fails.py | 5 - .../support/issue408/nosetests.xml | 0 .../functional_tests/support/issue408/test.py | 16 - .../functional_tests/support/issue513/test.py | 3 - .../functional_tests/support/issue649/test.py | 9 - .../functional_tests/support/issue680/test.py | 3 - .../functional_tests/support/issue700/test.py | 4 - .../functional_tests/support/issue720/test.py | 6 - .../functional_tests/support/issue771/test.py | 16 - .../functional_tests/support/issue859/test.py | 6 - .../functional_tests/support/ltfn/state.py | 1 - .../functional_tests/support/ltfn/test_mod.py | 10 - .../support/ltfn/test_pak1/__init__.py | 13 - .../support/ltfn/test_pak1/test_mod.py | 12 - .../support/ltfn/test_pak2/__init__.py | 13 - .../functional_tests/support/ltftc/tests.py | 9 - .../namespace_pkg/namespace_pkg/__init__.py | 2 - .../namespace_pkg/namespace_pkg/example.py | 1 - .../namespace_pkg/namespace_pkg/test_pkg.py | 6 - .../site-packages/namespace_pkg/__init__.py | 2 - .../site-packages/namespace_pkg/example2.py | 1 - .../site-packages/namespace_pkg/test_pkg2.py | 6 - .../support/package1/example.py | 8 - .../package1/tests/test_example_function.py | 15 - .../support/package2/maths.py | 11 - .../support/package2/test_pak/__init__.py | 10 - .../support/package2/test_pak/test_mod.py | 20 - .../package2/test_pak/test_sub/__init__.py | 12 - .../package2/test_pak/test_sub/test_mod.py | 36 - .../support/package3/lib/a.py | 2 - .../support/package3/src/b.py | 2 - .../support/package3/tests/test_a.py | 4 - .../support/package3/tests/test_b.py | 4 - .../functional_tests/support/pass/test.py | 2 - .../support/string-exception/test.py | 30 - .../nose/functional_tests/support/test.cfg | 2 - .../support/test_buggy_generators.py | 29 - .../support/todo/test_with_todo.py | 7 - .../functional_tests/support/todo/todoplug.py | 7 - .../support/twist/test_twisted.py | 15 - .../nose/functional_tests/support/xunit.xml | 25 - .../support/xunit/test_xunit_as_suite.py | 24 - .../functional_tests/test_attribute_plugin.py | 205 -- .../functional_tests/test_buggy_generators.py | 36 - .../nose/functional_tests/test_cases.py | 38 - .../nose/functional_tests/test_collector.py | 46 - .../nose/functional_tests/test_commands.py | 47 - .../functional_tests/test_config_files.py | 41 - .../functional_tests/test_coverage_plugin.py | 183 -- .../test_defaultpluginmanager.py | 22 - .../functional_tests/test_doctest_plugin.py | 44 - .../nose/functional_tests/test_entrypoints.py | 20 - .../nose/functional_tests/test_failure.py | 29 - .../test_failuredetail_plugin.py | 64 - .../test_generator_fixtures.py | 58 - .../nose/functional_tests/test_id_plugin.py | 261 -- .../nose/functional_tests/test_importer.py | 220 -- .../functional_tests/test_isolate_plugin.py | 57 - .../test_issue120/support/some_test.py | 3 - .../test_named_test_with_doctest.rst | 25 - .../nose/functional_tests/test_issue_072.py | 45 - .../nose/functional_tests/test_issue_082.py | 74 - .../nose/functional_tests/test_issue_408.py | 25 - .../nose/functional_tests/test_issue_649.py | 18 - .../test_load_tests_from_test_case.py | 56 - .../nose/functional_tests/test_loader.py | 504 --- .../test_multiprocessing/__init__.py | 28 - .../test_multiprocessing/support/class.py | 14 - .../support/concurrent_shared/__init__.py | 6 - .../support/concurrent_shared/test.py | 11 - .../support/fake_nosetest.py | 17 - .../support/keyboardinterrupt.py | 36 - .../support/keyboardinterrupt_twice.py | 42 - .../test_multiprocessing/support/nameerror.py | 4 - .../test_multiprocessing/support/timeout.py | 12 - .../test_multiprocessing/test_class.py | 13 - .../test_concurrent_shared.py | 42 - .../test_keyboardinterrupt.py | 104 - .../test_multiprocessing/test_nameerror.py | 13 - .../test_process_timeout.py | 21 - .../functional_tests/test_namespace_pkg.py | 58 - .../nose/functional_tests/test_plugin_api.py | 45 - .../nose/functional_tests/test_plugins.py | 71 - .../nose/functional_tests/test_plugintest.py | 51 - .../nose/functional_tests/test_program.py | 191 -- .../nose/functional_tests/test_result.py | 32 - .../nose/functional_tests/test_selector.py | 17 - .../test_skip_pdb_interaction.py | 49 - .../functional_tests/test_string_exception.py | 32 - .../nose/functional_tests/test_success.py | 43 - .../nose/functional_tests/test_suite.py | 47 - .../functional_tests/test_withid_failures.rst | 50 - .../nose/functional_tests/test_xunit.py | 127 - pythonPackages/nose/install-rpm.sh | 3 - pythonPackages/nose/lgpl.txt | 504 --- pythonPackages/nose/nose.egg-info/PKG-INFO | 38 - pythonPackages/nose/nose.egg-info/SOURCES.txt | 432 --- .../nose/nose.egg-info/dependency_links.txt | 1 - .../nose/nose.egg-info/entry_points.txt | 7 - .../nose/nose.egg-info/not-zip-safe | 1 - .../nose/nose.egg-info/top_level.txt | 1 - pythonPackages/nose/nose/__init__.py | 15 - pythonPackages/nose/nose/__main__.py | 8 - pythonPackages/nose/nose/case.py | 397 --- pythonPackages/nose/nose/commands.py | 172 -- pythonPackages/nose/nose/config.py | 661 ---- pythonPackages/nose/nose/core.py | 341 -- pythonPackages/nose/nose/exc.py | 9 - pythonPackages/nose/nose/ext/__init__.py | 3 - pythonPackages/nose/nose/ext/dtcompat.py | 2272 -------------- pythonPackages/nose/nose/failure.py | 42 - pythonPackages/nose/nose/importer.py | 167 - pythonPackages/nose/nose/inspector.py | 207 -- pythonPackages/nose/nose/loader.py | 623 ---- pythonPackages/nose/nose/plugins/__init__.py | 190 -- .../nose/nose/plugins/allmodules.py | 45 - pythonPackages/nose/nose/plugins/attrib.py | 286 -- pythonPackages/nose/nose/plugins/base.py | 725 ----- pythonPackages/nose/nose/plugins/builtin.py | 34 - pythonPackages/nose/nose/plugins/capture.py | 115 - pythonPackages/nose/nose/plugins/collect.py | 94 - pythonPackages/nose/nose/plugins/cover.py | 271 -- pythonPackages/nose/nose/plugins/debug.py | 67 - .../nose/nose/plugins/deprecated.py | 45 - pythonPackages/nose/nose/plugins/doctests.py | 455 --- .../nose/nose/plugins/errorclass.py | 210 -- .../nose/nose/plugins/failuredetail.py | 49 - pythonPackages/nose/nose/plugins/isolate.py | 103 - .../nose/nose/plugins/logcapture.py | 245 -- pythonPackages/nose/nose/plugins/manager.py | 460 --- .../nose/nose/plugins/multiprocess.py | 835 ----- .../nose/nose/plugins/plugintest.py | 416 --- pythonPackages/nose/nose/plugins/prof.py | 154 - pythonPackages/nose/nose/plugins/skip.py | 63 - pythonPackages/nose/nose/plugins/testid.py | 311 -- pythonPackages/nose/nose/plugins/xunit.py | 341 -- pythonPackages/nose/nose/proxy.py | 188 -- pythonPackages/nose/nose/pyversion.py | 215 -- pythonPackages/nose/nose/result.py | 200 -- pythonPackages/nose/nose/selector.py | 251 -- pythonPackages/nose/nose/sphinx/__init__.py | 1 - pythonPackages/nose/nose/sphinx/pluginopts.py | 189 -- pythonPackages/nose/nose/suite.py | 609 ---- pythonPackages/nose/nose/tools.py | 194 -- pythonPackages/nose/nose/tools/__init__.py | 15 - pythonPackages/nose/nose/tools/nontrivial.py | 151 - pythonPackages/nose/nose/tools/trivial.py | 54 - pythonPackages/nose/nose/twistedtools.py | 173 -- pythonPackages/nose/nose/usage.txt | 115 - pythonPackages/nose/nose/util.py | 668 ---- pythonPackages/nose/nosetests.1 | 581 ---- pythonPackages/nose/patch.py | 639 ---- pythonPackages/nose/selftest.py | 60 - pythonPackages/nose/setup.cfg | 14 - pythonPackages/nose/setup.py | 125 - pythonPackages/nose/setup3lib.py | 140 - pythonPackages/nose/unit_tests/helpers.py | 6 - pythonPackages/nose/unit_tests/mock.py | 107 - .../nose/unit_tests/support/bug101/tests.py | 9 - .../nose/unit_tests/support/bug105/tests.py | 49 - .../unit_tests/support/config_defaults/a.cfg | 2 - .../unit_tests/support/config_defaults/b.cfg | 2 - .../support/config_defaults/invalid.cfg | 1 - .../support/config_defaults/invalid_value.cfg | 2 - .../unit_tests/support/doctest/.gitignore | 1 - .../support/doctest/err_doctests.py | 12 - .../unit_tests/support/doctest/no_doctests.py | 9 - .../support/doctest/noname_wrapped.not_py | 6 - .../support/doctest/noname_wrapper.py | 12 - .../nose/unit_tests/support/foo/__init__.py | 7 - .../unit_tests/support/foo/bar/__init__.py | 1 - .../nose/unit_tests/support/foo/bar/buz.py | 8 - .../nose/unit_tests/support/foo/doctests.txt | 7 - .../nose/unit_tests/support/foo/test_foo.py | 1 - .../support/foo/tests/dir_test_file.py | 3 - .../support/init_prefix_bug/__init__.py | 1 - .../support/init_prefix_bug/__init__not.py | 1 - .../nose/unit_tests/support/issue006/tests.py | 19 - .../nose/unit_tests/support/issue065/tests.py | 5 - .../nose/unit_tests/support/issue135/tests.py | 6 - .../unit_tests/support/issue270/__init__.py | 2 - .../unit_tests/support/issue270/foo_test.py | 7 - .../nose/unit_tests/support/other/file.txt | 1 - .../support/pkgorg/lib/modernity.py | 1 - .../support/pkgorg/tests/test_mod.py | 4 - .../nose/unit_tests/support/script.py | 3 - .../nose/unit_tests/support/test-dir/test.py | 1 - .../nose/unit_tests/support/test.py | 13 - .../nose/unit_tests/test_attribute_plugin.py | 53 - pythonPackages/nose/unit_tests/test_bug105.py | 32 - .../nose/unit_tests/test_capture_plugin.py | 100 - pythonPackages/nose/unit_tests/test_cases.py | 274 -- pythonPackages/nose/unit_tests/test_config.py | 141 - .../nose/unit_tests/test_config_defaults.rst | 146 - pythonPackages/nose/unit_tests/test_core.py | 99 - .../nose/unit_tests/test_cover_plugin.py | 25 - .../nose/unit_tests/test_deprecated_plugin.py | 131 - .../unit_tests/test_doctest_error_handling.py | 40 - .../nose/unit_tests/test_doctest_munging.rst | 105 - .../nose/unit_tests/test_doctest_no_name.py | 34 - .../nose/unit_tests/test_id_plugin.py | 20 - .../nose/unit_tests/test_importer.py | 65 - .../nose/unit_tests/test_inspector.py | 149 - .../nose/unit_tests/test_isolation_plugin.py | 2 - .../nose/unit_tests/test_issue135.py | 33 - .../nose/unit_tests/test_issue155.rst | 46 - .../nose/unit_tests/test_issue270.rst | 22 - .../nose/unit_tests/test_issue270_fixtures.py | 11 - .../nose/unit_tests/test_issue_006.py | 31 - .../nose/unit_tests/test_issue_064.py | 2 - .../nose/unit_tests/test_issue_065.py | 20 - .../nose/unit_tests/test_issue_100.rst | 12 - .../unit_tests/test_issue_100.rst.py3.patch | 8 - .../nose/unit_tests/test_issue_101.py | 27 - .../nose/unit_tests/test_issue_159.rst | 6 - .../nose/unit_tests/test_issue_227.py | 12 - .../nose/unit_tests/test_issue_230.py | 21 - .../nose/unit_tests/test_issue_786.py | 12 - .../nose/unit_tests/test_lazy_suite.py | 21 - pythonPackages/nose/unit_tests/test_loader.py | 565 ---- .../nose/unit_tests/test_logcapture_plugin.py | 257 -- .../nose/unit_tests/test_logging.py | 40 - .../nose/unit_tests/test_ls_tree.rst | 50 - .../nose/unit_tests/test_multiprocess.py | 62 - .../unit_tests/test_multiprocess_runner.py | 120 - .../nose/unit_tests/test_pdb_plugin.py | 117 - pythonPackages/nose/unit_tests/test_plugin.py | 33 - .../nose/unit_tests/test_plugin_interfaces.py | 45 - .../nose/unit_tests/test_plugin_manager.py | 74 - .../nose/unit_tests/test_plugins.py | 438 --- .../nose/unit_tests/test_result_proxy.py | 188 -- .../nose/unit_tests/test_selector.py | 200 -- .../nose/unit_tests/test_selector_plugins.py | 30 - .../nose/unit_tests/test_skip_plugin.py | 130 - pythonPackages/nose/unit_tests/test_suite.py | 301 -- pythonPackages/nose/unit_tests/test_tools.py | 229 -- .../nose/unit_tests/test_twisted.py | 93 - .../nose/unit_tests/test_twisted_testcase.py | 11 - pythonPackages/nose/unit_tests/test_utils.py | 191 -- pythonPackages/nose/unit_tests/test_xunit.py | 312 -- pythonPackages/pmw/Pmw.1.3.2.tar.gz | Bin 399262 -> 0 bytes pythonPackages/pupynere-1.0.15/PKG-INFO | 82 - .../pupynere.egg-info/PKG-INFO | 82 - .../pupynere.egg-info/SOURCES.txt | 8 - .../pupynere.egg-info/dependency_links.txt | 1 - .../pupynere.egg-info/requires.txt | 4 - .../pupynere.egg-info/top_level.txt | 1 - .../pupynere.egg-info/zip-safe | 1 - pythonPackages/pupynere-1.0.15/pupynere.py | 656 ---- pythonPackages/pupynere-1.0.15/setup.cfg | 5 - pythonPackages/pupynere-1.0.15/setup.py | 104 - pythonPackages/pupynere/PKG-INFO | 82 - .../pupynere/pupynere.egg-info/PKG-INFO | 82 - .../pupynere/pupynere.egg-info/SOURCES.txt | 8 - .../pupynere.egg-info/dependency_links.txt | 1 - .../pupynere/pupynere.egg-info/requires.txt | 4 - .../pupynere/pupynere.egg-info/top_level.txt | 1 - .../pupynere/pupynere.egg-info/zip-safe | 1 - pythonPackages/pupynere/pupynere.py | 656 ---- pythonPackages/pupynere/setup.cfg | 5 - pythonPackages/pupynere/setup.py | 104 - pythonPackages/pycairo/pycairo-1.2.2.tar.gz | Bin 482417 -> 0 bytes pythonPackages/pygtk/pygtk-2.8.6.tar.gz | Bin 951939 -> 0 bytes pythonPackages/pythonPackages.ecl | 0 pythonPackages/qpid/qpid-python-0.32.tar.gz | Bin 161339 -> 0 bytes pythonPackages/thrift/TSCons.py | 35 - pythonPackages/thrift/TSerialization.py | 38 - pythonPackages/thrift/Thrift.py | 157 - pythonPackages/thrift/__init__.py | 20 - pythonPackages/thrift/protocol/TBase.py | 81 - .../thrift/protocol/TBinaryProtocol.py | 260 -- .../thrift/protocol/TCompactProtocol.py | 403 --- pythonPackages/thrift/protocol/TProtocol.py | 406 --- pythonPackages/thrift/protocol/__init__.py | 20 - pythonPackages/thrift/protocol/fastbinary.c | 1219 -------- pythonPackages/thrift/server/THttpServer.py | 87 - .../thrift/server/TNonblockingServer.py | 346 --- .../thrift/server/TProcessPoolServer.py | 118 - pythonPackages/thrift/server/TServer.py | 269 -- pythonPackages/thrift/server/__init__.py | 20 - .../thrift/transport/THttpClient.py | 149 - pythonPackages/thrift/transport/TSSLSocket.py | 202 -- pythonPackages/thrift/transport/TSocket.py | 176 -- pythonPackages/thrift/transport/TTransport.py | 330 -- pythonPackages/thrift/transport/TTwisted.py | 221 -- .../thrift/transport/TZlibTransport.py | 248 -- pythonPackages/thrift/transport/__init__.py | 20 - pythonPackages/tpg/TPG-3.1.2.tar.gz | Bin 275781 -> 0 bytes pythonPackages/tpg/TPG-3.2.2.tar.gz | Bin 379868 -> 0 bytes pythonPackages/werkzeug/AUTHORS | 41 - pythonPackages/werkzeug/CHANGES | 363 --- pythonPackages/werkzeug/LICENSE | 29 - pythonPackages/werkzeug/MANIFEST.in | 8 - pythonPackages/werkzeug/Makefile | 29 - pythonPackages/werkzeug/PKG-INFO | 67 - .../werkzeug/Werkzeug.egg-info/PKG-INFO | 67 - .../werkzeug/Werkzeug.egg-info/SOURCES.txt | 437 --- .../Werkzeug.egg-info/dependency_links.txt | 1 - .../werkzeug/Werkzeug.egg-info/top_level.txt | 1 - pythonPackages/werkzeug/artwork/logo.png | Bin 35069 -> 0 bytes pythonPackages/werkzeug/artwork/logo.svg | 88 - pythonPackages/werkzeug/docs/Makefile | 81 - .../werkzeug/docs/_build/html/.buildinfo | 4 - .../_build/html/_images/debug-screenshot.png | Bin 81612 -> 0 bytes .../_build/html/_images/shorty-screenshot.png | Bin 85078 -> 0 bytes .../docs/_build/html/_sources/changes.txt | 95 - .../_build/html/_sources/contrib/atom.txt | 10 - .../_build/html/_sources/contrib/cache.txt | 26 - .../_build/html/_sources/contrib/fixers.txt | 15 - .../_build/html/_sources/contrib/index.txt | 19 - .../_build/html/_sources/contrib/iterio.txt | 8 - .../_build/html/_sources/contrib/lint.txt | 7 - .../_build/html/_sources/contrib/profiler.txt | 11 - .../html/_sources/contrib/securecookie.txt | 36 - .../_build/html/_sources/contrib/sessions.txt | 50 - .../_build/html/_sources/contrib/wrappers.txt | 23 - .../_build/html/_sources/datastructures.txt | 138 - .../docs/_build/html/_sources/debug.txt | 64 - .../_build/html/_sources/deployment/cgi.txt | 44 - .../html/_sources/deployment/fastcgi.txt | 130 - .../_build/html/_sources/deployment/index.txt | 16 - .../html/_sources/deployment/mod_wsgi.txt | 82 - .../html/_sources/deployment/proxying.txt | 54 - .../docs/_build/html/_sources/exceptions.txt | 135 - .../docs/_build/html/_sources/http.txt | 131 - .../docs/_build/html/_sources/index.txt | 91 - .../_build/html/_sources/installation.txt | 65 - .../docs/_build/html/_sources/levels.txt | 68 - .../docs/_build/html/_sources/local.txt | 89 - .../docs/_build/html/_sources/middlewares.txt | 19 - .../docs/_build/html/_sources/quickstart.txt | 324 -- .../_build/html/_sources/request_data.txt | 115 - .../docs/_build/html/_sources/routing.txt | 199 -- .../docs/_build/html/_sources/script.txt | 62 - .../docs/_build/html/_sources/serving.txt | 125 - .../docs/_build/html/_sources/templates.txt | 146 - .../docs/_build/html/_sources/terms.txt | 44 - .../docs/_build/html/_sources/test.txt | 170 - .../docs/_build/html/_sources/tutorial.txt | 888 ------ .../docs/_build/html/_sources/unicode.txt | 136 - .../docs/_build/html/_sources/utils.txt | 85 - .../docs/_build/html/_sources/wrappers.txt | 180 -- .../docs/_build/html/_sources/wsgi.txt | 52 - .../docs/_build/html/_static/background.png | Bin 73096 -> 0 bytes .../docs/_build/html/_static/basic.css | 455 --- .../_build/html/_static/codebackground.png | Bin 8307 -> 0 bytes .../docs/_build/html/_static/contents.png | Bin 5527 -> 0 bytes .../_build/html/_static/debug-screenshot.png | Bin 81612 -> 0 bytes .../docs/_build/html/_static/default.css | 250 -- .../docs/_build/html/_static/doctools.js | 247 -- .../docs/_build/html/_static/favicon.ico | Bin 1150 -> 0 bytes .../docs/_build/html/_static/file.png | Bin 392 -> 0 bytes .../docs/_build/html/_static/header.png | Bin 86871 -> 0 bytes .../docs/_build/html/_static/jquery.js | 151 - .../docs/_build/html/_static/minus.png | Bin 199 -> 0 bytes .../docs/_build/html/_static/navigation.png | Bin 218 -> 0 bytes .../_build/html/_static/navigation_active.png | Bin 231 -> 0 bytes .../docs/_build/html/_static/plus.png | Bin 199 -> 0 bytes .../docs/_build/html/_static/pygments.css | 69 - .../docs/_build/html/_static/searchtools.js | 501 --- .../_build/html/_static/shorty-screenshot.png | Bin 85078 -> 0 bytes .../docs/_build/html/_static/style.css | 423 --- .../docs/_build/html/_static/underscore.js | 16 - .../docs/_build/html/_static/werkzeug.js | 10 - .../docs/_build/html/_static/werkzeug.png | Bin 19109 -> 0 bytes .../werkzeug/docs/_build/html/changes.html | 544 ---- .../docs/_build/html/contrib/atom.html | 198 -- .../docs/_build/html/contrib/cache.html | 468 --- .../docs/_build/html/contrib/fixers.html | 177 -- .../docs/_build/html/contrib/index.html | 84 - .../docs/_build/html/contrib/iterio.html | 93 - .../docs/_build/html/contrib/lint.html | 100 - .../docs/_build/html/contrib/profiler.html | 112 - .../_build/html/contrib/securecookie.html | 362 --- .../docs/_build/html/contrib/sessions.html | 270 -- .../docs/_build/html/contrib/wrappers.html | 268 -- .../docs/_build/html/datastructures.html | 1661 ---------- .../werkzeug/docs/_build/html/debug.html | 145 - .../docs/_build/html/deployment/cgi.html | 99 - .../docs/_build/html/deployment/fastcgi.html | 179 -- .../docs/_build/html/deployment/index.html | 84 - .../docs/_build/html/deployment/mod_wsgi.html | 129 - .../docs/_build/html/deployment/proxying.html | 109 - .../werkzeug/docs/_build/html/exceptions.html | 383 --- .../werkzeug/docs/_build/html/genindex.html | 1346 -------- .../werkzeug/docs/_build/html/http.html | 749 ----- .../werkzeug/docs/_build/html/index.html | 336 -- .../docs/_build/html/installation.html | 121 - .../werkzeug/docs/_build/html/levels.html | 124 - .../werkzeug/docs/_build/html/local.html | 274 -- .../docs/_build/html/middlewares.html | 149 - .../werkzeug/docs/_build/html/objects.inv | Bin 5035 -> 0 bytes .../docs/_build/html/py-modindex.html | 129 - .../werkzeug/docs/_build/html/quickstart.html | 371 --- .../docs/_build/html/request_data.html | 163 - .../werkzeug/docs/_build/html/routing.html | 907 ------ .../werkzeug/docs/_build/html/script.html | 241 -- .../werkzeug/docs/_build/html/search.html | 63 - .../werkzeug/docs/_build/html/searchindex.js | 1 - .../werkzeug/docs/_build/html/serving.html | 233 -- .../werkzeug/docs/_build/html/templates.html | 233 -- .../werkzeug/docs/_build/html/terms.html | 98 - .../werkzeug/docs/_build/html/test.html | 503 --- .../werkzeug/docs/_build/html/tutorial.html | 832 ----- .../werkzeug/docs/_build/html/unicode.html | 184 -- .../werkzeug/docs/_build/html/utils.html | 944 ------ .../werkzeug/docs/_build/html/wrappers.html | 1411 --------- .../werkzeug/docs/_build/html/wsgi.html | 443 --- .../werkzeug/docs/_static/background.png | Bin 73096 -> 0 bytes .../werkzeug/docs/_static/codebackground.png | Bin 8307 -> 0 bytes .../werkzeug/docs/_static/contents.png | Bin 5527 -> 0 bytes .../docs/_static/debug-screenshot.png | Bin 81612 -> 0 bytes .../werkzeug/docs/_static/favicon.ico | Bin 1150 -> 0 bytes .../werkzeug/docs/_static/header.png | Bin 86871 -> 0 bytes .../werkzeug/docs/_static/navigation.png | Bin 218 -> 0 bytes .../docs/_static/navigation_active.png | Bin 231 -> 0 bytes .../docs/_static/shorty-screenshot.png | Bin 85078 -> 0 bytes .../werkzeug/docs/_static/style.css | 423 --- .../werkzeug/docs/_static/werkzeug.js | 10 - .../werkzeug/docs/_static/werkzeug.png | Bin 19109 -> 0 bytes .../werkzeug/docs/_templates/genindex.html | 37 - .../werkzeug/docs/_templates/layout.html | 82 - .../werkzeug/docs/_templates/search.html | 39 - pythonPackages/werkzeug/docs/changes.rst | 95 - pythonPackages/werkzeug/docs/conf.py | 205 -- pythonPackages/werkzeug/docs/contrib/atom.rst | 10 - .../werkzeug/docs/contrib/cache.rst | 26 - .../werkzeug/docs/contrib/fixers.rst | 15 - .../werkzeug/docs/contrib/index.rst | 19 - .../werkzeug/docs/contrib/iterio.rst | 8 - pythonPackages/werkzeug/docs/contrib/lint.rst | 7 - .../werkzeug/docs/contrib/profiler.rst | 11 - .../werkzeug/docs/contrib/securecookie.rst | 36 - .../werkzeug/docs/contrib/sessions.rst | 50 - .../werkzeug/docs/contrib/wrappers.rst | 23 - .../werkzeug/docs/datastructures.rst | 138 - pythonPackages/werkzeug/docs/debug.rst | 64 - .../werkzeug/docs/deployment/cgi.rst | 44 - .../werkzeug/docs/deployment/fastcgi.rst | 130 - .../werkzeug/docs/deployment/index.rst | 16 - .../werkzeug/docs/deployment/mod_wsgi.rst | 82 - .../werkzeug/docs/deployment/proxying.rst | 54 - pythonPackages/werkzeug/docs/exceptions.rst | 135 - pythonPackages/werkzeug/docs/http.rst | 131 - pythonPackages/werkzeug/docs/index.rst | 91 - pythonPackages/werkzeug/docs/installation.rst | 65 - pythonPackages/werkzeug/docs/levels.rst | 68 - pythonPackages/werkzeug/docs/local.rst | 89 - pythonPackages/werkzeug/docs/make.bat | 95 - pythonPackages/werkzeug/docs/makearchive.py | 7 - pythonPackages/werkzeug/docs/middlewares.rst | 19 - pythonPackages/werkzeug/docs/quickstart.rst | 324 -- pythonPackages/werkzeug/docs/request_data.rst | 115 - pythonPackages/werkzeug/docs/routing.rst | 199 -- pythonPackages/werkzeug/docs/script.rst | 62 - pythonPackages/werkzeug/docs/serving.rst | 125 - pythonPackages/werkzeug/docs/templates.rst | 146 - pythonPackages/werkzeug/docs/terms.rst | 44 - pythonPackages/werkzeug/docs/test.rst | 170 - pythonPackages/werkzeug/docs/tutorial.rst | 888 ------ pythonPackages/werkzeug/docs/unicode.rst | 136 - pythonPackages/werkzeug/docs/utils.rst | 85 - pythonPackages/werkzeug/docs/werkzeugext.py | 15 - pythonPackages/werkzeug/docs/wrappers.rst | 180 -- pythonPackages/werkzeug/docs/wsgi.rst | 52 - pythonPackages/werkzeug/examples/README | 103 - .../werkzeug/examples/contrib/README | 1 - .../werkzeug/examples/contrib/securecookie.py | 49 - .../werkzeug/examples/contrib/sessions.py | 41 - .../werkzeug/examples/cookieauth.py | 106 - .../werkzeug/examples/coolmagic/__init__.py | 11 - .../examples/coolmagic/application.py | 78 - .../werkzeug/examples/coolmagic/helpers.py | 18 - .../examples/coolmagic/public/style.css | 10 - .../examples/coolmagic/templates/layout.html | 13 - .../coolmagic/templates/static/about.html | 10 - .../coolmagic/templates/static/index.html | 13 - .../coolmagic/templates/static/not_found.html | 8 - .../werkzeug/examples/coolmagic/utils.py | 105 - .../examples/coolmagic/views/__init__.py | 10 - .../examples/coolmagic/views/static.py | 36 - .../werkzeug/examples/couchy/README | 8 - .../werkzeug/examples/couchy/__init__.py | 0 .../werkzeug/examples/couchy/application.py | 44 - .../werkzeug/examples/couchy/models.py | 43 - .../werkzeug/examples/couchy/static/style.css | 108 - .../examples/couchy/templates/display.html | 8 - .../examples/couchy/templates/layout.html | 17 - .../examples/couchy/templates/list.html | 19 - .../examples/couchy/templates/new.html | 14 - .../examples/couchy/templates/not_found.html | 8 - .../werkzeug/examples/couchy/utils.py | 63 - .../werkzeug/examples/couchy/views.py | 61 - .../werkzeug/examples/cupoftee/__init__.py | 11 - .../werkzeug/examples/cupoftee/application.py | 110 - .../werkzeug/examples/cupoftee/db.py | 76 - .../werkzeug/examples/cupoftee/network.py | 133 - .../werkzeug/examples/cupoftee/pages.py | 84 - .../examples/cupoftee/shared/content.png | Bin 230 -> 0 bytes .../examples/cupoftee/shared/down.png | Bin 376 -> 0 bytes .../examples/cupoftee/shared/favicon.ico | Bin 48558 -> 0 bytes .../examples/cupoftee/shared/header.png | Bin 7936 -> 0 bytes .../examples/cupoftee/shared/logo.png | Bin 50158 -> 0 bytes .../examples/cupoftee/shared/style.css | 122 - .../werkzeug/examples/cupoftee/shared/up.png | Bin 389 -> 0 bytes .../examples/cupoftee/templates/layout.html | 21 - .../cupoftee/templates/missingpage.html | 8 - .../examples/cupoftee/templates/search.html | 36 - .../examples/cupoftee/templates/server.html | 29 - .../cupoftee/templates/serverlist.html | 59 - .../werkzeug/examples/cupoftee/utils.py | 19 - .../werkzeug/examples/httpbasicauth.py | 44 - .../werkzeug/examples/i18nurls/__init__.py | 1 - .../werkzeug/examples/i18nurls/application.py | 85 - .../examples/i18nurls/templates/about.html | 4 - .../examples/i18nurls/templates/blog.html | 4 - .../examples/i18nurls/templates/index.html | 5 - .../examples/i18nurls/templates/layout.html | 22 - .../werkzeug/examples/i18nurls/urls.py | 11 - .../werkzeug/examples/i18nurls/views.py | 22 - .../werkzeug/examples/manage-coolmagic.py | 20 - .../werkzeug/examples/manage-couchy.py | 17 - .../werkzeug/examples/manage-cupoftee.py | 19 - .../werkzeug/examples/manage-i18nurls.py | 20 - .../werkzeug/examples/manage-plnt.py | 65 - .../werkzeug/examples/manage-shorty.py | 17 - .../werkzeug/examples/manage-simplewiki.py | 46 - .../werkzeug/examples/manage-webpylike.py | 26 - .../werkzeug/examples/partial/README | 3 - .../examples/partial/complex_routing.py | 19 - .../werkzeug/examples/plnt/__init__.py | 11 - .../werkzeug/examples/plnt/database.py | 69 - .../werkzeug/examples/plnt/shared/style.css | 133 - pythonPackages/werkzeug/examples/plnt/sync.py | 105 - .../examples/plnt/templates/about.html | 19 - .../examples/plnt/templates/index.html | 26 - .../examples/plnt/templates/layout.html | 23 - .../werkzeug/examples/plnt/utils.py | 125 - .../werkzeug/examples/plnt/views.py | 40 - .../werkzeug/examples/plnt/webapp.py | 54 - .../werkzeug/examples/shorty/__init__.py | 0 .../werkzeug/examples/shorty/application.py | 41 - .../werkzeug/examples/shorty/models.py | 35 - .../werkzeug/examples/shorty/static/style.css | 108 - .../examples/shorty/templates/display.html | 8 - .../examples/shorty/templates/layout.html | 17 - .../examples/shorty/templates/list.html | 19 - .../examples/shorty/templates/new.html | 14 - .../examples/shorty/templates/not_found.html | 8 - .../werkzeug/examples/shorty/utils.py | 72 - .../werkzeug/examples/shorty/views.py | 52 - .../werkzeug/examples/simplewiki/__init__.py | 12 - .../werkzeug/examples/simplewiki/actions.py | 187 -- .../examples/simplewiki/application.py | 97 - .../werkzeug/examples/simplewiki/database.py | 131 - .../examples/simplewiki/shared/style.css | 210 -- .../examples/simplewiki/specialpages.py | 49 - .../simplewiki/templates/action_diff.html | 27 - .../simplewiki/templates/action_edit.html | 26 - .../simplewiki/templates/action_log.html | 44 - .../simplewiki/templates/action_revert.html | 31 - .../simplewiki/templates/action_show.html | 12 - .../examples/simplewiki/templates/layout.html | 46 - .../examples/simplewiki/templates/macros.xml | 18 - .../simplewiki/templates/missing_action.html | 12 - .../simplewiki/templates/page_index.html | 18 - .../simplewiki/templates/page_missing.html | 24 - .../simplewiki/templates/recent_changes.html | 26 - .../werkzeug/examples/simplewiki/utils.py | 145 - pythonPackages/werkzeug/examples/upload.py | 42 - .../werkzeug/examples/webpylike/example.py | 30 - .../werkzeug/examples/webpylike/webpylike.py | 69 - pythonPackages/werkzeug/setup.cfg | 8 - pythonPackages/werkzeug/setup.py | 83 - .../werkzeug/tests/contrib/test_cache.py | 13 - .../werkzeug/tests/contrib/test_fixers.py | 138 - .../werkzeug/tests/contrib/test_iterio.py | 38 - .../tests/contrib/test_securecookie.py | 45 - .../werkzeug/tests/contrib/test_sessions.py | 64 - .../werkzeug/tests/contrib/test_testtools.py | 48 - .../werkzeug/tests/contrib/test_wrappers.py | 78 - .../werkzeug/tests/multipart/collect.py | 55 - .../multipart/firefox3-2png1txt/file1.png | Bin 523 -> 0 bytes .../multipart/firefox3-2png1txt/file2.png | Bin 703 -> 0 bytes .../multipart/firefox3-2png1txt/request.txt | Bin 1722 -> 0 bytes .../multipart/firefox3-2png1txt/text.txt | 1 - .../multipart/firefox3-2pnglongtext/file1.png | Bin 781 -> 0 bytes .../multipart/firefox3-2pnglongtext/file2.png | Bin 733 -> 0 bytes .../firefox3-2pnglongtext/request.txt | Bin 2023 -> 0 bytes .../multipart/firefox3-2pnglongtext/text.txt | 3 - .../tests/multipart/ie6-2png1txt/file1.png | Bin 523 -> 0 bytes .../tests/multipart/ie6-2png1txt/file2.png | Bin 703 -> 0 bytes .../tests/multipart/ie6-2png1txt/request.txt | Bin 1781 -> 0 bytes .../tests/multipart/ie6-2png1txt/text.txt | 1 - .../tests/multipart/ie7_full_path_request.txt | Bin 30018 -> 0 bytes .../tests/multipart/opera8-2png1txt/file1.png | Bin 582 -> 0 bytes .../tests/multipart/opera8-2png1txt/file2.png | Bin 733 -> 0 bytes .../multipart/opera8-2png1txt/request.txt | Bin 1723 -> 0 bytes .../tests/multipart/opera8-2png1txt/text.txt | 1 - .../multipart/webkit3-2png1txt/file1.png | Bin 1002 -> 0 bytes .../multipart/webkit3-2png1txt/file2.png | Bin 952 -> 0 bytes .../multipart/webkit3-2png1txt/request.txt | Bin 2391 -> 0 bytes .../tests/multipart/webkit3-2png1txt/text.txt | 1 - pythonPackages/werkzeug/tests/res/test.txt | 1 - pythonPackages/werkzeug/tests/test_compat.py | 78 - .../werkzeug/tests/test_datastructures.py | 537 ---- pythonPackages/werkzeug/tests/test_debug.py | 141 - .../werkzeug/tests/test_exceptions.py | 74 - .../werkzeug/tests/test_formparser.py | 342 -- pythonPackages/werkzeug/tests/test_http.py | 295 -- .../werkzeug/tests/test_internal.py | 67 - pythonPackages/werkzeug/tests/test_local.py | 111 - pythonPackages/werkzeug/tests/test_routing.py | 372 --- .../werkzeug/tests/test_security.py | 35 - pythonPackages/werkzeug/tests/test_serving.py | 56 - .../werkzeug/tests/test_templates.py | 117 - pythonPackages/werkzeug/tests/test_test.py | 384 --- pythonPackages/werkzeug/tests/test_urls.py | 128 - pythonPackages/werkzeug/tests/test_utils.py | 277 -- .../werkzeug/tests/test_wrappers.py | 629 ---- pythonPackages/werkzeug/tests/test_wsgi.py | 195 -- pythonPackages/werkzeug/werkzeug/__init__.py | 157 - pythonPackages/werkzeug/werkzeug/_internal.py | 398 --- .../werkzeug/werkzeug/contrib/__init__.py | 16 - .../werkzeug/werkzeug/contrib/atom.py | 343 --- .../werkzeug/werkzeug/contrib/cache.py | 511 --- .../werkzeug/werkzeug/contrib/fixers.py | 205 -- .../werkzeug/werkzeug/contrib/iterio.py | 281 -- .../werkzeug/werkzeug/contrib/jsrouting.py | 258 -- .../werkzeug/werkzeug/contrib/kickstart.py | 284 -- .../werkzeug/werkzeug/contrib/limiter.py | 36 - .../werkzeug/werkzeug/contrib/lint.py | 331 -- .../werkzeug/werkzeug/contrib/profiler.py | 116 - .../werkzeug/werkzeug/contrib/securecookie.py | 328 -- .../werkzeug/werkzeug/contrib/sessions.py | 342 -- .../werkzeug/werkzeug/contrib/testtools.py | 66 - .../werkzeug/werkzeug/contrib/wrappers.py | 275 -- .../werkzeug/werkzeug/datastructures.py | 2331 -------------- .../werkzeug/werkzeug/debug/__init__.py | 166 - .../werkzeug/werkzeug/debug/console.py | 201 -- .../werkzeug/werkzeug/debug/render.py | 103 - .../werkzeug/werkzeug/debug/repr.py | 238 -- .../werkzeug/werkzeug/debug/shared/body.tmpl | 81 - .../werkzeug/debug/shared/codetable.tmpl | 8 - .../werkzeug/debug/shared/console.png | Bin 507 -> 0 bytes .../werkzeug/debug/shared/debugger.js | 196 -- .../werkzeug/werkzeug/debug/shared/jquery.js | 19 - .../werkzeug/werkzeug/debug/shared/less.png | Bin 191 -> 0 bytes .../werkzeug/werkzeug/debug/shared/more.png | Bin 200 -> 0 bytes .../werkzeug/werkzeug/debug/shared/source.png | Bin 818 -> 0 bytes .../werkzeug/werkzeug/debug/shared/style.css | 93 - .../werkzeug/debug/shared/vartable.tmpl | 16 - .../werkzeug/werkzeug/debug/tbtools.py | 297 -- .../werkzeug/debug/templates/console.html | 28 - .../werkzeug/debug/templates/dump_object.html | 14 - .../werkzeug/debug/templates/frame.html | 6 - .../debug/templates/help_command.html | 10 - .../werkzeug/debug/templates/source.html | 8 - .../debug/templates/traceback_full.html | 55 - .../debug/templates/traceback_plaintext.html | 6 - .../debug/templates/traceback_summary.html | 23 - .../werkzeug/werkzeug/debug/utils.py | 20 - .../werkzeug/werkzeug/exceptions.py | 459 --- .../werkzeug/werkzeug/formparser.py | 352 --- pythonPackages/werkzeug/werkzeug/http.py | 578 ---- pythonPackages/werkzeug/werkzeug/local.py | 405 --- .../werkzeug/werkzeug/posixemulation.py | 104 - pythonPackages/werkzeug/werkzeug/routing.py | 1434 --------- pythonPackages/werkzeug/werkzeug/script.py | 303 -- pythonPackages/werkzeug/werkzeug/security.py | 104 - pythonPackages/werkzeug/werkzeug/serving.py | 533 ---- pythonPackages/werkzeug/werkzeug/templates.py | 392 --- pythonPackages/werkzeug/werkzeug/test.py | 808 ----- pythonPackages/werkzeug/werkzeug/testapp.py | 214 -- pythonPackages/werkzeug/werkzeug/urls.py | 456 --- .../werkzeug/werkzeug/useragents.py | 185 -- pythonPackages/werkzeug/werkzeug/utils.py | 674 ---- pythonPackages/werkzeug/werkzeug/wrappers.py | 1495 --------- pythonPackages/werkzeug/werkzeug/wsgi.py | 764 ----- .../Installer.gfe/__init__.py | 0 .../Installer.gfe/component.spec | 1 - rpms/build/common/lookupRPM.sh | 72 +- .../Installer.cherrypy/component.spec | 73 - .../Installer.cycler/component.spec | 112 - .../Installer.cython/component.spec | 114 - .../Installer.dynamicserialize/component.spec | 77 - .../Installer.nose/component.spec | 95 - .../Installer.pmw/component.spec | 98 - .../Installer.pupynere/component.spec | 87 - .../Installer.python-awips/component.spec | 97 - .../Installer.thrift/component.spec | 65 - .../Installer.tpg/component.spec | 108 - .../Installer.ufpy/component.spec | 71 - .../Installer.werkzeug/component.spec | 92 - .../deploy.builder/build.sh | 104 - .../deploy.builder/install-setuptools.sh | 52 - 1297 files changed, 22 insertions(+), 157766 deletions(-) delete mode 100644 pythonPackages/.project delete mode 100644 pythonPackages/.pydevproject delete mode 100644 pythonPackages/.settings/org.eclipse.core.resources.prefs delete mode 100644 pythonPackages/README delete mode 100644 pythonPackages/VERSIONS delete mode 100644 pythonPackages/Werkzeug-0.12.1/AUTHORS delete mode 100644 pythonPackages/Werkzeug-0.12.1/CHANGES delete mode 100644 pythonPackages/Werkzeug-0.12.1/LICENSE delete mode 100644 pythonPackages/Werkzeug-0.12.1/MANIFEST.in delete mode 100644 pythonPackages/Werkzeug-0.12.1/Makefile delete mode 100644 pythonPackages/Werkzeug-0.12.1/PKG-INFO delete mode 100644 pythonPackages/Werkzeug-0.12.1/README.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/PKG-INFO delete mode 100644 pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/SOURCES.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/dependency_links.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/not-zip-safe delete mode 100644 pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/requires.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/top_level.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/artwork/logo.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/artwork/logo.svg delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/Makefile delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/background.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/codebackground.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/contents.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/debug-screenshot.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/favicon.ico delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/header.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/navigation.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/navigation_active.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/shortly.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/shorty-screenshot.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/style.css delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/werkzeug.js delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_static/werkzeug.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_templates/sidebarintro.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/_templates/sidebarlogo.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/changes.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/conf.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/contents.rst.inc delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/contrib/atom.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/contrib/cache.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/contrib/fixers.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/contrib/index.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/contrib/iterio.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/contrib/lint.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/contrib/profiler.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/contrib/securecookie.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/contrib/sessions.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/contrib/wrappers.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/datastructures.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/debug.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/deployment/cgi.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/deployment/fastcgi.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/deployment/index.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/deployment/mod_wsgi.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/deployment/proxying.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/exceptions.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/filesystem.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/http.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/index.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/installation.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/latexindex.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/levels.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/local.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/logo.pdf delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/make.bat delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/makearchive.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/middlewares.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/python3.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/quickstart.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/request_data.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/routing.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/serving.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/terms.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/test.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/transition.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/tutorial.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/unicode.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/urls.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/utils.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/werkzeugext.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/werkzeugstyle.sty delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/wrappers.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/docs/wsgi.rst delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/README delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/contrib/README delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/contrib/securecookie.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/contrib/sessions.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cookieauth.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/coolmagic/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/coolmagic/application.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/coolmagic/helpers.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/coolmagic/public/style.css delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/layout.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/static/about.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/static/index.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/static/not_found.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/coolmagic/utils.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/coolmagic/views/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/coolmagic/views/static.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/couchy/README delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/couchy/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/couchy/application.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/couchy/models.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/couchy/static/style.css delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/display.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/layout.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/list.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/new.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/not_found.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/couchy/utils.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/couchy/views.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/application.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/db.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/network.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/pages.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/content.png delete mode 100755 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/down.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/favicon.ico delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/header.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/logo.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/style.css delete mode 100755 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/up.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/layout.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/missingpage.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/search.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/server.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/serverlist.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/cupoftee/utils.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/httpbasicauth.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/i18nurls/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/i18nurls/application.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/about.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/blog.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/index.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/layout.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/i18nurls/urls.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/i18nurls/views.py delete mode 100755 pythonPackages/Werkzeug-0.12.1/examples/manage-coolmagic.py delete mode 100755 pythonPackages/Werkzeug-0.12.1/examples/manage-couchy.py delete mode 100755 pythonPackages/Werkzeug-0.12.1/examples/manage-cupoftee.py delete mode 100755 pythonPackages/Werkzeug-0.12.1/examples/manage-i18nurls.py delete mode 100755 pythonPackages/Werkzeug-0.12.1/examples/manage-plnt.py delete mode 100755 pythonPackages/Werkzeug-0.12.1/examples/manage-shorty.py delete mode 100755 pythonPackages/Werkzeug-0.12.1/examples/manage-simplewiki.py delete mode 100755 pythonPackages/Werkzeug-0.12.1/examples/manage-webpylike.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/partial/README delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/partial/complex_routing.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/plnt/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/plnt/database.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/plnt/shared/style.css delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/plnt/sync.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/plnt/templates/about.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/plnt/templates/index.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/plnt/templates/layout.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/plnt/utils.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/plnt/views.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/plnt/webapp.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shortly/shortly.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shortly/static/style.css delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/404.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/layout.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/new_url.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/short_link_details.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shorty/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shorty/application.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shorty/models.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shorty/static/style.css delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/display.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/layout.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/list.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/new.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/not_found.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shorty/utils.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/shorty/views.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/actions.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/application.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/database.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/shared/style.css delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/specialpages.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_diff.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_edit.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_log.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_revert.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_show.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/layout.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/macros.xml delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/missing_action.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/page_index.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/page_missing.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/recent_changes.html delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/simplewiki/utils.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/upload.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/webpylike/example.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/examples/webpylike/webpylike.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/setup.cfg delete mode 100644 pythonPackages/Werkzeug-0.12.1/setup.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/conftest.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/contrib/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/contrib/test_atom.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/contrib/test_cache.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/contrib/test_fixers.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/contrib/test_iterio.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/contrib/test_securecookie.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/contrib/test_sessions.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/contrib/test_wrappers.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/hypothesis/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/hypothesis/test_urls.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2png1txt/file1.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2png1txt/file2.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2png1txt/request.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2png1txt/text.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2pnglongtext/file1.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2pnglongtext/file2.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2pnglongtext/request.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2pnglongtext/text.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/ie6-2png1txt/file1.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/ie6-2png1txt/file2.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/ie6-2png1txt/request.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/ie6-2png1txt/text.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/ie7_full_path_request.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/opera8-2png1txt/file1.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/opera8-2png1txt/file2.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/opera8-2png1txt/request.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/opera8-2png1txt/text.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/test_collect.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/webkit3-2png1txt/file1.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/webkit3-2png1txt/file2.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/webkit3-2png1txt/request.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/multipart/webkit3-2png1txt/text.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/res/test.txt delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_compat.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_datastructures.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_debug.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_exceptions.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_formparser.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_http.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_internal.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_local.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_routing.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_security.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_serving.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_test.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_urls.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_utils.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_wrappers.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/tests/test_wsgi.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/_compat.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/_internal.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/_reloader.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/atom.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/cache.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/fixers.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/iterio.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/jsrouting.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/limiter.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/lint.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/profiler.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/securecookie.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/sessions.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/testtools.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/contrib/wrappers.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/datastructures.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/__init__.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/console.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/repr.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/shared/FONT_LICENSE delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/shared/console.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/shared/debugger.js delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/shared/jquery.js delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/shared/less.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/shared/more.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/shared/source.png delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/shared/style.css delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/shared/ubuntu.ttf delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/debug/tbtools.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/exceptions.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/filesystem.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/formparser.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/http.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/local.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/posixemulation.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/routing.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/script.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/security.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/serving.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/test.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/testapp.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/urls.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/useragents.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/utils.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/wrappers.py delete mode 100644 pythonPackages/Werkzeug-0.12.1/werkzeug/wsgi.py delete mode 100755 pythonPackages/cherrypy/PKG-INFO delete mode 100755 pythonPackages/cherrypy/README.txt delete mode 100755 pythonPackages/cherrypy/cherrypy/LICENSE.txt delete mode 100755 pythonPackages/cherrypy/cherrypy/__init__.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cpcgifs.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cpchecker.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cpconfig.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cpdispatch.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cperror.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cplogging.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cpmodpy.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cprequest.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cpserver.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cpthreadinglocal.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cptools.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cptree.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cpwsgi.py delete mode 100755 pythonPackages/cherrypy/cherrypy/_cpwsgi_server.py delete mode 100755 pythonPackages/cherrypy/cherrypy/cherryd delete mode 100755 pythonPackages/cherrypy/cherrypy/favicon.ico delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/__init__.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/auth.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/caching.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/covercp.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/cptools.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/encoding.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/http.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/httpauth.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/profiler.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/safemime.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/sessions.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/static.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/tidy.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/wsgiapp.py delete mode 100755 pythonPackages/cherrypy/cherrypy/lib/xmlrpc.py delete mode 100755 pythonPackages/cherrypy/cherrypy/process/__init__.py delete mode 100755 pythonPackages/cherrypy/cherrypy/process/plugins.py delete mode 100755 pythonPackages/cherrypy/cherrypy/process/servers.py delete mode 100755 pythonPackages/cherrypy/cherrypy/process/win32.py delete mode 100755 pythonPackages/cherrypy/cherrypy/process/wspbus.py delete mode 100755 pythonPackages/cherrypy/cherrypy/scaffold/__init__.py delete mode 100755 pythonPackages/cherrypy/cherrypy/scaffold/example.conf delete mode 100755 pythonPackages/cherrypy/cherrypy/scaffold/site.conf delete mode 100755 pythonPackages/cherrypy/cherrypy/scaffold/static/made_with_cherrypy_small.png delete mode 100755 pythonPackages/cherrypy/cherrypy/test/__init__.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/benchmark.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/checkerdemo.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/helper.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/logtest.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/modfcgid.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/modpy.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/modwsgi.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/py25.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/static/dirback.jpg delete mode 100755 pythonPackages/cherrypy/cherrypy/test/static/index.html delete mode 100755 pythonPackages/cherrypy/cherrypy/test/style.css delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test.pem delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_caching.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_config.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_conn.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_core.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_encoding.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_etags.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_http.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_httpauth.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_httplib.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_logging.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_misc_tools.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_objectmapping.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_proxy.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_refleaks.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_routes.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_safe_multipart.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_session.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_sessionauthenticate.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_states.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_states_demo.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_static.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_tidy.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_tools.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_tutorials.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_virtualhost.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_wsgi_ns.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_wsgi_vhost.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_wsgiapps.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/test_xmlrpc.py delete mode 100755 pythonPackages/cherrypy/cherrypy/test/webtest.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/README.txt delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/__init__.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/bonus-sqlobject.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/custom_error.html delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/pdf_file.pdf delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/tut01_helloworld.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/tut02_expose_methods.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/tut03_get_and_post.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/tut04_complex_site.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/tut05_derived_objects.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/tut06_default_method.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/tut07_sessions.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/tut08_generators_and_yield.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/tut09_files.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/tut10_http_errors.py delete mode 100755 pythonPackages/cherrypy/cherrypy/tutorial/tutorial.conf delete mode 100755 pythonPackages/cherrypy/cherrypy/wsgiserver/__init__.py delete mode 100755 pythonPackages/cherrypy/setup.py delete mode 100644 pythonPackages/cycler/cycler-0.10.0.tar.gz delete mode 100644 pythonPackages/cython/Cython-0.25.2.tar.gz delete mode 100644 pythonPackages/nose/AUTHORS delete mode 100644 pythonPackages/nose/CHANGELOG delete mode 100755 pythonPackages/nose/MANIFEST.in delete mode 100644 pythonPackages/nose/NEWS delete mode 100644 pythonPackages/nose/PKG-INFO delete mode 100644 pythonPackages/nose/README.txt delete mode 100755 pythonPackages/nose/bin/nosetests delete mode 100644 pythonPackages/nose/distribute_setup.py delete mode 100644 pythonPackages/nose/doc/.static/nose.css delete mode 100644 pythonPackages/nose/doc/.templates/index.html delete mode 100644 pythonPackages/nose/doc/.templates/indexsidebar.html delete mode 100644 pythonPackages/nose/doc/.templates/layout.html delete mode 100644 pythonPackages/nose/doc/.templates/page.html delete mode 100644 pythonPackages/nose/doc/Makefile delete mode 100644 pythonPackages/nose/doc/api.rst delete mode 100644 pythonPackages/nose/doc/api/commands.rst delete mode 100644 pythonPackages/nose/doc/api/config.rst delete mode 100644 pythonPackages/nose/doc/api/core.rst delete mode 100644 pythonPackages/nose/doc/api/importer.rst delete mode 100644 pythonPackages/nose/doc/api/inspector.rst delete mode 100644 pythonPackages/nose/doc/api/loader.rst delete mode 100644 pythonPackages/nose/doc/api/plugin_manager.rst delete mode 100644 pythonPackages/nose/doc/api/proxy.rst delete mode 100644 pythonPackages/nose/doc/api/result.rst delete mode 100644 pythonPackages/nose/doc/api/selector.rst delete mode 100644 pythonPackages/nose/doc/api/suite.rst delete mode 100644 pythonPackages/nose/doc/api/test_cases.rst delete mode 100644 pythonPackages/nose/doc/api/twistedtools.rst delete mode 100644 pythonPackages/nose/doc/api/util.rst delete mode 100644 pythonPackages/nose/doc/conf.py delete mode 100644 pythonPackages/nose/doc/contributing.rst delete mode 100644 pythonPackages/nose/doc/developing.rst delete mode 100644 pythonPackages/nose/doc/docstring.py delete mode 100644 pythonPackages/nose/doc/finding_tests.rst delete mode 100644 pythonPackages/nose/doc/further_reading.rst delete mode 100644 pythonPackages/nose/doc/index.html delete mode 100644 pythonPackages/nose/doc/index.rst delete mode 100644 pythonPackages/nose/doc/man.rst delete mode 100755 pythonPackages/nose/doc/manbuilder.py delete mode 100755 pythonPackages/nose/doc/manpage.py delete mode 100644 pythonPackages/nose/doc/more_info.rst delete mode 100644 pythonPackages/nose/doc/news.rst delete mode 100644 pythonPackages/nose/doc/plugins.rst delete mode 100644 pythonPackages/nose/doc/plugins/allmodules.rst delete mode 100644 pythonPackages/nose/doc/plugins/attrib.rst delete mode 100644 pythonPackages/nose/doc/plugins/builtin.rst delete mode 100644 pythonPackages/nose/doc/plugins/capture.rst delete mode 100644 pythonPackages/nose/doc/plugins/collect.rst delete mode 100644 pythonPackages/nose/doc/plugins/cover.rst delete mode 100644 pythonPackages/nose/doc/plugins/debug.rst delete mode 100644 pythonPackages/nose/doc/plugins/deprecated.rst delete mode 100644 pythonPackages/nose/doc/plugins/doctests.rst delete mode 100644 pythonPackages/nose/doc/plugins/documenting.rst delete mode 100644 pythonPackages/nose/doc/plugins/errorclasses.rst delete mode 100644 pythonPackages/nose/doc/plugins/failuredetail.rst delete mode 100644 pythonPackages/nose/doc/plugins/interface.rst delete mode 100644 pythonPackages/nose/doc/plugins/isolate.rst delete mode 100644 pythonPackages/nose/doc/plugins/logcapture.rst delete mode 100644 pythonPackages/nose/doc/plugins/multiprocess.rst delete mode 100644 pythonPackages/nose/doc/plugins/other.rst delete mode 100644 pythonPackages/nose/doc/plugins/prof.rst delete mode 100644 pythonPackages/nose/doc/plugins/skip.rst delete mode 100644 pythonPackages/nose/doc/plugins/testid.rst delete mode 100644 pythonPackages/nose/doc/plugins/testing.rst delete mode 100644 pythonPackages/nose/doc/plugins/writing.rst delete mode 100644 pythonPackages/nose/doc/plugins/xunit.rst delete mode 100644 pythonPackages/nose/doc/rtd-requirements.txt delete mode 100644 pythonPackages/nose/doc/setuptools_integration.rst delete mode 100644 pythonPackages/nose/doc/testing.rst delete mode 100644 pythonPackages/nose/doc/testing_tools.rst delete mode 100644 pythonPackages/nose/doc/usage.rst delete mode 100644 pythonPackages/nose/doc/writing_tests.rst delete mode 100644 pythonPackages/nose/examples/attrib_plugin.py delete mode 100644 pythonPackages/nose/examples/html_plugin/htmlplug.py delete mode 100644 pythonPackages/nose/examples/html_plugin/setup.py delete mode 100644 pythonPackages/nose/examples/plugin/plug.py delete mode 100644 pythonPackages/nose/examples/plugin/setup.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_addplugins/support/test.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_addplugins/test_addplugins.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_allmodules/support/mod.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_allmodules/support/test.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_allmodules/test_allmodules.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_doctest_fixtures/doctest_fixtures.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_doctest_fixtures/doctest_fixtures_fixtures.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_init_plugin/example.cfg delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_init_plugin/init_plugin.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_init_plugin/init_plugin.rst.py3.patch delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue089/support/unwanted_package/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue089/support/unwanted_package/test_spam.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue089/support/wanted_package/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue089/support/wanted_package/test_eggs.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue089/unwanted_package.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue097/plugintest_environment.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue107/plugin_exceptions.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue107/support/test_spam.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue119/empty_plugin.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue119/test_zeronine.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue142/errorclass_failure.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue142/support/errorclass_failing_test.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue142/support/errorclass_failure_plugin.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue142/support/errorclass_tests.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue145/imported_tests.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue145/support/package1/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue145/support/package1/test_module.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue145/support/package2c/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue145/support/package2c/test_module.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue145/support/package2f/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_issue145/support/package2f/test_module.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_multiprocess/multiprocess.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_multiprocess/multiprocess_fixtures.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_multiprocess/support/test_can_split.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_multiprocess/support/test_not_shared.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_multiprocess/support/test_shared.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_restricted_plugin_options/restricted_plugin_options.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_restricted_plugin_options/restricted_plugin_options.rst.py3.patch delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_restricted_plugin_options/support/bad.cfg delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_restricted_plugin_options/support/start.cfg delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_restricted_plugin_options/support/test.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_selector_plugin/selector_plugin.rst delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_selector_plugin/support/mymodule.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_selector_plugin/support/mypackage/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_selector_plugin/support/mypackage/math/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_selector_plugin/support/mypackage/math/basic.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_selector_plugin/support/mypackage/strings.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_selector_plugin/support/tests/math/basic.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_selector_plugin/support/tests/mymodule/my_function.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_selector_plugin/support/tests/strings/cat.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_selector_plugin/support/tests/testlib.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_xunit_plugin/support/nosetests.xml delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_xunit_plugin/support/test_skip.py delete mode 100644 pythonPackages/nose/functional_tests/doc_tests/test_xunit_plugin/test_skips.rst delete mode 100644 pythonPackages/nose/functional_tests/nosetests.xml delete mode 100644 pythonPackages/nose/functional_tests/support/att/test_attr.py delete mode 100644 pythonPackages/nose/functional_tests/support/attrib-static/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/coverage/blah.py delete mode 100644 pythonPackages/nose/functional_tests/support/coverage/tests/test_covered.py delete mode 100644 pythonPackages/nose/functional_tests/support/coverage2/.coverage delete mode 100644 pythonPackages/nose/functional_tests/support/coverage2/blah.py delete mode 100644 pythonPackages/nose/functional_tests/support/coverage2/moo.py delete mode 100644 pythonPackages/nose/functional_tests/support/coverage2/tests/test_covered.py delete mode 100644 pythonPackages/nose/functional_tests/support/ctx/mod_import_skip.py delete mode 100644 pythonPackages/nose/functional_tests/support/ctx/mod_setup_fails.py delete mode 100644 pythonPackages/nose/functional_tests/support/ctx/mod_setup_skip.py delete mode 100644 pythonPackages/nose/functional_tests/support/dir1/mod.py delete mode 100644 pythonPackages/nose/functional_tests/support/dir1/pak/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/dir1/pak/mod.py delete mode 100644 pythonPackages/nose/functional_tests/support/dir1/pak/sub/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/dir2/mod.py delete mode 100644 pythonPackages/nose/functional_tests/support/dir2/pak/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/dir2/pak/mod.py delete mode 100644 pythonPackages/nose/functional_tests/support/dir2/pak/sub/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/dir3/.hidden delete mode 100644 pythonPackages/nose/functional_tests/support/dtt/docs/doc.txt delete mode 100644 pythonPackages/nose/functional_tests/support/dtt/docs/errdoc.txt delete mode 100644 pythonPackages/nose/functional_tests/support/dtt/docs/nodoc.txt delete mode 100644 pythonPackages/nose/functional_tests/support/dtt/some_mod.py delete mode 100644 pythonPackages/nose/functional_tests/support/empty/.hidden delete mode 100644 pythonPackages/nose/functional_tests/support/ep/Some_plugin.egg-info/PKG-INFO delete mode 100644 pythonPackages/nose/functional_tests/support/ep/Some_plugin.egg-info/SOURCES.txt delete mode 100644 pythonPackages/nose/functional_tests/support/ep/Some_plugin.egg-info/dependency_links.txt delete mode 100644 pythonPackages/nose/functional_tests/support/ep/Some_plugin.egg-info/entry_points.txt delete mode 100644 pythonPackages/nose/functional_tests/support/ep/Some_plugin.egg-info/top_level.txt delete mode 100644 pythonPackages/nose/functional_tests/support/ep/setup.py delete mode 100644 pythonPackages/nose/functional_tests/support/ep/someplugin.py delete mode 100644 pythonPackages/nose/functional_tests/support/fdp/test_fdp.py delete mode 100644 pythonPackages/nose/functional_tests/support/fdp/test_fdp_no_capt.py delete mode 100644 pythonPackages/nose/functional_tests/support/gen/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/id_fails/test_a.py delete mode 100644 pythonPackages/nose/functional_tests/support/id_fails/test_b.py delete mode 100644 pythonPackages/nose/functional_tests/support/idp/exm.py delete mode 100644 pythonPackages/nose/functional_tests/support/idp/tests.py delete mode 100644 pythonPackages/nose/functional_tests/support/ipt/test1/ipthelp.py delete mode 100644 pythonPackages/nose/functional_tests/support/ipt/test1/tests.py delete mode 100644 pythonPackages/nose/functional_tests/support/ipt/test2/ipthelp.py delete mode 100644 pythonPackages/nose/functional_tests/support/ipt/test2/tests.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue038/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue072/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue082/_mypackage/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue082/_mypackage/_eggs.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue082/_mypackage/bacon.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue082/mypublicpackage/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue082/mypublicpackage/_foo.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue082/mypublicpackage/bar.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue130/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue134/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue143/not-a-package/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue143/not-a-package/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue191/UNKNOWN.egg-info/PKG-INFO delete mode 100644 pythonPackages/nose/functional_tests/support/issue191/UNKNOWN.egg-info/SOURCES.txt delete mode 100644 pythonPackages/nose/functional_tests/support/issue191/UNKNOWN.egg-info/dependency_links.txt delete mode 100644 pythonPackages/nose/functional_tests/support/issue191/UNKNOWN.egg-info/top_level.txt delete mode 100644 pythonPackages/nose/functional_tests/support/issue191/setup.cfg delete mode 100644 pythonPackages/nose/functional_tests/support/issue191/setup.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue191/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue269/test_bad_class.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue279/test_mod_setup_fails.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue408/nosetests.xml delete mode 100644 pythonPackages/nose/functional_tests/support/issue408/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue513/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue649/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue680/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue700/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue720/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue771/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/issue859/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/ltfn/state.py delete mode 100644 pythonPackages/nose/functional_tests/support/ltfn/test_mod.py delete mode 100644 pythonPackages/nose/functional_tests/support/ltfn/test_pak1/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/ltfn/test_pak1/test_mod.py delete mode 100644 pythonPackages/nose/functional_tests/support/ltfn/test_pak2/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/ltftc/tests.py delete mode 100644 pythonPackages/nose/functional_tests/support/namespace_pkg/namespace_pkg/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/namespace_pkg/namespace_pkg/example.py delete mode 100644 pythonPackages/nose/functional_tests/support/namespace_pkg/namespace_pkg/test_pkg.py delete mode 100644 pythonPackages/nose/functional_tests/support/namespace_pkg/site-packages/namespace_pkg/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/namespace_pkg/site-packages/namespace_pkg/example2.py delete mode 100644 pythonPackages/nose/functional_tests/support/namespace_pkg/site-packages/namespace_pkg/test_pkg2.py delete mode 100644 pythonPackages/nose/functional_tests/support/package1/example.py delete mode 100644 pythonPackages/nose/functional_tests/support/package1/tests/test_example_function.py delete mode 100644 pythonPackages/nose/functional_tests/support/package2/maths.py delete mode 100644 pythonPackages/nose/functional_tests/support/package2/test_pak/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/package2/test_pak/test_mod.py delete mode 100644 pythonPackages/nose/functional_tests/support/package2/test_pak/test_sub/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/support/package2/test_pak/test_sub/test_mod.py delete mode 100644 pythonPackages/nose/functional_tests/support/package3/lib/a.py delete mode 100644 pythonPackages/nose/functional_tests/support/package3/src/b.py delete mode 100644 pythonPackages/nose/functional_tests/support/package3/tests/test_a.py delete mode 100644 pythonPackages/nose/functional_tests/support/package3/tests/test_b.py delete mode 100644 pythonPackages/nose/functional_tests/support/pass/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/string-exception/test.py delete mode 100644 pythonPackages/nose/functional_tests/support/test.cfg delete mode 100644 pythonPackages/nose/functional_tests/support/test_buggy_generators.py delete mode 100644 pythonPackages/nose/functional_tests/support/todo/test_with_todo.py delete mode 100644 pythonPackages/nose/functional_tests/support/todo/todoplug.py delete mode 100644 pythonPackages/nose/functional_tests/support/twist/test_twisted.py delete mode 100644 pythonPackages/nose/functional_tests/support/xunit.xml delete mode 100644 pythonPackages/nose/functional_tests/support/xunit/test_xunit_as_suite.py delete mode 100644 pythonPackages/nose/functional_tests/test_attribute_plugin.py delete mode 100644 pythonPackages/nose/functional_tests/test_buggy_generators.py delete mode 100644 pythonPackages/nose/functional_tests/test_cases.py delete mode 100644 pythonPackages/nose/functional_tests/test_collector.py delete mode 100644 pythonPackages/nose/functional_tests/test_commands.py delete mode 100644 pythonPackages/nose/functional_tests/test_config_files.py delete mode 100644 pythonPackages/nose/functional_tests/test_coverage_plugin.py delete mode 100644 pythonPackages/nose/functional_tests/test_defaultpluginmanager.py delete mode 100644 pythonPackages/nose/functional_tests/test_doctest_plugin.py delete mode 100644 pythonPackages/nose/functional_tests/test_entrypoints.py delete mode 100644 pythonPackages/nose/functional_tests/test_failure.py delete mode 100644 pythonPackages/nose/functional_tests/test_failuredetail_plugin.py delete mode 100644 pythonPackages/nose/functional_tests/test_generator_fixtures.py delete mode 100644 pythonPackages/nose/functional_tests/test_id_plugin.py delete mode 100644 pythonPackages/nose/functional_tests/test_importer.py delete mode 100644 pythonPackages/nose/functional_tests/test_isolate_plugin.py delete mode 100644 pythonPackages/nose/functional_tests/test_issue120/support/some_test.py delete mode 100644 pythonPackages/nose/functional_tests/test_issue120/test_named_test_with_doctest.rst delete mode 100644 pythonPackages/nose/functional_tests/test_issue_072.py delete mode 100644 pythonPackages/nose/functional_tests/test_issue_082.py delete mode 100644 pythonPackages/nose/functional_tests/test_issue_408.py delete mode 100644 pythonPackages/nose/functional_tests/test_issue_649.py delete mode 100644 pythonPackages/nose/functional_tests/test_load_tests_from_test_case.py delete mode 100644 pythonPackages/nose/functional_tests/test_loader.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/support/class.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/support/concurrent_shared/__init__.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/support/concurrent_shared/test.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/support/fake_nosetest.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/support/keyboardinterrupt.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/support/keyboardinterrupt_twice.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/support/nameerror.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/support/timeout.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/test_class.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/test_concurrent_shared.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/test_keyboardinterrupt.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/test_nameerror.py delete mode 100644 pythonPackages/nose/functional_tests/test_multiprocessing/test_process_timeout.py delete mode 100644 pythonPackages/nose/functional_tests/test_namespace_pkg.py delete mode 100644 pythonPackages/nose/functional_tests/test_plugin_api.py delete mode 100644 pythonPackages/nose/functional_tests/test_plugins.py delete mode 100644 pythonPackages/nose/functional_tests/test_plugintest.py delete mode 100644 pythonPackages/nose/functional_tests/test_program.py delete mode 100644 pythonPackages/nose/functional_tests/test_result.py delete mode 100644 pythonPackages/nose/functional_tests/test_selector.py delete mode 100644 pythonPackages/nose/functional_tests/test_skip_pdb_interaction.py delete mode 100644 pythonPackages/nose/functional_tests/test_string_exception.py delete mode 100644 pythonPackages/nose/functional_tests/test_success.py delete mode 100644 pythonPackages/nose/functional_tests/test_suite.py delete mode 100644 pythonPackages/nose/functional_tests/test_withid_failures.rst delete mode 100644 pythonPackages/nose/functional_tests/test_xunit.py delete mode 100755 pythonPackages/nose/install-rpm.sh delete mode 100644 pythonPackages/nose/lgpl.txt delete mode 100644 pythonPackages/nose/nose.egg-info/PKG-INFO delete mode 100644 pythonPackages/nose/nose.egg-info/SOURCES.txt delete mode 100644 pythonPackages/nose/nose.egg-info/dependency_links.txt delete mode 100644 pythonPackages/nose/nose.egg-info/entry_points.txt delete mode 100644 pythonPackages/nose/nose.egg-info/not-zip-safe delete mode 100644 pythonPackages/nose/nose.egg-info/top_level.txt delete mode 100644 pythonPackages/nose/nose/__init__.py delete mode 100644 pythonPackages/nose/nose/__main__.py delete mode 100644 pythonPackages/nose/nose/case.py delete mode 100644 pythonPackages/nose/nose/commands.py delete mode 100644 pythonPackages/nose/nose/config.py delete mode 100644 pythonPackages/nose/nose/core.py delete mode 100644 pythonPackages/nose/nose/exc.py delete mode 100644 pythonPackages/nose/nose/ext/__init__.py delete mode 100644 pythonPackages/nose/nose/ext/dtcompat.py delete mode 100644 pythonPackages/nose/nose/failure.py delete mode 100644 pythonPackages/nose/nose/importer.py delete mode 100644 pythonPackages/nose/nose/inspector.py delete mode 100644 pythonPackages/nose/nose/loader.py delete mode 100644 pythonPackages/nose/nose/plugins/__init__.py delete mode 100644 pythonPackages/nose/nose/plugins/allmodules.py delete mode 100644 pythonPackages/nose/nose/plugins/attrib.py delete mode 100644 pythonPackages/nose/nose/plugins/base.py delete mode 100644 pythonPackages/nose/nose/plugins/builtin.py delete mode 100644 pythonPackages/nose/nose/plugins/capture.py delete mode 100644 pythonPackages/nose/nose/plugins/collect.py delete mode 100644 pythonPackages/nose/nose/plugins/cover.py delete mode 100644 pythonPackages/nose/nose/plugins/debug.py delete mode 100644 pythonPackages/nose/nose/plugins/deprecated.py delete mode 100644 pythonPackages/nose/nose/plugins/doctests.py delete mode 100644 pythonPackages/nose/nose/plugins/errorclass.py delete mode 100644 pythonPackages/nose/nose/plugins/failuredetail.py delete mode 100644 pythonPackages/nose/nose/plugins/isolate.py delete mode 100644 pythonPackages/nose/nose/plugins/logcapture.py delete mode 100644 pythonPackages/nose/nose/plugins/manager.py delete mode 100644 pythonPackages/nose/nose/plugins/multiprocess.py delete mode 100644 pythonPackages/nose/nose/plugins/plugintest.py delete mode 100644 pythonPackages/nose/nose/plugins/prof.py delete mode 100644 pythonPackages/nose/nose/plugins/skip.py delete mode 100644 pythonPackages/nose/nose/plugins/testid.py delete mode 100644 pythonPackages/nose/nose/plugins/xunit.py delete mode 100644 pythonPackages/nose/nose/proxy.py delete mode 100644 pythonPackages/nose/nose/pyversion.py delete mode 100644 pythonPackages/nose/nose/result.py delete mode 100644 pythonPackages/nose/nose/selector.py delete mode 100644 pythonPackages/nose/nose/sphinx/__init__.py delete mode 100644 pythonPackages/nose/nose/sphinx/pluginopts.py delete mode 100644 pythonPackages/nose/nose/suite.py delete mode 100755 pythonPackages/nose/nose/tools.py delete mode 100644 pythonPackages/nose/nose/tools/__init__.py delete mode 100644 pythonPackages/nose/nose/tools/nontrivial.py delete mode 100644 pythonPackages/nose/nose/tools/trivial.py delete mode 100644 pythonPackages/nose/nose/twistedtools.py delete mode 100644 pythonPackages/nose/nose/usage.txt delete mode 100644 pythonPackages/nose/nose/util.py delete mode 100644 pythonPackages/nose/nosetests.1 delete mode 100644 pythonPackages/nose/patch.py delete mode 100755 pythonPackages/nose/selftest.py delete mode 100644 pythonPackages/nose/setup.cfg delete mode 100644 pythonPackages/nose/setup.py delete mode 100644 pythonPackages/nose/setup3lib.py delete mode 100644 pythonPackages/nose/unit_tests/helpers.py delete mode 100644 pythonPackages/nose/unit_tests/mock.py delete mode 100644 pythonPackages/nose/unit_tests/support/bug101/tests.py delete mode 100644 pythonPackages/nose/unit_tests/support/bug105/tests.py delete mode 100644 pythonPackages/nose/unit_tests/support/config_defaults/a.cfg delete mode 100644 pythonPackages/nose/unit_tests/support/config_defaults/b.cfg delete mode 100644 pythonPackages/nose/unit_tests/support/config_defaults/invalid.cfg delete mode 100644 pythonPackages/nose/unit_tests/support/config_defaults/invalid_value.cfg delete mode 100644 pythonPackages/nose/unit_tests/support/doctest/.gitignore delete mode 100644 pythonPackages/nose/unit_tests/support/doctest/err_doctests.py delete mode 100644 pythonPackages/nose/unit_tests/support/doctest/no_doctests.py delete mode 100644 pythonPackages/nose/unit_tests/support/doctest/noname_wrapped.not_py delete mode 100644 pythonPackages/nose/unit_tests/support/doctest/noname_wrapper.py delete mode 100644 pythonPackages/nose/unit_tests/support/foo/__init__.py delete mode 100644 pythonPackages/nose/unit_tests/support/foo/bar/__init__.py delete mode 100644 pythonPackages/nose/unit_tests/support/foo/bar/buz.py delete mode 100644 pythonPackages/nose/unit_tests/support/foo/doctests.txt delete mode 100644 pythonPackages/nose/unit_tests/support/foo/test_foo.py delete mode 100644 pythonPackages/nose/unit_tests/support/foo/tests/dir_test_file.py delete mode 100644 pythonPackages/nose/unit_tests/support/init_prefix_bug/__init__.py delete mode 100644 pythonPackages/nose/unit_tests/support/init_prefix_bug/__init__not.py delete mode 100644 pythonPackages/nose/unit_tests/support/issue006/tests.py delete mode 100644 pythonPackages/nose/unit_tests/support/issue065/tests.py delete mode 100644 pythonPackages/nose/unit_tests/support/issue135/tests.py delete mode 100644 pythonPackages/nose/unit_tests/support/issue270/__init__.py delete mode 100644 pythonPackages/nose/unit_tests/support/issue270/foo_test.py delete mode 100644 pythonPackages/nose/unit_tests/support/other/file.txt delete mode 100644 pythonPackages/nose/unit_tests/support/pkgorg/lib/modernity.py delete mode 100644 pythonPackages/nose/unit_tests/support/pkgorg/tests/test_mod.py delete mode 100755 pythonPackages/nose/unit_tests/support/script.py delete mode 100644 pythonPackages/nose/unit_tests/support/test-dir/test.py delete mode 100644 pythonPackages/nose/unit_tests/support/test.py delete mode 100644 pythonPackages/nose/unit_tests/test_attribute_plugin.py delete mode 100644 pythonPackages/nose/unit_tests/test_bug105.py delete mode 100644 pythonPackages/nose/unit_tests/test_capture_plugin.py delete mode 100644 pythonPackages/nose/unit_tests/test_cases.py delete mode 100644 pythonPackages/nose/unit_tests/test_config.py delete mode 100644 pythonPackages/nose/unit_tests/test_config_defaults.rst delete mode 100644 pythonPackages/nose/unit_tests/test_core.py delete mode 100644 pythonPackages/nose/unit_tests/test_cover_plugin.py delete mode 100644 pythonPackages/nose/unit_tests/test_deprecated_plugin.py delete mode 100644 pythonPackages/nose/unit_tests/test_doctest_error_handling.py delete mode 100644 pythonPackages/nose/unit_tests/test_doctest_munging.rst delete mode 100644 pythonPackages/nose/unit_tests/test_doctest_no_name.py delete mode 100644 pythonPackages/nose/unit_tests/test_id_plugin.py delete mode 100644 pythonPackages/nose/unit_tests/test_importer.py delete mode 100644 pythonPackages/nose/unit_tests/test_inspector.py delete mode 100644 pythonPackages/nose/unit_tests/test_isolation_plugin.py delete mode 100644 pythonPackages/nose/unit_tests/test_issue135.py delete mode 100644 pythonPackages/nose/unit_tests/test_issue155.rst delete mode 100644 pythonPackages/nose/unit_tests/test_issue270.rst delete mode 100644 pythonPackages/nose/unit_tests/test_issue270_fixtures.py delete mode 100644 pythonPackages/nose/unit_tests/test_issue_006.py delete mode 100644 pythonPackages/nose/unit_tests/test_issue_064.py delete mode 100644 pythonPackages/nose/unit_tests/test_issue_065.py delete mode 100644 pythonPackages/nose/unit_tests/test_issue_100.rst delete mode 100644 pythonPackages/nose/unit_tests/test_issue_100.rst.py3.patch delete mode 100644 pythonPackages/nose/unit_tests/test_issue_101.py delete mode 100644 pythonPackages/nose/unit_tests/test_issue_159.rst delete mode 100644 pythonPackages/nose/unit_tests/test_issue_227.py delete mode 100644 pythonPackages/nose/unit_tests/test_issue_230.py delete mode 100644 pythonPackages/nose/unit_tests/test_issue_786.py delete mode 100644 pythonPackages/nose/unit_tests/test_lazy_suite.py delete mode 100644 pythonPackages/nose/unit_tests/test_loader.py delete mode 100644 pythonPackages/nose/unit_tests/test_logcapture_plugin.py delete mode 100644 pythonPackages/nose/unit_tests/test_logging.py delete mode 100644 pythonPackages/nose/unit_tests/test_ls_tree.rst delete mode 100644 pythonPackages/nose/unit_tests/test_multiprocess.py delete mode 100644 pythonPackages/nose/unit_tests/test_multiprocess_runner.py delete mode 100644 pythonPackages/nose/unit_tests/test_pdb_plugin.py delete mode 100644 pythonPackages/nose/unit_tests/test_plugin.py delete mode 100644 pythonPackages/nose/unit_tests/test_plugin_interfaces.py delete mode 100644 pythonPackages/nose/unit_tests/test_plugin_manager.py delete mode 100644 pythonPackages/nose/unit_tests/test_plugins.py delete mode 100644 pythonPackages/nose/unit_tests/test_result_proxy.py delete mode 100644 pythonPackages/nose/unit_tests/test_selector.py delete mode 100644 pythonPackages/nose/unit_tests/test_selector_plugins.py delete mode 100644 pythonPackages/nose/unit_tests/test_skip_plugin.py delete mode 100644 pythonPackages/nose/unit_tests/test_suite.py delete mode 100644 pythonPackages/nose/unit_tests/test_tools.py delete mode 100644 pythonPackages/nose/unit_tests/test_twisted.py delete mode 100644 pythonPackages/nose/unit_tests/test_twisted_testcase.py delete mode 100644 pythonPackages/nose/unit_tests/test_utils.py delete mode 100644 pythonPackages/nose/unit_tests/test_xunit.py delete mode 100644 pythonPackages/pmw/Pmw.1.3.2.tar.gz delete mode 100644 pythonPackages/pupynere-1.0.15/PKG-INFO delete mode 100644 pythonPackages/pupynere-1.0.15/pupynere.egg-info/PKG-INFO delete mode 100644 pythonPackages/pupynere-1.0.15/pupynere.egg-info/SOURCES.txt delete mode 100644 pythonPackages/pupynere-1.0.15/pupynere.egg-info/dependency_links.txt delete mode 100644 pythonPackages/pupynere-1.0.15/pupynere.egg-info/requires.txt delete mode 100644 pythonPackages/pupynere-1.0.15/pupynere.egg-info/top_level.txt delete mode 100644 pythonPackages/pupynere-1.0.15/pupynere.egg-info/zip-safe delete mode 100644 pythonPackages/pupynere-1.0.15/pupynere.py delete mode 100644 pythonPackages/pupynere-1.0.15/setup.cfg delete mode 100644 pythonPackages/pupynere-1.0.15/setup.py delete mode 100644 pythonPackages/pupynere/PKG-INFO delete mode 100644 pythonPackages/pupynere/pupynere.egg-info/PKG-INFO delete mode 100644 pythonPackages/pupynere/pupynere.egg-info/SOURCES.txt delete mode 100644 pythonPackages/pupynere/pupynere.egg-info/dependency_links.txt delete mode 100644 pythonPackages/pupynere/pupynere.egg-info/requires.txt delete mode 100644 pythonPackages/pupynere/pupynere.egg-info/top_level.txt delete mode 100644 pythonPackages/pupynere/pupynere.egg-info/zip-safe delete mode 100644 pythonPackages/pupynere/pupynere.py delete mode 100644 pythonPackages/pupynere/setup.cfg delete mode 100644 pythonPackages/pupynere/setup.py delete mode 100644 pythonPackages/pycairo/pycairo-1.2.2.tar.gz delete mode 100644 pythonPackages/pygtk/pygtk-2.8.6.tar.gz delete mode 100644 pythonPackages/pythonPackages.ecl delete mode 100644 pythonPackages/qpid/qpid-python-0.32.tar.gz delete mode 100644 pythonPackages/thrift/TSCons.py delete mode 100644 pythonPackages/thrift/TSerialization.py delete mode 100644 pythonPackages/thrift/Thrift.py delete mode 100644 pythonPackages/thrift/__init__.py delete mode 100644 pythonPackages/thrift/protocol/TBase.py delete mode 100644 pythonPackages/thrift/protocol/TBinaryProtocol.py delete mode 100644 pythonPackages/thrift/protocol/TCompactProtocol.py delete mode 100644 pythonPackages/thrift/protocol/TProtocol.py delete mode 100644 pythonPackages/thrift/protocol/__init__.py delete mode 100644 pythonPackages/thrift/protocol/fastbinary.c delete mode 100644 pythonPackages/thrift/server/THttpServer.py delete mode 100644 pythonPackages/thrift/server/TNonblockingServer.py delete mode 100644 pythonPackages/thrift/server/TProcessPoolServer.py delete mode 100644 pythonPackages/thrift/server/TServer.py delete mode 100644 pythonPackages/thrift/server/__init__.py delete mode 100644 pythonPackages/thrift/transport/THttpClient.py delete mode 100644 pythonPackages/thrift/transport/TSSLSocket.py delete mode 100644 pythonPackages/thrift/transport/TSocket.py delete mode 100644 pythonPackages/thrift/transport/TTransport.py delete mode 100644 pythonPackages/thrift/transport/TTwisted.py delete mode 100644 pythonPackages/thrift/transport/TZlibTransport.py delete mode 100644 pythonPackages/thrift/transport/__init__.py delete mode 100644 pythonPackages/tpg/TPG-3.1.2.tar.gz delete mode 100644 pythonPackages/tpg/TPG-3.2.2.tar.gz delete mode 100755 pythonPackages/werkzeug/AUTHORS delete mode 100755 pythonPackages/werkzeug/CHANGES delete mode 100755 pythonPackages/werkzeug/LICENSE delete mode 100755 pythonPackages/werkzeug/MANIFEST.in delete mode 100755 pythonPackages/werkzeug/Makefile delete mode 100755 pythonPackages/werkzeug/PKG-INFO delete mode 100755 pythonPackages/werkzeug/Werkzeug.egg-info/PKG-INFO delete mode 100755 pythonPackages/werkzeug/Werkzeug.egg-info/SOURCES.txt delete mode 100755 pythonPackages/werkzeug/Werkzeug.egg-info/dependency_links.txt delete mode 100755 pythonPackages/werkzeug/Werkzeug.egg-info/top_level.txt delete mode 100755 pythonPackages/werkzeug/artwork/logo.png delete mode 100755 pythonPackages/werkzeug/artwork/logo.svg delete mode 100755 pythonPackages/werkzeug/docs/Makefile delete mode 100755 pythonPackages/werkzeug/docs/_build/html/.buildinfo delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_images/debug-screenshot.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_images/shorty-screenshot.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/changes.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/contrib/atom.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/contrib/cache.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/contrib/fixers.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/contrib/index.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/contrib/iterio.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/contrib/lint.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/contrib/profiler.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/contrib/securecookie.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/contrib/sessions.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/contrib/wrappers.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/datastructures.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/debug.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/deployment/cgi.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/deployment/fastcgi.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/deployment/index.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/deployment/mod_wsgi.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/deployment/proxying.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/exceptions.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/http.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/index.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/installation.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/levels.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/local.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/middlewares.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/quickstart.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/request_data.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/routing.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/script.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/serving.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/templates.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/terms.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/test.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/tutorial.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/unicode.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/utils.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/wrappers.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_sources/wsgi.txt delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/background.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/basic.css delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/codebackground.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/contents.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/debug-screenshot.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/default.css delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/doctools.js delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/favicon.ico delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/file.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/header.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/jquery.js delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/minus.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/navigation.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/navigation_active.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/plus.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/pygments.css delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/searchtools.js delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/shorty-screenshot.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/style.css delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/underscore.js delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/werkzeug.js delete mode 100755 pythonPackages/werkzeug/docs/_build/html/_static/werkzeug.png delete mode 100755 pythonPackages/werkzeug/docs/_build/html/changes.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/contrib/atom.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/contrib/cache.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/contrib/fixers.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/contrib/index.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/contrib/iterio.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/contrib/lint.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/contrib/profiler.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/contrib/securecookie.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/contrib/sessions.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/contrib/wrappers.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/datastructures.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/debug.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/deployment/cgi.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/deployment/fastcgi.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/deployment/index.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/deployment/mod_wsgi.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/deployment/proxying.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/exceptions.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/genindex.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/http.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/index.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/installation.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/levels.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/local.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/middlewares.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/objects.inv delete mode 100755 pythonPackages/werkzeug/docs/_build/html/py-modindex.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/quickstart.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/request_data.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/routing.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/script.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/search.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/searchindex.js delete mode 100755 pythonPackages/werkzeug/docs/_build/html/serving.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/templates.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/terms.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/test.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/tutorial.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/unicode.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/utils.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/wrappers.html delete mode 100755 pythonPackages/werkzeug/docs/_build/html/wsgi.html delete mode 100755 pythonPackages/werkzeug/docs/_static/background.png delete mode 100755 pythonPackages/werkzeug/docs/_static/codebackground.png delete mode 100755 pythonPackages/werkzeug/docs/_static/contents.png delete mode 100755 pythonPackages/werkzeug/docs/_static/debug-screenshot.png delete mode 100755 pythonPackages/werkzeug/docs/_static/favicon.ico delete mode 100755 pythonPackages/werkzeug/docs/_static/header.png delete mode 100755 pythonPackages/werkzeug/docs/_static/navigation.png delete mode 100755 pythonPackages/werkzeug/docs/_static/navigation_active.png delete mode 100755 pythonPackages/werkzeug/docs/_static/shorty-screenshot.png delete mode 100755 pythonPackages/werkzeug/docs/_static/style.css delete mode 100755 pythonPackages/werkzeug/docs/_static/werkzeug.js delete mode 100755 pythonPackages/werkzeug/docs/_static/werkzeug.png delete mode 100755 pythonPackages/werkzeug/docs/_templates/genindex.html delete mode 100755 pythonPackages/werkzeug/docs/_templates/layout.html delete mode 100755 pythonPackages/werkzeug/docs/_templates/search.html delete mode 100755 pythonPackages/werkzeug/docs/changes.rst delete mode 100755 pythonPackages/werkzeug/docs/conf.py delete mode 100755 pythonPackages/werkzeug/docs/contrib/atom.rst delete mode 100755 pythonPackages/werkzeug/docs/contrib/cache.rst delete mode 100755 pythonPackages/werkzeug/docs/contrib/fixers.rst delete mode 100755 pythonPackages/werkzeug/docs/contrib/index.rst delete mode 100755 pythonPackages/werkzeug/docs/contrib/iterio.rst delete mode 100755 pythonPackages/werkzeug/docs/contrib/lint.rst delete mode 100755 pythonPackages/werkzeug/docs/contrib/profiler.rst delete mode 100755 pythonPackages/werkzeug/docs/contrib/securecookie.rst delete mode 100755 pythonPackages/werkzeug/docs/contrib/sessions.rst delete mode 100755 pythonPackages/werkzeug/docs/contrib/wrappers.rst delete mode 100755 pythonPackages/werkzeug/docs/datastructures.rst delete mode 100755 pythonPackages/werkzeug/docs/debug.rst delete mode 100755 pythonPackages/werkzeug/docs/deployment/cgi.rst delete mode 100755 pythonPackages/werkzeug/docs/deployment/fastcgi.rst delete mode 100755 pythonPackages/werkzeug/docs/deployment/index.rst delete mode 100755 pythonPackages/werkzeug/docs/deployment/mod_wsgi.rst delete mode 100755 pythonPackages/werkzeug/docs/deployment/proxying.rst delete mode 100755 pythonPackages/werkzeug/docs/exceptions.rst delete mode 100755 pythonPackages/werkzeug/docs/http.rst delete mode 100755 pythonPackages/werkzeug/docs/index.rst delete mode 100755 pythonPackages/werkzeug/docs/installation.rst delete mode 100755 pythonPackages/werkzeug/docs/levels.rst delete mode 100755 pythonPackages/werkzeug/docs/local.rst delete mode 100755 pythonPackages/werkzeug/docs/make.bat delete mode 100755 pythonPackages/werkzeug/docs/makearchive.py delete mode 100755 pythonPackages/werkzeug/docs/middlewares.rst delete mode 100755 pythonPackages/werkzeug/docs/quickstart.rst delete mode 100755 pythonPackages/werkzeug/docs/request_data.rst delete mode 100755 pythonPackages/werkzeug/docs/routing.rst delete mode 100755 pythonPackages/werkzeug/docs/script.rst delete mode 100755 pythonPackages/werkzeug/docs/serving.rst delete mode 100755 pythonPackages/werkzeug/docs/templates.rst delete mode 100755 pythonPackages/werkzeug/docs/terms.rst delete mode 100755 pythonPackages/werkzeug/docs/test.rst delete mode 100755 pythonPackages/werkzeug/docs/tutorial.rst delete mode 100755 pythonPackages/werkzeug/docs/unicode.rst delete mode 100755 pythonPackages/werkzeug/docs/utils.rst delete mode 100755 pythonPackages/werkzeug/docs/werkzeugext.py delete mode 100755 pythonPackages/werkzeug/docs/wrappers.rst delete mode 100755 pythonPackages/werkzeug/docs/wsgi.rst delete mode 100755 pythonPackages/werkzeug/examples/README delete mode 100755 pythonPackages/werkzeug/examples/contrib/README delete mode 100755 pythonPackages/werkzeug/examples/contrib/securecookie.py delete mode 100755 pythonPackages/werkzeug/examples/contrib/sessions.py delete mode 100755 pythonPackages/werkzeug/examples/cookieauth.py delete mode 100755 pythonPackages/werkzeug/examples/coolmagic/__init__.py delete mode 100755 pythonPackages/werkzeug/examples/coolmagic/application.py delete mode 100755 pythonPackages/werkzeug/examples/coolmagic/helpers.py delete mode 100755 pythonPackages/werkzeug/examples/coolmagic/public/style.css delete mode 100755 pythonPackages/werkzeug/examples/coolmagic/templates/layout.html delete mode 100755 pythonPackages/werkzeug/examples/coolmagic/templates/static/about.html delete mode 100755 pythonPackages/werkzeug/examples/coolmagic/templates/static/index.html delete mode 100755 pythonPackages/werkzeug/examples/coolmagic/templates/static/not_found.html delete mode 100755 pythonPackages/werkzeug/examples/coolmagic/utils.py delete mode 100755 pythonPackages/werkzeug/examples/coolmagic/views/__init__.py delete mode 100755 pythonPackages/werkzeug/examples/coolmagic/views/static.py delete mode 100755 pythonPackages/werkzeug/examples/couchy/README delete mode 100755 pythonPackages/werkzeug/examples/couchy/__init__.py delete mode 100755 pythonPackages/werkzeug/examples/couchy/application.py delete mode 100755 pythonPackages/werkzeug/examples/couchy/models.py delete mode 100755 pythonPackages/werkzeug/examples/couchy/static/style.css delete mode 100755 pythonPackages/werkzeug/examples/couchy/templates/display.html delete mode 100755 pythonPackages/werkzeug/examples/couchy/templates/layout.html delete mode 100755 pythonPackages/werkzeug/examples/couchy/templates/list.html delete mode 100755 pythonPackages/werkzeug/examples/couchy/templates/new.html delete mode 100755 pythonPackages/werkzeug/examples/couchy/templates/not_found.html delete mode 100755 pythonPackages/werkzeug/examples/couchy/utils.py delete mode 100755 pythonPackages/werkzeug/examples/couchy/views.py delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/__init__.py delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/application.py delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/db.py delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/network.py delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/pages.py delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/shared/content.png delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/shared/down.png delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/shared/favicon.ico delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/shared/header.png delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/shared/logo.png delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/shared/style.css delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/shared/up.png delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/templates/layout.html delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/templates/missingpage.html delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/templates/search.html delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/templates/server.html delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/templates/serverlist.html delete mode 100755 pythonPackages/werkzeug/examples/cupoftee/utils.py delete mode 100755 pythonPackages/werkzeug/examples/httpbasicauth.py delete mode 100755 pythonPackages/werkzeug/examples/i18nurls/__init__.py delete mode 100755 pythonPackages/werkzeug/examples/i18nurls/application.py delete mode 100755 pythonPackages/werkzeug/examples/i18nurls/templates/about.html delete mode 100755 pythonPackages/werkzeug/examples/i18nurls/templates/blog.html delete mode 100755 pythonPackages/werkzeug/examples/i18nurls/templates/index.html delete mode 100755 pythonPackages/werkzeug/examples/i18nurls/templates/layout.html delete mode 100755 pythonPackages/werkzeug/examples/i18nurls/urls.py delete mode 100755 pythonPackages/werkzeug/examples/i18nurls/views.py delete mode 100755 pythonPackages/werkzeug/examples/manage-coolmagic.py delete mode 100755 pythonPackages/werkzeug/examples/manage-couchy.py delete mode 100755 pythonPackages/werkzeug/examples/manage-cupoftee.py delete mode 100755 pythonPackages/werkzeug/examples/manage-i18nurls.py delete mode 100755 pythonPackages/werkzeug/examples/manage-plnt.py delete mode 100755 pythonPackages/werkzeug/examples/manage-shorty.py delete mode 100755 pythonPackages/werkzeug/examples/manage-simplewiki.py delete mode 100755 pythonPackages/werkzeug/examples/manage-webpylike.py delete mode 100755 pythonPackages/werkzeug/examples/partial/README delete mode 100755 pythonPackages/werkzeug/examples/partial/complex_routing.py delete mode 100755 pythonPackages/werkzeug/examples/plnt/__init__.py delete mode 100755 pythonPackages/werkzeug/examples/plnt/database.py delete mode 100755 pythonPackages/werkzeug/examples/plnt/shared/style.css delete mode 100755 pythonPackages/werkzeug/examples/plnt/sync.py delete mode 100755 pythonPackages/werkzeug/examples/plnt/templates/about.html delete mode 100755 pythonPackages/werkzeug/examples/plnt/templates/index.html delete mode 100755 pythonPackages/werkzeug/examples/plnt/templates/layout.html delete mode 100755 pythonPackages/werkzeug/examples/plnt/utils.py delete mode 100755 pythonPackages/werkzeug/examples/plnt/views.py delete mode 100755 pythonPackages/werkzeug/examples/plnt/webapp.py delete mode 100755 pythonPackages/werkzeug/examples/shorty/__init__.py delete mode 100755 pythonPackages/werkzeug/examples/shorty/application.py delete mode 100755 pythonPackages/werkzeug/examples/shorty/models.py delete mode 100755 pythonPackages/werkzeug/examples/shorty/static/style.css delete mode 100755 pythonPackages/werkzeug/examples/shorty/templates/display.html delete mode 100755 pythonPackages/werkzeug/examples/shorty/templates/layout.html delete mode 100755 pythonPackages/werkzeug/examples/shorty/templates/list.html delete mode 100755 pythonPackages/werkzeug/examples/shorty/templates/new.html delete mode 100755 pythonPackages/werkzeug/examples/shorty/templates/not_found.html delete mode 100755 pythonPackages/werkzeug/examples/shorty/utils.py delete mode 100755 pythonPackages/werkzeug/examples/shorty/views.py delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/__init__.py delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/actions.py delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/application.py delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/database.py delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/shared/style.css delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/specialpages.py delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/templates/action_diff.html delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/templates/action_edit.html delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/templates/action_log.html delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/templates/action_revert.html delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/templates/action_show.html delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/templates/layout.html delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/templates/macros.xml delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/templates/missing_action.html delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/templates/page_index.html delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/templates/page_missing.html delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/templates/recent_changes.html delete mode 100755 pythonPackages/werkzeug/examples/simplewiki/utils.py delete mode 100755 pythonPackages/werkzeug/examples/upload.py delete mode 100755 pythonPackages/werkzeug/examples/webpylike/example.py delete mode 100755 pythonPackages/werkzeug/examples/webpylike/webpylike.py delete mode 100755 pythonPackages/werkzeug/setup.cfg delete mode 100755 pythonPackages/werkzeug/setup.py delete mode 100755 pythonPackages/werkzeug/tests/contrib/test_cache.py delete mode 100755 pythonPackages/werkzeug/tests/contrib/test_fixers.py delete mode 100755 pythonPackages/werkzeug/tests/contrib/test_iterio.py delete mode 100755 pythonPackages/werkzeug/tests/contrib/test_securecookie.py delete mode 100755 pythonPackages/werkzeug/tests/contrib/test_sessions.py delete mode 100755 pythonPackages/werkzeug/tests/contrib/test_testtools.py delete mode 100755 pythonPackages/werkzeug/tests/contrib/test_wrappers.py delete mode 100755 pythonPackages/werkzeug/tests/multipart/collect.py delete mode 100755 pythonPackages/werkzeug/tests/multipart/firefox3-2png1txt/file1.png delete mode 100755 pythonPackages/werkzeug/tests/multipart/firefox3-2png1txt/file2.png delete mode 100755 pythonPackages/werkzeug/tests/multipart/firefox3-2png1txt/request.txt delete mode 100755 pythonPackages/werkzeug/tests/multipart/firefox3-2png1txt/text.txt delete mode 100755 pythonPackages/werkzeug/tests/multipart/firefox3-2pnglongtext/file1.png delete mode 100755 pythonPackages/werkzeug/tests/multipart/firefox3-2pnglongtext/file2.png delete mode 100755 pythonPackages/werkzeug/tests/multipart/firefox3-2pnglongtext/request.txt delete mode 100755 pythonPackages/werkzeug/tests/multipart/firefox3-2pnglongtext/text.txt delete mode 100755 pythonPackages/werkzeug/tests/multipart/ie6-2png1txt/file1.png delete mode 100755 pythonPackages/werkzeug/tests/multipart/ie6-2png1txt/file2.png delete mode 100755 pythonPackages/werkzeug/tests/multipart/ie6-2png1txt/request.txt delete mode 100755 pythonPackages/werkzeug/tests/multipart/ie6-2png1txt/text.txt delete mode 100755 pythonPackages/werkzeug/tests/multipart/ie7_full_path_request.txt delete mode 100755 pythonPackages/werkzeug/tests/multipart/opera8-2png1txt/file1.png delete mode 100755 pythonPackages/werkzeug/tests/multipart/opera8-2png1txt/file2.png delete mode 100755 pythonPackages/werkzeug/tests/multipart/opera8-2png1txt/request.txt delete mode 100755 pythonPackages/werkzeug/tests/multipart/opera8-2png1txt/text.txt delete mode 100755 pythonPackages/werkzeug/tests/multipart/webkit3-2png1txt/file1.png delete mode 100755 pythonPackages/werkzeug/tests/multipart/webkit3-2png1txt/file2.png delete mode 100755 pythonPackages/werkzeug/tests/multipart/webkit3-2png1txt/request.txt delete mode 100755 pythonPackages/werkzeug/tests/multipart/webkit3-2png1txt/text.txt delete mode 100755 pythonPackages/werkzeug/tests/res/test.txt delete mode 100755 pythonPackages/werkzeug/tests/test_compat.py delete mode 100755 pythonPackages/werkzeug/tests/test_datastructures.py delete mode 100755 pythonPackages/werkzeug/tests/test_debug.py delete mode 100755 pythonPackages/werkzeug/tests/test_exceptions.py delete mode 100755 pythonPackages/werkzeug/tests/test_formparser.py delete mode 100755 pythonPackages/werkzeug/tests/test_http.py delete mode 100755 pythonPackages/werkzeug/tests/test_internal.py delete mode 100755 pythonPackages/werkzeug/tests/test_local.py delete mode 100755 pythonPackages/werkzeug/tests/test_routing.py delete mode 100755 pythonPackages/werkzeug/tests/test_security.py delete mode 100755 pythonPackages/werkzeug/tests/test_serving.py delete mode 100755 pythonPackages/werkzeug/tests/test_templates.py delete mode 100755 pythonPackages/werkzeug/tests/test_test.py delete mode 100755 pythonPackages/werkzeug/tests/test_urls.py delete mode 100755 pythonPackages/werkzeug/tests/test_utils.py delete mode 100755 pythonPackages/werkzeug/tests/test_wrappers.py delete mode 100755 pythonPackages/werkzeug/tests/test_wsgi.py delete mode 100755 pythonPackages/werkzeug/werkzeug/__init__.py delete mode 100755 pythonPackages/werkzeug/werkzeug/_internal.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/__init__.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/atom.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/cache.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/fixers.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/iterio.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/jsrouting.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/kickstart.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/limiter.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/lint.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/profiler.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/securecookie.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/sessions.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/testtools.py delete mode 100755 pythonPackages/werkzeug/werkzeug/contrib/wrappers.py delete mode 100755 pythonPackages/werkzeug/werkzeug/datastructures.py delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/__init__.py delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/console.py delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/render.py delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/repr.py delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/shared/body.tmpl delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/shared/codetable.tmpl delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/shared/console.png delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/shared/debugger.js delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/shared/jquery.js delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/shared/less.png delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/shared/more.png delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/shared/source.png delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/shared/style.css delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/shared/vartable.tmpl delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/tbtools.py delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/templates/console.html delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/templates/dump_object.html delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/templates/frame.html delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/templates/help_command.html delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/templates/source.html delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/templates/traceback_full.html delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/templates/traceback_plaintext.html delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/templates/traceback_summary.html delete mode 100755 pythonPackages/werkzeug/werkzeug/debug/utils.py delete mode 100755 pythonPackages/werkzeug/werkzeug/exceptions.py delete mode 100755 pythonPackages/werkzeug/werkzeug/formparser.py delete mode 100755 pythonPackages/werkzeug/werkzeug/http.py delete mode 100755 pythonPackages/werkzeug/werkzeug/local.py delete mode 100755 pythonPackages/werkzeug/werkzeug/posixemulation.py delete mode 100755 pythonPackages/werkzeug/werkzeug/routing.py delete mode 100755 pythonPackages/werkzeug/werkzeug/script.py delete mode 100755 pythonPackages/werkzeug/werkzeug/security.py delete mode 100755 pythonPackages/werkzeug/werkzeug/serving.py delete mode 100755 pythonPackages/werkzeug/werkzeug/templates.py delete mode 100755 pythonPackages/werkzeug/werkzeug/test.py delete mode 100755 pythonPackages/werkzeug/werkzeug/testapp.py delete mode 100755 pythonPackages/werkzeug/werkzeug/urls.py delete mode 100755 pythonPackages/werkzeug/werkzeug/useragents.py delete mode 100755 pythonPackages/werkzeug/werkzeug/utils.py delete mode 100755 pythonPackages/werkzeug/werkzeug/wrappers.py delete mode 100755 pythonPackages/werkzeug/werkzeug/wsgi.py rename rpms/{python.site-packages => awips2.upc}/Installer.gfe/__init__.py (100%) rename rpms/{python.site-packages => awips2.upc}/Installer.gfe/component.spec (98%) delete mode 100644 rpms/python.site-packages/Installer.cherrypy/component.spec delete mode 100644 rpms/python.site-packages/Installer.cycler/component.spec delete mode 100644 rpms/python.site-packages/Installer.cython/component.spec delete mode 100644 rpms/python.site-packages/Installer.dynamicserialize/component.spec delete mode 100644 rpms/python.site-packages/Installer.nose/component.spec delete mode 100644 rpms/python.site-packages/Installer.pmw/component.spec delete mode 100644 rpms/python.site-packages/Installer.pupynere/component.spec delete mode 100644 rpms/python.site-packages/Installer.python-awips/component.spec delete mode 100644 rpms/python.site-packages/Installer.thrift/component.spec delete mode 100644 rpms/python.site-packages/Installer.tpg/component.spec delete mode 100644 rpms/python.site-packages/Installer.ufpy/component.spec delete mode 100644 rpms/python.site-packages/Installer.werkzeug/component.spec delete mode 100644 rpms/python.site-packages/deploy.builder/build.sh delete mode 100644 rpms/python.site-packages/deploy.builder/install-setuptools.sh diff --git a/pythonPackages/.project b/pythonPackages/.project deleted file mode 100644 index c885e15319..0000000000 --- a/pythonPackages/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - pythonPackages - - - - - - org.python.pydev.PyDevBuilder - - - - - - org.python.pydev.pythonNature - - diff --git a/pythonPackages/.pydevproject b/pythonPackages/.pydevproject deleted file mode 100644 index f4a659751e..0000000000 --- a/pythonPackages/.pydevproject +++ /dev/null @@ -1,7 +0,0 @@ - - - - -python 2.7 -Default - diff --git a/pythonPackages/.settings/org.eclipse.core.resources.prefs b/pythonPackages/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 72f02d7c46..0000000000 --- a/pythonPackages/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,3 +0,0 @@ -#Sun Mar 20 15:17:07 CDT 2011 -eclipse.preferences.version=1 -encoding//werkzeug/examples/plnt/__init__.py=utf-8 diff --git a/pythonPackages/README b/pythonPackages/README deleted file mode 100644 index add3c383e0..0000000000 --- a/pythonPackages/README +++ /dev/null @@ -1,6 +0,0 @@ -The python packages dir exists solely for pure python packages. -NO JAVA/JEP CODE ALLOWED. - -Each dir under this directory should be able to be copied to an installed python's -site-packages dir and function correctly, being able to be imported and used -as needed. \ No newline at end of file diff --git a/pythonPackages/VERSIONS b/pythonPackages/VERSIONS deleted file mode 100644 index 18b35c1412..0000000000 --- a/pythonPackages/VERSIONS +++ /dev/null @@ -1,23 +0,0 @@ -This file contains a listing of the versions of every applicable package. -This file SHOULD be updated whenever a newer version of a particular package is checked -in. - -cherrpy = 3.1.2 [3.2.2] -dynamicserialize = RAYTHEON-OWNED (AWIPS II) -h5py = 1.3.0 [2.1.0] -matplotlib = 0.99.1.1 [1.2.0] -nose = 0.11.1 [1.2.1] -numpy = 1.5.0b1 [1.6.2] -pil = 1.1.6 [1.1.7] -pmw = 1.3.2 [2.0.0] -pupynere = 1.0.13 [1.0.15] -qpid = 0.5 [0.6] -scientific = 2.8 [2.8] -scipy = 0.8.0 [0.11.0] -tables = 2.1.2 [2.4.0] -thrift = 20080411p1 [0.9.0] -tpg = 3.1.2 [3.2.1] -ufpy = RAYTHEON-OWNED (AWIPS II) -werkzeug = 0.6.2 [0.8.3] -shapely = 1.2.16 [1.2.16] -msaslaps = RAYTHEON-OWNED (AWIPS II) diff --git a/pythonPackages/Werkzeug-0.12.1/AUTHORS b/pythonPackages/Werkzeug-0.12.1/AUTHORS deleted file mode 100644 index b746c2967e..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/AUTHORS +++ /dev/null @@ -1,60 +0,0 @@ -Werkzeug is written and maintained by the Werkzeug Team and various -contributors: - -Project Leader / Developer: - -- Armin Ronacher - -- Georg Brandl -- Leif K-Brooks -- Thomas Johansson -- Marian Sigler -- Ronny Pfannschmidt -- Noah Slater -- Alec Thomas -- Shannon Behrens -- Christoph Rauch -- Clemens Hermann -- Jason Kirtland -- Ali Afshar -- Christopher Grebs -- Sean Cazzell -- Florent Xicluna -- Kyle Dawkins -- Pedro Algarvio -- Zahari Petkov -- Ludvig Ericson -- Kenneth Reitz -- Daniel Neuhäuser -- Markus Unterwaditzer -- Joe Esposito -- Abhinav Upadhyay -- immerrr -- Cédric Krier -- Phil Jones -- Michael Hunsinger -- Lars Holm Nielsen -- Joël Charles -- Benjamin Dopplinger - -Contributors of code for werkzeug/examples are: - -- Itay Neeman - -The SSL related parts of the Werkzeug development server are partially -taken from Paste. Same thing is true for the range support which comes -from WebOb which is a Paste project. The original code is MIT licensed which -is largely compatible with the modfied BSD license. The following copyrights -apply: - -- (c) 2005 Ian Bicking and contributors -- (c) 2005 Clark C. Evans - -The rename() function from the posixemulation was taken almost unmodified -from the Trac project's utility module. The original code is BSD licensed -with the following copyrights from that module: - -- (c) 2003-2009 Edgewall Software -- (c) 2003-2006 Jonas Borgström -- (c) 2006 Matthew Good -- (c) 2005-2006 Christian Boos diff --git a/pythonPackages/Werkzeug-0.12.1/CHANGES b/pythonPackages/Werkzeug-0.12.1/CHANGES deleted file mode 100644 index 4bad588f8b..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/CHANGES +++ /dev/null @@ -1,1172 +0,0 @@ -Werkzeug Changelog -================== - -Version 0.12.1 --------------- - -Released on March 15th 2017 - -- Fix crash of reloader (used on debug mode) on Windows. - (`OSError: [WinError 10038]`). See pull request ``#1081`` -- Partially revert change to class hierarchy of `Headers`. See ``#1084``. - -Version 0.12 ------------- - -Released on March 10th 2017 - -- Spit out big deprecation warnings for werkzeug.script -- Use `inspect.getfullargspec` internally when available as - `inspect.getargspec` is gone in 3.6 -- Added support for status code 451 and 423 -- Improved the build error suggestions. In particular only if - someone stringifies the error will the suggestions be calculated. -- Added support for uWSGI's caching backend. -- Fix a bug where iterating over a `FileStorage` would result in an infinite - loop. -- Datastructures now inherit from the relevant baseclasses from the - `collections` module in the stdlib. See #794. -- Add support for recognizing NetBSD, OpenBSD, FreeBSD, DragonFlyBSD platforms - in the user agent string. -- Recognize SeaMonkey browser name and version correctly -- Recognize Baiduspider, and bingbot user agents -- If `LocalProxy`'s wrapped object is a function, refer to it with __wrapped__ - attribute. -- The defaults of ``generate_password_hash`` have been changed to more secure - ones, see pull request ``#753``. -- Add support for encoding in options header parsing, see pull request - ``#933``. -- ``test.Client`` now properly handles Location headers with relative URLs, see - pull request ``#879``. -- When `HTTPException` is raised, it now prints the description, for easier - debugging. -- Werkzeug's dict-like datastructures now have ``view``-methods under Python 2, - see pull request ``#968``. -- Fix a bug in ``MultiPartParser`` when no ``stream_factory`` was provided - during initialization, see pull request ``#973``. -- Disable autocorrect and spellchecker in the debugger middleware's Python - prompt, see pull request ``#994``. -- Don't redirect to slash route when method doesn't match, see pull request - ``#907``. -- Fix a bug when using ``SharedDataMiddleware`` with frozen packages, see pull - request ``#959``. -- `Range` header parsing function fixed for invalid values ``#974``. -- Add support for byte Range Requests, see pull request ``#978``. -- Use modern cryptographic defaults in the dev servers ``#1004``. -- the post() method of the test client now accept file object through the data - parameter. -- Color run_simple's terminal output based on HTTP codes ``#1013``. -- Fix self-XSS in debugger console, see ``#1031``. -- Fix IPython 5.x shell support, see ``#1033``. - -Version 0.11.16 ---------------- - -- werkzeug.serving: set CONTENT_TYPE / CONTENT_LENGTH if only they're provided by the client -- werkzeug.serving: Fix crash of reloader when using `python -m werkzeug.serving`. - -Version 0.11.15 ---------------- - -Released on December 30th 2016. - -- Bugfix for the bugfix in the previous release. - -Version 0.11.14 ---------------- - -Released on December 30th 2016. - -- Check if platform can fork before importing ``ForkingMixIn``, raise exception - when creating ``ForkingWSGIServer`` on such a platform, see PR ``#999``. - -Version 0.11.13 ---------------- - -Released on December 26th 2016. - -- Correct fix for the reloader issuer on certain Windows installations. - -Version 0.11.12 ---------------- - -Released on December 26th 2016. - -- Fix more bugs in multidicts regarding empty lists. See ``#1000``. -- Add some docstrings to some `EnvironBuilder` properties that were previously - unintentionally missing. -- Added a workaround for the reloader on windows. - -Version 0.11.11 ---------------- - -Released on August 31st 2016. - -- Fix JSONRequestMixin for Python3. See #731 -- Fix broken string handling in test client when passing integers. See #852 -- Fix a bug in ``parse_options_header`` where an invalid content type - starting with comma or semi-colon would result in an invalid return value, - see issue ``#995``. -- Fix a bug in multidicts when passing empty lists as values, see issue - ``#979``. -- Fix a security issue that allows XSS on the Werkzeug debugger. See ``#1001``. - -Version 0.11.10 ---------------- - -Released on May 24th 2016. - -- Fixed a bug that occurs when running on Python 2.6 and using a broken locale. - See pull request #912. -- Fixed a crash when running the debugger on Google App Engine. See issue #925. -- Fixed an issue with multipart parsing that could cause memory exhaustion. - -Version 0.11.9 --------------- - -Released on April 24th 2016. - -- Corrected an issue that caused the debugger not to use the - machine GUID on POSIX systems. -- Corrected a Unicode error on Python 3 for the debugger's - PIN usage. -- Corrected the timestamp verification in the pin debug code. - Without this fix the pin was remembered for too long. - -Version 0.11.8 --------------- - -Released on April 15th 2016. - -- fixed a problem with the machine GUID detection code on OS X - on Python 3. - -Version 0.11.7 --------------- - -Released on April 14th 2016. - -- fixed a regression on Python 3 for the debugger. - -Version 0.11.6 --------------- - -Released on April 14th 2016. - -- werkzeug.serving: Still show the client address on bad requests. -- improved the PIN based protection for the debugger to make it harder to - brute force via trying cookies. Please keep in mind that the debugger - *is not intended for running on production environments* -- increased the pin timeout to a week to make it less annoying for people - which should decrease the chance that users disable the pin check - entirely. -- werkzeug.serving: Fix broken HTTP_HOST when path starts with double slash. - -Version 0.11.5 --------------- - -Released on March 22nd 2016. - -- werkzeug.serving: Fix crash when attempting SSL connection to HTTP server. - -Version 0.11.4 --------------- - -Released on February 14th 2016. - -- Fixed werkzeug.serving not working from -m flag. -- Fixed incorrect weak etag handling. - -Version 0.11.3 --------------- - -Released on December 20th 2015. - -- Fixed an issue with copy operations not working against - proxies. -- Changed the logging operations of the development server to - correctly log where the server is running in all situations - again. -- Fixed another regression with SSL wrapping similar to the - fix in 0.11.2 but for a different code path. - -Version 0.11.2 --------------- - -Released on November 12th 2015. - -- Fix inheritable sockets on Windows on Python 3. -- Fixed an issue with the forking server not starting any longer. -- Fixed SSL wrapping on platforms that supported opening sockets - by file descriptor. -- No longer log from the watchdog reloader. -- Unicode errors in hosts are now better caught or converted into - bad request errors. - -Version 0.11.1 --------------- - -Released on November 10th 2015. - -- Fixed a regression on Python 3 in the debugger. - -Version 0.11 ------------- - -Released on November 8th 2015, codename Gleisbaumaschine. - -- Added ``reloader_paths`` option to ``run_simple`` and other functions in - ``werkzeug.serving``. This allows the user to completely override the Python - module watching of Werkzeug with custom paths. -- Many custom cached properties of Werkzeug's classes are now subclasses of - Python's ``property`` type (issue ``#616``). -- ``bind_to_environ`` now doesn't differentiate between implicit and explicit - default port numbers in ``HTTP_HOST`` (pull request ``#204``). -- ``BuildErrors`` are now more informative. They come with a complete sentence - as error message, and also provide suggestions (pull request ``#691``). -- Fix a bug in the user agent parser where Safari's build number instead of - version would be extracted (pull request ``#703``). -- Fixed issue where RedisCache set_many was broken for twemproxy, which doesn't - support the default MULTI command (pull request ``#702``). -- ``mimetype`` parameters on request and response classes are now always - converted to lowercase. -- Changed cache so that cache never expires if timeout is 0. This also fixes - an issue with redis setex (issue ``#550``) -- Werkzeug now assumes ``UTF-8`` as filesystem encoding on Unix if Python - detected it as ASCII. -- New optional `has` method on caches. -- Fixed various bugs in `parse_options_header` (pull request ``#643``). -- If the reloader is enabled the server will now open the socket in the parent - process if this is possible. This means that when the reloader kicks in - the connection from client will wait instead of tearing down. This does - not work on all Python versions. -- Implemented PIN based authentication for the debugger. This can optionally - be disabled but is discouraged. This change was necessary as it has been - discovered that too many people run the debugger in production. -- Devserver no longer requires SSL module to be installed. - -Version 0.10.5 --------------- - -(bugfix release, release date yet to be decided) - -- Reloader: Correctly detect file changes made by moving temporary files over - the original, which is e.g. the case with PyCharm (pull request ``#722``). -- Fix bool behavior of ``werkzeug.datastructures.ETags`` under Python 3 (issue - ``#744``). - -Version 0.10.4 --------------- - -(bugfix release, released on March 26th 2015) - -- Re-release of 0.10.3 with packaging artifacts manually removed. - -Version 0.10.3 --------------- - -(bugfix release, released on March 26th 2015) - -- Re-release of 0.10.2 without packaging artifacts. - -Version 0.10.2 --------------- - -(bugfix release, released on March 26th 2015) - -- Fixed issue where ``empty`` could break third-party libraries that relied on - keyword arguments (pull request ``#675``) -- Improved ``Rule.empty`` by providing a ```get_empty_kwargs`` to allow setting - custom kwargs without having to override entire ``empty`` method. (pull - request ``#675``) -- Fixed ```extra_files``` parameter for reloader to not cause startup - to crash when included in server params -- Using `MultiDict` when building URLs is now not supported again. The behavior - introduced several regressions. -- Fix performance problems with stat-reloader (pull request ``#715``). - -Version 0.10.1 --------------- - -(bugfix release, released on February 3rd 2015) - -- Fixed regression with multiple query values for URLs (pull request ``#667``). -- Fix issues with eventlet's monkeypatching and the builtin server (pull - request ``#663``). - -Version 0.10 ------------- - -Released on January 30th 2015, codename Bagger. - -- Changed the error handling of and improved testsuite for the caches in - ``contrib.cache``. -- Fixed a bug on Python 3 when creating adhoc ssl contexts, due to `sys.maxint` - not being defined. -- Fixed a bug on Python 3, that caused - :func:`~werkzeug.serving.make_ssl_devcert` to fail with an exception. -- Added exceptions for 504 and 505. -- Added support for ChromeOS detection. -- Added UUID converter to the routing system. -- Added message that explains how to quit the server. -- Fixed a bug on Python 2, that caused ``len`` for - :class:`werkzeug.datastructures.CombinedMultiDict` to crash. -- Added support for stdlib pbkdf2 hmac if a compatible digest - is found. -- Ported testsuite to use ``py.test``. -- Minor optimizations to various middlewares (pull requests ``#496`` and - ``#571``). -- Use stdlib ``ssl`` module instead of ``OpenSSL`` for the builtin server - (issue ``#434``). This means that OpenSSL contexts are not supported anymore, - but instead ``ssl.SSLContext`` from the stdlib. -- Allow protocol-relative URLs when building external URLs. -- Fixed Atom syndication to print time zone offset for tz-aware datetime - objects (pull request ``#254``). -- Improved reloader to track added files and to recover from broken - sys.modules setups with syntax errors in packages. -- ``cache.RedisCache`` now supports arbitrary ``**kwargs`` for the redis - object. -- ``werkzeug.test.Client`` now uses the original request method when resolving - 307 redirects (pull request ``#556``). -- ``werkzeug.datastructures.MIMEAccept`` now properly deals with mimetype - parameters (pull request ``#205``). -- ``werkzeug.datastructures.Accept`` now handles a quality of ``0`` as - intolerable, as per RFC 2616 (pull request ``#536``). -- ``werkzeug.urls.url_fix`` now properly encodes hostnames with ``idna`` - encoding (issue ``#559``). It also doesn't crash on malformed URLs anymore - (issue ``#582``). -- ``werkzeug.routing.MapAdapter.match`` now recognizes the difference between - the path ``/`` and an empty one (issue ``#360``). -- The interactive debugger now tries to decode non-ascii filenames (issue - ``#469``). -- Increased default key size of generated SSL certificates to 1024 bits (issue - ``#611``). -- Added support for specifying a ``Response`` subclass to use when calling - :func:`~werkzeug.utils.redirect`\ . -- ``werkzeug.test.EnvironBuilder`` now doesn't use the request method anymore - to guess the content type, and purely relies on the ``form``, ``files`` and - ``input_stream`` properties (issue ``#620``). -- Added Symbian to the user agent platform list. -- Fixed make_conditional to respect automatically_set_content_length -- Unset ``Content-Length`` when writing to response.stream (issue ``#451``) -- ``wrappers.Request.method`` is now always uppercase, eliminating - inconsistencies of the WSGI environment (issue ``647``). -- ``routing.Rule.empty`` now works correctly with subclasses of ``Rule`` (pull - request ``#645``). -- Made map updating safe in light of concurrent updates. -- Allow multiple values for the same field for url building (issue ``#658``). - -Version 0.9.7 -------------- - -(bugfix release, release date to be decided) - -- Fix unicode problems in ``werkzeug.debug.tbtools``. -- Fix Python 3-compatibility problems in ``werkzeug.posixemulation``. -- Backport fix of fatal typo for ``ImmutableList`` (issue ``#492``). -- Make creation of the cache dir for ``FileSystemCache`` atomic (issue - ``#468``). -- Use native strings for memcached keys to work with Python 3 client (issue - ``#539``). -- Fix charset detection for ``werkzeug.debug.tbtools.Frame`` objects (issues - ``#547`` and ``#532``). -- Fix ``AttributeError`` masking in ``werkzeug.utils.import_string`` (issue - ``#182``). -- Explicitly shut down server (issue ``#519``). -- Fix timeouts greater than 2592000 being misinterpreted as UNIX timestamps in - ``werkzeug.contrib.cache.MemcachedCache`` (issue ``#533``). -- Fix bug where ``werkzeug.exceptions.abort`` would raise an arbitrary subclass - of the expected class (issue ``#422``). -- Fix broken ``jsrouting`` (due to removal of ``werkzeug.templates``) -- ``werkzeug.urls.url_fix`` now doesn't crash on malformed URLs anymore, but - returns them unmodified. This is a cheap workaround for ``#582``, the proper - fix is included in version 0.10. -- The repr of ``werkzeug.wrappers.Request`` doesn't crash on non-ASCII-values - anymore (pull request ``#466``). -- Fix bug in ``cache.RedisCache`` when combined with ``redis.StrictRedis`` - object (pull request ``#583``). -- The ``qop`` parameter for ``WWW-Authenticate`` headers is now always quoted, - as required by RFC 2617 (issue ``#633``). -- Fix bug in ``werkzeug.contrib.cache.SimpleCache`` with Python 3 where add/set - may throw an exception when pruning old entries from the cache (pull request - ``#651``). - -Version 0.9.6 -------------- - -(bugfix release, released on June 7th 2014) - -- Added a safe conversion for IRI to URI conversion and use that - internally to work around issues with spec violations for - protocols such as ``itms-service``. - -Version 0.9.7 -------------- - -- Fixed uri_to_iri() not re-encoding hashes in query string parameters. - -Version 0.9.5 -------------- - -(bugfix release, released on June 7th 2014) - -- Forward charset argument from request objects to the environ - builder. -- Fixed error handling for missing boundaries in multipart data. -- Fixed session creation on systems without ``os.urandom()``. -- Fixed pluses in dictionary keys not being properly URL encoded. -- Fixed a problem with deepcopy not working for multi dicts. -- Fixed a double quoting issue on redirects. -- Fixed a problem with unicode keys appearing in headers on 2.x. -- Fixed a bug with unicode strings in the test builder. -- Fixed a unicode bug on Python 3 in the WSGI profiler. -- Fixed an issue with the safe string compare function on - Python 2.7.7 and Python 3.4. - -Version 0.9.4 -------------- - -(bugfix release, released on August 26th 2013) - -- Fixed an issue with Python 3.3 and an edge case in cookie parsing. -- Fixed decoding errors not handled properly through the WSGI - decoding dance. -- Fixed URI to IRI conversion incorrectly decoding percent signs. - -Version 0.9.3 -------------- - -(bugfix release, released on July 25th 2013) - -- Restored behavior of the ``data`` descriptor of the request class to pre 0.9 - behavior. This now also means that ``.data`` and ``.get_data()`` have - different behavior. New code should use ``.get_data()`` always. - - In addition to that there is now a flag for the ``.get_data()`` method that - controls what should happen with form data parsing and the form parser will - honor cached data. This makes dealing with custom form data more consistent. - -Version 0.9.2 -------------- - -(bugfix release, released on July 18th 2013) - -- Added `unsafe` parameter to :func:`~werkzeug.urls.url_quote`. -- Fixed an issue with :func:`~werkzeug.urls.url_quote_plus` not quoting - `'+'` correctly. -- Ported remaining parts of :class:`~werkzeug.contrib.RedisCache` to - Python 3.3. -- Ported remaining parts of :class:`~werkzeug.contrib.MemcachedCache` to - Python 3.3 -- Fixed a deprecation warning in the contrib atom module. -- Fixed a regression with setting of content types through the - headers dictionary instead with the content type parameter. -- Use correct name for stdlib secure string comparison function. -- Fixed a wrong reference in the docstring of - :func:`~werkzeug.local.release_local`. -- Fixed an `AttributeError` that sometimes occurred when accessing the - :attr:`werkzeug.wrappers.BaseResponse.is_streamed` attribute. - -Version 0.9.1 -------------- - -(bugfix release, released on June 14th 2013) - -- Fixed an issue with integers no longer being accepted in certain - parts of the routing system or URL quoting functions. -- Fixed an issue with `url_quote` not producing the right escape - codes for single digit codepoints. -- Fixed an issue with :class:`~werkzeug.wsgi.SharedDataMiddleware` not - reading the path correctly and breaking on etag generation in some - cases. -- Properly handle `Expect: 100-continue` in the development server - to resolve issues with curl. -- Automatically exhaust the input stream on request close. This should - fix issues where not touching request files results in a timeout. -- Fixed exhausting of streams not doing anything if a non-limited - stream was passed into the multipart parser. -- Raised the buffer sizes for the multipart parser. - -Version 0.9 ------------ - -Released on June 13nd 2013, codename Planierraupe. - -- Added support for :meth:`~werkzeug.wsgi.LimitedStream.tell` - on the limited stream. -- :class:`~werkzeug.datastructures.ETags` now is nonzero if it - contains at least one etag of any kind, including weak ones. -- Added a workaround for a bug in the stdlib for SSL servers. -- Improved SSL interface of the devserver so that it can generate - certificates easily and load them from files. -- Refactored test client to invoke the open method on the class - for redirects. This makes subclassing more powerful. -- :func:`werkzeug.wsgi.make_chunk_iter` and - :func:`werkzeug.wsgi.make_line_iter` now support processing of - iterators and streams. -- URL generation by the routing system now no longer quotes - ``+``. -- URL fixing now no longer quotes certain reserved characters. -- The :func:`werkzeug.security.generate_password_hash` and - check functions now support any of the hashlib algorithms. -- `wsgi.get_current_url` is now ascii safe for browsers sending - non-ascii data in query strings. -- improved parsing behavior for :func:`werkzeug.http.parse_options_header` -- added more operators to local proxies. -- added a hook to override the default converter in the routing - system. -- The description field of HTTP exceptions is now always escaped. - Use markup objects to disable that. -- Added number of proxy argument to the proxy fix to make it more - secure out of the box on common proxy setups. It will by default - no longer trust the x-forwarded-for header as much as it did - before. -- Added support for fragment handling in URI/IRI functions. -- Added custom class support for :func:`werkzeug.http.parse_dict_header`. -- Renamed `LighttpdCGIRootFix` to `CGIRootFix`. -- Always treat `+` as safe when fixing URLs as people love misusing them. -- Added support to profiling into directories in the contrib profiler. -- The escape function now by default escapes quotes. -- Changed repr of exceptions to be less magical. -- Simplified exception interface to no longer require environments - to be passed to receive the response object. -- Added sentinel argument to IterIO objects. -- Added pbkdf2 support for the security module. -- Added a plain request type that disables all form parsing to only - leave the stream behind. -- Removed support for deprecated `fix_headers`. -- Removed support for deprecated `header_list`. -- Removed support for deprecated parameter for `iter_encoded`. -- Removed support for deprecated non-silent usage of the limited - stream object. -- Removed support for previous dummy `writable` parameter on - the cached property. -- Added support for explicitly closing request objects to close - associated resources. -- Conditional request handling or access to the data property on responses no - longer ignores direct passthrough mode. -- Removed werkzeug.templates and werkzeug.contrib.kickstart. -- Changed host lookup logic for forwarded hosts to allow lists of - hosts in which case only the first one is picked up. -- Added `wsgi.get_query_string`, `wsgi.get_path_info` and - `wsgi.get_script_name` and made the `wsgi.pop_path_info` and - `wsgi.peek_path_info` functions perform unicode decoding. This - was necessary to avoid having to expose the WSGI encoding dance - on Python 3. -- Added `content_encoding` and `content_md5` to the request object's - common request descriptor mixin. -- added `options` and `trace` to the test client. -- Overhauled the utilization of the input stream to be easier to use - and better to extend. The detection of content payload on the input - side is now more compliant with HTTP by detecting off the content - type header instead of the request method. This also now means that - the stream property on the request class is always available instead - of just when the parsing fails. -- Added support for using :class:`werkzeug.wrappers.BaseResponse` in a with - statement. -- Changed `get_app_iter` to fetch the response early so that it does not - fail when wrapping a response iterable. This makes filtering easier. -- Introduced `get_data` and `set_data` methods for responses. -- Introduced `get_data` for requests. -- Soft deprecated the `data` descriptors for request and response objects. -- Added `as_bytes` operations to some of the headers to simplify working - with things like cookies. -- Made the debugger paste tracebacks into github's gist service as - private pastes. - -Version 0.8.4 -------------- - -(bugfix release, release date to be announced) - -- Added a favicon to the debugger which fixes problem with - state changes being triggered through a request to - /favicon.ico in Google Chrome. This should fix some - problems with Flask and other frameworks that use - context local objects on a stack with context preservation - on errors. -- Fixed an issue with scrolling up in the debugger. -- Fixed an issue with debuggers running on a different URL - than the URL root. -- Fixed a problem with proxies not forwarding some rarely - used special methods properly. -- Added a workaround to prevent the XSS protection from Chrome - breaking the debugger. -- Skip redis tests if redis is not running. -- Fixed a typo in the multipart parser that caused content-type - to not be picked up properly. - -Version 0.8.3 -------------- - -(bugfix release, released on February 5th 2012) - -- Fixed another issue with :func:`werkzeug.wsgi.make_line_iter` - where lines longer than the buffer size were not handled - properly. -- Restore stdout after debug console finished executing so - that the debugger can be used on GAE better. -- Fixed a bug with the redis cache for int subclasses - (affects bool caching). -- Fixed an XSS problem with redirect targets coming from - untrusted sources. -- Redis cache backend now supports password authentication. - -Version 0.8.2 -------------- - -(bugfix release, released on December 16th 2011) - -- Fixed a problem with request handling of the builtin server - not responding to socket errors properly. -- The routing request redirect exception's code attribute is now - used properly. -- Fixed a bug with shutdowns on Windows. -- Fixed a few unicode issues with non-ascii characters being - hardcoded in URL rules. -- Fixed two property docstrings being assigned to fdel instead - of ``__doc__``. -- Fixed an issue where CRLF line endings could be split into two - by the line iter function, causing problems with multipart file - uploads. - -Version 0.8.1 -------------- - -(bugfix release, released on September 30th 2011) - -- Fixed an issue with the memcache not working properly. -- Fixed an issue for Python 2.7.1 and higher that broke - copying of multidicts with :func:`copy.copy`. -- Changed hashing methodology of immutable ordered multi dicts - for a potential problem with alternative Python implementations. - -Version 0.8 ------------ - -Released on September 29th 2011, codename Lötkolben - -- Removed data structure specific KeyErrors for a general - purpose :exc:`~werkzeug.exceptions.BadRequestKeyError`. -- Documented :meth:`werkzeug.wrappers.BaseRequest._load_form_data`. -- The routing system now also accepts strings instead of - dictionaries for the `query_args` parameter since we're only - passing them through for redirects. -- Werkzeug now automatically sets the content length immediately when - the :attr:`~werkzeug.wrappers.BaseResponse.data` attribute is set - for efficiency and simplicity reasons. -- The routing system will now normalize server names to lowercase. -- The routing system will no longer raise ValueErrors in case the - configuration for the server name was incorrect. This should make - deployment much easier because you can ignore that factor now. -- Fixed a bug with parsing HTTP digest headers. It rejected headers - with missing nc and nonce params. -- Proxy fix now also updates wsgi.url_scheme based on X-Forwarded-Proto. -- Added support for key prefixes to the redis cache. -- Added the ability to suppress some auto corrections in the wrappers - that are now controlled via `autocorrect_location_header` and - `automatically_set_content_length` on the response objects. -- Werkzeug now uses a new method to check that the length of incoming - data is complete and will raise IO errors by itself if the server - fails to do so. -- :func:`~werkzeug.wsgi.make_line_iter` now requires a limit that is - not higher than the length the stream can provide. -- Refactored form parsing into a form parser class that makes it possible - to hook into individual parts of the parsing process for debugging and - extending. -- For conditional responses the content length is no longer set when it - is already there and added if missing. -- Immutable datastructures are hashable now. -- Headers datastructure no longer allows newlines in values to avoid - header injection attacks. -- Made it possible through subclassing to select a different remote - addr in the proxy fix. -- Added stream based URL decoding. This reduces memory usage on large - transmitted form data that is URL decoded since Werkzeug will no longer - load all the unparsed data into memory. -- Memcache client now no longer uses the buggy cmemcache module and - supports pylibmc. GAE is not tried automatically and the dedicated - class is no longer necessary. -- Redis cache now properly serializes data. -- Removed support for Python 2.4 - -Version 0.7.2 -------------- - -(bugfix release, released on September 30th 2011) - -- Fixed a CSRF problem with the debugger. -- The debugger is now generating private pastes on lodgeit. -- If URL maps are now bound to environments the query arguments - are properly decoded from it for redirects. - -Version 0.7.1 -------------- - -(bugfix release, released on July 26th 2011) - -- Fixed a problem with newer versions of IPython. -- Disabled pyinotify based reloader which does not work reliably. - -Version 0.7 ------------ - -Released on July 24th 2011, codename Schraubschlüssel - -- Add support for python-libmemcached to the Werkzeug cache abstraction - layer. -- Improved :func:`url_decode` and :func:`url_encode` performance. -- Fixed an issue where the SharedDataMiddleware could cause an - internal server error on weird paths when loading via pkg_resources. -- Fixed an URL generation bug that caused URLs to be invalid if a - generated component contains a colon. -- :func:`werkzeug.import_string` now works with partially set up - packages properly. -- Disabled automatic socket switching for IPv6 on the development - server due to problems it caused. -- Werkzeug no longer overrides the Date header when creating a - conditional HTTP response. -- The routing system provides a method to retrieve the matching - methods for a given path. -- The routing system now accepts a parameter to change the encoding - error behaviour. -- The local manager can now accept custom ident functions in the - constructor that are forwarded to the wrapped local objects. -- url_unquote_plus now accepts unicode strings again. -- Fixed an issue with the filesystem session support's prune - function and concurrent usage. -- Fixed a problem with external URL generation discarding the port. -- Added support for pylibmc to the Werkzeug cache abstraction layer. -- Fixed an issue with the new multipart parser that happened when - a linebreak happened to be on the chunk limit. -- Cookies are now set properly if ports are in use. A runtime error - is raised if one tries to set a cookie for a domain without a dot. -- Fixed an issue with Template.from_file not working for file - descriptors. -- Reloader can now use inotify to track reloads. This requires the - pyinotify library to be installed. -- Werkzeug debugger can now submit to custom lodgeit installations. -- redirect function's status code assertion now allows 201 to be used - as redirection code. While it's not a real redirect, it shares - enough with redirects for the function to still be useful. -- Fixed securecookie for pypy. -- Fixed `ValueErrors` being raised on calls to `best_match` on - `MIMEAccept` objects when invalid user data was supplied. -- Deprecated `werkzeug.contrib.kickstart` and `werkzeug.contrib.testtools` -- URL routing now can be passed the URL arguments to keep them for - redirects. In the future matching on URL arguments might also be - possible. -- Header encoding changed from utf-8 to latin1 to support a port to - Python 3. Bytestrings passed to the object stay untouched which - makes it possible to have utf-8 cookies. This is a part where - the Python 3 version will later change in that it will always - operate on latin1 values. -- Fixed a bug in the form parser that caused the last character to - be dropped off if certain values in multipart data are used. -- Multipart parser now looks at the part-individual content type - header to override the global charset. -- Introduced mimetype and mimetype_params attribute for the file - storage object. -- Changed FileStorage filename fallback logic to skip special filenames - that Python uses for marking special files like stdin. -- Introduced more HTTP exception classes. -- `call_on_close` now can be used as a decorator. -- Support for redis as cache backend. -- Added `BaseRequest.scheme`. -- Support for the RFC 5789 PATCH method. -- New custom routing parser and better ordering. -- Removed support for `is_behind_proxy`. Use a WSGI middleware - instead that rewrites the `REMOTE_ADDR` according to your setup. - Also see the :class:`werkzeug.contrib.fixers.ProxyFix` for - a drop-in replacement. -- Added cookie forging support to the test client. -- Added support for host based matching in the routing system. -- Switched from the default 'ignore' to the better 'replace' - unicode error handling mode. -- The builtin server now adds a function named 'werkzeug.server.shutdown' - into the WSGI env to initiate a shutdown. This currently only works - in Python 2.6 and later. -- Headers are now assumed to be latin1 for better compatibility with - Python 3 once we have support. -- Added :func:`werkzeug.security.safe_join`. -- Added `accept_json` property analogous to `accept_html` on the - :class:`werkzeug.datastructures.MIMEAccept`. -- :func:`werkzeug.utils.import_string` now fails with much better - error messages that pinpoint to the problem. -- Added support for parsing of the `If-Range` header - (:func:`werkzeug.http.parse_if_range_header` and - :class:`werkzeug.datastructures.IfRange`). -- Added support for parsing of the `Range` header - (:func:`werkzeug.http.parse_range_header` and - :class:`werkzeug.datastructures.Range`). -- Added support for parsing of the `Content-Range` header of responses - and provided an accessor object for it - (:func:`werkzeug.http.parse_content_range_header` and - :class:`werkzeug.datastructures.ContentRange`). - -Version 0.6.2 -------------- - -(bugfix release, released on April 23th 2010) - -- renamed the attribute `implicit_seqence_conversion` attribute of the - request object to `implicit_sequence_conversion`. - -Version 0.6.1 -------------- - -(bugfix release, released on April 13th 2010) - -- heavily improved local objects. Should pick up standalone greenlet - builds now and support proxies to free callables as well. There is - also a stacked local now that makes it possible to invoke the same - application from within itself by pushing current request/response - on top of the stack. -- routing build method will also build non-default method rules properly - if no method is provided. -- added proper IPv6 support for the builtin server. -- windows specific filesystem session store fixes. - (should now be more stable under high concurrency) -- fixed a `NameError` in the session system. -- fixed a bug with empty arguments in the werkzeug.script system. -- fixed a bug where log lines will be duplicated if an application uses - :meth:`logging.basicConfig` (#499) -- added secure password hashing and checking functions. -- `HEAD` is now implicitly added as method in the routing system if - `GET` is present. Not doing that was considered a bug because often - code assumed that this is the case and in web servers that do not - normalize `HEAD` to `GET` this could break `HEAD` requests. -- the script support can start SSL servers now. - -Version 0.6 ------------ - -Released on Feb 19th 2010, codename Hammer. - -- removed pending deprecations -- sys.path is now printed from the testapp. -- fixed an RFC 2068 incompatibility with cookie value quoting. -- the :class:`FileStorage` now gives access to the multipart headers. -- `cached_property.writeable` has been deprecated. -- :meth:`MapAdapter.match` now accepts a `return_rule` keyword argument - that returns the matched `Rule` instead of just the `endpoint` -- :meth:`routing.Map.bind_to_environ` raises a more correct error message - now if the map was bound to an invalid WSGI environment. -- added support for SSL to the builtin development server. -- Response objects are no longer modified in place when they are evaluated - as WSGI applications. For backwards compatibility the `fix_headers` - function is still called in case it was overridden. - You should however change your application to use `get_wsgi_headers` if - you need header modifications before responses are sent as the backwards - compatibility support will go away in future versions. -- :func:`append_slash_redirect` no longer requires the QUERY_STRING to be - in the WSGI environment. -- added :class:`~werkzeug.contrib.wrappers.DynamicCharsetResponseMixin` -- added :class:`~werkzeug.contrib.wrappers.DynamicCharsetRequestMixin` -- added :attr:`BaseRequest.url_charset` -- request and response objects have a default `__repr__` now. -- builtin data structures can be pickled now. -- the form data parser will now look at the filename instead the - content type to figure out if it should treat the upload as regular - form data or file upload. This fixes a bug with Google Chrome. -- improved performance of `make_line_iter` and the multipart parser - for binary uploads. -- fixed :attr:`~werkzeug.BaseResponse.is_streamed` -- fixed a path quoting bug in `EnvironBuilder` that caused PATH_INFO and - SCRIPT_NAME to end up in the environ unquoted. -- :meth:`werkzeug.BaseResponse.freeze` now sets the content length. -- for unknown HTTP methods the request stream is now always limited - instead of being empty. This makes it easier to implement DAV - and other protocols on top of Werkzeug. -- added :meth:`werkzeug.MIMEAccept.best_match` -- multi-value test-client posts from a standard dictionary are now - supported. Previously you had to use a multi dict. -- rule templates properly work with submounts, subdomains and - other rule factories now. -- deprecated non-silent usage of the :class:`werkzeug.LimitedStream`. -- added support for IRI handling to many parts of Werkzeug. -- development server properly logs to the werkzeug logger now. -- added :func:`werkzeug.extract_path_info` -- fixed a querystring quoting bug in :func:`url_fix` -- added `fallback_mimetype` to :class:`werkzeug.SharedDataMiddleware`. -- deprecated :meth:`BaseResponse.iter_encoded`'s charset parameter. -- added :meth:`BaseResponse.make_sequence`, - :attr:`BaseResponse.is_sequence` and - :meth:`BaseResponse._ensure_sequence`. -- added better __repr__ of :class:`werkzeug.Map` -- `import_string` accepts unicode strings as well now. -- development server doesn't break on double slashes after the host name. -- better `__repr__` and `__str__` of - :exc:`werkzeug.exceptions.HTTPException` -- test client works correctly with multiple cookies now. -- the :class:`werkzeug.routing.Map` now has a class attribute with - the default converter mapping. This helps subclasses to override - the converters without passing them to the constructor. -- implemented :class:`OrderedMultiDict` -- improved the session support for more efficient session storing - on the filesystem. Also added support for listing of sessions - currently stored in the filesystem session store. -- werkzeug no longer utilizes the Python time module for parsing - which means that dates in a broader range can be parsed. -- the wrappers have no class attributes that make it possible to - swap out the dict and list types it uses. -- werkzeug debugger should work on the appengine dev server now. -- the URL builder supports dropping of unexpected arguments now. - Previously they were always appended to the URL as query string. -- profiler now writes to the correct stream. - -Version 0.5.1 -------------- -(bugfix release for 0.5, released on July 9th 2009) - -- fixed boolean check of :class:`FileStorage` -- url routing system properly supports unicode URL rules now. -- file upload streams no longer have to provide a truncate() - method. -- implemented :meth:`BaseRequest._form_parsing_failed`. -- fixed #394 -- :meth:`ImmutableDict.copy`, :meth:`ImmutableMultiDict.copy` and - :meth:`ImmutableTypeConversionDict.copy` return mutable shallow - copies. -- fixed a bug with the `make_runserver` script action. -- :meth:`MultiDict.items` and :meth:`MutiDict.iteritems` now accept an - argument to return a pair for each value of each key. -- the multipart parser works better with hand-crafted multipart - requests now that have extra newlines added. This fixes a bug - with setuptools uploads not handled properly (#390) -- fixed some minor bugs in the atom feed generator. -- fixed a bug with client cookie header parsing being case sensitive. -- fixed a not-working deprecation warning. -- fixed package loading for :class:`SharedDataMiddleware`. -- fixed a bug in the secure cookie that made server-side expiration - on servers with a local time that was not set to UTC impossible. -- fixed console of the interactive debugger. - - -Version 0.5 ------------ - -Released on April 24th, codename Schlagbohrer. - -- requires Python 2.4 now -- fixed a bug in :class:`~contrib.IterIO` -- added :class:`MIMEAccept` and :class:`CharsetAccept` that work like the - regular :class:`Accept` but have extra special normalization for mimetypes - and charsets and extra convenience methods. -- switched the serving system from wsgiref to something homebrew. -- the :class:`Client` now supports cookies. -- added the :mod:`~werkzeug.contrib.fixers` module with various - fixes for webserver bugs and hosting setup side-effects. -- added :mod:`werkzeug.contrib.wrappers` -- added :func:`is_hop_by_hop_header` -- added :func:`is_entity_header` -- added :func:`remove_hop_by_hop_headers` -- added :func:`pop_path_info` -- added :func:`peek_path_info` -- added :func:`wrap_file` and :class:`FileWrapper` -- moved `LimitedStream` from the contrib package into the regular - werkzeug one and changed the default behavior to raise exceptions - rather than stopping without warning. The old class will stick in - the module until 0.6. -- implemented experimental multipart parser that replaces the old CGI hack. -- added :func:`dump_options_header` and :func:`parse_options_header` -- added :func:`quote_header_value` and :func:`unquote_header_value` -- :func:`url_encode` and :func:`url_decode` now accept a separator - argument to switch between `&` and `;` as pair separator. The magic - switch is no longer in place. -- all form data parsing functions as well as the :class:`BaseRequest` - object have parameters (or attributes) to limit the number of - incoming bytes (either totally or per field). -- added :class:`LanguageAccept` -- request objects are now enforced to be read only for all collections. -- added many new collection classes, refactored collections in general. -- test support was refactored, semi-undocumented `werkzeug.test.File` - was replaced by :class:`werkzeug.FileStorage`. -- :class:`EnvironBuilder` was added and unifies the previous distinct - :func:`create_environ`, :class:`Client` and - :meth:`BaseRequest.from_values`. They all work the same now which - is less confusing. -- officially documented imports from the internal modules as undefined - behavior. These modules were never exposed as public interfaces. -- removed `FileStorage.__len__` which previously made the object - falsy for browsers not sending the content length which all browsers - do. -- :class:`SharedDataMiddleware` uses `wrap_file` now and has a - configurable cache timeout. -- added :class:`CommonRequestDescriptorsMixin` -- added :attr:`CommonResponseDescriptorsMixin.mimetype_params` -- added :mod:`werkzeug.contrib.lint` -- added `passthrough_errors` to `run_simple`. -- added `secure_filename` -- added :func:`make_line_iter` -- :class:`MultiDict` copies now instead of revealing internal - lists to the caller for `getlist` and iteration functions that - return lists. -- added :attr:`follow_redirect` to the :func:`open` of :class:`Client`. -- added support for `extra_files` in - :func:`~werkzeug.script.make_runserver` - -Version 0.4.1 -------------- - -(Bugfix release, released on January 11th 2009) - -- `werkzeug.contrib.cache.Memcached` accepts now objects that - implement the memcache.Client interface as alternative to a list of - strings with server addresses. - There is also now a `GAEMemcachedCache` that connects to the Google - appengine cache. -- explicitly convert secret keys to bytestrings now because Python - 2.6 no longer does that. -- `url_encode` and all interfaces that call it, support ordering of - options now which however is disabled by default. -- the development server no longer resolves the addresses of clients. -- Fixed a typo in `werkzeug.test` that broke `File`. -- `Map.bind_to_environ` uses the `Host` header now if available. -- Fixed `BaseCache.get_dict` (#345) -- `werkzeug.test.Client` can now run the application buffered in which - case the application is properly closed automatically. -- Fixed `Headers.set` (#354). Caused header duplication before. -- Fixed `Headers.pop` (#349). default parameter was not properly - handled. -- Fixed UnboundLocalError in `create_environ` (#351) -- `Headers` is more compatible with wsgiref now. -- `Template.render` accepts multidicts now. -- dropped support for Python 2.3 - -Version 0.4 ------------ - -Released on November 23rd 2008, codename Schraubenzieher. - -- `Client` supports an empty `data` argument now. -- fixed a bug in `Response.application` that made it impossible to use it - as method decorator. -- the session system should work on appengine now -- the secure cookie works properly in load balanced environments with - different cpu architectures now. -- `CacheControl.no_cache` and `CacheControl.private` behavior changed to - reflect the possibilities of the HTTP RFC. Setting these attributes to - `None` or `True` now sets the value to "the empty value". - More details in the documentation. -- fixed `werkzeug.contrib.atom.AtomFeed.__call__`. (#338) -- `BaseResponse.make_conditional` now always returns `self`. Previously - it didn't for post requests and such. -- fixed a bug in boolean attribute handling of `html` and `xhtml`. -- added graceful error handling to the debugger pastebin feature. -- added a more list like interface to `Headers` (slicing and indexing - works now) -- fixed a bug with the `__setitem__` method of `Headers` that didn't - properly remove all keys on replacing. -- added `remove_entity_headers` which removes all entity headers from - a list of headers (or a `Headers` object) -- the responses now automatically call `remove_entity_headers` if the - status code is 304. -- fixed a bug with `Href` query parameter handling. Previously the last - item of a call to `Href` was not handled properly if it was a dict. -- headers now support a `pop` operation to better work with environ - properties. - - -Version 0.3.1 -------------- - -(bugfix release, released on June 24th 2008) - -- fixed a security problem with `werkzeug.contrib.SecureCookie`. - More details available in the `release announcement`_. - -.. _release announcement: http://lucumr.pocoo.org/cogitations/2008/06/24/werkzeug-031-released/ - -Version 0.3 ------------ - -Released on June 14th 2008, codename EUR325CAT6. - -- added support for redirecting in url routing. -- added `Authorization` and `AuthorizationMixin` -- added `WWWAuthenticate` and `WWWAuthenticateMixin` -- added `parse_list_header` -- added `parse_dict_header` -- added `parse_authorization_header` -- added `parse_www_authenticate_header` -- added `_get_current_object` method to `LocalProxy` objects -- added `parse_form_data` -- `MultiDict`, `CombinedMultiDict`, `Headers`, and `EnvironHeaders` raise - special key errors now that are subclasses of `BadRequest` so if you - don't catch them they give meaningful HTTP responses. -- added support for alternative encoding error handling and the new - `HTTPUnicodeError` which (if not caught) behaves like a `BadRequest`. -- added `BadRequest.wrap`. -- added ETag support to the SharedDataMiddleware and added an option - to disable caching. -- fixed `is_xhr` on the request objects. -- fixed error handling of the url adapter's `dispatch` method. (#318) -- fixed bug with `SharedDataMiddleware`. -- fixed `Accept.values`. -- `EnvironHeaders` contain content-type and content-length now -- `url_encode` treats lists and tuples in dicts passed to it as multiple - values for the same key so that one doesn't have to pass a `MultiDict` - to the function. -- added `validate_arguments` -- added `BaseRequest.application` -- improved Python 2.3 support -- `run_simple` accepts `use_debugger` and `use_evalex` parameters now, - like the `make_runserver` factory function from the script module. -- the `environ_property` is now read-only by default -- it's now possible to initialize requests as "shallow" requests which - causes runtime errors if the request object tries to consume the - input stream. - - -Version 0.2 ------------ - -Released Feb 14th 2008, codename Faustkeil. - -- Added `AnyConverter` to the routing system. -- Added `werkzeug.contrib.securecookie` -- Exceptions have a ``get_response()`` method that return a response object -- fixed the path ordering bug (#293), thanks Thomas Johansson -- `BaseReporterStream` is now part of the werkzeug contrib module. From - Werkzeug 0.3 onwards you will have to import it from there. -- added `DispatcherMiddleware`. -- `RequestRedirect` is now a subclass of `HTTPException` and uses a - 301 status code instead of 302. -- `url_encode` and `url_decode` can optionally treat keys as unicode strings - now, too. -- `werkzeug.script` has a different caller format for boolean arguments now. -- renamed `lazy_property` to `cached_property`. -- added `import_string`. -- added is_* properties to request objects. -- added `empty()` method to routing rules. -- added `werkzeug.contrib.profiler`. -- added `extends` to `Headers`. -- added `dump_cookie` and `parse_cookie`. -- added `as_tuple` to the `Client`. -- added `werkzeug.contrib.testtools`. -- added `werkzeug.unescape` -- added `BaseResponse.freeze` -- added `werkzeug.contrib.atom` -- the HTTPExceptions accept an argument `description` now which overrides the - default description. -- the `MapAdapter` has a default for path info now. If you use - `bind_to_environ` you don't have to pass the path later. -- the wsgiref subclass werkzeug uses for the dev server does not use direct - sys.stderr logging any more but a logger called "werkzeug". -- implemented `Href`. -- implemented `find_modules` -- refactored request and response objects into base objects, mixins and - full featured subclasses that implement all mixins. -- added simple user agent parser -- werkzeug's routing raises `MethodNotAllowed` now if it matches a - rule but for a different method. -- many fixes and small improvements - - -Version 0.1 ------------ - -Released on Dec 9th 2007, codename Wictorinoxger. - -- Initial release diff --git a/pythonPackages/Werkzeug-0.12.1/LICENSE b/pythonPackages/Werkzeug-0.12.1/LICENSE deleted file mode 100644 index 1c2e0b7dc6..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -Copyright (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/pythonPackages/Werkzeug-0.12.1/MANIFEST.in b/pythonPackages/Werkzeug-0.12.1/MANIFEST.in deleted file mode 100644 index 2e81e03c76..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/MANIFEST.in +++ /dev/null @@ -1,10 +0,0 @@ -include Makefile CHANGES LICENSE AUTHORS -recursive-include werkzeug/debug/shared * -recursive-include tests * -recursive-include docs * -recursive-include artwork * -recursive-include examples * - -prune docs/_build -prune docs/_themes -global-exclude *.py[cdo] __pycache__ *.so *.pyd diff --git a/pythonPackages/Werkzeug-0.12.1/Makefile b/pythonPackages/Werkzeug-0.12.1/Makefile deleted file mode 100644 index b5e3c98351..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -# -# Werkzeug Makefile -# ~~~~~~~~~~~~~~~~~ -# -# Shortcuts for various tasks. -# -# :copyright: (c) 2008 by the Werkzeug Team, see AUTHORS for more details. -# :license: BSD, see LICENSE for more details. -# - -documentation: - @(cd docs; make html) - -release: - python scripts/make-release.py - -test: - py.test --tb=native - -tox-test: - tox - -coverage: - @(coverage run --source=werkzeug --module py.test $(TEST_OPTIONS) $(TESTS)) - -doctest: - @(cd docs; sphinx-build -b doctest . _build/doctest) - -upload-docs: - $(MAKE) -C docs html dirhtml latex - $(MAKE) -C docs/_build/latex all-pdf - cd docs/_build/; mv html werkzeug-docs; zip -r werkzeug-docs.zip werkzeug-docs; mv werkzeug-docs html - rsync -a docs/_build/dirhtml/ flow.srv.pocoo.org:/srv/websites/werkzeug.pocoo.org/docs/ - rsync -a docs/_build/latex/Werkzeug.pdf flow.srv.pocoo.org:/srv/websites/werkzeug.pocoo.org/docs/ - rsync -a docs/_build/werkzeug-docs.zip flow.srv.pocoo.org:/srv/websites/werkzeug.pocoo.org/docs/werkzeug-docs.zip diff --git a/pythonPackages/Werkzeug-0.12.1/PKG-INFO b/pythonPackages/Werkzeug-0.12.1/PKG-INFO deleted file mode 100644 index 31d17b0748..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/PKG-INFO +++ /dev/null @@ -1,78 +0,0 @@ -Metadata-Version: 1.1 -Name: Werkzeug -Version: 0.12.1 -Summary: The Swiss Army knife of Python web development -Home-page: http://werkzeug.pocoo.org/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -License: BSD -Description: - Werkzeug - ======== - - Werkzeug started as simple collection of various utilities for WSGI - applications and has become one of the most advanced WSGI utility - modules. It includes a powerful debugger, full featured request and - response objects, HTTP utilities to handle entity tags, cache control - headers, HTTP dates, cookie handling, file uploads, a powerful URL - routing system and a bunch of community contributed addon modules. - - Werkzeug is unicode aware and doesn't enforce a specific template - engine, database adapter or anything else. It doesn't even enforce - a specific way of handling requests and leaves all that up to the - developer. It's most useful for end user applications which should work - on as many server environments as possible (such as blogs, wikis, - bulletin boards, etc.). - - Details and example applications are available on the - `Werkzeug website `_. - - - Features - -------- - - - unicode awareness - - - request and response objects - - - various utility functions for dealing with HTTP headers such as - `Accept` and `Cache-Control` headers. - - - thread local objects with proper cleanup at request end - - - an interactive debugger - - - A simple WSGI server with support for threading and forking - with an automatic reloader. - - - a flexible URL routing system with REST support. - - - fully WSGI compatible - - - Development Version - ------------------- - - The Werkzeug development version can be installed by cloning the git - repository from `github`_:: - - git clone git@github.com:pallets/werkzeug.git - - .. _github: http://github.com/pallets/werkzeug - -Platform: any -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Software Development :: Libraries :: Python Modules diff --git a/pythonPackages/Werkzeug-0.12.1/README.rst b/pythonPackages/Werkzeug-0.12.1/README.rst deleted file mode 100644 index 5d55b26c28..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/README.rst +++ /dev/null @@ -1,40 +0,0 @@ -Werkzeug -======== - -Werkzeug started as simple collection of various utilities for WSGI -applications and has become one of the most advanced WSGI utility -modules. It includes a powerful debugger, full-featured request and -response objects, HTTP utilities to handle entity tags, cache control -headers, HTTP dates, cookie handling, file uploads, a powerful URL -routing system and a bunch of community-contributed addon modules. - -Werkzeug is unicode aware and doesn't enforce a specific template -engine, database adapter or anything else. It doesn't even enforce -a specific way of handling requests and leaves all that up to the -developer. It's most useful for end user applications which should work -on as many server environments as possible (such as blogs, wikis, -bulletin boards, etc.). - -Details and example applications are available on the -`Werkzeug website `_. - - -Branches --------- - -+----------------------+-------------------------------------------------------------------------------+ -| ``master`` | .. image:: https://travis-ci.org/pallets/werkzeug.svg?branch=master | -| | :target: https://travis-ci.org/pallets/werkzeug | -+----------------------+-------------------------------------------------------------------------------+ -| ``0.12-maintenance`` | .. image:: https://travis-ci.org/pallets/werkzeug.svg?branch=0.12-maintenance | -| | :target: https://travis-ci.org/pallets/werkzeug | -+----------------------+-------------------------------------------------------------------------------+ -| ``0.11-maintenance`` | .. image:: https://travis-ci.org/pallets/werkzeug.svg?branch=0.11-maintenance | -| | :target: https://travis-ci.org/pallets/werkzeug | -+----------------------+-------------------------------------------------------------------------------+ -| ``0.10-maintenance`` | .. image:: https://travis-ci.org/pallets/werkzeug.svg?branch=0.10-maintenance | -| | :target: https://travis-ci.org/pallets/werkzeug | -+----------------------+-------------------------------------------------------------------------------+ -| ``0.9-maintenance`` | .. image:: https://travis-ci.org/pallets/werkzeug.svg?branch=0.9-maintenance | -| | :target: https://travis-ci.org/pallets/werkzeug | -+----------------------+-------------------------------------------------------------------------------+ diff --git a/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/PKG-INFO b/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/PKG-INFO deleted file mode 100644 index 31d17b0748..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/PKG-INFO +++ /dev/null @@ -1,78 +0,0 @@ -Metadata-Version: 1.1 -Name: Werkzeug -Version: 0.12.1 -Summary: The Swiss Army knife of Python web development -Home-page: http://werkzeug.pocoo.org/ -Author: Armin Ronacher -Author-email: armin.ronacher@active-4.com -License: BSD -Description: - Werkzeug - ======== - - Werkzeug started as simple collection of various utilities for WSGI - applications and has become one of the most advanced WSGI utility - modules. It includes a powerful debugger, full featured request and - response objects, HTTP utilities to handle entity tags, cache control - headers, HTTP dates, cookie handling, file uploads, a powerful URL - routing system and a bunch of community contributed addon modules. - - Werkzeug is unicode aware and doesn't enforce a specific template - engine, database adapter or anything else. It doesn't even enforce - a specific way of handling requests and leaves all that up to the - developer. It's most useful for end user applications which should work - on as many server environments as possible (such as blogs, wikis, - bulletin boards, etc.). - - Details and example applications are available on the - `Werkzeug website `_. - - - Features - -------- - - - unicode awareness - - - request and response objects - - - various utility functions for dealing with HTTP headers such as - `Accept` and `Cache-Control` headers. - - - thread local objects with proper cleanup at request end - - - an interactive debugger - - - A simple WSGI server with support for threading and forking - with an automatic reloader. - - - a flexible URL routing system with REST support. - - - fully WSGI compatible - - - Development Version - ------------------- - - The Werkzeug development version can be installed by cloning the git - repository from `github`_:: - - git clone git@github.com:pallets/werkzeug.git - - .. _github: http://github.com/pallets/werkzeug - -Platform: any -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Software Development :: Libraries :: Python Modules diff --git a/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/SOURCES.txt b/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/SOURCES.txt deleted file mode 100644 index f45ede37cf..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/SOURCES.txt +++ /dev/null @@ -1,292 +0,0 @@ -AUTHORS -CHANGES -LICENSE -MANIFEST.in -Makefile -README.rst -setup.cfg -setup.py -Werkzeug.egg-info/PKG-INFO -Werkzeug.egg-info/SOURCES.txt -Werkzeug.egg-info/dependency_links.txt -Werkzeug.egg-info/not-zip-safe -Werkzeug.egg-info/requires.txt -Werkzeug.egg-info/top_level.txt -artwork/logo.png -artwork/logo.svg -docs/Makefile -docs/changes.rst -docs/conf.py -docs/contents.rst.inc -docs/datastructures.rst -docs/debug.rst -docs/exceptions.rst -docs/filesystem.rst -docs/http.rst -docs/index.rst -docs/installation.rst -docs/latexindex.rst -docs/levels.rst -docs/local.rst -docs/logo.pdf -docs/make.bat -docs/makearchive.py -docs/middlewares.rst -docs/python3.rst -docs/quickstart.rst -docs/request_data.rst -docs/routing.rst -docs/serving.rst -docs/terms.rst -docs/test.rst -docs/transition.rst -docs/tutorial.rst -docs/unicode.rst -docs/urls.rst -docs/utils.rst -docs/werkzeugext.py -docs/werkzeugstyle.sty -docs/wrappers.rst -docs/wsgi.rst -docs/_static/background.png -docs/_static/codebackground.png -docs/_static/contents.png -docs/_static/debug-screenshot.png -docs/_static/favicon.ico -docs/_static/header.png -docs/_static/navigation.png -docs/_static/navigation_active.png -docs/_static/shortly.png -docs/_static/shorty-screenshot.png -docs/_static/style.css -docs/_static/werkzeug.js -docs/_static/werkzeug.png -docs/_templates/sidebarintro.html -docs/_templates/sidebarlogo.html -docs/contrib/atom.rst -docs/contrib/cache.rst -docs/contrib/fixers.rst -docs/contrib/index.rst -docs/contrib/iterio.rst -docs/contrib/lint.rst -docs/contrib/profiler.rst -docs/contrib/securecookie.rst -docs/contrib/sessions.rst -docs/contrib/wrappers.rst -docs/deployment/cgi.rst -docs/deployment/fastcgi.rst -docs/deployment/index.rst -docs/deployment/mod_wsgi.rst -docs/deployment/proxying.rst -examples/README -examples/cookieauth.py -examples/httpbasicauth.py -examples/manage-coolmagic.py -examples/manage-couchy.py -examples/manage-cupoftee.py -examples/manage-i18nurls.py -examples/manage-plnt.py -examples/manage-shorty.py -examples/manage-simplewiki.py -examples/manage-webpylike.py -examples/upload.py -examples/contrib/README -examples/contrib/securecookie.py -examples/contrib/sessions.py -examples/coolmagic/__init__.py -examples/coolmagic/application.py -examples/coolmagic/helpers.py -examples/coolmagic/utils.py -examples/coolmagic/public/style.css -examples/coolmagic/templates/layout.html -examples/coolmagic/templates/static/about.html -examples/coolmagic/templates/static/index.html -examples/coolmagic/templates/static/not_found.html -examples/coolmagic/views/__init__.py -examples/coolmagic/views/static.py -examples/couchy/README -examples/couchy/__init__.py -examples/couchy/application.py -examples/couchy/models.py -examples/couchy/utils.py -examples/couchy/views.py -examples/couchy/static/style.css -examples/couchy/templates/display.html -examples/couchy/templates/layout.html -examples/couchy/templates/list.html -examples/couchy/templates/new.html -examples/couchy/templates/not_found.html -examples/cupoftee/__init__.py -examples/cupoftee/application.py -examples/cupoftee/db.py -examples/cupoftee/network.py -examples/cupoftee/pages.py -examples/cupoftee/utils.py -examples/cupoftee/shared/content.png -examples/cupoftee/shared/down.png -examples/cupoftee/shared/favicon.ico -examples/cupoftee/shared/header.png -examples/cupoftee/shared/logo.png -examples/cupoftee/shared/style.css -examples/cupoftee/shared/up.png -examples/cupoftee/templates/layout.html -examples/cupoftee/templates/missingpage.html -examples/cupoftee/templates/search.html -examples/cupoftee/templates/server.html -examples/cupoftee/templates/serverlist.html -examples/i18nurls/__init__.py -examples/i18nurls/application.py -examples/i18nurls/urls.py -examples/i18nurls/views.py -examples/i18nurls/templates/about.html -examples/i18nurls/templates/blog.html -examples/i18nurls/templates/index.html -examples/i18nurls/templates/layout.html -examples/partial/README -examples/partial/complex_routing.py -examples/plnt/__init__.py -examples/plnt/database.py -examples/plnt/sync.py -examples/plnt/utils.py -examples/plnt/views.py -examples/plnt/webapp.py -examples/plnt/shared/style.css -examples/plnt/templates/about.html -examples/plnt/templates/index.html -examples/plnt/templates/layout.html -examples/shortly/shortly.py -examples/shortly/static/style.css -examples/shortly/templates/404.html -examples/shortly/templates/layout.html -examples/shortly/templates/new_url.html -examples/shortly/templates/short_link_details.html -examples/shorty/__init__.py -examples/shorty/application.py -examples/shorty/models.py -examples/shorty/utils.py -examples/shorty/views.py -examples/shorty/static/style.css -examples/shorty/templates/display.html -examples/shorty/templates/layout.html -examples/shorty/templates/list.html -examples/shorty/templates/new.html -examples/shorty/templates/not_found.html -examples/simplewiki/__init__.py -examples/simplewiki/actions.py -examples/simplewiki/application.py -examples/simplewiki/database.py -examples/simplewiki/specialpages.py -examples/simplewiki/utils.py -examples/simplewiki/shared/style.css -examples/simplewiki/templates/action_diff.html -examples/simplewiki/templates/action_edit.html -examples/simplewiki/templates/action_log.html -examples/simplewiki/templates/action_revert.html -examples/simplewiki/templates/action_show.html -examples/simplewiki/templates/layout.html -examples/simplewiki/templates/macros.xml -examples/simplewiki/templates/missing_action.html -examples/simplewiki/templates/page_index.html -examples/simplewiki/templates/page_missing.html -examples/simplewiki/templates/recent_changes.html -examples/webpylike/example.py -examples/webpylike/webpylike.py -tests/__init__.py -tests/conftest.py -tests/test_compat.py -tests/test_datastructures.py -tests/test_debug.py -tests/test_exceptions.py -tests/test_formparser.py -tests/test_http.py -tests/test_internal.py -tests/test_local.py -tests/test_routing.py -tests/test_security.py -tests/test_serving.py -tests/test_test.py -tests/test_urls.py -tests/test_utils.py -tests/test_wrappers.py -tests/test_wsgi.py -tests/contrib/__init__.py -tests/contrib/test_atom.py -tests/contrib/test_cache.py -tests/contrib/test_fixers.py -tests/contrib/test_iterio.py -tests/contrib/test_securecookie.py -tests/contrib/test_sessions.py -tests/contrib/test_wrappers.py -tests/hypothesis/__init__.py -tests/hypothesis/test_urls.py -tests/multipart/ie7_full_path_request.txt -tests/multipart/test_collect.py -tests/multipart/firefox3-2png1txt/file1.png -tests/multipart/firefox3-2png1txt/file2.png -tests/multipart/firefox3-2png1txt/request.txt -tests/multipart/firefox3-2png1txt/text.txt -tests/multipart/firefox3-2pnglongtext/file1.png -tests/multipart/firefox3-2pnglongtext/file2.png -tests/multipart/firefox3-2pnglongtext/request.txt -tests/multipart/firefox3-2pnglongtext/text.txt -tests/multipart/ie6-2png1txt/file1.png -tests/multipart/ie6-2png1txt/file2.png -tests/multipart/ie6-2png1txt/request.txt -tests/multipart/ie6-2png1txt/text.txt -tests/multipart/opera8-2png1txt/file1.png -tests/multipart/opera8-2png1txt/file2.png -tests/multipart/opera8-2png1txt/request.txt -tests/multipart/opera8-2png1txt/text.txt -tests/multipart/webkit3-2png1txt/file1.png -tests/multipart/webkit3-2png1txt/file2.png -tests/multipart/webkit3-2png1txt/request.txt -tests/multipart/webkit3-2png1txt/text.txt -tests/res/test.txt -werkzeug/__init__.py -werkzeug/_compat.py -werkzeug/_internal.py -werkzeug/_reloader.py -werkzeug/datastructures.py -werkzeug/exceptions.py -werkzeug/filesystem.py -werkzeug/formparser.py -werkzeug/http.py -werkzeug/local.py -werkzeug/posixemulation.py -werkzeug/routing.py -werkzeug/script.py -werkzeug/security.py -werkzeug/serving.py -werkzeug/test.py -werkzeug/testapp.py -werkzeug/urls.py -werkzeug/useragents.py -werkzeug/utils.py -werkzeug/wrappers.py -werkzeug/wsgi.py -werkzeug/contrib/__init__.py -werkzeug/contrib/atom.py -werkzeug/contrib/cache.py -werkzeug/contrib/fixers.py -werkzeug/contrib/iterio.py -werkzeug/contrib/jsrouting.py -werkzeug/contrib/limiter.py -werkzeug/contrib/lint.py -werkzeug/contrib/profiler.py -werkzeug/contrib/securecookie.py -werkzeug/contrib/sessions.py -werkzeug/contrib/testtools.py -werkzeug/contrib/wrappers.py -werkzeug/debug/__init__.py -werkzeug/debug/console.py -werkzeug/debug/repr.py -werkzeug/debug/tbtools.py -werkzeug/debug/shared/FONT_LICENSE -werkzeug/debug/shared/console.png -werkzeug/debug/shared/debugger.js -werkzeug/debug/shared/jquery.js -werkzeug/debug/shared/less.png -werkzeug/debug/shared/more.png -werkzeug/debug/shared/source.png -werkzeug/debug/shared/style.css -werkzeug/debug/shared/ubuntu.ttf \ No newline at end of file diff --git a/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/dependency_links.txt b/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789179..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/not-zip-safe b/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/not-zip-safe deleted file mode 100644 index 8b13789179..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/not-zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/requires.txt b/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/requires.txt deleted file mode 100644 index fcd1813b15..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/requires.txt +++ /dev/null @@ -1,6 +0,0 @@ - -[termcolor] -termcolor - -[watchdog] -watchdog diff --git a/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/top_level.txt b/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/top_level.txt deleted file mode 100644 index 6fe8da8499..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/Werkzeug.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -werkzeug diff --git a/pythonPackages/Werkzeug-0.12.1/artwork/logo.png b/pythonPackages/Werkzeug-0.12.1/artwork/logo.png deleted file mode 100644 index 61666ab1f093b0dd9e9446de2a0df8d0b631e583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35069 zcmZ7ebwJZ^*f$Jsbf-vzP5}`V5D+N`I!Y;N5lN+#ke1pINkK$HN(t#!x*J5grBepd zJz#9_x!-l)?{htm|0sHX&pP^Zd``o(HC1S-IH({H2(6kbLI(mN0)HfeP>_M&4!uUt zz;7h357hK1z%O5l7op&1b~hy>H(e)dH%|+fmk>`+&)as6uUxGxoL}B{amE7aYFC!?` z9}H59cCIl;H#Uc4Hl7m462*u8DuaE_Z4|XqH{YZ}iHT_ly=Q@Rw%=e}CzoRn)-HkE`s(V_#?ZsYe6sIqG(O?q_3D5p5N-K3Mbrj+6J402q%*!9FbtvefXB>n6bS4N}lY)g2h+5(S zXhy81^x!Y)s>gzjV*DQn3r8?S_ctG`Ip9JH$v9-t9yifqoi~0GH7BrLfo%nJzj*Ex zB^7WsE;*R6_7cqVL=$05tQ%11ICDU!Js@2r|KWhcsxcX?(?&sqz&;eHc(0Z zH4cg*?QF~(LXe2CJ1`yk1o{{B-nY6iT)B%W=eO2^*sO-FM<9`5FqjT!!s8VO93&1k z2Gf!IpMNm~UopXSxV>n9u^bu?m-6Ipr%W>)K8O$#EE9rsBA|>lWL|N<=CRP<#IF#U zF9xZ_Ix~BV!44M@nKv8hk#lJipEWrH?E7o_2>WoAt0OX3Ct;56K`GsEz)iZRUcJYR zrs&6esn`R%b`c$l`$j|!b@m9nmf!*{qu}?X4z?Ia!tnzTD=>3G zZG~(8=|rWk@1~eBetXO1xRDx76*jiP8G* zgfh)LT!X~V3$z~g+PlB{Wo%Xt2m)n9AZ`-%1hjJO9iW5wMB4aRx$r((aug@WL%+^a znJ};glQH4WgirtNk|Ej^#nP+>#;yh^iKqSU5NuixHB*i7SZHc2#Yk#k=TR$foey~eM&kOKKC~tv2*%Vo3*$Qpg-$TgK$$OaLK z&rD-FDNV~@8)RAiffe#0>O2u?cgXRi=i&p#-OZoEaVX{&iGykzWd9qvrPSb*gpAu=JQ zB-N^X_eHI5xH;r7%1dbcJMW@(ePQ@Gnl|A!3>tf{v;8h%(krl2R7Z1`v9$7iGAWPI zaGu)W3X8cH^X}SeOrrXTse+fH{B%!&5hR4Enwm2*EUkS#

A@_8bZS=6_`0{7%q+ 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 - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/pythonPackages/Werkzeug-0.12.1/docs/Makefile b/pythonPackages/Werkzeug-0.12.1/docs/Makefile deleted file mode 100644 index 52d78d9efe..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/Makefile +++ /dev/null @@ -1,118 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp epub latex changes linkcheck doctest - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Flask.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Flask.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) _build/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/Flask" - @echo "# ln -s _build/devhelp $$HOME/.local/share/devhelp/Flask" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ - "run these through (pdf)latex." - -latexpdf: latex - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex - @echo "Running LaTeX files through pdflatex..." - make -C _build/latex all-pdf - @echo "pdflatex finished; the PDF files are in _build/latex." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." diff --git a/pythonPackages/Werkzeug-0.12.1/docs/_static/background.png b/pythonPackages/Werkzeug-0.12.1/docs/_static/background.png deleted file mode 100644 index 928957aa3c01701a9b842138a93ee8474afb779d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73096 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 LNkvXXu0mjf{+y>$ diff --git a/pythonPackages/Werkzeug-0.12.1/docs/_static/codebackground.png b/pythonPackages/Werkzeug-0.12.1/docs/_static/codebackground.png deleted file mode 100644 index 3368da2ea931348a1fd8ac0dbec71bd8de564509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8307 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 EFaDB{7ytkO diff --git a/pythonPackages/Werkzeug-0.12.1/docs/_static/contents.png b/pythonPackages/Werkzeug-0.12.1/docs/_static/contents.png deleted file mode 100644 index 6f993b5e3da27708d913115f46f9e2f9d80b2f39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5527 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 Z7yz0-u}002ovPDHLkV1gzQ={5iW diff --git a/pythonPackages/Werkzeug-0.12.1/docs/_static/debug-screenshot.png b/pythonPackages/Werkzeug-0.12.1/docs/_static/debug-screenshot.png deleted file mode 100644 index 14326468943bf6fbf00d73b4acb0ae11d041ae05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209112 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

E4g1Mq(p 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�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 Q&j0`b07*qoM6N<$f+XSUEdT%j diff --git a/pythonPackages/Werkzeug-0.12.1/docs/_static/favicon.ico b/pythonPackages/Werkzeug-0.12.1/docs/_static/favicon.ico deleted file mode 100644 index a3b079a9f473996fffba9bdbc0feb8766e4f75be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmb7DOG_JJ6g^>PG8tXeRl$|jRTuRK=%#!BfLmRNA{IgsK`O2It|%xe5|I)_3u%eq zBVe&0p{;LG!AG<%;-=7z(p?3Mx98?_w5Uij;mkL=-#ur}z4Kilz+X`jcz=Qh8+Z)h zDZvmUCe9__%R4upqpe0)4Mp6faVpHBs`EpqvdfuK*h zv+5aXjv5W^!xnK!jIC)M3FbR@IJX0OR<&RL`HiH=_2Nw9bmn;J%ye^hqThw{FiDn` yBhya{WM@}r_yO+a8{qGA;JgI*{RlW=S5rj0zKv7g&Lze5g#UFPx#32;bRa{vGvuK)lWuK`{fksJU300(qQO+^RT0S*Q&7}(9!Y5)Kr07*naRCwC7 zz1fo_*>&dkJNNn$OJ?L&TkqXixXmwS&M+#}ML>mHE}PMMWeR%S+o`}Mng=R4o|j{GnG^S@J6 zSr!GkSF+Nx$qFX1WtJw)CJC`oVjGbp2}YoFo;XTCOD5?Nw|8&3+2qXT$J|}7IZZ8- z#e~hKBu!#O9LGl|7!T?l-U_$^uO4F(R_i;Ko02y-OJ3bBd3(3vhu{4GB*wTk(@9F{ z9Fxc(BCLxX=OB#}iXy{_vfg-{!sX3|Pd|Ld&E1lV(^H&tJbQFOS!Spz))-L17{hFO zMCm0fw2=5(EmAmB)Md1*y++`a!MTtnnd^#b| zH)OuRIVFu^PUlBVCn+b3Gfp49NBQ2L@Yl0X`H!1ZUfg;#SMUm@qNRee`+s#YRDZly z|EhwozenS1sb6cVZ|{D-{aR%EO=SDC*6+4{82Fxqf7X1>(9g$yR~pwRfUWPr)c-dI ztRNP!00j~FU;Kps>&Jh`>fiiN{HIU;ip#Y}3q^}+9%$K^3$Fg_6?OF-@b$l1 zKRc}-pud0Q_kVQ!p&atO2LCkPyE)%>UrOWu5}0VTe^(l>*O8ALyUpMj484Hy&uWfo z;H4^^Z)$r?CGex&8XEh|?emoGXUga!=>4mm50cLPO6NU?uB-Pt>2C$QF_HU=lFr=o z19MIqH=+-mf}Y>+j|RSe$eNHtz9$cVkAI09(toMX*gnh7B$1IfHV2NK1m@}X+IMG@ z4%~v?|6H4&DS>s=ScEFO-_^!`BQi7(w0U9gDl#-V@ z#zveU$4nGBL=L2^WzC;$1~o`Px;MP zZvewOD|mhRmd9tOh%wj+#A!rq61*!&lN9d?EO2^y%&N$Ed~!x4%6bD%4bLxcP%+#t zmpnaRV6;FGk~k)cV>X)=iZDs$I4vk#i4g;0h~fnAN=jc6r4y{N)Q1J^EAr)9iv5s!%8x zMPfyrRx`uaKwWB3ZW{+sw4Ge_=HfMcxJr8i6&f3dNPokU_J*~06Oqp0t`7j|(%HPF z0m_>fY&w5M?*AIu0e3MF8zFKz6ZLrS$%_oHiiu`KaltfAD80i*25SWM;6?B#)PTFl z9Z?FX2QlQO!x%-K;8k(XVXOfM#wdcIb?j6

P|`ot07-Lo^^Ie$c6=Dd3I5^EHf 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 a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink { - visibility: visible; -} - -a.headerlink:hover { - background-color: #B4B4B4; - color: #F0F0F0!important; -} - -table { - border-collapse: collapse; - margin: 0 -0.5em 0 -0.5em; -} - -table td, table th { - padding: 0.2em 0.5em 0.2em 0.5em; -} - -div.footer { - background-color: #E3EFF1; - color: #86989B; - padding: 3px 8px 3px 0; - clear: both; - font-size: 0.8em; - text-align: right; -} - -div.footer a { - color: #86989B; - text-decoration: underline; -} - -div.toc { - float: right; - background-color: white; - border: 1px solid #86989B; - padding: 0; - margin: 0 0 1em 1em; - width: 10em; -} - -div.toc h4 { - margin: 0; - font-size: 0.9em; - padding: 0.1em 0 0.1em 0.6em; - margin: 0; - color: white; - border-bottom: 1px solid #86989B; - background-color: #AFC1C4; -} - -div.toc ul { - margin: 1em 0 1em 0; - padding: 0 0 0 1em; - list-style: none; -} - -div.toc ul li { - margin: 0.5em 0 0.5em 0; - font-size: 0.9em; - line-height: 130%; -} - -div.toc ul li p { - margin: 0; - padding: 0; -} - -div.toc ul ul { - margin: 0.2em 0 0.2em 0; - padding: 0 0 0 1.8em; -} - -div.toc ul ul li { - padding: 0; -} - -div.admonition, div.warning, div#toc { - font-size: 0.9em; - margin: 1em 0 0 0; - border: 1px solid #86989B; - background-color: #f7f7f7; -} - -div.admonition p, div.warning p, div#toc p { - margin: 0.5em 1em 0.5em 1em; - padding: 0; -} - -div.admonition pre, div.warning pre, div#toc pre { - margin: 0.4em 1em 0.4em 1em; -} - -div.admonition p.admonition-title, -div.warning p.admonition-title, -div#toc h3 { - margin: 0; - padding: 0.1em 0 0.1em 0.5em; - color: white; - border-bottom: 1px solid #86989B; - font-weight: bold; - background-color: #AFC1C4; -} - -div.warning { - border: 1px solid #940000; -} - -div.warning p.admonition-title { - background-color: #CF0000; - border-bottom-color: #940000; -} - -div.admonition ul, div.admonition ol, -div.warning ul, div.warning ol, -div#toc ul, div#toc ol { - margin: 0.1em 0.5em 0.5em 3em; - padding: 0; -} - -div#toc div.inner { - border-top: 1px solid #86989B; - padding: 10px; -} - -div#toc h3 { - border-bottom: none; - cursor: pointer; - font-size: 13px; -} - -div#toc h3:hover { - background-color: #86989B; -} - -div#toc ul { - margin: 2px 0 2px 20px; - padding: 0; -} - -div#toc ul li { - line-height: 125%; -} - -dl.function dt, -dl.class dt, -dl.exception dt, -dl.method dt, -dl.attribute dt { - font-weight: normal; -} - -dt .descname { - font-weight: bold; - margin-right: 4px; -} - -dt .descname, dt .descclassname { - padding: 0; - background: transparent; - border-bottom: 1px solid #111; -} - -dt .descclassname { - margin-left: 2px; -} - -dl dt big { - font-size: 100%; -} - -dl p { - margin: 0; -} - -dl p + p { - margin-top: 10px; -} - -span.versionmodified { - color: #4B4A49; - font-weight: bold; -} - -span.versionadded { - color: #30691A; - font-weight: bold; -} - -table.field-list td.field-body ul.simple { - margin: 0; - padding: 0!important; - list-style: none; -} - -table.indextable td { - width: 50%; - vertical-align: top; -} - -table.indextable dt { - margin: 0; -} - -table.indextable dd dt a { - color: black!important; - font-size: 0.8em; -} - -div.jumpbox { - padding: 1em 0 0.4em 0; - border-bottom: 1px solid #ddd; - color: #aaa; -} diff --git a/pythonPackages/Werkzeug-0.12.1/docs/_static/werkzeug.js b/pythonPackages/Werkzeug-0.12.1/docs/_static/werkzeug.js deleted file mode 100644 index 6ab549a330..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/_static/werkzeug.js +++ /dev/null @@ -1,10 +0,0 @@ -(function() { - Werkzeug = {}; - - $(function() { - $('#toc h3').click(function() { - $(this).next().slideToggle(); - $(this).parent().toggleClass('toc-collapsed'); - }).next().hide().parent().addClass('toc-collapsed'); - }); -})(); diff --git a/pythonPackages/Werkzeug-0.12.1/docs/_static/werkzeug.png b/pythonPackages/Werkzeug-0.12.1/docs/_static/werkzeug.png deleted file mode 100644 index 9cedb0614a658347219e072fbdb19e28c1da72cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19109 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 Werkzeug

<0AC*Q< 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 Y?bIRN^-rAc#f~eNOfQyRaD4Fp0iT0Fr2qf` diff --git a/pythonPackages/Werkzeug-0.12.1/docs/_static/shorty-screenshot.png b/pythonPackages/Werkzeug-0.12.1/docs/_static/shorty-screenshot.png deleted file mode 100644 index c20c935ed249bfb48e4e5e53ec66c70c0d6236de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85078 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

-

- Werkzeug is a WSGI utility library. It can serve as the basis for a - custom framework. -

-

Other Formats

-

- You can download the documentation in other formats as well: -

-
-

Useful Links

- diff --git a/pythonPackages/Werkzeug-0.12.1/docs/_templates/sidebarlogo.html b/pythonPackages/Werkzeug-0.12.1/docs/_templates/sidebarlogo.html deleted file mode 100644 index c1a7ba7a73..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/_templates/sidebarlogo.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/pythonPackages/Werkzeug-0.12.1/docs/changes.rst b/pythonPackages/Werkzeug-0.12.1/docs/changes.rst deleted file mode 100644 index 4e4a409a98..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/changes.rst +++ /dev/null @@ -1,109 +0,0 @@ -================== -Werkzeug Changelog -================== - -.. module:: werkzeug - -This file lists all major changes in Werkzeug over the versions. -For API breaking changes have a look at :ref:`api-changes`, they -are listed there in detail. - -.. include:: ../CHANGES - -.. _api-changes: - -API Changes -=========== - -`0.9` - - Soft-deprecated the :attr:`BaseRequest.data` and - :attr:`BaseResponse.data` attributes and introduced new methods - to interact with entity data. This will allows in the future to - make better APIs to deal with request and response entity - bodies. So far there is no deprecation warning but users are - strongly encouraged to update. - - The :class:`Headers` and :class:`EnvironHeaders` datastructures - are now designed to operate on unicode data. This is a backwards - incompatible change and was necessary for the Python 3 support. - - The :class:`Headers` object no longer supports in-place operations - through the old ``linked`` method. This has been removed without - replacement due to changes on the encoding model. - -`0.6.2` - - renamed the attribute `implicit_seqence_conversion` attribute of - the request object to `implicit_sequence_conversion`. Because - this is a feature that is typically unused and was only in there - for the 0.6 series we consider this a bug that does not require - backwards compatibility support which would be impossible to - properly implement. - -`0.6` - - Old deprecations were removed. - - `cached_property.writeable` was deprecated. - - :meth:`BaseResponse.get_wsgi_headers` replaces the older - `BaseResponse.fix_headers` method. The older method stays - around for backwards compatibility reasons until 0.7. - - `BaseResponse.header_list` was deprecated. You should not - need this function, `get_wsgi_headers` and the `to_list` - method on the regular headers should serve as a replacement. - - Deprecated `BaseResponse.iter_encoded`'s charset parameter. - - :class:`LimitedStream` non-silent usage was deprecated. - - the `__repr__` of HTTP exceptions changed. This might break - doctests. - -`0.5` - - Werkzeug switched away from wsgiref as library for the builtin - webserver. - - The `encoding` parameter for :class:`Template`\s is now called - `charset`. The older one will work for another two versions - but warn with a :exc:`DeprecationWarning`. - - The :class:`Client` has cookie support now which is enabled - by default. - - :meth:`BaseResponse._get_file_stream` is now passed more parameters - to make the function more useful. In 0.6 the old way to invoke - the method will no longer work. To support both newer and older - Werkzeug versions you can add all arguments to the signature and - provide default values for each of them. - - :func:`url_decode` no longer supports both `&` and `;` as - separator. This has to be specified explicitly now. - - The request object is now enforced to be read-only for all - attributes. If your code relies on modifications of some values - makes sure to create copies of them using the mutable counterparts! - - Some data structures that were only used on request objects are - now immutable as well. (:class:`Authorization` / :class:`Accept` - and subclasses) - - `CacheControl` was split up into :class:`RequestCacheControl` - and :class:`ResponseCacheControl`, the former being immutable. - The old class will go away in 0.6 - - undocumented `werkzeug.test.File` was replaced by - :class:`FileWrapper`. - - it's not longer possible to pass dicts inside the `data` dict - in :class:`Client`. Use tuples instead. - - It's save to modify the return value of :meth:`MultiDict.getlist` - and methods that return lists in the :class:`MultiDict` now. The - class creates copies instead of revealing the internal lists. - However :class:`MultiDict.setlistdefault` still (and intentionally) - returns the internal list for modifications. - -`0.3` - - Werkzeug 0.3 will be the last release with Python 2.3 compatibility. - - The `environ_property` is now read-only by default. This decision was - made because the request in general should be considered read-only. - -`0.2` - - The `BaseReporterStream` is now part of the contrib module, the - new module is `werkzeug.contrib.reporterstream`. Starting with - `0.3`, the old import will not work any longer. - - `RequestRedirect` now uses a 301 status code. Previously a 302 - status code was used incorrectly. If you want to continue using - this 302 code, use ``response = redirect(e.new_url, 302)``. - - `lazy_property` is now called `cached_property`. The alias for - the old name will disappear in Werkzeug 0.3. - - `match` can now raise `MethodNotAllowed` if configured for - methods and there was no method for that request. - - The `response_body` attribute on the response object is now called - `data`. With Werkzeug 0.3 the old name will not work any longer. - - The file-like methods on the response object are deprecated. If - you want to use the response object as file like object use the - `Response` class or a subclass of `BaseResponse` and mix the new - `ResponseStreamMixin` class and use `response.stream`. diff --git a/pythonPackages/Werkzeug-0.12.1/docs/conf.py b/pythonPackages/Werkzeug-0.12.1/docs/conf.py deleted file mode 100644 index 540ae20d84..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/conf.py +++ /dev/null @@ -1,214 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Werkzeug documentation build configuration file, created by -# sphinx-quickstart on Fri Jan 16 23:10:43 2009. -# -# This file is execfile()d with the current directory set to its containing dir. -# -# The contents of this file are pickled, so don't put values in the namespace -# that aren't pickleable (module imports are okay, they're removed automatically). -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys, os - -# If your extensions are in another directory, add it here. If the directory -# is relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -sys.path.append(os.path.abspath('.')) -sys.path.append(os.path.abspath('_themes')) - -# General configuration -# --------------------- - -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', - 'sphinx.ext.doctest', 'werkzeugext'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'Werkzeug' -copyright = u'2011, The Werkzeug Team' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. - -import re -try: - import werkzeug -except ImportError: - sys.path.append(os.path.abspath('../')) -from werkzeug import __version__ as release -if 'dev' in release: - release = release[:release.find('dev') + 3] -if release == 'unknown': - version = release -else: - version = re.match(r'\d+\.\d+(?:\.\d+)?', release).group() - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of documents that shouldn't be included in the build. -#unused_docs = [] - -# List of directories, relative to source directory, that shouldn't be searched -# for source files. -exclude_trees = ['_build'] - -# The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'werkzeug_theme_support.WerkzeugStyle' - -# doctest setup code -doctest_global_setup = '''\ -from werkzeug import * -''' - - -# Options for HTML output -# ----------------------- - -html_theme = 'werkzeug' -html_theme_path = ['_themes'] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -html_sidebars = { - 'index': ['sidebarlogo.html', 'sidebarintro.html', 'sourcelink.html', - 'searchbox.html'], - '**': ['sidebarlogo.html', 'localtoc.html', 'relations.html', - 'sourcelink.html', 'searchbox.html'] -} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_use_modindex = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = '' - -# Output file base name for HTML help builder. -htmlhelp_basename = 'Werkzeugdoc' - - -# Options for LaTeX output -# ------------------------ - -# The paper size ('letter' or 'a4'). -latex_paper_size = 'a4' - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, document class [howto/manual]). -latex_documents = [ - ('latexindex', 'Werkzeug.tex', ur'Werkzeug Documentation', - ur'The Werkzeug Team', 'manual'), -] - -# Additional stuff for LaTeX -latex_elements = { - 'fontpkg': r'\usepackage{mathpazo}', - 'papersize': 'a4paper', - 'pointsize': '12pt', - 'preamble': r''' -\usepackage{werkzeugstyle} - -% i hate you latex, here too -\DeclareUnicodeCharacter{2603}{\\N\{SNOWMAN\}} -''' -} - -latex_use_parts = True - -latex_additional_files = ['werkzeugstyle.sty', 'logo.pdf'] - -latex_use_modindex = False - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = { - 'http://docs.python.org/dev': None, - 'http://docs.sqlalchemy.org/en/latest/': None -} diff --git a/pythonPackages/Werkzeug-0.12.1/docs/contents.rst.inc b/pythonPackages/Werkzeug-0.12.1/docs/contents.rst.inc deleted file mode 100644 index d5d29a85b0..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/contents.rst.inc +++ /dev/null @@ -1,85 +0,0 @@ -Getting Started ---------------- - -If you are new to Werkzeug or WSGI development in general you -should start here. - -.. toctree:: - :maxdepth: 2 - - installation - transition - tutorial - levels - quickstart - python3 - -Serving and Testing -------------------- - -The development server and testing support and management script -utilities are covered here: - -.. toctree:: - :maxdepth: 2 - - serving - test - debug - -Reference ---------- - -.. toctree:: - :maxdepth: 2 - - wrappers - routing - wsgi - filesystem - http - datastructures - utils - urls - local - middlewares - exceptions - -Deployment ----------- - -This section covers running your application in production on a web -server such as Apache or lighttpd. - -.. toctree:: - :maxdepth: 3 - - deployment/index - -Contributed Modules -------------------- - -A lot of useful code contributed by the community is shipped with Werkzeug -as part of the `contrib` module: - -.. toctree:: - :maxdepth: 3 - - contrib/index - -Additional Information ----------------------- - -.. toctree:: - :maxdepth: 2 - - terms - unicode - request_data - changes - -If you can’t find the information you’re looking for, have a look at the -index or try to find it using the search function: - -* :ref:`genindex` -* :ref:`search` diff --git a/pythonPackages/Werkzeug-0.12.1/docs/contrib/atom.rst b/pythonPackages/Werkzeug-0.12.1/docs/contrib/atom.rst deleted file mode 100644 index a2e583437e..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/contrib/atom.rst +++ /dev/null @@ -1,10 +0,0 @@ -================ -Atom Syndication -================ - -.. automodule:: werkzeug.contrib.atom - -.. autoclass:: AtomFeed - :members: - -.. autoclass:: FeedEntry diff --git a/pythonPackages/Werkzeug-0.12.1/docs/contrib/cache.rst b/pythonPackages/Werkzeug-0.12.1/docs/contrib/cache.rst deleted file mode 100644 index 7437ea6d97..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/contrib/cache.rst +++ /dev/null @@ -1,36 +0,0 @@ -===== -Cache -===== - -.. automodule:: werkzeug.contrib.cache - - -Cache System API -================ - -.. autoclass:: BaseCache - :members: - - -Cache Systems -============= - -.. autoclass:: NullCache - -.. autoclass:: SimpleCache - -.. autoclass:: MemcachedCache - -.. class:: GAEMemcachedCache - - This class is deprecated in favour of :class:`MemcachedCache` which - now supports Google Appengine as well. - - .. versionchanged:: 0.8 - Deprecated in favour of :class:`MemcachedCache`. - -.. autoclass:: RedisCache - -.. autoclass:: FileSystemCache - -.. autoclass:: UWSGICache diff --git a/pythonPackages/Werkzeug-0.12.1/docs/contrib/fixers.rst b/pythonPackages/Werkzeug-0.12.1/docs/contrib/fixers.rst deleted file mode 100644 index 662b5c24b0..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/contrib/fixers.rst +++ /dev/null @@ -1,16 +0,0 @@ -====== -Fixers -====== - -.. automodule:: werkzeug.contrib.fixers - -.. autoclass:: CGIRootFix - -.. autoclass:: PathInfoFromRequestUriFix - -.. autoclass:: ProxyFix - :members: - -.. autoclass:: HeaderRewriterFix - -.. autoclass:: InternetExplorerFix diff --git a/pythonPackages/Werkzeug-0.12.1/docs/contrib/index.rst b/pythonPackages/Werkzeug-0.12.1/docs/contrib/index.rst deleted file mode 100644 index 991f50619c..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/contrib/index.rst +++ /dev/null @@ -1,19 +0,0 @@ -=================== -Contributed Modules -=================== - -A lot of useful code contributed by the community is shipped with Werkzeug -as part of the `contrib` module: - -.. toctree:: - :maxdepth: 2 - - atom - sessions - securecookie - cache - wrappers - iterio - fixers - profiler - lint diff --git a/pythonPackages/Werkzeug-0.12.1/docs/contrib/iterio.rst b/pythonPackages/Werkzeug-0.12.1/docs/contrib/iterio.rst deleted file mode 100644 index e7b0fe9994..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/contrib/iterio.rst +++ /dev/null @@ -1,8 +0,0 @@ -======= -Iter IO -======= - -.. automodule:: werkzeug.contrib.iterio - -.. autoclass:: IterIO - :members: diff --git a/pythonPackages/Werkzeug-0.12.1/docs/contrib/lint.rst b/pythonPackages/Werkzeug-0.12.1/docs/contrib/lint.rst deleted file mode 100644 index fe3e015c26..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/contrib/lint.rst +++ /dev/null @@ -1,9 +0,0 @@ -========================== -Lint Validation Middleware -========================== - -.. currentmodule:: werkzeug.contrib.lint - -.. automodule:: werkzeug.contrib.lint - -.. autoclass:: LintMiddleware diff --git a/pythonPackages/Werkzeug-0.12.1/docs/contrib/profiler.rst b/pythonPackages/Werkzeug-0.12.1/docs/contrib/profiler.rst deleted file mode 100644 index 187039ebec..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/contrib/profiler.rst +++ /dev/null @@ -1,11 +0,0 @@ -========================= -WSGI Application Profiler -========================= - -.. automodule:: werkzeug.contrib.profiler - -.. autoclass:: MergeStream - -.. autoclass:: ProfilerMiddleware - -.. autofunction:: make_action diff --git a/pythonPackages/Werkzeug-0.12.1/docs/contrib/securecookie.rst b/pythonPackages/Werkzeug-0.12.1/docs/contrib/securecookie.rst deleted file mode 100644 index e75572b647..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/contrib/securecookie.rst +++ /dev/null @@ -1,55 +0,0 @@ -============= -Secure Cookie -============= - -.. automodule:: werkzeug.contrib.securecookie - -Security -======== - -The default implementation uses Pickle as this is the only module that -used to be available in the standard library when this module was created. -If you have simplejson available it's strongly recommended to create a -subclass and replace the serialization method:: - - import json - from werkzeug.contrib.securecookie import SecureCookie - - class JSONSecureCookie(SecureCookie): - serialization_method = json - -The weakness of Pickle is that if someone gains access to the secret key -the attacker can not only modify the session but also execute arbitrary -code on the server. - - -Reference -========= - -.. autoclass:: SecureCookie - :members: - - .. attribute:: new - - `True` if the cookie was newly created, otherwise `False` - - .. attribute:: modified - - Whenever an item on the cookie is set, this attribute is set to `True`. - However this does not track modifications inside mutable objects - in the cookie: - - >>> c = SecureCookie() - >>> c["foo"] = [1, 2, 3] - >>> c.modified - True - >>> c.modified = False - >>> c["foo"].append(4) - >>> c.modified - False - - In that situation it has to be set to `modified` by hand so that - :attr:`should_save` can pick it up. - - -.. autoexception:: UnquoteError diff --git a/pythonPackages/Werkzeug-0.12.1/docs/contrib/sessions.rst b/pythonPackages/Werkzeug-0.12.1/docs/contrib/sessions.rst deleted file mode 100644 index 28bdb4147b..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/contrib/sessions.rst +++ /dev/null @@ -1,50 +0,0 @@ -======== -Sessions -======== - -.. automodule:: werkzeug.contrib.sessions - -.. testsetup:: - - from werkzeug.contrib.sessions import * - -Reference -========= - -.. autoclass:: Session - - .. attribute:: sid - - The session ID as string. - - .. attribute:: new - - `True` is the cookie was newly created, otherwise `False` - - .. attribute:: modified - - Whenever an item on the cookie is set, this attribute is set to `True`. - However this does not track modifications inside mutable objects - in the session: - - >>> c = Session({}, sid='deadbeefbabe2c00ffee') - >>> c["foo"] = [1, 2, 3] - >>> c.modified - True - >>> c.modified = False - >>> c["foo"].append(4) - >>> c.modified - False - - In that situation it has to be set to `modified` by hand so that - :attr:`should_save` can pick it up. - - .. autoattribute:: should_save - -.. autoclass:: SessionStore - :members: - -.. autoclass:: FilesystemSessionStore - :members: list - -.. autoclass:: SessionMiddleware diff --git a/pythonPackages/Werkzeug-0.12.1/docs/contrib/wrappers.rst b/pythonPackages/Werkzeug-0.12.1/docs/contrib/wrappers.rst deleted file mode 100644 index 292208a565..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/contrib/wrappers.rst +++ /dev/null @@ -1,23 +0,0 @@ -============== -Extra Wrappers -============== - -.. automodule:: werkzeug.contrib.wrappers - -.. autoclass:: JSONRequestMixin - :members: - -.. autoclass:: ProtobufRequestMixin - :members: - -.. autoclass:: RoutingArgsRequestMixin - :members: - -.. autoclass:: ReverseSlashBehaviorRequestMixin - :members: - -.. autoclass:: DynamicCharsetRequestMixin - :members: - -.. autoclass:: DynamicCharsetResponseMixin - :members: diff --git a/pythonPackages/Werkzeug-0.12.1/docs/datastructures.rst b/pythonPackages/Werkzeug-0.12.1/docs/datastructures.rst deleted file mode 100644 index 10e3715e22..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/datastructures.rst +++ /dev/null @@ -1,137 +0,0 @@ -=============== -Data Structures -=============== - -.. module:: werkzeug.datastructures - -Werkzeug provides some subclasses of common Python objects to extend them -with additional features. Some of them are used to make them immutable, others -are used to change some semantics to better work with HTTP. - -General Purpose -=============== - -.. versionchanged:: 0.6 - The general purpose classes are now pickleable in each protocol as long - as the contained objects are pickleable. This means that the - :class:`FileMultiDict` won't be pickleable as soon as it contains a - file. - -.. autoclass:: TypeConversionDict - :members: - -.. autoclass:: ImmutableTypeConversionDict - :members: copy - -.. autoclass:: MultiDict - :members: - :inherited-members: - -.. autoclass:: OrderedMultiDict - -.. autoclass:: ImmutableMultiDict - :members: copy - -.. autoclass:: ImmutableOrderedMultiDict - :members: copy - -.. autoclass:: CombinedMultiDict - -.. autoclass:: ImmutableDict - :members: copy - -.. autoclass:: ImmutableList - -.. autoclass:: FileMultiDict - :members: - -.. _http-datastructures: - -HTTP Related -============ - -.. autoclass:: Headers([defaults]) - :members: - -.. autoclass:: EnvironHeaders - -.. autoclass:: HeaderSet - :members: - -.. autoclass:: Accept - :members: - -.. autoclass:: MIMEAccept - :members: accept_html, accept_xhtml, accept_json - -.. autoclass:: CharsetAccept - -.. autoclass:: LanguageAccept - -.. autoclass:: RequestCacheControl - :members: - - .. autoattribute:: no_cache - - .. autoattribute:: no_store - - .. autoattribute:: max_age - - .. autoattribute:: no_transform - -.. autoclass:: ResponseCacheControl - :members: - - .. autoattribute:: no_cache - - .. autoattribute:: no_store - - .. autoattribute:: max_age - - .. autoattribute:: no_transform - -.. autoclass:: ETags - :members: - -.. autoclass:: Authorization - :members: - -.. autoclass:: WWWAuthenticate - :members: - -.. autoclass:: IfRange - :members: - -.. autoclass:: Range - :members: - -.. autoclass:: ContentRange - :members: - - -Others -====== - -.. autoclass:: FileStorage - :members: - - .. attribute:: stream - - The input stream for the uploaded file. This usually points to an - open temporary file. - - .. attribute:: filename - - The filename of the file on the client. - - .. attribute:: name - - The name of the form field. - - .. attribute:: headers - - The multipart headers as :class:`Headers` object. This usually contains - irrelevant information but in combination with custom multipart requests - the raw headers might be interesting. - - .. versionadded:: 0.6 diff --git a/pythonPackages/Werkzeug-0.12.1/docs/debug.rst b/pythonPackages/Werkzeug-0.12.1/docs/debug.rst deleted file mode 100644 index 78563e435c..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/debug.rst +++ /dev/null @@ -1,89 +0,0 @@ -====================== -Debugging Applications -====================== - -.. module:: werkzeug.debug - -Depending on the WSGI gateway/server, exceptions are handled differently. -But most of the time, exceptions go to stderr or the error log. - -Since this is not the best debugging environment, Werkzeug provides a -WSGI middleware that renders nice debugging tracebacks, optionally with an -AJAX based debugger (which allows to execute code in the context of the -traceback's frames). - -The interactive debugger however does not work in forking environments -which makes it nearly impossible to use on production servers. Also the -debugger allows the execution of arbitrary code which makes it a major -security risk and **must never be used on production machines** because of -that. **We cannot stress this enough. Do not enable this in -production.** - -Enabling the Debugger -===================== - -You can enable the debugger by wrapping the application in a -:class:`DebuggedApplication` middleware. Additionally there are -parameters to the :func:`run_simple` function to enable it because this -is a common task during development. - -.. autoclass:: DebuggedApplication - -Using the Debugger -================== - -Once enabled and an error happens during a request you will see a detailed -traceback instead of a general "internal server error". If you have the -`evalex` feature enabled you can also get a traceback for every frame in -the traceback by clicking on the console icon. - -Once clicked a console opens where you can execute Python code in: - -.. image:: _static/debug-screenshot.png - :alt: a screenshot of the interactive debugger - :align: center - -Inside the interactive consoles you can execute any kind of Python code. -Unlike regular Python consoles the output of the object reprs is colored -and stripped to a reasonable size by default. If the output is longer -than what the console decides to display a small plus sign is added to -the repr and a click will expand the repr. - -To display all variables that are defined in the current frame you can -use the `dump()` function. You can call it without arguments to get a -detailed list of all variables and their values, or with an object as -argument to get a detailed list of all the attributes it has. - -Debugger PIN -============ - -Starting with Werkzeug 0.11 the debugger is additionally protected by a -PIN. This is a security helper to make it less likely for the debugger to -be exploited in production as it has happened to people to keep the -debugger active. The PIN based authentication is enabled by default. - -When the debugger comes up, on first usage it will prompt for a PIN that -is printed to the command line. The PIN is generated in a stable way that -is specific to the project. In some situations it might be not possible -to generate a stable PIN between restarts in which case an explicit PIN -can be provided through the environment variable ``WERKZEUG_DEBUG_PIN``. -This can be set to a number and will become the PIN. This variable can -also be set to the value ``off`` to disable the PIN check entirely. - -If the PIN is entered too many times incorrectly the server needs to be -restarted. - -**This feature is not supposed to entirely secure the debugger. It's -intended to make it harder for an attacker to exploit the debugger. Never -enable the debugger in production.** - -Pasting Errors -============== - -If you click on the `Traceback` title, the traceback switches over to a text -based one. The text based one can be pasted to `gist.github.com `_ with one -click. - - -.. _paste.pocoo.org: https://gist.github.com - diff --git a/pythonPackages/Werkzeug-0.12.1/docs/deployment/cgi.rst b/pythonPackages/Werkzeug-0.12.1/docs/deployment/cgi.rst deleted file mode 100644 index 5c79d5afcf..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/deployment/cgi.rst +++ /dev/null @@ -1,44 +0,0 @@ -=== -CGI -=== - -If all other deployment methods do not work, CGI will work for sure. CGI -is supported by all major servers but usually has a less-than-optimal -performance. - -This is also the way you can use a Werkzeug application on Google's -`AppEngine`_, there however the execution does happen in a CGI-like -environment. The application's performance is unaffected because of that. - -.. _AppEngine: http://code.google.com/appengine/ - -Creating a `.cgi` file -====================== - -First you need to create the CGI application file. Let's call it -`yourapplication.cgi`:: - - #!/usr/bin/python - from wsgiref.handlers import CGIHandler - from yourapplication import make_app - - application = make_app() - CGIHandler().run(application) - -If you're running Python 2.4 you will need the :mod:`wsgiref` package. Python -2.5 and higher ship this as part of the standard library. - -Server Setup -============ - -Usually there are two ways to configure the server. Either just copy the -`.cgi` into a `cgi-bin` (and use `mod_rerwite` or something similar to -rewrite the URL) or let the server point to the file directly. - -In Apache for example you can put a like like this into the config: - -.. sourcecode:: apache - - ScriptAlias /app /path/to/the/application.cgi - -For more information consult the documentation of your webserver. diff --git a/pythonPackages/Werkzeug-0.12.1/docs/deployment/fastcgi.rst b/pythonPackages/Werkzeug-0.12.1/docs/deployment/fastcgi.rst deleted file mode 100644 index 84d09877f1..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/deployment/fastcgi.rst +++ /dev/null @@ -1,142 +0,0 @@ -======= -FastCGI -======= - -A very popular deployment setup on servers like `lighttpd`_ and `nginx`_ -is FastCGI. To use your WSGI application with any of them you will need -a FastCGI server first. - -The most popular one is `flup`_ which we will use for this guide. Make -sure to have it installed. - -Creating a `.fcgi` file -======================= - -First you need to create the FastCGI server file. Let's call it -`yourapplication.fcgi`:: - - #!/usr/bin/python - from flup.server.fcgi import WSGIServer - from yourapplication import make_app - - if __name__ == '__main__': - application = make_app() - WSGIServer(application).run() - -This is enough for Apache to work, however ngingx and older versions of -lighttpd need a socket to be explicitly passed to communicate with the FastCGI -server. For that to work you need to pass the path to the socket to the -:class:`~flup.server.fcgi.WSGIServer`:: - - WSGIServer(application, bindAddress='/path/to/fcgi.sock').run() - -The path has to be the exact same path you define in the server -config. - -Save the `yourapplication.fcgi` file somewhere you will find it again. -It makes sense to have that in `/var/www/yourapplication` or something -similar. - -Make sure to set the executable bit on that file so that the servers -can execute it:: - - # chmod +x /var/www/yourapplication/yourapplication.fcgi - -Configuring lighttpd -==================== - -A basic FastCGI configuration for lighttpd looks like this:: - - fastcgi.server = ("/yourapplication.fcgi" => - (( - "socket" => "/tmp/yourapplication-fcgi.sock", - "bin-path" => "/var/www/yourapplication/yourapplication.fcgi", - "check-local" => "disable", - "max-procs" -> 1 - )) - ) - - alias.url = ( - "/static/" => "/path/to/your/static" - ) - - url.rewrite-once = ( - "^(/static.*)$" => "$1", - "^(/.*)$" => "/yourapplication.fcgi$1" - -Remember to enable the FastCGI, alias and rewrite modules. This configuration -binds the application to `/yourapplication`. If you want the application to -work in the URL root you have to work around a lighttpd bug with the -:class:`~werkzeug.contrib.fixers.LighttpdCGIRootFix` middleware. - -Make sure to apply it only if you are mounting the application the URL -root. Also, see the Lighty docs for more information on `FastCGI and Python -`_ (note that -explicitly passing a socket to run() is no longer necessary). - -Configuring nginx -================= - -Installing FastCGI applications on nginx is a bit tricky because by default -some FastCGI parameters are not properly forwarded. - -A basic FastCGI configuration for nginx looks like this:: - - location /yourapplication/ { - include fastcgi_params; - if ($uri ~ ^/yourapplication/(.*)?) { - set $path_url $1; - } - fastcgi_param PATH_INFO $path_url; - fastcgi_param SCRIPT_NAME /yourapplication; - fastcgi_pass unix:/tmp/yourapplication-fcgi.sock; - } - -This configuration binds the application to `/yourapplication`. If you want -to have it in the URL root it's a bit easier because you don't have to figure -out how to calculate `PATH_INFO` and `SCRIPT_NAME`:: - - location /yourapplication/ { - include fastcgi_params; - fastcgi_param PATH_INFO $fastcgi_script_name; - fastcgi_param SCRIPT_NAME ""; - fastcgi_pass unix:/tmp/yourapplication-fcgi.sock; - } - -Since Nginx doesn't load FastCGI apps, you have to do it by yourself. You -can either write an `init.d` script for that or execute it inside a screen -session:: - - $ screen - $ /var/www/yourapplication/yourapplication.fcgi - -Debugging -========= - -FastCGI deployments tend to be hard to debug on most webservers. Very often the -only thing the server log tells you is something along the lines of "premature -end of headers". In order to debug the application the only thing that can -really give you ideas why it breaks is switching to the correct user and -executing the application by hand. - -This example assumes your application is called `application.fcgi` and that your -webserver user is `www-data`:: - - $ su www-data - $ cd /var/www/yourapplication - $ python application.fcgi - Traceback (most recent call last): - File "yourapplication.fcg", line 4, in - ImportError: No module named yourapplication - -In this case the error seems to be "yourapplication" not being on the python -path. Common problems are: - -- relative paths being used. Don't rely on the current working directory -- the code depending on environment variables that are not set by the - web server. -- different python interpreters being used. - -.. _lighttpd: http://www.lighttpd.net/ -.. _nginx: http://nginx.net/ -.. _flup: http://trac.saddi.com/flup diff --git a/pythonPackages/Werkzeug-0.12.1/docs/deployment/index.rst b/pythonPackages/Werkzeug-0.12.1/docs/deployment/index.rst deleted file mode 100644 index 524d528342..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/deployment/index.rst +++ /dev/null @@ -1,16 +0,0 @@ -.. _deployment: - -====================== -Application Deployment -====================== - -This section covers running your application in production on a web -server such as Apache or lighttpd. - -.. toctree:: - :maxdepth: 2 - - cgi - mod_wsgi - fastcgi - proxying diff --git a/pythonPackages/Werkzeug-0.12.1/docs/deployment/mod_wsgi.rst b/pythonPackages/Werkzeug-0.12.1/docs/deployment/mod_wsgi.rst deleted file mode 100644 index 85eb965b96..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/deployment/mod_wsgi.rst +++ /dev/null @@ -1,82 +0,0 @@ -=================== -`mod_wsgi` (Apache) -=================== - -If you are using the `Apache`_ webserver you should consider using `mod_wsgi`_. - -.. _Apache: http://httpd.apache.org/ - -Installing `mod_wsgi` -===================== - -If you don't have `mod_wsgi` installed yet you have to either install it using -a package manager or compile it yourself. - -The mod_wsgi `installation instructions`_ cover installation instructions for -source installations on UNIX systems. - -If you are using ubuntu / debian you can apt-get it and activate it as follows:: - - # apt-get install libapache2-mod-wsgi - -On FreeBSD install `mod_wsgi` by compiling the `www/mod_wsgi` port or by using -pkg_add:: - - # pkg_add -r mod_wsgi - -If you are using pkgsrc you can install `mod_wsgi` by compiling the -`www/ap2-wsgi` package. - -If you encounter segfaulting child processes after the first apache reload you -can safely ignore them. Just restart the server. - -Creating a `.wsgi` file -======================= - -To run your application you need a `yourapplication.wsgi` file. This file -contains the code `mod_wsgi` is executing on startup to get the application -object. The object called `application` in that file is then used as -application. - -For most applications the following file should be sufficient:: - - from yourapplication import make_app - application = make_app() - -If you don't have a factory function for application creation but a singleton -instance you can directly import that one as `application`. - -Store that file somewhere where you will find it again (eg: -`/var/www/yourapplication`) and make sure that `yourapplication` and all -the libraries that are in use are on the python load path. If you don't -want to install it system wide consider using a `virtual python`_ instance. - -Configuring Apache -================== - -The last thing you have to do is to create an Apache configuration file for -your application. In this example we are telling `mod_wsgi` to execute the -application under a different user for security reasons: - -.. sourcecode:: apache - - - ServerName example.com - - WSGIDaemonProcess yourapplication user=user1 group=group1 processes=2 threads=5 - WSGIScriptAlias / /var/www/yourapplication/yourapplication.wsgi - - - WSGIProcessGroup yourapplication - WSGIApplicationGroup %{GLOBAL} - Order deny,allow - Allow from all - - - -For more information consult the `mod_wsgi wiki`_. - -.. _mod_wsgi: http://code.google.com/p/modwsgi/ -.. _installation instructions: http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide -.. _virtual python: http://pypi.python.org/pypi/virtualenv -.. _mod_wsgi wiki: http://code.google.com/p/modwsgi/wiki/ diff --git a/pythonPackages/Werkzeug-0.12.1/docs/deployment/proxying.rst b/pythonPackages/Werkzeug-0.12.1/docs/deployment/proxying.rst deleted file mode 100644 index d88dbcb2a2..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/deployment/proxying.rst +++ /dev/null @@ -1,54 +0,0 @@ -============= -HTTP Proxying -============= - -Many people prefer using a standalone Python HTTP server and proxying that -server via nginx, Apache etc. - -A very stable Python server is CherryPy. This part of the documentation -shows you how to combine your WSGI application with the CherryPy WSGI -server and how to configure the webserver for proxying. - - -Creating a `.py` server -======================= - -To run your application you need a `start-server.py` file that starts up -the WSGI Server. - -It looks something along these lines:: - - from cherrypy import wsgiserver - from yourapplication import make_app - server = wsgiserver.CherryPyWSGIServer(('localhost', 8080), make_app()) - try: - server.start() - except KeyboardInterrupt: - server.stop() - -If you now start the file the server will listen on `localhost:8080`. Keep -in mind that WSGI applications behave slightly different for proxied setups. -If you have not developed your application for proxying in mind, you can -apply the :class:`~werkzeug.contrib.fixers.ProxyFix` middleware. - - -Configuring nginx -================= - -As an example we show here how to configure nginx to proxy to the server. - -The basic nginx configuration looks like this:: - - location / { - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_pass http://127.0.0.1:8080; - proxy_redirect default; - } - -Since Nginx doesn't start your server for you, you have to do it by yourself. You -can either write an `init.d` script for that or execute it inside a screen -session:: - - $ screen - $ python start-server.py diff --git a/pythonPackages/Werkzeug-0.12.1/docs/exceptions.rst b/pythonPackages/Werkzeug-0.12.1/docs/exceptions.rst deleted file mode 100644 index 6f978c4c73..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/exceptions.rst +++ /dev/null @@ -1,147 +0,0 @@ -=============== -HTTP Exceptions -=============== - -.. automodule:: werkzeug.exceptions - - -Error Classes -============= - -The following error classes exist in Werkzeug: - -.. autoexception:: BadRequest - -.. autoexception:: Unauthorized - -.. autoexception:: Forbidden - -.. autoexception:: NotFound - -.. autoexception:: MethodNotAllowed - -.. autoexception:: NotAcceptable - -.. autoexception:: RequestTimeout - -.. autoexception:: Conflict - -.. autoexception:: Gone - -.. autoexception:: LengthRequired - -.. autoexception:: PreconditionFailed - -.. autoexception:: RequestEntityTooLarge - -.. autoexception:: RequestURITooLarge - -.. autoexception:: UnsupportedMediaType - -.. autoexception:: RequestedRangeNotSatisfiable - -.. autoexception:: ExpectationFailed - -.. autoexception:: ImATeapot - -.. autoexception:: PreconditionRequired - -.. autoexception:: TooManyRequests - -.. autoexception:: RequestHeaderFieldsTooLarge - -.. autoexception:: InternalServerError - -.. autoexception:: NotImplemented - -.. autoexception:: BadGateway - -.. autoexception:: ServiceUnavailable - -.. exception:: HTTPUnicodeError - - This exception is used to signal unicode decode errors of request - data. For more information see the :ref:`unicode` chapter. - -.. autoexception:: ClientDisconnected - -.. autoexception:: SecurityError - - -Baseclass -========= - -All the exceptions implement this common interface: - -.. autoexception:: HTTPException - :members: get_response, __call__ - - -Special HTTP Exceptions -======================= - -Starting with Werkzeug 0.3 some of the builtin classes raise exceptions that -look like regular python exceptions (eg :exc:`KeyError`) but are -:exc:`BadRequest` HTTP exceptions at the same time. This decision was made -to simplify a common pattern where you want to abort if the client tampered -with the submitted form data in a way that the application can't recover -properly and should abort with ``400 BAD REQUEST``. - -Assuming the application catches all HTTP exceptions and reacts to them -properly a view function could do the following safely and doesn't have to -check if the keys exist:: - - def new_post(request): - post = Post(title=request.form['title'], body=request.form['body']) - post.save() - return redirect(post.url) - -If `title` or `body` are missing in the form, a special key error will be -raised which behaves like a :exc:`KeyError` but also a :exc:`BadRequest` -exception. - - -Simple Aborting -=============== - -Sometimes it's convenient to just raise an exception by the error code, -without importing the exception and looking up the name etc. For this -purpose there is the :func:`abort` function. - -.. autofunction:: abort - -If you want to use this functionality with custom exceptions you can -create an instance of the aborter class: - -.. autoclass:: Aborter - - -Custom Errors -============= - -As you can see from the list above not all status codes are available as -errors. Especially redirects and other non 200 status codes that do not -represent errors are missing. For redirects you can use the :func:`redirect` -function from the utilities. - -If you want to add an error yourself you can subclass :exc:`HTTPException`:: - - from werkzeug.exceptions import HTTPException - - class PaymentRequired(HTTPException): - code = 402 - description = '

Payment required.

' - -This is the minimal code you need for your own exception. If you want to -add more logic to the errors you can override the -:meth:`~HTTPException.get_description`, :meth:`~HTTPException.get_body`, -:meth:`~HTTPException.get_headers` and :meth:`~HTTPException.get_response` -methods. In any case you should have a look at the sourcecode of the -exceptions module. - -You can override the default description in the constructor with the -`description` parameter (it's the first argument for all exceptions -except of the :exc:`MethodNotAllowed` which accepts a list of allowed methods -as first argument):: - - raise BadRequest('Request failed because X was not present') diff --git a/pythonPackages/Werkzeug-0.12.1/docs/filesystem.rst b/pythonPackages/Werkzeug-0.12.1/docs/filesystem.rst deleted file mode 100644 index 0ac92838a6..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/filesystem.rst +++ /dev/null @@ -1,11 +0,0 @@ -==================== -Filesystem Utilities -==================== - -Various utilities for the local filesystem. - -.. module:: werkzeug.filesystem - -.. autoclass:: BrokenFilesystemWarning - -.. autofunction:: get_filesystem_encoding diff --git a/pythonPackages/Werkzeug-0.12.1/docs/http.rst b/pythonPackages/Werkzeug-0.12.1/docs/http.rst deleted file mode 100644 index 89841c092b..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/http.rst +++ /dev/null @@ -1,156 +0,0 @@ -============== -HTTP Utilities -============== - -.. module:: werkzeug.http - -Werkzeug provides a couple of functions to parse and generate HTTP headers -that are useful when implementing WSGI middlewares or whenever you are -operating on a lower level layer. All this functionality is also exposed -from request and response objects. - -Date Functions -============== - -The following functions simplify working with times in an HTTP context. -Werkzeug uses offset-naive :class:`~datetime.datetime` objects internally -that store the time in UTC. If you're working with timezones in your -application make sure to replace the tzinfo attribute with a UTC timezone -information before processing the values. - -.. autofunction:: cookie_date - -.. autofunction:: http_date - -.. autofunction:: parse_date - -Header Parsing -============== - -The following functions can be used to parse incoming HTTP headers. -Because Python does not provide data structures with the semantics required -by :rfc:`2616`, Werkzeug implements some custom data structures that are -:ref:`documented separately `. - -.. autofunction:: parse_options_header - -.. autofunction:: parse_set_header - -.. autofunction:: parse_list_header - -.. autofunction:: parse_dict_header - -.. autofunction:: parse_accept_header(value, [class]) - -.. autofunction:: parse_cache_control_header - -.. autofunction:: parse_authorization_header - -.. autofunction:: parse_www_authenticate_header - -.. autofunction:: parse_if_range_header - -.. autofunction:: parse_range_header - -.. autofunction:: parse_content_range_header - -Header Utilities -================ - -The following utilities operate on HTTP headers well but do not parse -them. They are useful if you're dealing with conditional responses or if -you want to proxy arbitrary requests but want to remove WSGI-unsupported -hop-by-hop headers. Also there is a function to create HTTP header -strings from the parsed data. - -.. autofunction:: is_entity_header - -.. autofunction:: is_hop_by_hop_header - -.. autofunction:: remove_entity_headers - -.. autofunction:: remove_hop_by_hop_headers - -.. autofunction:: is_byte_range_valid - -.. autofunction:: quote_header_value - -.. autofunction:: unquote_header_value - -.. autofunction:: dump_header - - -Cookies -======= - -.. autofunction:: parse_cookie - -.. autofunction:: dump_cookie - - -Conditional Response Helpers -============================ - -For conditional responses the following functions might be useful: - -.. autofunction:: parse_etags - -.. autofunction:: quote_etag - -.. autofunction:: unquote_etag - -.. autofunction:: generate_etag - -.. autofunction:: is_resource_modified - -Constants -========= - -.. data:: HTTP_STATUS_CODES - - A dict of status code -> default status message pairs. This is used - by the wrappers and other places where an integer status code is expanded - to a string throughout Werkzeug. - -Form Data Parsing -================= - -.. module:: werkzeug.formparser - -Werkzeug provides the form parsing functions separately from the request -object so that you can access form data from a plain WSGI environment. - -The following formats are currently supported by the form data parser: - -- `application/x-www-form-urlencoded` -- `multipart/form-data` - -Nested multipart is not currently supported (Werkzeug 0.9), but it isn't used -by any of the modern web browsers. - -Usage example: - ->>> from cStringIO import StringIO ->>> data = '--foo\r\nContent-Disposition: form-data; name="test"\r\n' \ -... '\r\nHello World!\r\n--foo--' ->>> environ = {'wsgi.input': StringIO(data), 'CONTENT_LENGTH': str(len(data)), -... 'CONTENT_TYPE': 'multipart/form-data; boundary=foo', -... 'REQUEST_METHOD': 'POST'} ->>> stream, form, files = parse_form_data(environ) ->>> stream.read() -'' ->>> form['test'] -u'Hello World!' ->>> not files -True - -Normally the WSGI environment is provided by the WSGI gateway with the -incoming data as part of it. If you want to generate such fake-WSGI -environments for unittesting you might want to use the -:func:`create_environ` function or the :class:`EnvironBuilder` instead. - -.. autoclass:: FormDataParser - -.. autofunction:: parse_form_data - -.. autofunction:: parse_multipart_headers diff --git a/pythonPackages/Werkzeug-0.12.1/docs/index.rst b/pythonPackages/Werkzeug-0.12.1/docs/index.rst deleted file mode 100644 index 48c0da5630..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/index.rst +++ /dev/null @@ -1,7 +0,0 @@ -====================== -Documentation Overview -====================== - -Welcome to the Werkzeug |version| documentation. - -.. include:: contents.rst.inc diff --git a/pythonPackages/Werkzeug-0.12.1/docs/installation.rst b/pythonPackages/Werkzeug-0.12.1/docs/installation.rst deleted file mode 100644 index c07d4521a6..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/installation.rst +++ /dev/null @@ -1,133 +0,0 @@ -============ -Installation -============ - -Werkzeug requires at least Python 2.6 to work correctly. If you do need -to support an older version you can download an older version of Werkzeug -though we strongly recommend against that. Werkzeug currently has -experimental support for Python 3. For more information about the -Python 3 support see :ref:`python3`. - - -Installing a released version -============================= - -As a Python egg (via easy_install or pip) ------------------------------------------ - -You can install the most recent Werkzeug version using `easy_install`_:: - - easy_install Werkzeug - -Alternatively you can also use pip:: - - pip install Werkzeug - -Either way we strongly recommend using these tools in combination with -:ref:`virtualenv`. - -This will install a Werkzeug egg in your Python installation's `site-packages` -directory. - -From the tarball release -------------------------- - -1. Download the most recent tarball from the `download page`_. -2. Unpack the tarball. -3. ``python setup.py install`` - -Note that the last command will automatically download and install -`setuptools`_ if you don't already have it installed. This requires a working -Internet connection. - -This will install Werkzeug into your Python installation's `site-packages` -directory. - - -Installing the development version -================================== - -1. Install `Git`_ -2. ``git clone git://github.com/pallets/werkzeug.git`` -3. ``cd werkzeug`` -4. ``pip install --editable .`` - -.. _virtualenv: - -virtualenv -========== - -Virtualenv is probably what you want to use during development, and in -production too if you have shell access there. - -What problem does virtualenv solve? If you like Python as I do, -chances are you want to use it for other projects besides Werkzeug-based -web applications. But the more projects you have, the more likely it is -that you will be working with different versions of Python itself, or at -least different versions of Python libraries. Let's face it; quite often -libraries break backwards compatibility, and it's unlikely that any serious -application will have zero dependencies. So what do you do if two or more -of your projects have conflicting dependencies? - -Virtualenv to the rescue! It basically enables multiple side-by-side -installations of Python, one for each project. It doesn't actually -install separate copies of Python, but it does provide a clever way -to keep different project environments isolated. - -So let's see how virtualenv works! - -If you are on Mac OS X or Linux, chances are that one of the following two -commands will work for you:: - - $ sudo easy_install virtualenv - -or even better:: - - $ sudo pip install virtualenv - -One of these will probably install virtualenv on your system. Maybe it's -even in your package manager. If you use Ubuntu, try:: - - $ sudo apt-get install python-virtualenv - -If you are on Windows and don't have the `easy_install` command, you must -install it first. Once you have it installed, run the same commands as -above, but without the `sudo` prefix. - -Once you have virtualenv installed, just fire up a shell and create -your own environment. I usually create a project folder and an `env` -folder within:: - - $ mkdir myproject - $ cd myproject - $ virtualenv env - New python executable in env/bin/python - Installing setuptools............done. - -Now, whenever you want to work on a project, you only have to activate -the corresponding environment. On OS X and Linux, do the following:: - - $ . env/bin/activate - -(Note the space between the dot and the script name. The dot means that -this script should run in the context of the current shell. If this command -does not work in your shell, try replacing the dot with ``source``) - -If you are a Windows user, the following command is for you:: - - $ env\scripts\activate - -Either way, you should now be using your virtualenv (see how the prompt of -your shell has changed to show the virtualenv). - -Now you can just enter the following command to get Werkzeug activated in -your virtualenv:: - - $ pip install Werkzeug - -A few seconds later you are good to go. - -.. _download page: https://pypi.python.org/pypi/Werkzeug -.. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools -.. _easy_install: http://peak.telecommunity.com/DevCenter/EasyInstall -.. _Git: http://git-scm.org/ diff --git a/pythonPackages/Werkzeug-0.12.1/docs/latexindex.rst b/pythonPackages/Werkzeug-0.12.1/docs/latexindex.rst deleted file mode 100644 index 159ffea1aa..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/latexindex.rst +++ /dev/null @@ -1,6 +0,0 @@ -:orphan: - -Werkzeug Documentation -====================== - -.. include:: contents.rst.inc diff --git a/pythonPackages/Werkzeug-0.12.1/docs/levels.rst b/pythonPackages/Werkzeug-0.12.1/docs/levels.rst deleted file mode 100644 index 5a0190a19a..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/levels.rst +++ /dev/null @@ -1,70 +0,0 @@ -========== -API Levels -========== - -.. module:: werkzeug - -Werkzeug is intended to be a utility rather than a framework. Because of that -the user-friendly API is separated from the lower-level API so that Werkzeug -can easily be used to extend another system. - -All the functionality the :class:`Request` and :class:`Response` objects (aka -the "wrappers") provide is also available in small utility functions. - -Example -======= - -This example implements a small `Hello World` application that greets the -user with the name entered:: - - from werkzeug.utils import escape - from werkzeug.wrappers import Request, Response - - @Request.application - def hello_world(request): - result = ['Greeter'] - if request.method == 'POST': - result.append('

Hello %s!

' % escape(request.form['name'])) - result.append(''' -
-

Name: - -

- ''') - return Response(''.join(result), mimetype='text/html') - -Alternatively the same application could be used without request and response -objects but by taking advantage of the parsing functions werkzeug provides:: - - from werkzeug.formparser import parse_form_data - from werkzeug.utils import escape - - def hello_world(environ, start_response): - result = ['Greeter'] - if environ['REQUEST_METHOD'] == 'POST': - form = parse_form_data(environ)[1] - result.append('

Hello %s!

' % escape(form['name'])) - result.append(''' -
-

Name: - -

- ''') - start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')]) - return [''.join(result)] - -High or Low? -============ - -Usually you want to use the high-level layer (the request and response -objects). But there are situations where this might not be what you want. - -For example you might be maintaining code for an application written in -Django or another framework and you have to parse HTTP headers. You can -utilize Werkzeug for that by accessing the lower-level HTTP header parsing -functions. - -Another situation where the low level parsing functions can be useful are -custom WSGI frameworks, unit-testing or modernizing an old CGI/mod_python -application to WSGI as well as WSGI middlewares where you want to keep the -overhead low. diff --git a/pythonPackages/Werkzeug-0.12.1/docs/local.rst b/pythonPackages/Werkzeug-0.12.1/docs/local.rst deleted file mode 100644 index 4d776e9750..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/local.rst +++ /dev/null @@ -1,94 +0,0 @@ -============== -Context Locals -============== - -.. module:: werkzeug.local - -Sooner or later you have some things you want to have in every single view -or helper function or whatever. In PHP the way to go are global -variables. However, that isn't possible in WSGI applications without a -major drawback: As soon as you operate on the global namespace your -application isn't thread-safe any longer. - -The Python standard library has a concept called "thread locals" (or thread-local -data). A thread local is a global object in which you can put stuff in and get back -later in a thread-safe and thread-specific way. That means that whenever you set -or get a value on a thread local object, the thread local object checks in which -thread you are and retrieves the value corresponding to your thread (if one exists). -So, you won't accidentally get another thread's data. - -This approach, however, has a few disadvantages. For example, besides threads, -there are other types of concurrency in Python. A very popular one -is greenlets. Also, whether every request gets its own thread is not -guaranteed in WSGI. It could be that a request is reusing a thread from -a previous request, and hence data is left over in the thread local object. - -Werkzeug provides its own implementation of local data storage called `werkzeug.local`. -This approach provides a similar functionality to thread locals but also works with -greenlets. - -Here's a simple example of how one could use werkzeug.local:: - - from werkzeug.local import Local, LocalManager - - local = Local() - local_manager = LocalManager([local]) - - def application(environ, start_response): - local.request = request = Request(environ) - ... - - application = local_manager.make_middleware(application) - -This binds the request to `local.request`. Every other piece of code executed -after this assignment in the same context can safely access local.request and -will get the same request object. The `make_middleware` method on the local -manager ensures that all references to the local objects are cleared up after -the request. - -The same context means the same greenlet (if you're using greenlets) in -the same thread and same process. - -If a request object is not yet set on the local object and you try to -access it, you will get an `AttributeError`. You can use `getattr` to avoid -that:: - - def get_request(): - return getattr(local, 'request', None) - -This will try to get the request or return `None` if the request is not -(yet?) available. - -Note that local objects cannot manage themselves, for that you need a local -manager. You can pass a local manager multiple locals or add additionals -later by appending them to `manager.locals` and every time the manager -cleans up it will clean up all the data left in the locals for this -context. - -.. autofunction:: release_local - -.. autoclass:: LocalManager - :members: cleanup, make_middleware, middleware, get_ident - -.. autoclass:: LocalStack - :members: push, pop, top - -.. autoclass:: LocalProxy - :members: _get_current_object - - Keep in mind that ``repr()`` is also forwarded, so if you want to find - out if you are dealing with a proxy you can do an ``isinstance()`` check: - - .. sourcecode:: pycon - - >>> from werkzeug.local import LocalProxy - >>> isinstance(request, LocalProxy) - True - - You can also create proxy objects by hand: - - .. sourcecode:: python - - from werkzeug.local import Local, LocalProxy - local = Local() - request = LocalProxy(local, 'request') diff --git a/pythonPackages/Werkzeug-0.12.1/docs/logo.pdf b/pythonPackages/Werkzeug-0.12.1/docs/logo.pdf deleted file mode 100644 index 00cc0c357bc43f1370c5812880312b8850012fa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5395 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 where ^ is one of - echo. html to make standalone HTML files - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. changes to make an overview over all changed/added/deprecated items - echo. linkcheck to check all external links for integrity - goto end -) - -if "%1" == "clean" ( - for /d %%i in (_build\*) do rmdir /q /s %%i - del /q /s _build\* - goto end -) - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% _build/html - echo. - echo.Build finished. The HTML pages are in _build/html. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% _build/pickle - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% _build/json - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% _build/htmlhelp - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in _build/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% _build/qthelp - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in _build/qthelp, like this: - echo.^> qcollectiongenerator _build\qthelp\Werkzeug.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile _build\qthelp\Werkzeug.ghc - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% _build/latex - echo. - echo.Build finished; the LaTeX files are in _build/latex. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% _build/changes - echo. - echo.The overview file is in _build/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% _build/linkcheck - echo. - echo.Link check complete; look for any errors in the above output ^ -or in _build/linkcheck/output.txt. - goto end -) - -:end diff --git a/pythonPackages/Werkzeug-0.12.1/docs/makearchive.py b/pythonPackages/Werkzeug-0.12.1/docs/makearchive.py deleted file mode 100644 index 62e208e356..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/makearchive.py +++ /dev/null @@ -1,7 +0,0 @@ -import os -import conf -name = "werkzeug-docs-" + conf.version -os.chdir("_build") -os.rename("html", name) -os.system("tar czf %s.tar.gz %s" % (name, name)) -os.rename(name, "html") diff --git a/pythonPackages/Werkzeug-0.12.1/docs/middlewares.rst b/pythonPackages/Werkzeug-0.12.1/docs/middlewares.rst deleted file mode 100644 index 41f9a98ae1..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/middlewares.rst +++ /dev/null @@ -1,19 +0,0 @@ -=========== -Middlewares -=========== - -.. module:: werkzeug.wsgi - -Middlewares wrap applications to dispatch between them or provide -additional request handling. Additionally to the middlewares documented -here, there is also the :class:`DebuggedApplication` class that is -implemented as a WSGI middleware. - -.. autoclass:: SharedDataMiddleware - :members: is_allowed - -.. autoclass:: DispatcherMiddleware - -Also there's the … - -.. autofunction:: werkzeug._internal._easteregg diff --git a/pythonPackages/Werkzeug-0.12.1/docs/python3.rst b/pythonPackages/Werkzeug-0.12.1/docs/python3.rst deleted file mode 100644 index 5597fe542c..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/python3.rst +++ /dev/null @@ -1,73 +0,0 @@ -.. _python3: - -============== -Python 3 Notes -============== - -Since version 0.9, Werkzeug supports Python 3.3+ in addition to versions 2.6 -and 2.7. Older Python 3 versions such as 3.2 or 3.1 are not supported. - -This part of the documentation outlines special information required to -use Werkzeug and WSGI on Python 3. - -.. warning:: - - Python 3 support in Werkzeug is currently highly experimental. Please - give feedback on it and help us improve it. - - -WSGI Environment -================ - -The WSGI environment on Python 3 works slightly different than it does on -Python 2. For the most part Werkzeug hides the differences from you if -you work on the higher level APIs. The main difference between Python 2 -and Python 3 is that on Python 2 the WSGI environment contains bytes -whereas the environment on Python 3 contains a range of differently -encoded strings. - -There are two different kinds of strings in the WSGI environ on Python 3: - -- unicode strings restricted to latin1 values. These are used for - HTTP headers and a few other things. -- unicode strings carrying binary payload, roundtripped through latin1 - values. This is usually referred as “WSGI encoding dance” throughout - Werkzeug. - -Werkzeug provides you with functionality to deal with these automatically -so that you don't need to be aware of the inner workings. The following -functions and classes should be used to read information out of the -WSGI environment: - -- :func:`~werkzeug.wsgi.get_current_url` -- :func:`~werkzeug.wsgi.get_host` -- :func:`~werkzeug.wsgi.get_script_name` -- :func:`~werkzeug.wsgi.get_path_info` -- :func:`~werkzeug.wsgi.get_query_string` -- :func:`~werkzeug.datastructures.EnvironHeaders` - -Applications are strongly discouraged to create and modify a WSGI -environment themselves on Python 3 unless they take care of the proper -decoding step. All high level interfaces in Werkzeug will apply the -correct encoding and decoding steps as necessary. - -URLs -==== - -URLs in Werkzeug attempt to represent themselves as unicode strings on -Python 3. All the parsing functions generally also provide functionality -that allow operations on bytes. In some cases functions that deal with -URLs allow passing in `None` as charset to change the return value to byte -objects. Internally Werkzeug will now unify URIs and IRIs as much as -possible. - -Request Cleanup -=============== - -Request objects on Python 3 and PyPy require explicit closing when file -uploads are involved. This is required to properly close temporary file -objects created by the multipart parser. For that purpose the ``close()`` -method was introduced. - -In addition to that request objects now also act as context managers that -automatically close. diff --git a/pythonPackages/Werkzeug-0.12.1/docs/quickstart.rst b/pythonPackages/Werkzeug-0.12.1/docs/quickstart.rst deleted file mode 100644 index 30ec04082d..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/quickstart.rst +++ /dev/null @@ -1,323 +0,0 @@ -========== -Quickstart -========== - -.. module:: werkzeug - -This part of the documentation shows how to use the most important parts of -Werkzeug. It's intended as a starting point for developers with basic -understanding of :pep:`333` (WSGI) and :rfc:`2616` (HTTP). - -.. warning:: - - Make sure to import all objects from the places the documentation - suggests. It is theoretically possible in some situations to import - objects from different locations but this is not supported. - - For example :class:`MultiDict` is a member of the `werkzeug` module - but internally implemented in a different one. - - -WSGI Environment -================ - -The WSGI environment contains all the information the user request transmits -to the application. It is passed to the WSGI application but you can also -create a WSGI environ dict using the :func:`create_environ` helper: - ->>> from werkzeug.test import create_environ ->>> environ = create_environ('/foo', 'http://localhost:8080/') - -Now we have an environment to play around: - ->>> environ['PATH_INFO'] -'/foo' ->>> environ['SCRIPT_NAME'] -'' ->>> environ['SERVER_NAME'] -'localhost' - -Usually nobody wants to work with the environ directly because it is limited -to bytestrings and does not provide any way to access the form data besides -parsing that data by hand. - - -Enter Request -============= - -For access to the request data the :class:`Request` object is much more fun. -It wraps the `environ` and provides a read-only access to the data from -there: - ->>> from werkzeug.wrappers import Request ->>> request = Request(environ) - -Now you can access the important variables and Werkzeug will parse them -for you and decode them where it makes sense. The default charset for -requests is set to `utf-8` but you can change that by subclassing -:class:`Request`. - ->>> request.path -u'/foo' ->>> request.script_root -u'' ->>> request.host -'localhost:8080' ->>> request.url -'http://localhost:8080/foo' - -We can also find out which HTTP method was used for the request: - ->>> request.method -'GET' - -This way we can also access URL arguments (the query string) and data that -was transmitted in a POST/PUT request. - -For testing purposes we can create a request object from supplied data -using the :meth:`~BaseRequest.from_values` method: - ->>> from cStringIO import StringIO ->>> data = "name=this+is+encoded+form+data&another_key=another+one" ->>> request = Request.from_values(query_string='foo=bar&blah=blafasel', -... content_length=len(data), input_stream=StringIO(data), -... content_type='application/x-www-form-urlencoded', -... method='POST') -... ->>> request.method -'POST' - -Now we can access the URL parameters easily: - ->>> request.args.keys() -['blah', 'foo'] ->>> request.args['blah'] -u'blafasel' - -Same for the supplied form data: - ->>> request.form['name'] -u'this is encoded form data' - -Handling for uploaded files is not much harder as you can see from this -example:: - - def store_file(request): - file = request.files.get('my_file') - if file: - file.save('/where/to/store/the/file.txt') - else: - handle_the_error() - -The files are represented as :class:`FileStorage` objects which provide -some common operations to work with them. - -Request headers can be accessed by using the :class:`~BaseRequest.headers` -attribute: - ->>> request.headers['Content-Length'] -'54' ->>> request.headers['Content-Type'] -'application/x-www-form-urlencoded' - -The keys for the headers are of course case insensitive. - - -Header Parsing -============== - -There is more. Werkzeug provides convenient access to often used HTTP headers -and other request data. - -Let's create a request object with all the data a typical web browser transmits -so that we can play with it: - ->>> environ = create_environ() ->>> environ.update( -... HTTP_USER_AGENT='Mozilla/5.0 (Macintosh; U; Mac OS X 10.5; en-US; ) Firefox/3.1', -... HTTP_ACCEPT='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', -... HTTP_ACCEPT_LANGUAGE='de-at,en-us;q=0.8,en;q=0.5', -... HTTP_ACCEPT_ENCODING='gzip,deflate', -... HTTP_ACCEPT_CHARSET='ISO-8859-1,utf-8;q=0.7,*;q=0.7', -... HTTP_IF_MODIFIED_SINCE='Fri, 20 Feb 2009 10:10:25 GMT', -... HTTP_IF_NONE_MATCH='"e51c9-1e5d-46356dc86c640"', -... HTTP_CACHE_CONTROL='max-age=0' -... ) -... ->>> request = Request(environ) - -Let's start with the most useless header: the user agent: - ->>> request.user_agent.browser -'firefox' ->>> request.user_agent.platform -'macos' ->>> request.user_agent.version -'3.1' ->>> request.user_agent.language -'en-US' - -A more useful header is the accept header. With this header the browser -informs the web application what mimetypes it can handle and how well. All -accept headers are sorted by the quality, the best item being the first: - ->>> request.accept_mimetypes.best -'text/html' ->>> 'application/xhtml+xml' in request.accept_mimetypes -True ->>> print request.accept_mimetypes["application/json"] -0.8 - -The same works for languages: - ->>> request.accept_languages.best -'de-at' ->>> request.accept_languages.values() -['de-at', 'en-us', 'en'] - -And of course encodings and charsets: - ->>> 'gzip' in request.accept_encodings -True ->>> request.accept_charsets.best -'ISO-8859-1' ->>> 'utf-8' in request.accept_charsets -True - -Normalization is available, so you can safely use alternative forms to perform -containment checking: - ->>> 'UTF8' in request.accept_charsets -True ->>> 'de_AT' in request.accept_languages -True - -E-tags and other conditional headers are available in parsed form as well: - ->>> request.if_modified_since -datetime.datetime(2009, 2, 20, 10, 10, 25) ->>> request.if_none_match - ->>> request.cache_control - ->>> request.cache_control.max_age -0 ->>> 'e51c9-1e5d-46356dc86c640' in request.if_none_match -True - - -Responses -========= - -Response objects are the opposite of request objects. They are used to send -data back to the client. In reality, response objects are nothing more than -glorified WSGI applications. - -So what you are doing is not *returning* the response objects from your WSGI -application but *calling* it as WSGI application inside your WSGI application -and returning the return value of that call. - -So imagine your standard WSGI "Hello World" application:: - - def application(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/plain')]) - return ['Hello World!'] - -With response objects it would look like this:: - - from werkzeug.wrappers import Response - - def application(environ, start_response): - response = Response('Hello World!') - return response(environ, start_response) - -Also, unlike request objects, response objects are designed to be modified. -So here is what you can do with them: - ->>> from werkzeug.wrappers import Response ->>> response = Response("Hello World!") ->>> response.headers['content-type'] -'text/plain; charset=utf-8' ->>> response.data -'Hello World!' ->>> response.headers['content-length'] = len(response.data) - -You can modify the status of the response in the same way. Either just the -code or provide a message as well: - ->>> response.status -'200 OK' ->>> response.status = '404 Not Found' ->>> response.status_code -404 ->>> response.status_code = 400 ->>> response.status -'400 BAD REQUEST' - -As you can see attributes work in both directions. So you can set both -:attr:`~BaseResponse.status` and :attr:`~BaseResponse.status_code` and the -change will be reflected to the other. - -Also common headers are exposed as attributes or with methods to set / -retrieve them: - ->>> response.content_length -12 ->>> from datetime import datetime ->>> response.date = datetime(2009, 2, 20, 17, 42, 51) ->>> response.headers['Date'] -'Fri, 20 Feb 2009 17:42:51 GMT' - -Because etags can be weak or strong there are methods to set them: - ->>> response.set_etag("12345-abcd") ->>> response.headers['etag'] -'"12345-abcd"' ->>> response.get_etag() -('12345-abcd', False) ->>> response.set_etag("12345-abcd", weak=True) ->>> response.get_etag() -('12345-abcd', True) - -Some headers are available as mutable structures. For example most -of the `Content-` headers are sets of values: - ->>> response.content_language.add('en-us') ->>> response.content_language.add('en') ->>> response.headers['Content-Language'] -'en-us, en' - -Also here this works in both directions: - ->>> response.headers['Content-Language'] = 'de-AT, de' ->>> response.content_language -HeaderSet(['de-AT', 'de']) - -Authentication headers can be set that way as well: - ->>> response.www_authenticate.set_basic("My protected resource") ->>> response.headers['www-authenticate'] -'Basic realm="My protected resource"' - -Cookies can be set as well: - ->>> response.set_cookie('name', 'value') ->>> response.headers['Set-Cookie'] -'name=value; Path=/' ->>> response.set_cookie('name2', 'value2') - -If headers appear multiple times you can use the :meth:`~Headers.getlist` -method to get all values for a header: - ->>> response.headers.getlist('Set-Cookie') -['name=value; Path=/', 'name2=value2; Path=/'] - -Finally if you have set all the conditional values, you can make the -response conditional against a request. Which means that if the request -can assure that it has the information already, no data besides the headers -is sent over the network which saves traffic. For that you should set at -least an etag (which is used for comparison) and the date header and then -call :class:`~BaseRequest.make_conditional` with the request object. - -The response is modified accordingly (status code changed, response body -removed, entity headers removed etc.) diff --git a/pythonPackages/Werkzeug-0.12.1/docs/request_data.rst b/pythonPackages/Werkzeug-0.12.1/docs/request_data.rst deleted file mode 100644 index 4f32ab66f7..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/request_data.rst +++ /dev/null @@ -1,116 +0,0 @@ -.. _dealing-with-request-data: - -Dealing with Request Data -========================= - -.. module:: werkzeug - -The most important rule about web development is "Do not trust the user". -This is especially true for incoming request data on the input stream. -With WSGI this is actually a bit harder than you would expect. Because -of that Werkzeug wraps the request stream for you to save you from the -most prominent problems with it. - - -Missing EOF Marker on Input Stream ----------------------------------- - -The input stream has no end-of-file marker. If you would call the -:meth:`~file.read` method on the `wsgi.input` stream you would cause your -application to hang on conforming servers. This is actually intentional -however painful. Werkzeug solves that problem by wrapping the input -stream in a special :class:`LimitedStream`. The input stream is exposed -on the request objects as :attr:`~BaseRequest.stream`. This one is either -an empty stream (if the form data was parsed) or a limited stream with -the contents of the input stream. - - -When does Werkzeug Parse? -------------------------- - -Werkzeug parses the incoming data under the following situations: - -- you access either :attr:`~BaseRequest.form`, :attr:`~BaseRequest.files`, - or :attr:`~BaseRequest.stream` and the request method was - `POST` or `PUT`. -- if you call :func:`parse_form_data`. - -These calls are not interchangeable. If you invoke :func:`parse_form_data` -you must not use the request object or at least not the attributes that -trigger the parsing process. - -This is also true if you read from the `wsgi.input` stream before the -parsing. - -**General rule:** Leave the WSGI input stream alone. Especially in -WSGI middlewares. Use either the parsing functions or the request -object. Do not mix multiple WSGI utility libraries for form data -parsing or anything else that works on the input stream. - - -How does it Parse? ------------------- - -The standard Werkzeug parsing behavior handles three cases: - -- input content type was `multipart/form-data`. In this situation the - :class:`~BaseRequest.stream` will be empty and - :class:`~BaseRequest.form` will contain the regular `POST` / `PUT` - data, :class:`~BaseRequest.files` will contain the uploaded - files as :class:`FileStorage` objects. -- input content type was `application/x-www-form-urlencoded`. Then the - :class:`~BaseRequest.stream` will be empty and - :class:`~BaseRequest.form` will contain the regular `POST` / `PUT` - data and :class:`~BaseRequest.files` will be empty. -- the input content type was neither of them, :class:`~BaseRequest.stream` - points to a :class:`LimitedStream` with the input data for further - processing. - -Special note on the :attr:`~BaseRequest.get_data` method: Calling this -loads the full request data into memory. This is only safe to do if the -:attr:`~BaseRequest.max_content_length` is set. Also you can *either* -read the stream *or* call :meth:`~BaseRequest.get_data`. - - -Limiting Request Data ---------------------- - -To avoid being the victim of a DDOS attack you can set the maximum -accepted content length and request field sizes. The :class:`BaseRequest` -class has two attributes for that: :attr:`~BaseRequest.max_content_length` -and :attr:`~BaseRequest.max_form_memory_size`. - -The first one can be used to limit the total content length. For example -by setting it to ``1024 * 1024 * 16`` the request won't accept more than -16MB of transmitted data. - -Because certain data can't be moved to the hard disk (regular post data) -whereas temporary files can, there is a second limit you can set. The -:attr:`~BaseRequest.max_form_memory_size` limits the size of `POST` -transmitted form data. By setting it to ``1024 * 1024 * 2`` you can make -sure that all in memory-stored fields are not more than 2MB in size. - -This however does *not* affect in-memory stored files if the -`stream_factory` used returns a in-memory file. - - -How to extend Parsing? ----------------------- - -Modern web applications transmit a lot more than multipart form data or -url encoded data. Extending the parsing capabilities by subclassing -the :class:`BaseRequest` is simple. The following example implements -parsing for incoming JSON data:: - - from werkzeug.utils import cached_property - from werkzeug.wrappers import Request - from simplejson import loads - - class JSONRequest(Request): - # accept up to 4MB of transmitted data. - max_content_length = 1024 * 1024 * 4 - - @cached_property - def json(self): - if self.headers.get('content-type') == 'application/json': - return loads(self.data) diff --git a/pythonPackages/Werkzeug-0.12.1/docs/routing.rst b/pythonPackages/Werkzeug-0.12.1/docs/routing.rst deleted file mode 100644 index 0b1d8269dd..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/routing.rst +++ /dev/null @@ -1,205 +0,0 @@ -.. _routing: - -=========== -URL Routing -=========== - -.. module:: werkzeug.routing - -.. testsetup:: - - from werkzeug.routing import * - -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 ``PATH_INFO`` and call registered -callback functions that return the value. - -Werkzeug provides a much more powerful system, similar to `Routes`_. All the -objects mentioned on this page must be imported from :mod:`werkzeug.routing`, not -from :mod:`werkzeug`! - -.. _Routes: http://routes.groovie.org/ - - -Quickstart -========== - -Here is a simple example which could be the URL definition for a blog:: - - from werkzeug.routing import Map, Rule, NotFound, RequestRedirect - - url_map = Map([ - Rule('/', endpoint='blog/index'), - Rule('//', endpoint='blog/archive'), - Rule('///', endpoint='blog/archive'), - Rule('////', endpoint='blog/archive'), - Rule('////', - endpoint='blog/show_post'), - Rule('/about', endpoint='blog/about_me'), - Rule('/feeds/', endpoint='blog/feeds'), - Rule('/feeds/.rss', endpoint='blog/show_feed') - ]) - - def application(environ, start_response): - urls = url_map.bind_to_environ(environ) - try: - endpoint, args = urls.match() - except HTTPException, e: - return e(environ, start_response) - start_response('200 OK', [('Content-Type', 'text/plain')]) - return ['Rule points to %r with arguments %r' % (endpoint, args)] - -So what does that do? First of all we create a new :class:`Map` which stores -a bunch of URL rules. Then we pass it a list of :class:`Rule` objects. - -Each :class:`Rule` object is instantiated with a string that represents a rule -and an endpoint which will be the alias for what view the rule represents. -Multiple rules can have the same endpoint, but should have different arguments -to allow URL construction. - -The format for the URL rules is straightforward, but explained in detail below. - -Inside the WSGI application we bind the url_map to the current request which will -return a new :class:`MapAdapter`. This url_map adapter can then be used to match -or build domains for the current request. - -The :meth:`MapAdapter.match` method can then either return a tuple in the form -``(endpoint, args)`` or raise one of the three exceptions -:exc:`~werkzeug.exceptions.NotFound`, :exc:`~werkzeug.exceptions.MethodNotAllowed`, -or :exc:`~werkzeug.exceptions.RequestRedirect`. For more details about those -exceptions have a look at the documentation of the :meth:`MapAdapter.match` method. - - -Rule Format -=========== - -Rule strings basically are just normal URL paths with placeholders in the -format ````, where 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 -visited without a trailing slash will trigger a redirect to the same URL with -that slash appended. - -The list of converters can be extended, the default converters are explained -below. - - -Builtin Converters -================== - -Here a list of converters that come with Werkzeug: - -.. autoclass:: UnicodeConverter - -.. autoclass:: PathConverter - -.. autoclass:: AnyConverter - -.. autoclass:: IntegerConverter - -.. autoclass:: FloatConverter - -.. autoclass:: UUIDConverter - - -Maps, Rules and Adapters -======================== - -.. autoclass:: Map - :members: - - .. attribute:: converters - - The dictionary of converters. This can be modified after the class - was created, but will only affect rules added after the - modification. If the rules are defined with the list passed to the - class, the `converters` parameter to the constructor has to be used - instead. - -.. autoclass:: MapAdapter - :members: - -.. autoclass:: Rule - :members: empty - - -Rule Factories -============== - -.. autoclass:: RuleFactory - :members: get_rules - -.. autoclass:: Subdomain - -.. autoclass:: Submount - -.. autoclass:: EndpointPrefix - - -Rule Templates -============== - -.. autoclass:: RuleTemplate - - -Custom Converters -================= - -You can easily add custom converters. The only thing you have to do is to -subclass :class:`BaseConverter` and pass that new converter to the url_map. -A converter has to provide two public methods: `to_python` and `to_url`, -as well as a member that represents a regular expression. Here is a small -example:: - - from random import randrange - from werkzeug.routing import Rule, Map, BaseConverter, ValidationError - - class BooleanConverter(BaseConverter): - - def __init__(self, url_map, randomify=False): - super(BooleanConverter, self).__init__(url_map) - self.randomify = randomify - self.regex = '(?:yes|no|maybe)' - - def to_python(self, value): - if value == 'maybe': - if self.randomify: - return not randrange(2) - raise ValidationError() - return value == 'yes' - - def to_url(self, value): - return value and 'yes' or 'no' - - url_map = Map([ - Rule('/vote/', endpoint='vote'), - Rule('/vote/', endpoint='foo') - ], converters={'bool': BooleanConverter}) - -If you want that converter to be the default converter, name it ``'default'``. - -Host Matching -============= - -.. versionadded:: 0.7 - -Starting with Werkzeug 0.7 it's also possible to do matching on the whole -host names instead of just the subdomain. To enable this feature you need -to pass ``host_matching=True`` to the :class:`Map` constructor and provide -the `host` argument to all routes:: - - url_map = Map([ - Rule('/', endpoint='www_index', host='www.example.com'), - Rule('/', endpoint='help_index', host='help.example.com') - ], host_matching=True) - -Variable parts are of course also possible in the host section:: - - url_map = Map([ - Rule('/', endpoint='www_index', host='www.example.com'), - Rule('/', endpoint='user_index', host='.example.com') - ], host_matching=True) diff --git a/pythonPackages/Werkzeug-0.12.1/docs/serving.rst b/pythonPackages/Werkzeug-0.12.1/docs/serving.rst deleted file mode 100644 index 39f618f3ac..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/serving.rst +++ /dev/null @@ -1,227 +0,0 @@ -========================= -Serving WSGI Applications -========================= - -.. module:: werkzeug.serving - -There are many ways to serve a WSGI application. While you're developing it, -you usually don't want to have a full-blown webserver like Apache up and -running, but instead a simple standalone one. Because of that Werkzeug comes -with a builtin development server. - -The easiest way is creating a small ``start-myproject.py`` file that runs the -application using the builtin server:: - - #!/usr/bin/env python - # -*- coding: utf-8 -*- - - from werkzeug.serving import run_simple - from myproject import make_app - - app = make_app(...) - run_simple('localhost', 8080, app, use_reloader=True) - -You can also pass it the `extra_files` keyword argument with a list of -additional files (like configuration files) you want to observe. - -.. autofunction:: run_simple - -.. autofunction:: is_running_from_reloader - -.. autofunction:: make_ssl_devcert - -.. admonition:: Information - - The development server is not intended to be used on production systems. - It was designed especially for development purposes and performs poorly - under high load. For deployment setups have a look at the - :ref:`deployment` pages. - -.. _reloader: - -Reloader --------- - -.. versionchanged:: 0.10 - -The Werkzeug reloader constantly monitors modules and paths of your web -application, and restarts the server if any of the observed files change. - -Since version 0.10, there are two backends the reloader supports: ``stat`` and -``watchdog``. - -- The default ``stat`` backend simply checks the ``mtime`` of all files in a - regular interval. This is sufficient for most cases, however, it is known to - drain a laptop's battery. - -- The ``watchdog`` backend uses filesystem events, and is much faster than - ``stat``. It requires the `watchdog `_ - module to be installed. The recommended way to achieve this is to add - ``Werkzeug[watchdog]`` to your requirements file. - -If ``watchdog`` is installed and available it will automatically be used -instead of the builtin ``stat`` reloader. - -To switch between the backends you can use the `reloader_type` parameter of the -:func:`run_simple` function. ``'stat'`` sets it to the default stat based -polling and ``'watchdog'`` forces it to the watchdog backend. - -.. note:: - - Some edge cases, like modules that failed to import correctly, are not - handled by the stat reloader for performance reasons. The watchdog reloader - monitors such files too. - -Colored Logging ---------------- -Werkzeug is able to color the output of request logs when ran from a terminal, just install the `termcolor -`_ package. Windows users need to install `colorama -`_ in addition to termcolor for this to work. - -Virtual Hosts -------------- - -Many web applications utilize multiple subdomains. This can be a bit tricky -to simulate locally. Fortunately there is the `hosts file`_ that can be used -to assign the local computer multiple names. - -This allows you to call your local computer `yourapplication.local` and -`api.yourapplication.local` (or anything else) in addition to `localhost`. - -You can find the hosts file on the following location: - - =============== ============================================== - Windows ``%SystemRoot%\system32\drivers\etc\hosts`` - Linux / OS X ``/etc/hosts`` - =============== ============================================== - -You can open the file with your favorite text editor and add a new name after -`localhost`:: - - 127.0.0.1 localhost yourapplication.local api.yourapplication.local - -Save the changes and after a while you should be able to access the -development server on these host names as well. You can use the -:ref:`routing` system to dispatch between different hosts or parse -:attr:`request.host` yourself. - -Shutting Down The Server ------------------------- - -.. versionadded:: 0.7 - -Starting with Werkzeug 0.7 the development server provides a way to shut -down the server after a request. This currently only works with Python -2.6 and later and will only work with the development server. To initiate -the shutdown you have to call a function named -``'werkzeug.server.shutdown'`` in the WSGI environment:: - - def shutdown_server(environ): - if not 'werkzeug.server.shutdown' in environ: - raise RuntimeError('Not running the development server') - environ['werkzeug.server.shutdown']() - -Troubleshooting ---------------- - -On operating systems that support ipv6 and have it configured such as modern -Linux systems, OS X 10.4 or higher as well as Windows Vista some browsers can -be painfully slow if accessing your local server. The reason for this is that -sometimes "localhost" is configured to be available on both ipv4 and ipv6 sockets -and some browsers will try to access ipv6 first and then ipv4. - -At the current time the integrated webserver does not support ipv6 and ipv4 at -the same time and for better portability ipv4 is the default. - -If you notice that the web browser takes ages to load the page there are two ways -around this issue. If you don't need ipv6 support you can disable the ipv6 entry -in the `hosts file`_ by removing this line:: - - ::1 localhost - -Alternatively you can also disable ipv6 support in your browser. For example -if Firefox shows this behavior you can disable it by going to ``about:config`` -and disabling the `network.dns.disableIPv6` key. This however is not -recommended as of Werkzeug 0.6.1! - -Starting with Werkzeug 0.6.1, the server will now switch between ipv4 and -ipv6 based on your operating system's configuration. This means if that -you disabled ipv6 support in your browser but your operating system is -preferring ipv6, you will be unable to connect to your server. In that -situation, you can either remove the localhost entry for ``::1`` or -explicitly bind the hostname to an ipv4 address (`127.0.0.1`) - -.. _hosts file: http://en.wikipedia.org/wiki/Hosts_file - -SSL ---- - -.. versionadded:: 0.6 - -The builtin server supports SSL for testing purposes. If an SSL context is -provided it will be used. That means a server can either run in HTTP or HTTPS -mode, but not both. - -Quickstart -`````````` - -The easiest way to do SSL based development with Werkzeug is by using it -to generate an SSL certificate and private key and storing that somewhere -and to then put it there. For the certificate you need to provide the -name of your server on generation or a `CN`. - -1. Generate an SSL key and store it somewhere: - - >>> from werkzeug.serving import make_ssl_devcert - >>> make_ssl_devcert('/path/to/the/key', host='localhost') - ('/path/to/the/key.crt', '/path/to/the/key.key') - -2. Now this tuple can be passed as ``ssl_context`` to the - :func:`run_simple` method:: - - run_simple('localhost', 4000, application, - ssl_context=('/path/to/the/key.crt', - '/path/to/the/key.key')) - -You will have to acknowledge the certificate in your browser once then. - -Loading Contexts by Hand -```````````````````````` - -In Python 2.7.9 and 3+ you also have the option to use a ``ssl.SSLContext`` -object instead of a simple tuple. This way you have better control over the SSL -behavior of Werkzeug's builtin server:: - - import ssl - ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) - ctx.load_cert_chain('ssl.cert', 'ssl.key') - run_simple('localhost', 4000, application, ssl_context=ctx) - - -.. versionchanged 0.10:: ``OpenSSL`` contexts are not supported anymore. - -Generating Certificates -``````````````````````` - -A key and certificate can be created in advance using the openssl tool -instead of the :func:`make_ssl_devcert`. This requires that you have -the `openssl` command installed on your system:: - - $ openssl genrsa 1024 > ssl.key - $ openssl req -new -x509 -nodes -sha1 -days 365 -key ssl.key > ssl.cert - -Adhoc Certificates -`````````````````` - -The easiest way to enable SSL is to start the server in adhoc-mode. In -that case Werkzeug will generate an SSL certificate for you:: - - run_simple('localhost', 4000, application, - ssl_context='adhoc') - -The downside of this of course is that you will have to acknowledge the -certificate each time the server is reloaded. Adhoc certificates are -discouraged because modern browsers do a bad job at supporting them for -security reasons. - -This feature requires the pyOpenSSL library to be installed. diff --git a/pythonPackages/Werkzeug-0.12.1/docs/terms.rst b/pythonPackages/Werkzeug-0.12.1/docs/terms.rst deleted file mode 100644 index f2b85820c7..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/terms.rst +++ /dev/null @@ -1,44 +0,0 @@ -=============== -Important Terms -=============== - -.. module:: werkzeug - -This page covers important terms used in the documentation and Werkzeug -itself. - - -WSGI ----- - -WSGI a specification for Python web applications Werkzeug follows. It was -specified in the :pep:`333` and is widely supported. Unlike previous solutions -it guarantees that web applications, servers and utilities can work together. - -Response Object ---------------- - -For Werkzeug, a response object is an object that works like a WSGI -application but does not do any request processing. Usually you have a view -function or controller method that processes the request and assembles a -response object. - -A response object is *not* necessarily the :class:`BaseResponse` object or a -subclass thereof. - -For example Pylons/webob provide a very similar response class that can -be used as well (:class:`webob.Response`). - -View Function -------------- - -Often people speak of MVC (Model, View, Controller) when developing web -applications. However, the Django framework coined MTV (Model, Template, -View) which basically means the same but reduces the concept to the data -model, a function that processes data from the request and the database and -renders a template. - -Werkzeug itself does not tell you how you should develop applications, but the -documentation often speaks of view functions that work roughly the same. The -idea of a view function is that it's called with a request object (and -optionally some parameters from an URL rule) and returns a response object. diff --git a/pythonPackages/Werkzeug-0.12.1/docs/test.rst b/pythonPackages/Werkzeug-0.12.1/docs/test.rst deleted file mode 100644 index eb0130b3d3..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/test.rst +++ /dev/null @@ -1,172 +0,0 @@ -============== -Test Utilities -============== - -.. module:: werkzeug.test - -Quite often you want to unittest your application or just check the output -from an interactive python session. In theory that is pretty simple because -you can fake a WSGI environment and call the application with a dummy -`start_response` and iterate over the application iterator but there are -argumentably better ways to interact with an application. - - -Diving In -========= - -Werkzeug provides a `Client` object which you can pass a WSGI application (and -optionally a response wrapper) which you can use to send virtual requests to -the application. - -A response wrapper is a callable that takes three arguments: the application -iterator, the status and finally a list of headers. The default response -wrapper returns a tuple. Because response objects have the same signature, -you can use them as response wrapper, ideally by subclassing them and hooking -in test functionality. - ->>> from werkzeug.test import Client ->>> from werkzeug.testapp import test_app ->>> from werkzeug.wrappers import BaseResponse ->>> c = Client(test_app, BaseResponse) ->>> resp = c.get('/') ->>> resp.status_code -200 ->>> resp.headers -Headers([('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '8339')]) ->>> resp.data.splitlines()[0] -'>> c = Client(test_app) ->>> app_iter, status, headers = c.get('/') ->>> status -'200 OK' ->>> headers -[('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '8339')] ->>> ''.join(app_iter).splitlines()[0] -'>> from werkzeug.test import EnvironBuilder ->>> from StringIO import StringIO ->>> builder = EnvironBuilder(method='POST', data={'foo': 'this is some text', -... 'file': (StringIO('my file contents'), 'test.txt')}) ->>> env = builder.get_environ() - -The resulting environment is a regular WSGI environment that can be used for -further processing: - ->>> from werkzeug.wrappers import Request ->>> req = Request(env) ->>> req.form['foo'] -u'this is some text' ->>> req.files['file'] - ->>> req.files['file'].read() -'my file contents' - -The :class:`EnvironBuilder` figures out the content type automatically if you -pass a dict to the constructor as `data`. If you provide a string or an -input stream you have to do that yourself. - -By default it will try to use ``application/x-www-form-urlencoded`` and only -use ``multipart/form-data`` if files are uploaded: - ->>> builder = EnvironBuilder(method='POST', data={'foo': 'bar'}) ->>> builder.content_type -'application/x-www-form-urlencoded' ->>> builder.files['foo'] = StringIO('contents') ->>> builder.content_type -'multipart/form-data' - -If a string is provided as data (or an input stream) you have to specify -the content type yourself: - ->>> builder = EnvironBuilder(method='POST', data='{"json": "this is"}') ->>> builder.content_type ->>> builder.content_type = 'application/json' - - -Testing API -=========== - -.. autoclass:: EnvironBuilder - :members: - - .. attribute:: path - - The path of the application. (aka `PATH_INFO`) - - .. attribute:: charset - - The charset used to encode unicode data. - - .. attribute:: headers - - A :class:`Headers` object with the request headers. - - .. attribute:: errors_stream - - The error stream used for the `wsgi.errors` stream. - - .. attribute:: multithread - - The value of `wsgi.multithread` - - .. attribute:: multiprocess - - The value of `wsgi.multiprocess` - - .. attribute:: environ_base - - The dict used as base for the newly create environ. - - .. attribute:: environ_overrides - - A dict with values that are used to override the generated environ. - - .. attribute:: input_stream - - The optional input stream. This and :attr:`form` / :attr:`files` - is mutually exclusive. Also do not provide this stream if the - request method is not `POST` / `PUT` or something comparable. - -.. autoclass:: Client - - .. automethod:: open - - Shortcut methods are available for many HTTP methods: - - .. automethod:: get - - .. automethod:: patch - - .. automethod:: post - - .. automethod:: head - - .. automethod:: put - - .. automethod:: delete - - .. automethod:: options - - .. automethod:: trace - - -.. autofunction:: create_environ([options]) - -.. autofunction:: run_wsgi_app diff --git a/pythonPackages/Werkzeug-0.12.1/docs/transition.rst b/pythonPackages/Werkzeug-0.12.1/docs/transition.rst deleted file mode 100644 index a1257e1707..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/transition.rst +++ /dev/null @@ -1,73 +0,0 @@ -Transition to Werkzeug 1.0 -========================== - -Werkzeug originally had a magical import system hook that enabled -everything to be imported from one module and still loading the actual -implementations lazily as necessary. Unfortunately this turned out to be -slow and also unreliable on alternative Python implementations and -Google's App Engine. - -Starting with 0.7 we recommend against the short imports and strongly -encourage starting importing from the actual implementation module. -Werkzeug 1.0 will disable the magical import hook completely. - -Because finding out where the actual functions are imported and rewriting -them by hand is a painful and boring process we wrote a tool that aids in -making this transition. - -Automatically Rewriting Imports -------------------------------- - -For instance, with Werkzeug < 0.7 the recommended way to use the escape function -was this:: - - from werkzeug import escape - -With Werkzeug 0.7, the recommended way to import this function is -directly from the utils module (and with 1.0 this will become mandatory). -To automatically rewrite all imports one can use the -`werkzeug-import-rewrite `_ script. - -You can use it by executing it with Python and with a list of folders with -Werkzeug based code. It will then spit out a hg/git compatible patch -file. Example patch file creation:: - - $ python werkzeug-import-rewrite.py . > new-imports.udiff - -To apply the patch one of the following methods work: - -hg: - - :: - - hg import new-imports.udiff - -git: - - :: - - git apply new-imports.udiff - -patch: - - :: - - patch -p1 < new-imports.udiff - -Stop Using Deprecated Things ----------------------------- - -A few things in Werkzeug will stop being supported and for others, we're -suggesting alternatives even if they will stick around for a longer time. - -Do not use: - -- `werkzeug.script`, replace it with custom scripts written with - `argparse` or something similar. -- `werkzeug.template`, replace with a proper template engine. -- `werkzeug.contrib.jsrouting`, stop using URL generation for - JavaScript, it does not scale well with many public routing. -- `werkzeug.contrib.kickstart`, replace with hand written code, the - Werkzeug API became better in general that this is no longer - necessary. -- `werkzeug.contrib.testtools`, not useful really. diff --git a/pythonPackages/Werkzeug-0.12.1/docs/tutorial.rst b/pythonPackages/Werkzeug-0.12.1/docs/tutorial.rst deleted file mode 100644 index 99f84e0af0..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/tutorial.rst +++ /dev/null @@ -1,475 +0,0 @@ -================= -Werkzeug Tutorial -================= - -.. module:: werkzeug - -Welcome to the Werkzeug tutorial in which we will create a `TinyURL`_ clone -that stores URLs in a redis instance. The libraries we will use for this -applications are `Jinja`_ 2 for the templates, `redis`_ for the database -layer and, of course, Werkzeug for the WSGI layer. - -You can use `pip` to install the required libraries:: - - pip install Jinja2 redis Werkzeug - -Also make sure to have a redis server running on your local machine. If -you are on OS X, you can use `brew` to install it:: - - brew install redis - -If you are on Ubuntu or Debian, you can use apt-get:: - - sudo apt-get install redis-server - -Redis was developed for UNIX systems and was never really designed to -work on Windows. For development purposes, the unofficial ports however -work well enough. You can get them from `github -`_. - -Introducing Shortly -------------------- - -In this tutorial, we will together create a simple URL shortener service -with Werkzeug. Please keep in mind that Werkzeug is not a framework, it's -a library with utilities to create your own framework or application and -as such is very flexible. The approach we use here is just one of many you -can use. - -As data store, we will use `redis`_ here instead of a relational database -to keep this simple and because that's the kind of job that `redis`_ -excels at. - -The final result will look something like this: - -.. image:: _static/shortly.png - :alt: a screenshot of shortly - -.. _TinyURL: http://tinyurl.com/ -.. _Jinja: http://jinja.pocoo.org/ -.. _redis: http://redis.io/ - -Step 0: A Basic WSGI Introduction ---------------------------------- - -Werkzeug is a utility library for WSGI. WSGI itself is a protocol or -convention that ensures that your web application can speak with the -webserver and more importantly that web applications work nicely together. - -A basic “Hello World” application in WSGI without the help of Werkzeug -looks like this:: - - def application(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/plain')]) - return ['Hello World!'] - -A WSGI application is something you can call and pass an environ dict -and a ``start_response`` callable. The environ contains all incoming -information, the ``start_response`` function can be used to indicate the -start of the response. With Werkzeug you don't have to deal directly with -either as request and response objects are provided to work with them. - -The request data takes the environ object and allows you to access the -data from that environ in a nice manner. The response object is a WSGI -application in itself and provides a much nicer way to create responses. - -Here is how you would write that application with response objects:: - - from werkzeug.wrappers import Response - - def application(environ, start_response): - response = Response('Hello World!', mimetype='text/plain') - return response(environ, start_response) - -And here an expanded version that looks at the query string in the URL -(more importantly at the `name` parameter in the URL to substitute “World” -against another word):: - - from werkzeug.wrappers import Request, Response - - def application(environ, start_response): - request = Request(environ) - text = 'Hello %s!' % request.args.get('name', 'World') - response = Response(text, mimetype='text/plain') - return response(environ, start_response) - -And that's all you need to know about WSGI. - - -Step 1: Creating the Folders ----------------------------- - -Before we get started, let’s create the folders needed for this application:: - - /shortly - /static - /templates - -The shortly folder is not a python package, but just something where we -drop our files. Directly into this folder we will then put our main -module in the following steps. The files inside the static folder are -available to users of the application via HTTP. This is the place where -CSS and JavaScript files go. Inside the templates folder we will make -Jinja2 look for templates. The templates you create later in the tutorial -will go in this directory. - -Step 2: The Base Structure --------------------------- - -Now let's get right into it and create a module for our application. Let's -create a file called `shortly.py` in the `shortly` folder. At first we -will need a bunch of imports. I will pull in all the imports here, even -if they are not used right away, to keep it from being confusing:: - - import os - import redis - import urlparse - from werkzeug.wrappers import Request, Response - from werkzeug.routing import Map, Rule - from werkzeug.exceptions import HTTPException, NotFound - from werkzeug.wsgi import SharedDataMiddleware - from werkzeug.utils import redirect - from jinja2 import Environment, FileSystemLoader - -Then we can create the basic structure for our application and a function -to create a new instance of it, optionally with a piece of WSGI middleware -that exports all the files on the `static` folder on the web:: - - class Shortly(object): - - def __init__(self, config): - self.redis = redis.Redis(config['redis_host'], config['redis_port']) - - def dispatch_request(self, request): - return Response('Hello World!') - - def wsgi_app(self, environ, start_response): - request = Request(environ) - response = self.dispatch_request(request) - return response(environ, start_response) - - def __call__(self, environ, start_response): - return self.wsgi_app(environ, start_response) - - - def create_app(redis_host='localhost', redis_port=6379, with_static=True): - app = Shortly({ - 'redis_host': redis_host, - 'redis_port': redis_port - }) - if with_static: - app.wsgi_app = SharedDataMiddleware(app.wsgi_app, { - '/static': os.path.join(os.path.dirname(__file__), 'static') - }) - return app - -Lastly we can add a piece of code that will start a local development -server with automatic code reloading and a debugger:: - - if __name__ == '__main__': - from werkzeug.serving import run_simple - app = create_app() - run_simple('127.0.0.1', 5000, app, use_debugger=True, use_reloader=True) - -The basic idea here is that our ``Shortly`` class is an actual WSGI -application. The ``__call__`` method directly dispatches to ``wsgi_app``. -This is done so that we can wrap ``wsgi_app`` to apply middlewares like we -do in the ``create_app`` function. The actual ``wsgi_app`` method then -creates a :class:`Request` object and calls the ``dispatch_request`` -method which then has to return a :class:`Response` object which is then -evaluated as WSGI application again. As you can see: turtles all the way -down. Both the ``Shortly`` class we create, as well as any request object -in Werkzeug implements the WSGI interface. As a result of that you could -even return another WSGI application from the ``dispatch_request`` method. - -The ``create_app`` factory function can be used to create a new instance -of our application. Not only will it pass some parameters as -configuration to the application but also optionally add a WSGI middleware -that exports static files. This way we have access to the files from the -static folder even when we are not configuring our server to provide them -which is very helpful for development. - -Intermezzo: Running the Application ------------------------------------ - -Now you should be able to execute the file with `python` and see a server -on your local machine:: - - $ python shortly.py - * Running on http://127.0.0.1:5000/ - * Restarting with reloader: stat() polling - -It also tells you that the reloader is active. It will use various -techniques to figure out if any file changed on the disk and then -automatically restart. - -Just go to the URL and you should see “Hello World!”. - -Step 3: The Environment ------------------------ - -Now that we have the basic application class, we can make the constructor -do something useful and provide a few helpers on there that can come in -handy. We will need to be able to render templates and connect to redis, -so let's extend the class a bit:: - - def __init__(self, config): - self.redis = redis.Redis(config['redis_host'], config['redis_port']) - template_path = os.path.join(os.path.dirname(__file__), 'templates') - self.jinja_env = Environment(loader=FileSystemLoader(template_path), - autoescape=True) - - def render_template(self, template_name, **context): - t = self.jinja_env.get_template(template_name) - return Response(t.render(context), mimetype='text/html') - -Step 4: The Routing -------------------- - -Next up is routing. Routing is the process of matching and parsing the URL to -something we can use. Werkzeug provides a flexible integrated routing -system which we can use for that. The way it works is that you create a -:class:`~werkzeug.routing.Map` instance and add a bunch of -:class:`~werkzeug.routing.Rule` objects. Each rule has a pattern it will -try to match the URL against and an “endpoint”. The endpoint is typically -a string and can be used to uniquely identify the URL. We could also use -this to automatically reverse the URL, but that's not what we will do in this -tutorial. - -Just put this into the constructor:: - - self.url_map = Map([ - Rule('/', endpoint='new_url'), - Rule('/', endpoint='follow_short_link'), - Rule('/+', endpoint='short_link_details') - ]) - -Here we create a URL map with three rules. ``/`` for the root of the URL -space where we will just dispatch to a function that implements the logic -to create a new URL. And then one that follows the short link to the -target URL and another one with the same rule but a plus (``+``) at the -end to show the link details. - -So how do we find our way from the endpoint to a function? That's up to you. -The way we will do it in this tutorial is by calling the method ``on_`` -+ endpoint on the class itself. Here is how this works:: - - def dispatch_request(self, request): - adapter = self.url_map.bind_to_environ(request.environ) - try: - endpoint, values = adapter.match() - return getattr(self, 'on_' + endpoint)(request, **values) - except HTTPException, e: - return e - -We bind the URL map to the current environment and get back a -:class:`~werkzeug.routing.URLAdapter`. The adapter can be used to match -the request but also to reverse URLs. The match method will return the -endpoint and a dictionary of values in the URL. For instance the rule for -``follow_short_link`` has a variable part called ``short_id``. When we go -to ``http://localhost:5000/foo`` we will get the following values back:: - - endpoint = 'follow_short_link' - values = {'short_id': u'foo'} - -If it does not match anything, it will raise a -:exc:`~werkzeug.exceptions.NotFound` exception, which is an -:exc:`~werkzeug.exceptions.HTTPException`. All HTTP exceptions are also -WSGI applications by themselves which render a default error page. So we -just catch all of them down and return the error itself. - -If all works well, we call the function ``on_`` + endpoint and pass it the -request as argument as well as all the URL arguments as keyword arguments -and return the response object that method returns. - -Step 5: The First View ----------------------- - -Let's start with the first view: the one for new URLs:: - - def on_new_url(self, request): - error = None - url = '' - if request.method == 'POST': - url = request.form['url'] - if not is_valid_url(url): - error = 'Please enter a valid URL' - else: - short_id = self.insert_url(url) - return redirect('/%s+' % short_id) - return self.render_template('new_url.html', error=error, url=url) - -This logic should be easy to understand. Basically we are checking that -the request method is POST, in which case we validate the URL and add a -new entry to the database, then redirect to the detail page. This means -we need to write a function and a helper method. For URL validation this -is good enough:: - - def is_valid_url(url): - parts = urlparse.urlparse(url) - return parts.scheme in ('http', 'https') - -For inserting the URL, all we need is this little method on our class:: - - def insert_url(self, url): - short_id = self.redis.get('reverse-url:' + url) - if short_id is not None: - return short_id - url_num = self.redis.incr('last-url-id') - short_id = base36_encode(url_num) - self.redis.set('url-target:' + short_id, url) - self.redis.set('reverse-url:' + url, short_id) - return short_id - -``reverse-url:`` + the URL will store the short id. If the URL was -already submitted this won't be None and we can just return that value -which will be the short ID. Otherwise we increment the ``last-url-id`` -key and convert it to base36. Then we store the link and the reverse -entry in redis. And here the function to convert to base 36:: - - def base36_encode(number): - assert number >= 0, 'positive integer required' - if number == 0: - return '0' - base36 = [] - while number != 0: - number, i = divmod(number, 36) - base36.append('0123456789abcdefghijklmnopqrstuvwxyz'[i]) - return ''.join(reversed(base36)) - -So what is missing for this view to work is the template. We will create -this later, let's first also write the other views and then do the -templates in one go. - -Step 6: Redirect View ---------------------- - -The redirect view is easy. All it has to do is to look for the link in -redis and redirect to it. Additionally we will also increment a counter -so that we know how often a link was clicked:: - - def on_follow_short_link(self, request, short_id): - link_target = self.redis.get('url-target:' + short_id) - if link_target is None: - raise NotFound() - self.redis.incr('click-count:' + short_id) - return redirect(link_target) - -In this case we will raise a :exc:`~werkzeug.exceptions.NotFound` exception -by hand if the URL does not exist, which will bubble up to the -``dispatch_request`` function and be converted into a default 404 -response. - -Step 7: Detail View -------------------- - -The link detail view is very similar, we just render a template -again. In addition to looking up the target, we also ask redis for the -number of times the link was clicked and let it default to zero if such -a key does not yet exist:: - - def on_short_link_details(self, request, short_id): - link_target = self.redis.get('url-target:' + short_id) - if link_target is None: - raise NotFound() - click_count = int(self.redis.get('click-count:' + short_id) or 0) - return self.render_template('short_link_details.html', - link_target=link_target, - short_id=short_id, - click_count=click_count - ) - -Please be aware that redis always works with strings, so you have to convert -the click count to :class:`int` by hand. - -Step 8: Templates ------------------ - -And here are all the templates. Just drop them into the `templates` -folder. Jinja2 supports template inheritance, so the first thing we will -do is create a layout template with blocks that act as placeholders. We -also set up Jinja2 so that it automatically escapes strings with HTML -rules, so we don't have to spend time on that ourselves. This prevents -XSS attacks and rendering errors. - -*layout.html*: - -.. sourcecode:: html+jinja - - - {% block title %}{% endblock %} | shortly - -
-

shortly

-

Shortly is a URL shortener written with Werkzeug - {% block body %}{% endblock %} -

- -*new_url.html*: - -.. sourcecode:: html+jinja - - {% extends "layout.html" %} - {% block title %}Create New Short URL{% endblock %} - {% block body %} -

Submit URL

-
- {% if error %} -

Error: {{ error }} - {% endif %} -

URL: - - -

- {% endblock %} - -*short_link_details.html*: - -.. sourcecode:: html+jinja - - {% extends "layout.html" %} - {% block title %}Details about /{{ short_id }}{% endblock %} - {% block body %} -

/{{ short_id }}

-
-
Full link -
Click count: -
{{ click_count }} -
- {% endblock %} - -Step 9: The Style ------------------ - -For this to look better than ugly black and white, here a simple -stylesheet that goes along: - -.. sourcecode:: css - - body { background: #E8EFF0; margin: 0; padding: 0; } - body, input { font-family: 'Helvetica Neue', Arial, - sans-serif; font-weight: 300; font-size: 18px; } - .box { width: 500px; margin: 60px auto; padding: 20px; - background: white; box-shadow: 0 1px 4px #BED1D4; - border-radius: 2px; } - a { color: #11557C; } - h1, h2 { margin: 0; color: #11557C; } - h1 a { text-decoration: none; } - h2 { font-weight: normal; font-size: 24px; } - .tagline { color: #888; font-style: italic; margin: 0 0 20px 0; } - .link div { overflow: auto; font-size: 0.8em; white-space: pre; - padding: 4px 10px; margin: 5px 0; background: #E5EAF1; } - dt { font-weight: normal; } - .error { background: #E8EFF0; padding: 3px 8px; color: #11557C; - font-size: 0.9em; border-radius: 2px; } - .urlinput { width: 300px; } - -Bonus: Refinements ------------------- - -Look at the implementation in the example dictionary in the Werkzeug -repository to see a version of this tutorial with some small refinements -such as a custom 404 page. - -- `shortly in the example folder `_ diff --git a/pythonPackages/Werkzeug-0.12.1/docs/unicode.rst b/pythonPackages/Werkzeug-0.12.1/docs/unicode.rst deleted file mode 100644 index 0dc977a7b1..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/unicode.rst +++ /dev/null @@ -1,158 +0,0 @@ -.. _unicode: - -======= -Unicode -======= - -.. module:: werkzeug - -Since early Python 2 days unicode was part of all default Python builds. It -allows developers to write applications that deal with non-ASCII characters -in a straightforward way. But working with unicode requires a basic knowledge -about that matter, especially when working with libraries that do not support -it. - -Werkzeug uses unicode internally everywhere text data is assumed, even if the -HTTP standard is not unicode aware as it. Basically all incoming data is -decoded from the charset specified (per default `utf-8`) so that you don't -operate on bytestrings any more. Outgoing unicode data is then encoded into -the target charset again. - -Unicode in Python -================= - -In Python 2 there are two basic string types: `str` and `unicode`. `str` may -carry encoded unicode data but it's always represented in bytes whereas the -`unicode` type does not contain bytes but charpoints. What does this mean? -Imagine you have the German Umlaut `ö`. In ASCII you cannot represent that -character, but in the `latin-1` and `utf-8` character sets you can represent -it, but they look differently when encoded: - ->>> u'ö'.encode('latin1') -'\xf6' ->>> u'ö'.encode('utf-8') -'\xc3\xb6' - -So an `ö` might look totally different depending on the encoding which makes -it hard to work with it. The solution is using the `unicode` type (as we did -above, note the `u` prefix before the string). The unicode type does not -store the bytes for `ö` but the information, that this is a -``LATIN SMALL LETTER O WITH DIAERESIS``. - -Doing ``len(u'ö')`` will always give us the expected "1" but ``len('ö')`` -might give different results depending on the encoding of ``'ö'``. - -Unicode in HTTP -=============== - -The problem with unicode is that HTTP does not know what unicode is. HTTP -is limited to bytes but this is not a big problem as Werkzeug decodes and -encodes for us automatically all incoming and outgoing data. Basically what -this means is that data sent from the browser to the web application is per -default decoded from an utf-8 bytestring into a `unicode` string. Data sent -from the application back to the browser that is not yet a bytestring is then -encoded back to utf-8. - -Usually this "just works" and we don't have to worry about it, but there are -situations where this behavior is problematic. For example the Python 2 IO -layer is not unicode aware. This means that whenever you work with data from -the file system you have to properly decode it. The correct way to load -a text file from the file system looks like this:: - - f = file('/path/to/the_file.txt', 'r') - try: - text = f.decode('utf-8') # assuming the file is utf-8 encoded - finally: - f.close() - -There is also the codecs module which provides an open function that decodes -automatically from the given encoding. - -Error Handling -============== - -With Werkzeug 0.3 onwards you can further control the way Werkzeug works with -unicode. In the past Werkzeug ignored encoding errors silently on incoming -data. This decision was made to avoid internal server errors if the user -tampered with the submitted data. However there are situations where you -want to abort with a `400 BAD REQUEST` instead of silently ignoring the error. - -All the functions that do internal decoding now accept an `errors` keyword -argument that behaves like the `errors` parameter of the builtin string method -`decode`. The following values are possible: - -`ignore` - This is the default behavior and tells the codec to ignore characters that - it doesn't understand silently. - -`replace` - The codec will replace unknown characters with a replacement character - (`U+FFFD` ``REPLACEMENT CHARACTER``) - -`strict` - Raise an exception if decoding fails. - -Unlike the regular python decoding Werkzeug does not raise an -:exc:`UnicodeDecodeError` if the decoding failed but an -:exc:`~exceptions.HTTPUnicodeError` which -is a direct subclass of `UnicodeError` and the `BadRequest` HTTP exception. -The reason is that if this exception is not caught by the application but -a catch-all for HTTP exceptions exists a default `400 BAD REQUEST` error -page is displayed. - -There is additional error handling available which is a Werkzeug extension -to the regular codec error handling which is called `fallback`. Often you -want to use utf-8 but support latin1 as legacy encoding too if decoding -failed. For this case you can use the `fallback` error handling. For -example you can specify ``'fallback:iso-8859-15'`` to tell Werkzeug it should -try with `iso-8859-15` if `utf-8` failed. If this decoding fails too (which -should not happen for most legacy charsets such as `iso-8859-15`) the error -is silently ignored as if the error handling was `ignore`. - -Further details are available as part of the API documentation of the concrete -implementations of the functions or classes working with unicode. - -Request and Response Objects -============================ - -As request and response objects usually are the central entities of Werkzeug -powered applications you can change the default encoding Werkzeug operates on -by subclassing these two classes. For example you can easily set the -application to utf-7 and strict error handling:: - - from werkzeug.wrappers import BaseRequest, BaseResponse - - class Request(BaseRequest): - charset = 'utf-7' - encoding_errors = 'strict' - - class Response(BaseResponse): - charset = 'utf-7' - -Keep in mind that the error handling is only customizable for all decoding -but not encoding. If Werkzeug encounters an encoding error it will raise a -:exc:`UnicodeEncodeError`. It's your responsibility to not create data that is -not present in the target charset (a non issue with all unicode encodings -such as utf-8). - -.. _filesystem-encoding: - -The Filesystem -============== - -.. versionchanged:: 0.11 - -Up until version 0.11, Werkzeug used Python's stdlib functionality to detect -the filesystem encoding. However, several bug reports against Werkzeug have -shown that the value of :py:func:`sys.getfilesystemencoding` cannot be -trusted under traditional UNIX systems. The usual problems come from -misconfigured systems, where ``LANG`` and similar environment variables are not -set. In such cases, Python would default to ASCII as filesystem encoding, a -very conservative default that is usually wrong and causes more problems than -it avoids. - -Therefore Werkzeug will force the filesystem encoding to ``UTF-8`` and issue a -warning whenever it detects that it is running under BSD or Linux, and -:py:func:`sys.getfilesystemencoding` is returning an ASCII encoding. - -See also :py:mod:`werkzeug.filesystem`. diff --git a/pythonPackages/Werkzeug-0.12.1/docs/urls.rst b/pythonPackages/Werkzeug-0.12.1/docs/urls.rst deleted file mode 100644 index f97e54bf5f..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/urls.rst +++ /dev/null @@ -1,6 +0,0 @@ -=========== -URL Helpers -=========== - -.. automodule:: werkzeug.urls - :members: diff --git a/pythonPackages/Werkzeug-0.12.1/docs/utils.rst b/pythonPackages/Werkzeug-0.12.1/docs/utils.rst deleted file mode 100644 index 89b6ef9d15..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/utils.rst +++ /dev/null @@ -1,80 +0,0 @@ -========= -Utilities -========= - -Various utility functions shipped with Werkzeug. - - -HTML Helpers -============ - -.. module:: werkzeug.utils - -.. autoclass:: HTMLBuilder - -.. autofunction:: escape - -.. autofunction:: unescape - - -General Helpers -=============== - -.. autoclass:: cached_property - :members: - -.. autoclass:: environ_property - -.. autoclass:: header_property - -.. autofunction:: parse_cookie - -.. autofunction:: dump_cookie - -.. autofunction:: redirect - -.. autofunction:: append_slash_redirect - -.. autofunction:: import_string - -.. autofunction:: find_modules - -.. autofunction:: validate_arguments - -.. autofunction:: secure_filename - -.. autofunction:: bind_arguments - - -URL Helpers -=========== - -Please refer to :doc:`urls`. - -UserAgent Parsing -================= - -.. module:: werkzeug.useragents - -.. autoclass:: UserAgent - :members: - - -Security Helpers -================ - -.. module:: werkzeug.security - -.. versionadded:: 0.6.1 - -.. autofunction:: generate_password_hash - -.. autofunction:: check_password_hash - -.. autofunction:: safe_str_cmp - -.. autofunction:: safe_join - -.. autofunction:: pbkdf2_hex - -.. autofunction:: pbkdf2_bin diff --git a/pythonPackages/Werkzeug-0.12.1/docs/werkzeugext.py b/pythonPackages/Werkzeug-0.12.1/docs/werkzeugext.py deleted file mode 100644 index ba72e70520..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/werkzeugext.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Werkzeug Sphinx Extensions - ~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Provides some more helpers for the werkzeug docs. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from sphinx.ext.autodoc import cut_lines - - -def setup(app): - app.connect('autodoc-process-docstring', cut_lines(3, 3, what=['module'])) diff --git a/pythonPackages/Werkzeug-0.12.1/docs/werkzeugstyle.sty b/pythonPackages/Werkzeug-0.12.1/docs/werkzeugstyle.sty deleted file mode 100644 index 5f5e53984b..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/werkzeugstyle.sty +++ /dev/null @@ -1,119 +0,0 @@ -\definecolor{TitleColor}{rgb}{0,0,0} -\definecolor{InnerLinkColor}{rgb}{0,0,0} -\definecolor{OuterLinkColor}{rgb}{1.0,0.5,0.0} - -\renewcommand{\maketitle}{% - \begin{titlepage}% - \let\footnotesize\small - \let\footnoterule\relax - \ifsphinxpdfoutput - \begingroup - % This \def is required to deal with multi-line authors; it - % changes \\ to ', ' (comma-space), making it pass muster for - % generating document info in the PDF file. - \def\\{, } - \pdfinfo{ - /Author (\@author) - /Title (\@title) - } - \endgroup - \fi - \begin{flushright}% - %\sphinxlogo% - {\center - \vspace*{3cm} - \includegraphics{logo.pdf} - \vspace{3cm} - \par - {\rm\Huge \@title \par}% - {\em\LARGE \py@release\releaseinfo \par} - {\large - \@date \par - \py@authoraddress \par - }}% - \end{flushright}%\par - \@thanks - \end{titlepage}% - \cleardoublepage% - \setcounter{footnote}{0}% - \let\thanks\relax\let\maketitle\relax - %\gdef\@thanks{}\gdef\@author{}\gdef\@title{} -} - -\fancypagestyle{normal}{ - \fancyhf{} - \fancyfoot[LE,RO]{{\thepage}} - \fancyfoot[LO]{{\nouppercase{\rightmark}}} - \fancyfoot[RE]{{\nouppercase{\leftmark}}} - \fancyhead[LE,RO]{{ \@title, \py@release}} - \renewcommand{\headrulewidth}{0.4pt} - \renewcommand{\footrulewidth}{0.4pt} -} - -\fancypagestyle{plain}{ - \fancyhf{} - \fancyfoot[LE,RO]{{\thepage}} - \renewcommand{\headrulewidth}{0pt} - \renewcommand{\footrulewidth}{0.4pt} -} - -\titleformat{\section}{\Large}% - {\py@TitleColor\thesection}{0.5em}{\py@TitleColor}{\py@NormalColor} -\titleformat{\subsection}{\large}% - {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor}{\py@NormalColor} -\titleformat{\subsubsection}{}% - {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor}{\py@NormalColor} -\titleformat{\paragraph}{\large}% - {\py@TitleColor}{0em}{\py@TitleColor}{\py@NormalColor} - -\ChNameVar{\raggedleft\normalsize} -\ChNumVar{\raggedleft \bfseries\Large} -\ChTitleVar{\raggedleft \rm\Huge} - -\renewcommand\thepart{\@Roman\c@part} -\renewcommand\part{% - \pagestyle{plain} - \if@noskipsec \leavevmode \fi - \cleardoublepage - \vspace*{6cm}% - \@afterindentfalse - \secdef\@part\@spart} - -\def\@part[#1]#2{% - \ifnum \c@secnumdepth >\m@ne - \refstepcounter{part}% - \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}% - \else - \addcontentsline{toc}{part}{#1}% - \fi - {\parindent \z@ %\center - \interlinepenalty \@M - \normalfont - \ifnum \c@secnumdepth >\m@ne - \rm\Large \partname~\thepart - \par\nobreak - \fi - \MakeUppercase{\rm\Huge #2}% - \markboth{}{}\par}% - \nobreak - \vskip 8ex - \@afterheading} -\def\@spart#1{% - {\parindent \z@ %\center - \interlinepenalty \@M - \normalfont - \huge \bfseries #1\par}% - \nobreak - \vskip 3ex - \@afterheading} - -% use inconsolata font -\usepackage{inconsolata} - -% fix single quotes, for inconsolata. (does not work) -%%\usepackage{textcomp} -%%\begingroup -%% \catcode`'=\active -%% \g@addto@macro\@noligs{\let'\textsinglequote} -%% \endgroup -%%\endinput diff --git a/pythonPackages/Werkzeug-0.12.1/docs/wrappers.rst b/pythonPackages/Werkzeug-0.12.1/docs/wrappers.rst deleted file mode 100644 index aa79e79432..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/wrappers.rst +++ /dev/null @@ -1,178 +0,0 @@ -.. _wrappers: - -========================== -Request / Response Objects -========================== - -.. module:: werkzeug.wrappers - -The request and response objects wrap the WSGI environment or the return -value from a WSGI application so that it is another WSGI application -(wraps a whole application). - -How they Work -============= - -Your WSGI application is always passed two arguments. The WSGI "environment" -and the WSGI `start_response` function that is used to start the response -phase. The :class:`Request` class wraps the `environ` for easier access to -request variables (form data, request headers etc.). - -The :class:`Response` on the other hand is a standard WSGI application that -you can create. The simple hello world in Werkzeug looks like this:: - - from werkzeug.wrappers import Response - application = Response('Hello World!') - -To make it more useful you can replace it with a function and do some -processing:: - - from werkzeug.wrappers import Request, Response - - def application(environ, start_response): - request = Request(environ) - response = Response("Hello %s!" % request.args.get('name', 'World!')) - return response(environ, start_response) - -Because this is a very common task the :class:`~Request` object provides -a helper for that. The above code can be rewritten like this:: - - from werkzeug.wrappers import Request, Response - - @Request.application - def application(request): - return Response("Hello %s!" % request.args.get('name', 'World!')) - -The `application` is still a valid WSGI application that accepts the -environment and `start_response` callable. - - -Mutability and Reusability of Wrappers -====================================== - -The implementation of the Werkzeug request and response objects are trying -to guard you from common pitfalls by disallowing certain things as much as -possible. This serves two purposes: high performance and avoiding of -pitfalls. - -For the request object the following rules apply: - -1. The request object is immutable. Modifications are not supported by - default, you may however replace the immutable attributes with mutable - attributes if you need to modify it. -2. The request object may be shared in the same thread, but is not thread - safe itself. If you need to access it from multiple threads, use - locks around calls. -3. It's not possible to pickle the request object. - -For the response object the following rules apply: - -1. The response object is mutable -2. The response object can be pickled or copied after `freeze()` was - called. -3. Since Werkzeug 0.6 it's safe to use the same response object for - multiple WSGI responses. -4. It's possible to create copies using `copy.deepcopy`. - - -Base Wrappers -============= - -These objects implement a common set of operations. They are missing fancy -addon functionality like user agent parsing or etag handling. These features -are available by mixing in various mixin classes or using :class:`Request` and -:class:`Response`. - -.. autoclass:: BaseRequest - :members: - - .. attribute:: environ - - The WSGI environment that the request object uses for data retrival. - - .. attribute:: shallow - - `True` if this request object is shallow (does not modify :attr:`environ`), - `False` otherwise. - - .. automethod:: _get_file_stream - - -.. autoclass:: BaseResponse - :members: - - .. attribute:: response - - The application iterator. If constructed from a string this will be a - list, otherwise the object provided as application iterator. (The first - argument passed to :class:`BaseResponse`) - - .. attribute:: headers - - A :class:`Headers` object representing the response headers. - - .. attribute:: status_code - - The response status as integer. - - .. attribute:: direct_passthrough - - If ``direct_passthrough=True`` was passed to the response object or if - this attribute was set to `True` before using the response object as - WSGI application, the wrapped iterator is returned unchanged. This - makes it possible to pass a special `wsgi.file_wrapper` to the response - object. See :func:`wrap_file` for more details. - - .. automethod:: __call__ - - .. automethod:: _ensure_sequence - - -Mixin Classes -============= - -Werkzeug also provides helper mixins for various HTTP related functionality -such as etags, cache control, user agents etc. When subclassing you can -mix those classes in to extend the functionality of the :class:`BaseRequest` -or :class:`BaseResponse` object. Here a small example for a request object -that parses accept headers:: - - from werkzeug.wrappers import AcceptMixin, BaseRequest - - class Request(BaseRequest, AcceptMixin): - pass - -The :class:`Request` and :class:`Response` classes subclass the :class:`BaseRequest` -and :class:`BaseResponse` classes and implement all the mixins Werkzeug provides: - - -.. autoclass:: Request - -.. autoclass:: Response - -.. autoclass:: AcceptMixin - :members: - -.. autoclass:: AuthorizationMixin - :members: - -.. autoclass:: ETagRequestMixin - :members: - -.. autoclass:: ETagResponseMixin - :members: - -.. autoclass:: ResponseStreamMixin - :members: - -.. autoclass:: CommonRequestDescriptorsMixin - :members: - -.. autoclass:: CommonResponseDescriptorsMixin - :members: - -.. autoclass:: WWWAuthenticateMixin - :members: - -.. autoclass:: UserAgentMixin - :members: diff --git a/pythonPackages/Werkzeug-0.12.1/docs/wsgi.rst b/pythonPackages/Werkzeug-0.12.1/docs/wsgi.rst deleted file mode 100644 index 4391c89a6a..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/docs/wsgi.rst +++ /dev/null @@ -1,66 +0,0 @@ -============ -WSGI Helpers -============ - -.. module:: werkzeug.wsgi - -The following classes and functions are designed to make working with -the WSGI specification easier or operate on the WSGI layer. All the -functionality from this module is available on the high-level -:ref:`Request/Response classes `. - - -Iterator / Stream Helpers -========================= - -These classes and functions simplify working with the WSGI application -iterator and the input stream. - -.. autoclass:: ClosingIterator - -.. autoclass:: FileWrapper - -.. autoclass:: LimitedStream - :members: - -.. autofunction:: make_line_iter - -.. autofunction:: make_chunk_iter - -.. autofunction:: wrap_file - - -Environ Helpers -=============== - -These functions operate on the WSGI environment. They extract useful -information or perform common manipulations: - -.. autofunction:: get_host - -.. autofunction:: get_content_length - -.. autofunction:: get_input_stream - -.. autofunction:: get_current_url - -.. autofunction:: get_query_string - -.. autofunction:: get_script_name - -.. autofunction:: get_path_info - -.. autofunction:: pop_path_info - -.. autofunction:: peek_path_info - -.. autofunction:: extract_path_info - -.. autofunction:: host_is_trusted - -Convenience Helpers -=================== - -.. autofunction:: responder - -.. autofunction:: werkzeug.testapp.test_app diff --git a/pythonPackages/Werkzeug-0.12.1/examples/README b/pythonPackages/Werkzeug-0.12.1/examples/README deleted file mode 100644 index e99dd0fdd0..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/README +++ /dev/null @@ -1,103 +0,0 @@ -================= -Werkzeug Examples -================= - -This directory contains various example applications and example code of -Werkzeug powered applications. - -Beside the proof of concept applications and code snippets in the partial -folder they all have external depencencies for template engines or database -adapters (SQLAlchemy only so far). - - -Full Example Applications -========================= - -The following example applications are application types you would actually -find in real life :-) - - -`simplewiki` - A simple Wiki implementation. - - Requirements: - - SQLAlchemy - - Creoleparser >= 0.7 - - genshi - - You can obtain all packages in the Cheeseshop via easy_install. You have - to have at least version 0.7 of Creoleparser. - - Usage:: - - ./manage-simplewiki.py initdb - ./manage-simplewiki.py runserver - - Or of course you can just use the application object - (`simplewiki.SimpleWiki`) and hook that into your favourite WSGI gateway. - The constructor of the application object takes a single argument which is - the SQLAlchemy URI for the database. - - The management script for the devserver looks up the an environment var - called `SIMPLEWIKI_DATABASE_URI` and uses that for the database URI. If - no such variable is provided "sqlite:////tmp/simplewiki.db" is assumed. - -`plnt` - A planet called plnt, pronounce plant. - - Requirements: - - SQLAlchemy - - Jinja - - feedparser - - You can obtain all packages in the Cheeseshop via easy_install. - - Usage:: - - ./manage-plnt.py initdb - ./manage-plnt.py sync - ./manage-plnt.py runserver - - The WSGI application is called `plnt.Plnt` which, like the simple wiki, - accepts a database URI as first argument. The environment variable for - the database key is called `PLNT_DATABASE_URI` and the default is - "sqlite:////tmp/plnt.db". - - Per default a few python related blogs are added to the database, you - can add more in a python shell by playing with the `Blog` model. - -`shorty` - A tinyurl clone for the Werkzeug tutorial. - - Requirements: - - SQLAlchemy - - Jinja2 - - You can obtain all packages in the Cheeseshop via easy_install. - - Usage:: - - ./manage-shorty.py initdb - ./manage-shorty.py runserver - - The WSGI application is called `shorty.application.Shorty` which, like the - simple wiki, accepts a database URI as first argument. - - The source code of the application is explained in detail in the Werkzeug - tutorial. - -`couchy` - Like shorty, but implemented using CouchDB. - - Requirements : - - werkzeug : http://werkzeug.pocoo.org - - jinja : http://jinja.pocoo.org - - couchdb 0.72 & above : http://www.couchdb.org - -`cupoftee` - A `Teeworlds `_ server browser. This application - works best in a non forking environment and won't work for CGI. - - Usage:: - - ./manage-cupoftee.py runserver diff --git a/pythonPackages/Werkzeug-0.12.1/examples/contrib/README b/pythonPackages/Werkzeug-0.12.1/examples/contrib/README deleted file mode 100644 index 387df5bd11..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/contrib/README +++ /dev/null @@ -1 +0,0 @@ -This folder includes example applications for werkzeug.contrib diff --git a/pythonPackages/Werkzeug-0.12.1/examples/contrib/securecookie.py b/pythonPackages/Werkzeug-0.12.1/examples/contrib/securecookie.py deleted file mode 100644 index da7b4f1193..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/contrib/securecookie.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Secure Cookie Example - ~~~~~~~~~~~~~~~~~~~~~ - - Stores session on the client. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -from time import asctime -from werkzeug.serving import run_simple -from werkzeug.wrappers import BaseRequest, BaseResponse -from werkzeug.contrib.securecookie import SecureCookie - -SECRET_KEY = 'V\x8a$m\xda\xe9\xc3\x0f|f\x88\xbccj>\x8bI^3+' - - -class Request(BaseRequest): - - def __init__(self, environ): - BaseRequest.__init__(self, environ) - self.session = SecureCookie.load_cookie(self, secret_key=SECRET_KEY) - - -def index(request): - return 'Set the Time or Get the time' - - -def get_time(request): - return 'Time: %s' % request.session.get('time', 'not set') - - -def set_time(request): - request.session['time'] = time = asctime() - return 'Time set to %s' % time - - -def application(environ, start_response): - request = Request(environ) - response = BaseResponse({ - 'get': get_time, - 'set': set_time - }.get(request.path.strip('/'), index)(request), mimetype='text/html') - request.session.save_cookie(response) - return response(environ, start_response) - - -if __name__ == '__main__': - run_simple('localhost', 5000, application) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/contrib/sessions.py b/pythonPackages/Werkzeug-0.12.1/examples/contrib/sessions.py deleted file mode 100644 index ecf464a242..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/contrib/sessions.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -from werkzeug.serving import run_simple -from werkzeug.contrib.sessions import SessionStore, SessionMiddleware - - -class MemorySessionStore(SessionStore): - - def __init__(self, session_class=None): - SessionStore.__init__(self, session_class=None) - self.sessions = {} - - def save(self, session): - self.sessions[session.sid] = session - - def delete(self, session): - self.sessions.pop(session.id, None) - - def get(self, sid): - if not self.is_valid_key(sid) or sid not in self.sessions: - return self.new() - return self.session_class(self.sessions[sid], sid, False) - - -def application(environ, start_response): - session = environ['werkzeug.session'] - session['visit_count'] = session.get('visit_count', 0) + 1 - - start_response('200 OK', [('Content-Type', 'text/html')]) - return [''' - - Session Example -

Session Example

-

You visited this page %d times.

- ''' % session['visit_count']] - - -def make_app(): - return SessionMiddleware(application, MemorySessionStore()) - - -if __name__ == '__main__': - run_simple('localhost', 5000, make_app()) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cookieauth.py b/pythonPackages/Werkzeug-0.12.1/examples/cookieauth.py deleted file mode 100644 index 13f32c9e42..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/cookieauth.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" - Cookie Based Auth - ~~~~~~~~~~~~~~~~~ - - This is a very simple application that uses a secure cookie to do the - user authentification. - - :copyright: Copyright 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from werkzeug.serving import run_simple -from werkzeug.utils import cached_property, escape, redirect -from werkzeug.wrappers import Request, Response -from werkzeug.contrib.securecookie import SecureCookie - - -# don't use this key but a different one; you could just use -# os.unrandom(20) to get something random. Changing this key -# invalidates all sessions at once. -SECRET_KEY = '\xfa\xdd\xb8z\xae\xe0}4\x8b\xea' - -# the cookie name for the session -COOKIE_NAME = 'session' - -# the users that may access -USERS = { - 'admin': 'default', - 'user1': 'default' -} - - -class AppRequest(Request): - """A request with a secure cookie session.""" - - def logout(self): - """Log the user out.""" - self.session.pop('username', None) - - def login(self, username): - """Log the user in.""" - self.session['username'] = username - - @property - def logged_in(self): - """Is the user logged in?""" - return self.user is not None - - @property - def user(self): - """The user that is logged in.""" - return self.session.get('username') - - @cached_property - def session(self): - data = self.cookies.get(COOKIE_NAME) - if not data: - return SecureCookie(secret_key=SECRET_KEY) - return SecureCookie.unserialize(data, SECRET_KEY) - - -def login_form(request): - error = '' - if request.method == 'POST': - username = request.form.get('username') - password = request.form.get('password') - if password and USERS.get(username) == password: - request.login(username) - return redirect('') - error = '

Invalid credentials' - return Response(''' - Login

Login

-

Not logged in. - %s -

-

- - - - -

''' % error, mimetype='text/html') - - -def index(request): - return Response(''' - Logged in -

Logged in

-

Logged in as %s -

Logout - ''' % escape(request.user), mimetype='text/html') - - -@AppRequest.application -def application(request): - if request.args.get('do') == 'logout': - request.logout() - response = redirect('.') - elif request.logged_in: - response = index(request) - else: - response = login_form(request) - request.session.save_cookie(response) - return response - - -if __name__ == '__main__': - run_simple('localhost', 4000, application) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/__init__.py b/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/__init__.py deleted file mode 100644 index f544175723..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -""" - coolmagic - ~~~~~~~~~ - - Package description goes here. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from coolmagic.application import make_app diff --git a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/application.py b/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/application.py deleted file mode 100644 index 83c8e04d21..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/application.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- -""" - coolmagic.application - ~~~~~~~~~~~~~~~~~~~~~ - - This module provides the WSGI application. - - The WSGI middlewares are applied in the `make_app` factory function - that automatically wraps the application within the require - middlewares. Per default only the `SharedDataMiddleware` is applied. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from os import path, listdir -from coolmagic.utils import Request, local_manager, redirect -from werkzeug.routing import Map, Rule, RequestRedirect -from werkzeug.exceptions import HTTPException, NotFound - - -class CoolMagicApplication(object): - """ - The application class. It's passed a directory with configuration values. - """ - - def __init__(self, config): - self.config = config - - for fn in listdir(path.join(path.dirname(__file__), 'views')): - if fn.endswith('.py') and fn != '__init__.py': - __import__('coolmagic.views.' + fn[:-3]) - - from coolmagic.utils import exported_views - rules = [ - # url for shared data. this will always be unmatched - # because either the middleware or the webserver - # handles that request first. - Rule('/public/', - endpoint='shared_data') - ] - self.views = {} - for endpoint, (func, rule, extra) in exported_views.iteritems(): - if rule is not None: - rules.append(Rule(rule, endpoint=endpoint, **extra)) - self.views[endpoint] = func - self.url_map = Map(rules) - - def __call__(self, environ, start_response): - urls = self.url_map.bind_to_environ(environ) - req = Request(environ, urls) - try: - endpoint, args = urls.match(req.path) - resp = self.views[endpoint](**args) - except NotFound, e: - resp = self.views['static.not_found']() - except (HTTPException, RequestRedirect), e: - resp = e - return resp(environ, start_response) - - -def make_app(config=None): - """ - Factory function that creates a new `CoolmagicApplication` - object. Optional WSGI middlewares should be applied here. - """ - config = config or {} - app = CoolMagicApplication(config) - - # static stuff - from werkzeug.utils import SharedDataMiddleware - app = SharedDataMiddleware(app, { - '/public': path.join(path.dirname(__file__), 'public') - }) - - # clean up locals - app = local_manager.make_middleware(app) - - return app diff --git a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/helpers.py b/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/helpers.py deleted file mode 100644 index 7c2ac210d9..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/helpers.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" - coolmagic.helpers - ~~~~~~~~~~~~~~~~~ - - The star-import module for all views. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from coolmagic.utils import Response, TemplateResponse, ThreadedRequest, \ - export, url_for, redirect -from werkzeug.utils import escape - - -#: a thread local proxy request object -request = ThreadedRequest() -del ThreadedRequest diff --git a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/public/style.css b/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/public/style.css deleted file mode 100644 index bf48856858..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/public/style.css +++ /dev/null @@ -1,10 +0,0 @@ -body { - margin: 0; - padding: 20px; - font-family: sans-serif; - font-size: 15px; -} - -h1, a { - color: #a00; -} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/layout.html b/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/layout.html deleted file mode 100644 index 82597816d3..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/layout.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - {{ page_title }} — Cool Magic! - - - -

Cool Magic

-

{{ page_title }}

- {% block page_body %}{% endblock %} - - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/static/about.html b/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/static/about.html deleted file mode 100644 index b814230b1a..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/static/about.html +++ /dev/null @@ -1,10 +0,0 @@ -{% extends "layout.html" %} -{% set page_title = 'About the Magic' %} -{% block page_body %} -

- Nothing to see. It's just magic. -

-

- back to the index -

-{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/static/index.html b/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/static/index.html deleted file mode 100644 index a7d8410110..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/static/index.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "layout.html" %} -{% set page_title = 'Welcome to the Magic' %} -{% block page_body %} -

- Welcome to the magic! This is a bigger example for the - Werkzeug toolkit. And it contains a lot of magic. -

-

- about the implementation or - click here if you want to see a broken view. -

-{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/static/not_found.html b/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/static/not_found.html deleted file mode 100644 index 6f41e8e4e4..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/templates/static/not_found.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "layout.html" %} -{% set page_title = 'Missing Magic' %} -{% block page_body %} -

- The requested magic really does not exist. Maybe you want - to look for it on the index. -

-{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/utils.py b/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/utils.py deleted file mode 100644 index 473352d70f..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/utils.py +++ /dev/null @@ -1,107 +0,0 @@ -# -*- coding: utf-8 -*- -""" - coolmagic.utils - ~~~~~~~~~~~~~~~ - - This module contains the subclasses of the base request and response - objects provided by werkzeug. The subclasses know about their charset - and implement some additional functionallity like the ability to link - to view functions. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from os.path import dirname, join -from jinja import Environment, FileSystemLoader -from werkzeug.local import Local, LocalManager -from werkzeug.utils import redirect -from werkzeug.wrappers import BaseRequest, BaseResponse - - -local = Local() -local_manager = LocalManager([local]) -template_env = Environment( - loader=FileSystemLoader(join(dirname(__file__), 'templates'), - use_memcache=False) -) -exported_views = {} - - -def export(string, template=None, **extra): - """ - Decorator for registering view functions and adding - templates to it. - """ - def wrapped(f): - endpoint = (f.__module__ + '.' + f.__name__)[16:] - if template is not None: - old_f = f - def f(**kwargs): - rv = old_f(**kwargs) - if not isinstance(rv, Response): - rv = TemplateResponse(template, **(rv or {})) - return rv - f.__name__ = old_f.__name__ - f.__doc__ = old_f.__doc__ - exported_views[endpoint] = (f, string, extra) - return f - return wrapped - - -def url_for(endpoint, **values): - """ - Build a URL - """ - return local.request.url_adapter.build(endpoint, values) - - -class Request(BaseRequest): - """ - The concrete request object used in the WSGI application. - It has some helper functions that can be used to build URLs. - """ - charset = 'utf-8' - - def __init__(self, environ, url_adapter): - BaseRequest.__init__(self, environ) - self.url_adapter = url_adapter - local.request = self - - -class ThreadedRequest(object): - """ - A pseudo request object that always poins to the current - context active request. - """ - - def __getattr__(self, name): - if name == '__members__': - return [x for x in dir(local.request) if not - x.startswith('_')] - return getattr(local.request, name) - - def __setattr__(self, name, value): - return setattr(local.request, name, value) - - -class Response(BaseResponse): - """ - The concrete response object for the WSGI application. - """ - charset = 'utf-8' - default_mimetype = 'text/html' - - -class TemplateResponse(Response): - """ - Render a template to a response. - """ - - def __init__(self, template_name, **values): - from coolmagic import helpers - values.update( - request=local.request, - h=helpers - ) - template = template_env.get_template(template_name) - Response.__init__(self, template.render(values)) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/views/__init__.py b/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/views/__init__.py deleted file mode 100644 index c0e988e90a..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/views/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -""" - coolmagic.views - ~~~~~~~~~~~~~~~ - - This module collects and assambles the urls. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" diff --git a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/views/static.py b/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/views/static.py deleted file mode 100644 index 34b0a2f6b0..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/coolmagic/views/static.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -""" - coolmagic.views.static - ~~~~~~~~~~~~~~~~~~~~~~ - - Some static views. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from coolmagic.helpers import * - - -@export('/', template='static/index.html') -def index(): - pass - - -@export('/about', template='static/about.html') -def about(): - pass - - -@export('/broken') -def broken(): - foo = request.args.get('foo', 42) - raise RuntimeError('that\'s really broken') - - -@export(None, template='static/not_found.html') -def not_found(): - """ - This function is always executed if an url does not - match or a `NotFound` exception is raised. - """ - pass diff --git a/pythonPackages/Werkzeug-0.12.1/examples/couchy/README b/pythonPackages/Werkzeug-0.12.1/examples/couchy/README deleted file mode 100644 index 1bfc3a9772..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/couchy/README +++ /dev/null @@ -1,8 +0,0 @@ -couchy README - -Requirements : -- werkzeug : http://werkzeug.pocoo.org -- jinja : http://jinja.pocoo.org -- couchdb 0.72 & above : http://www.couchdb.org -- couchdb-python 0.3 & above : http://code.google.com/p/couchdb-python - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/couchy/__init__.py b/pythonPackages/Werkzeug-0.12.1/examples/couchy/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/pythonPackages/Werkzeug-0.12.1/examples/couchy/application.py b/pythonPackages/Werkzeug-0.12.1/examples/couchy/application.py deleted file mode 100644 index cc5d0c6048..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/couchy/application.py +++ /dev/null @@ -1,45 +0,0 @@ -from couchdb.client import Server -from couchy.utils import STATIC_PATH, local, local_manager, \ - url_map -from werkzeug.wrappers import Request -from werkzeug.wsgi import ClosingIterator, SharedDataMiddleware -from werkzeug.exceptions import HTTPException, NotFound -from couchy import views -from couchy.models import URL -import couchy.models - - -class Couchy(object): - - def __init__(self, db_uri): - local.application = self - - server = Server(db_uri) - try: - db = server.create('urls') - except: - db = server['urls'] - self.dispatch = SharedDataMiddleware(self.dispatch, { - '/static': STATIC_PATH - }) - - URL.db = db - - def dispatch(self, environ, start_response): - local.application = self - request = Request(environ) - local.url_adapter = adapter = url_map.bind_to_environ(environ) - try: - endpoint, values = adapter.match() - handler = getattr(views, endpoint) - response = handler(request, **values) - except NotFound, e: - response = views.not_found(request) - response.status_code = 404 - except HTTPException, e: - response = e - return ClosingIterator(response(environ, start_response), - [local_manager.cleanup]) - - def __call__(self, environ, start_response): - return self.dispatch(environ, start_response) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/couchy/models.py b/pythonPackages/Werkzeug-0.12.1/examples/couchy/models.py deleted file mode 100644 index dd7aea385d..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/couchy/models.py +++ /dev/null @@ -1,43 +0,0 @@ -from datetime import datetime -from couchdb.schema import Document, TextField, BooleanField, DateTimeField -from couchy.utils import url_for, get_random_uid - - -class URL(Document): - target = TextField() - public = BooleanField() - added = DateTimeField(default=datetime.utcnow()) - shorty_id = TextField(default=None) - db = None - - @classmethod - def load(self, id): - return super(URL, self).load(URL.db, id) - - @classmethod - def query(self, code): - return URL.db.query(code) - - def store(self): - if getattr(self._data, 'id', None) is None: - new_id = self.shorty_id if self.shorty_id else None - while 1: - id = new_id if new_id else get_random_uid() - docid = None - try: - docid = URL.db.resource.put(content=self._data, path='/%s/' % str(id))['id'] - except: - continue - if docid: - break - self._data = URL.db.get(docid) - else: - super(URL, self).store(URL.db) - return self - - @property - def short_url(self): - return url_for('link', uid=self.id, _external=True) - - def __repr__(self): - return '' % self.id diff --git a/pythonPackages/Werkzeug-0.12.1/examples/couchy/static/style.css b/pythonPackages/Werkzeug-0.12.1/examples/couchy/static/style.css deleted file mode 100644 index 787632f084..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/couchy/static/style.css +++ /dev/null @@ -1,108 +0,0 @@ -body { - background-color: #333; - font-family: 'Lucida Sans', 'Verdana', sans-serif; - font-size: 16px; - margin: 3em 0 3em 0; - padding: 0; - text-align: center; -} - -a { - color: #0C4850; -} - -a:hover { - color: #1C818F; -} - -h1 { - width: 500px; - background-color: #24C0CE; - text-align: center; - font-size: 3em; - margin: 0 auto 0 auto; - padding: 0; -} - -h1 a { - display: block; - padding: 0.3em; - color: #fff; - text-decoration: none; -} - -h1 a:hover { - color: #ADEEF7; - background-color: #0E8A96; -} - -div.footer { - margin: 0 auto 0 auto; - font-size: 13px; - text-align: right; - padding: 10px; - width: 480px; - background-color: #004C63; - color: white; -} - -div.footer a { - color: #A0E9FF; -} - -div.body { - margin: 0 auto 0 auto; - padding: 20px; - width: 460px; - background-color: #98CE24; - color: black; -} - -div.body h2 { - margin: 0 0 0.5em 0; - text-align: center; -} - -div.body input { - margin: 0.2em 0 0.2em 0; - font-family: 'Lucida Sans', 'Verdana', sans-serif; - font-size: 20px; - background-color: #CCEB98; - color: black; -} - -div.body #url { - width: 400px; -} - -div.body #alias { - width: 300px; - margin-right: 10px; -} - -div.body #submit { - width: 90px; -} - -div.body p { - margin: 0; - padding: 0.2em 0 0.2em 0; -} - -div.body ul { - margin: 1em 0 1em 0; - padding: 0; - list-style: none; -} - -div.error { - margin: 1em 0 1em 0; - border: 2px solid #AC0202; - background-color: #9E0303; - font-weight: bold; - color: white; -} - -div.pagination { - font-size: 13px; -} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/display.html b/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/display.html deleted file mode 100644 index 83d5685946..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/display.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends 'layout.html' %} -{% block body %} -

Shortened URL

-

- The URL {{ url.target|urlize(40, true) }} - was shortened to {{ url.short_url|urlize }}. -

-{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/layout.html b/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/layout.html deleted file mode 100644 index 8715740e3d..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/layout.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - Shorty - - - -

Shorty

-
{% block body %}{% endblock %}
- - - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/list.html b/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/list.html deleted file mode 100644 index be42f0d0cd..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/list.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends 'layout.html' %} -{% block body %} -

List of URLs

-
    - {%- for url in pagination.entries %} -
  • {{ url.id|e }} » - {{ url.target|urlize(38, true) }}
  • - {%- else %} -
  • no URLs shortened yet
  • - {%- endfor %} -
- -{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/new.html b/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/new.html deleted file mode 100644 index 3db0802b9f..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/new.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends 'layout.html' %} -{% block body %} -

Create a Shorty-URL!

- {% if error %}
{{ error }}
{% endif -%} -
-

Enter the URL you want to shorten

-

-

Optionally you can give the URL a memorable name

-

{# - #}

-

-

-
-{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/not_found.html b/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/not_found.html deleted file mode 100644 index bd45566845..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/couchy/templates/not_found.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends 'layout.html' %} -{% block body %} -

Page Not Found

-

- The page you have requested does not exist on this server. What about - adding a new URL? -

-{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/couchy/utils.py b/pythonPackages/Werkzeug-0.12.1/examples/couchy/utils.py deleted file mode 100644 index bfcb885a4f..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/couchy/utils.py +++ /dev/null @@ -1,65 +0,0 @@ -from os import path -from urlparse import urlparse -from random import sample, randrange -from jinja import Environment, FileSystemLoader -from werkzeug.local import Local, LocalManager -from werkzeug.utils import cached_property -from werkzeug.wrappers import Response -from werkzeug.routing import Map, Rule - -TEMPLATE_PATH = path.join(path.dirname(__file__), 'templates') -STATIC_PATH = path.join(path.dirname(__file__), 'static') -ALLOWED_SCHEMES = frozenset(['http', 'https', 'ftp', 'ftps']) -URL_CHARS = 'abcdefghijkmpqrstuvwxyzABCDEFGHIJKLMNPQRST23456789' - -local = Local() -local_manager = LocalManager([local]) -application = local('application') - -url_map = Map([Rule('/static/', endpoint='static', build_only=True)]) - -jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_PATH)) - - -def expose(rule, **kw): - def decorate(f): - kw['endpoint'] = f.__name__ - url_map.add(Rule(rule, **kw)) - return f - return decorate - -def url_for(endpoint, _external=False, **values): - return local.url_adapter.build(endpoint, values, force_external=_external) -jinja_env.globals['url_for'] = url_for - -def render_template(template, **context): - return Response(jinja_env.get_template(template).render(**context), - mimetype='text/html') - -def validate_url(url): - return urlparse(url)[0] in ALLOWED_SCHEMES - -def get_random_uid(): - return ''.join(sample(URL_CHARS, randrange(3, 9))) - -class Pagination(object): - - def __init__(self, results, per_page, page, endpoint): - self.results = results - self.per_page = per_page - self.page = page - self.endpoint = endpoint - - @cached_property - def count(self): - return len(self.results) - - @cached_property - def entries(self): - return self.results[((self.page - 1) * self.per_page):(((self.page - 1) * self.per_page)+self.per_page)] - - has_previous = property(lambda x: x.page > 1) - has_next = property(lambda x: x.page < x.pages) - previous = property(lambda x: url_for(x.endpoint, page=x.page - 1)) - next = property(lambda x: url_for(x.endpoint, page=x.page + 1)) - pages = property(lambda x: max(0, x.count - 1) // x.per_page + 1) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/couchy/views.py b/pythonPackages/Werkzeug-0.12.1/examples/couchy/views.py deleted file mode 100644 index 39c8ea2963..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/couchy/views.py +++ /dev/null @@ -1,61 +0,0 @@ -from werkzeug.utils import redirect -from werkzeug.exceptions import NotFound -from couchy.utils import render_template, expose, \ - validate_url, url_for, Pagination -from couchy.models import URL - - -@expose('/') -def new(request): - error = url = '' - if request.method == 'POST': - url = request.form.get('url') - alias = request.form.get('alias') - if not validate_url(url): - error = "I'm sorry but you cannot shorten this URL." - elif alias: - if len(alias) > 140: - error = 'Your alias is too long' - elif '/' in alias: - error = 'Your alias might not include a slash' - elif URL.load(alias): - error = 'The alias you have requested exists already' - if not error: - url = URL(target=url, public='private' not in request.form, shorty_id=alias if alias else None) - url.store() - uid = url.id - return redirect(url_for('display', uid=uid)) - return render_template('new.html', error=error, url=url) - -@expose('/display/') -def display(request, uid): - url = URL.load(uid) - if not url: - raise NotFound() - return render_template('display.html', url=url) - -@expose('/u/') -def link(request, uid): - url = URL.load(uid) - if not url: - raise NotFound() - return redirect(url.target, 301) - -@expose('/list/', defaults={'page': 1}) -@expose('/list/') -def list(request, page): - def wrap(doc): - data = doc.value - data['_id'] = doc.id - return URL.wrap(data) - - code = '''function(doc) { if (doc.public){ map([doc._id], doc); }}''' - docResults = URL.query(code) - results = [wrap(doc) for doc in docResults] - pagination = Pagination(results, 1, page, 'list') - if pagination.page > 1 and not pagination.entries: - raise NotFound() - return render_template('list.html', pagination=pagination) - -def not_found(request): - return render_template('not_found.html') diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/__init__.py b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/__init__.py deleted file mode 100644 index 26cc9724ba..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -""" - cupoftee - ~~~~~~~~ - - Werkzeug powered Teeworlds Server Browser. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from cupoftee.application import make_app diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/application.py b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/application.py deleted file mode 100644 index 526cf188a5..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/application.py +++ /dev/null @@ -1,112 +0,0 @@ -# -*- coding: utf-8 -*- -""" - cupoftee.application - ~~~~~~~~~~~~~~~~~~~~ - - The WSGI appliction for the cup of tee browser. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import time -from os import path -from threading import Thread -from cupoftee.db import Database -from cupoftee.network import ServerBrowser -from werkzeug.templates import Template -from werkzeug.wrappers import Request, Response -from werkzeug.wsgi import SharedDataMiddleware -from werkzeug.exceptions import HTTPException, NotFound -from werkzeug.routing import Map, Rule - - -templates = path.join(path.dirname(__file__), 'templates') -pages = {} -url_map = Map([Rule('/shared/', endpoint='shared')]) - - -def make_app(database, interval=60): - return SharedDataMiddleware(Cup(database), { - '/shared': path.join(path.dirname(__file__), 'shared') - }) - - -class PageMeta(type): - - def __init__(cls, name, bases, d): - type.__init__(cls, name, bases, d) - if d.get('url_rule') is not None: - pages[cls.identifier] = cls - url_map.add(Rule(cls.url_rule, endpoint=cls.identifier, - **cls.url_arguments)) - - identifier = property(lambda x: x.__name__.lower()) - - -class Page(object): - __metaclass__ = PageMeta - url_arguments = {} - - def __init__(self, cup, request, url_adapter): - self.cup = cup - self.request = request - self.url_adapter = url_adapter - - def url_for(self, endpoint, **values): - return self.url_adapter.build(endpoint, values) - - def process(self): - pass - - def render_template(self, template=None): - if template is None: - template = self.__class__.identifier + '.html' - context = dict(self.__dict__) - context.update(url_for=self.url_for, self=self) - body_tmpl = Template.from_file(path.join(templates, template)) - layout_tmpl = Template.from_file(path.join(templates, 'layout.html')) - context['body'] = body_tmpl.render(context) - return layout_tmpl.render(context) - - def get_response(self): - return Response(self.render_template(), mimetype='text/html') - - -class Cup(object): - - def __init__(self, database, interval=120): - self.interval = interval - self.db = Database(database) - self.master = ServerBrowser(self) - self.updater = Thread(None, self.update_master) - self.updater.setDaemon(True) - self.updater.start() - - def update_master(self): - wait = self.interval - while 1: - if self.master.sync(): - wait = self.interval - else: - wait = self.interval // 2 - time.sleep(wait) - - def dispatch_request(self, request): - url_adapter = url_map.bind_to_environ(request.environ) - try: - endpoint, values = url_adapter.match() - page = pages[endpoint](self, request, url_adapter) - response = page.process(**values) - except NotFound, e: - page = MissingPage(self, request, url_adapter) - response = page.process() - except HTTPException, e: - return e - return response or page.get_response() - - def __call__(self, environ, start_response): - request = Request(environ) - return self.dispatch_request(request)(environ, start_response) - - -from cupoftee.pages import MissingPage diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/db.py b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/db.py deleted file mode 100644 index 6644e0b437..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/db.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- -""" - cupoftee.db - ~~~~~~~~~~~ - - A simple object database. As long as the server is not running in - multiprocess mode that's good enough. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from __future__ import with_statement -import gdbm -from threading import Lock -from pickle import dumps, loads - - -class Database(object): - - def __init__(self, filename): - self.filename = filename - self._fs = gdbm.open(filename, 'cf') - self._local = {} - self._lock = Lock() - - def __getitem__(self, key): - with self._lock: - return self._load_key(key) - - def _load_key(self, key): - if key in self._local: - return self._local[key] - rv = loads(self._fs[key]) - self._local[key] = rv - return rv - - def __setitem__(self, key, value): - self._local[key] = value - - def __delitem__(self, key, value): - with self._lock: - self._local.pop(key, None) - if self._fs.has_key(key): - del self._fs[key] - - def __del__(self): - self.close() - - def __contains__(self, key): - with self._lock: - try: - self._load_key(key) - except KeyError: - pass - return key in self._local - - def setdefault(self, key, factory): - with self._lock: - try: - rv = self._load_key(key) - except KeyError: - self._local[key] = rv = factory() - return rv - - def sync(self): - with self._lock: - for key, value in self._local.iteritems(): - self._fs[key] = dumps(value, 2) - self._fs.sync() - - def close(self): - try: - self.sync() - self._fs.close() - except: - pass diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/network.py b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/network.py deleted file mode 100644 index 668f98c232..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/network.py +++ /dev/null @@ -1,133 +0,0 @@ -# -*- coding: utf-8 -*- -""" - cupyoftee.network - ~~~~~~~~~~~~~~~~~ - - Query the servers for information. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import time -import socket -from math import log -from datetime import datetime -from cupoftee.utils import unicodecmp - - -class ServerError(Exception): - pass - - -class Syncable(object): - last_sync = None - - def sync(self): - try: - self._sync() - except (socket.error, socket.timeout, IOError): - return False - self.last_sync = datetime.utcnow() - return True - - -class ServerBrowser(Syncable): - - def __init__(self, cup): - self.cup = cup - self.servers = cup.db.setdefault('servers', dict) - - def _sync(self): - to_delete = set(self.servers) - for x in xrange(1, 17): - addr = ('master%d.teeworlds.com' % x, 8300) - print addr - try: - self._sync_master(addr, to_delete) - except (socket.error, socket.timeout, IOError), e: - continue - for server_id in to_delete: - self.servers.pop(server_id, None) - if not self.servers: - raise IOError('no servers found') - self.cup.db.sync() - - def _sync_master(self, addr, to_delete): - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.settimeout(5) - s.sendto('\x20\x00\x00\x00\x00\x48\xff\xff\xff\xffreqt', addr) - data = s.recvfrom(1024)[0][14:] - s.close() - - for n in xrange(0, len(data) / 6): - addr = ('.'.join(map(str, map(ord, data[n * 6:n * 6 + 4]))), - ord(data[n * 6 + 5]) * 256 + ord(data[n * 6 + 4])) - server_id = '%s:%d' % addr - if server_id in self.servers: - if not self.servers[server_id].sync(): - continue - else: - try: - self.servers[server_id] = Server(addr, server_id) - except ServerError: - pass - to_delete.discard(server_id) - - -class Server(Syncable): - - def __init__(self, addr, server_id): - self.addr = addr - self.id = server_id - self.players = [] - if not self.sync(): - raise ServerError('server not responding in time') - - def _sync(self): - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.settimeout(1) - s.sendto('\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffgief', self.addr) - bits = s.recvfrom(1024)[0][14:].split('\x00') - s.close() - self.version, server_name, map_name = bits[:3] - self.name = server_name.decode('latin1') - self.map = map_name.decode('latin1') - self.gametype = bits[3] - self.flags, self.progression, player_count, \ - self.max_players = map(int, bits[4:8]) - - # sync the player stats - players = dict((p.name, p) for p in self.players) - for i in xrange(player_count): - name = bits[8 + i * 2].decode('latin1') - score = int(bits[9 + i * 2]) - - # update existing player - if name in players: - player = players.pop(name) - player.score = score - # add new player - else: - self.players.append(Player(self, name, score)) - # delete players that left - for player in players.itervalues(): - try: - self.players.remove(player) - except: - pass - - # sort the player list and count them - self.players.sort(key=lambda x: -x.score) - self.player_count = len(self.players) - - def __cmp__(self, other): - return unicodecmp(self.name, other.name) - - -class Player(object): - - def __init__(self, server, name, score): - self.server = server - self.name = name - self.score = score - self.size = round(100 + log(max(score, 1)) * 25, 2) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/pages.py b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/pages.py deleted file mode 100644 index 92b2046b30..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/pages.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- coding: utf-8 -*- -""" - cupoftee.pages - ~~~~~~~~~~~~~~ - - The pages. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" - -from werkzeug.utils import redirect -from werkzeug.exceptions import NotFound -from cupoftee.application import Page -from cupoftee.utils import unicodecmp - - -class ServerList(Page): - url_rule = '/' - - def order_link(self, name, title): - cls = '' - link = '?order_by=' + name - desc = False - if name == self.order_by: - desc = not self.order_desc - cls = ' class="%s"' % (desc and 'down' or 'up') - if desc: - link += '&dir=desc' - return '%s' % (link, cls, title) - - def process(self): - self.order_by = self.request.args.get('order_by') or 'name' - sort_func = { - 'name': lambda x: x, - 'map': lambda x: x.map, - 'gametype': lambda x: x.gametype, - 'players': lambda x: x.player_count, - 'progression': lambda x: x.progression, - }.get(self.order_by) - if sort_func is None: - return redirect(self.url_for('serverlist')) - - self.servers = self.cup.master.servers.values() - self.servers.sort(key=sort_func) - if self.request.args.get('dir') == 'desc': - self.servers.reverse() - self.order_desc = True - else: - self.order_desc = False - - self.players = reduce(lambda a, b: a + b.players, self.servers, []) - self.players.sort(lambda a, b: unicodecmp(a.name, b.name)) - - -class Server(Page): - url_rule = '/server/' - - def process(self, id): - try: - self.server = self.cup.master.servers[id] - except KeyError: - raise NotFound() - - -class Search(Page): - url_rule = '/search' - - def process(self): - self.user = self.request.args.get('user') - if self.user: - self.results = [] - for server in self.cup.master.servers.itervalues(): - for player in server.players: - if player.name == self.user: - self.results.append(server) - - -class MissingPage(Page): - - def get_response(self): - response = super(MissingPage, self).get_response() - response.status_code = 404 - return response diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/content.png b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/content.png deleted file mode 100644 index dcb9f6ae424c22c09c1a5e5bb4d08a04b90e1a76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^)` z7_KusUhjHV0Vu**;1OBOz`!jG!i)^F=12eq*-JcqUDJ=-#W z`s0-0caS5r>mdKI;Vst0QbC11poj5 diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/down.png b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/down.png deleted file mode 100755 index 6bb91397cc92f3e2aaaa99e320c17d415f18d315..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rfr zt}{Gd?|N1ND8gCb5n0T@z%2~Ij105pNB{-dOFVsD*>5mQa+(;asGPqK6#C)m;uvCa zIyqs1fWf0lKlUH}V1M|3JrB?SIzxj$e-9pzD3MR6=y``2*e-+O-M!||JVejGdS;k!69^I`k8|NHGGCmxueFChNs|KSfWt(h&^Y7|c~ z%xV1b_jtaC1<=$FFWDv8YJQz#=sgtwWaop+HpVx8!u>F1T+l#NWw@)bf@Lv4z_IMti z{CZ>iouB(J&wk-!q&WHSpI*PV|I?!+|Ao73h*QyC9(sI(tR`o=?MVl31_qx=740$& S$0dPbz~JfX=d#Wzp$P!Ve4O$C diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/favicon.ico b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/shared/favicon.ico deleted file mode 100644 index 0c3a78530748193b2f20727e9c231cda77671a68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48558 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 j3G6m6kQ5{x;K#lJ&|!jx0i- - - - Teeworlds Server Browser - - - - -

Teeworlds Server Browser

-
- ${body} -
- - - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/missingpage.html b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/missingpage.html deleted file mode 100644 index be8d5717bf..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/missingpage.html +++ /dev/null @@ -1,8 +0,0 @@ -

Page Not Found

-

- The requested page does not exist on this server. If you expect something - here (for example a server) it probably went away after the last update. -

-

- go back to the server list. -

diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/search.html b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/search.html deleted file mode 100644 index 25cfec854b..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/search.html +++ /dev/null @@ -1,36 +0,0 @@ -

Nick Search

-<% if not user %> -
-

- You have to enter a nickname. -

-

- - -

-

- Take me back to the server list. -

-
-<% else %> -<% if results %> -

- The nickname "$escape(user)" is currently playing on the - following ${len(results) == 1 and 'server' or 'servers'}: -

- -<% else %> -

- The nickname "$escape(user)" is currently not playing. -

-<% endif %> -

- You can bookmark this link - to search for "$escape(user)" quickly or return - to the server list. -

-<% endif %> diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/server.html b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/server.html deleted file mode 100644 index a7d581e8fc..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/server.html +++ /dev/null @@ -1,29 +0,0 @@ -

$escape(server.name)

-

- Take me back to the server list. -

-
-
Map
-
$escape(server.map)
-
Gametype
-
$server.gametype
-
Number of players
-
$server.player_count
-
Server version
-
$server.version
-
Maximum number of players
-
$server.max_players
- <% if server.progression >= 0 %> -
Game progression
-
$server.progression%
- <% endif %> -
-<% if server.players %> -

Players

- -<% endif %> diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/serverlist.html b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/serverlist.html deleted file mode 100644 index 8562e417f2..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/templates/serverlist.html +++ /dev/null @@ -1,59 +0,0 @@ -

Server List

-

- Currently $len(players) players are playing on - $len(servers) servers. - <% if cup.master.last_sync %> - This list was last synced on - $cup.master.last_sync.strftime('%d %B %Y at %H:%M UTC'). - <% else %> - Syncronization with master server in progress. Reload the page in a minute - or two, to see the server list. - <% endif %> -

- - - - - - - - - - - - <% for server in servers %> - - - - - - - - <% endfor %> - -
$self.order_link('name', 'Name')$self.order_link('map', 'Map')$self.order_link('gametype', 'Gametype')$self.order_link('players', 'Players')$self.order_link('progression', 'Progression')
$escape(server.name)$escape(server.map)$server.gametype$server.player_count / $server.max_players${server.progression >= 0 and '%d%%' % server.progression or '?'}
-

Players online

-

- The following map represents the users playing currently. The bigger their name - the higher their score in the current game. Clicking on the name takes you to - the detail page of the server for some more information. -

-
-<% for player in players %> - $escape(player.name) -<% endfor %> -
-

Find User

-

- Find a user by username. The result page contains a link you can bookmark to - find your buddy easily. Because currently there is no central user database - users can appear on multiple servers for too generic usernames (like the - default "nameless tee" user). -

-
-

- - -

-
diff --git a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/utils.py b/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/utils.py deleted file mode 100644 index 92d45871ea..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/cupoftee/utils.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -""" - cupoftee.utils - ~~~~~~~~~~~~~~ - - Various utilities. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import re - - -_sort_re = re.compile(r'\w+', re.UNICODE) - - -def unicodecmp(a, b): - x, y = map(_sort_re.search, [a, b]) - return cmp((x and x.group() or a).lower(), (y and y.group() or b).lower()) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/httpbasicauth.py b/pythonPackages/Werkzeug-0.12.1/examples/httpbasicauth.py deleted file mode 100644 index 1618bb99b2..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/httpbasicauth.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -""" - HTTP Basic Auth Example - ~~~~~~~~~~~~~~~~~~~~~~~ - - Shows how you can implement HTTP basic auth support without an - additional component. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -from werkzeug.serving import run_simple -from werkzeug.wrappers import Request, Response - - -class Application(object): - - def __init__(self, users, realm='login required'): - self.users = users - self.realm = realm - - def check_auth(self, username, password): - return username in self.users and self.users[username] == password - - def auth_required(self, request): - return Response('Could not verify your access level for that URL.\n' - 'You have to login with proper credentials', 401, - {'WWW-Authenticate': 'Basic realm="%s"' % self.realm}) - - def dispatch_request(self, request): - return Response('Logged in as %s' % request.authorization.username) - - def __call__(self, environ, start_response): - request = Request(environ) - auth = request.authorization - if not auth or not self.check_auth(auth.username, auth.password): - response = self.auth_required(request) - else: - response = self.dispatch_request(request) - return response(environ, start_response) - - -if __name__ == '__main__': - application = Application({'user1': 'password', 'user2': 'password'}) - run_simple('localhost', 5000, application) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/__init__.py b/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/__init__.py deleted file mode 100644 index 393d270c64..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from i18nurls.application import Application as make_app diff --git a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/application.py b/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/application.py deleted file mode 100644 index dce2ec1ab9..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/application.py +++ /dev/null @@ -1,86 +0,0 @@ -from os import path -from werkzeug.templates import Template -from werkzeug.wrappers import BaseRequest, BaseResponse -from werkzeug.routing import NotFound, RequestRedirect -from werkzeug.exceptions import HTTPException, NotFound -from i18nurls.urls import map - -TEMPLATES = path.join(path.dirname(__file__), 'templates') -views = {} - - -def expose(name): - """Register the function as view.""" - def wrapped(f): - views[name] = f - return f - return wrapped - - -class Request(BaseRequest): - - def __init__(self, environ, urls): - super(Request, self).__init__(environ) - self.urls = urls - self.matched_url = None - - def url_for(self, endpoint, **args): - if not 'lang_code' in args: - args['lang_code'] = self.language - if endpoint == 'this': - endpoint = self.matched_url[0] - tmp = self.matched_url[1].copy() - tmp.update(args) - args = tmp - return self.urls.build(endpoint, args) - - -class Response(BaseResponse): - pass - - -class TemplateResponse(Response): - - def __init__(self, template_name, **values): - self.template_name = template_name - self.template_values = values - Response.__init__(self, mimetype='text/html') - - def __call__(self, environ, start_response): - req = environ['werkzeug.request'] - values = self.template_values.copy() - values['req'] = req - values['body'] = self.render_template(self.template_name, values) - self.write(self.render_template('layout.html', values)) - return Response.__call__(self, environ, start_response) - - def render_template(self, name, values): - return Template.from_file(path.join(TEMPLATES, name)).render(values) - - -class Application(object): - - def __init__(self): - from i18nurls import views - self.not_found = views.page_not_found - - def __call__(self, environ, start_response): - urls = map.bind_to_environ(environ) - req = Request(environ, urls) - try: - endpoint, args = urls.match(req.path) - req.matched_url = (endpoint, args) - if endpoint == '#language_select': - lng = req.accept_languages.best - lng = lng and lng.split('-')[0].lower() or 'en' - index_url = urls.build('index', {'lang_code': lng}) - resp = Response('Moved to %s' % index_url, status=302) - resp.headers['Location'] = index_url - else: - req.language = args.pop('lang_code', None) - resp = views[endpoint](req, **args) - except NotFound: - resp = self.not_found(req) - except (RequestRedirect, HTTPException), e: - resp = e - return resp(environ, start_response) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/about.html b/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/about.html deleted file mode 100644 index 709d6d49c1..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/about.html +++ /dev/null @@ -1,4 +0,0 @@ -

- This is just another page. Maybe you want to head over to the - blog. -

diff --git a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/blog.html b/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/blog.html deleted file mode 100644 index 79cbc21377..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/blog.html +++ /dev/null @@ -1,4 +0,0 @@ -

Blog <% if mode == 'index' %>Index<% else %>Post $post_id<% endif %>

-

- How about going to the index. -

diff --git a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/index.html b/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/index.html deleted file mode 100644 index 870bd3d6b0..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/index.html +++ /dev/null @@ -1,5 +0,0 @@ -

Hello in the i18n URL example application.

-

Because I'm too lazy to translate here is just english content.

- diff --git a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/layout.html b/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/layout.html deleted file mode 100644 index 15a6ad4ace..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/templates/layout.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - $title | Example Application - - -

Example Application

-

- Request Language: $req.language -

- $body -
-

This page in other languages: -

    - <% for lng in ['en', 'de', 'fr'] %> -
  • $lng
  • - <% endfor %> -
-
- - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/urls.py b/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/urls.py deleted file mode 100644 index 57ff68a23a..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/urls.py +++ /dev/null @@ -1,11 +0,0 @@ -from werkzeug.routing import Map, Rule, Submount - -map = Map([ - Rule('/', endpoint='#language_select'), - Submount('/', [ - Rule('/', endpoint='index'), - Rule('/about', endpoint='about'), - Rule('/blog/', endpoint='blog/index'), - Rule('/blog/', endpoint='blog/show') - ]) -]) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/views.py b/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/views.py deleted file mode 100644 index 7b8bdb709b..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/i18nurls/views.py +++ /dev/null @@ -1,22 +0,0 @@ -from i18nurls.application import TemplateResponse, Response, expose - - -@expose('index') -def index(req): - return TemplateResponse('index.html', title='Index') - -@expose('about') -def about(req): - return TemplateResponse('about.html', title='About') - -@expose('blog/index') -def blog_index(req): - return TemplateResponse('blog.html', title='Blog Index', mode='index') - -@expose('blog/show') -def blog_show(req, post_id): - return TemplateResponse('blog.html', title='Blog Post #%d' % post_id, - post_id=post_id, mode='show') - -def page_not_found(req): - return Response('

Page Not Found

', mimetype='text/html') diff --git a/pythonPackages/Werkzeug-0.12.1/examples/manage-coolmagic.py b/pythonPackages/Werkzeug-0.12.1/examples/manage-coolmagic.py deleted file mode 100755 index b61eaa99c9..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/manage-coolmagic.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" - Manage Coolmagic - ~~~~~~~~~~~~~~~~ - - Manage the coolmagic example application. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import os -from coolmagic import make_app -from werkzeug import script - -action_runserver = script.make_runserver(make_app, use_reloader=True) -action_shell = script.make_shell(lambda: {}) - -if __name__ == '__main__': - script.run() diff --git a/pythonPackages/Werkzeug-0.12.1/examples/manage-couchy.py b/pythonPackages/Werkzeug-0.12.1/examples/manage-couchy.py deleted file mode 100755 index 4b582dbcf5..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/manage-couchy.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python -from werkzeug import script - -def make_app(): - from couchy.application import Couchy - return Couchy('http://localhost:5984') - -def make_shell(): - from couchy import models, utils - application = make_app() - return locals() - -action_runserver = script.make_runserver(make_app, use_reloader=True) -action_shell = script.make_shell(make_shell) -action_initdb = lambda: make_app().init_database() - -script.run() diff --git a/pythonPackages/Werkzeug-0.12.1/examples/manage-cupoftee.py b/pythonPackages/Werkzeug-0.12.1/examples/manage-cupoftee.py deleted file mode 100755 index dd5e0a6ce8..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/manage-cupoftee.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -""" - Manage Cup Of Tee - ~~~~~~~~~~~~~~~~~ - - Manage the cup of tee application. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from werkzeug import script - - -def make_app(): - from cupoftee import make_app - return make_app('/tmp/cupoftee.db') -action_runserver = script.make_runserver(make_app) - -script.run() diff --git a/pythonPackages/Werkzeug-0.12.1/examples/manage-i18nurls.py b/pythonPackages/Werkzeug-0.12.1/examples/manage-i18nurls.py deleted file mode 100755 index ba0ac4d936..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/manage-i18nurls.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" - Manage i18nurls - ~~~~~~~~~~~~~~~ - - Manage the i18n url example application. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import os -from i18nurls import make_app -from werkzeug import script - -action_runserver = script.make_runserver(make_app) -action_shell = script.make_shell(lambda: {}) - -if __name__ == '__main__': - script.run() diff --git a/pythonPackages/Werkzeug-0.12.1/examples/manage-plnt.py b/pythonPackages/Werkzeug-0.12.1/examples/manage-plnt.py deleted file mode 100755 index e8853d19cb..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/manage-plnt.py +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" - Manage plnt - ~~~~~~~~~~~ - - This script manages the plnt application. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import os -from werkzeug import script - - -def make_app(): - """Helper function that creates a plnt app.""" - from plnt import Plnt - database_uri = os.environ.get('PLNT_DATABASE_URI') - app = Plnt(database_uri or 'sqlite:////tmp/plnt.db') - app.bind_to_context() - return app - - -action_runserver = script.make_runserver(make_app, use_reloader=True) -action_shell = script.make_shell(lambda: {'app': make_app()}) - - -def action_initdb(): - """Initialize the database""" - from plnt.database import Blog, session - make_app().init_database() - # and now fill in some python blogs everybody should read (shamelessly - # added my own blog too) - blogs = [ - Blog('Armin Ronacher', 'http://lucumr.pocoo.org/', - 'http://lucumr.pocoo.org/cogitations/feed/'), - Blog('Georg Brandl', 'http://pyside.blogspot.com/', - 'http://pyside.blogspot.com/feeds/posts/default'), - Blog('Ian Bicking', 'http://blog.ianbicking.org/', - 'http://blog.ianbicking.org/feed/'), - Blog('Amir Salihefendic', 'http://amix.dk/', - 'http://feeds.feedburner.com/amixdk'), - Blog('Christopher Lenz', 'http://www.cmlenz.net/blog/', - 'http://www.cmlenz.net/blog/atom.xml'), - Blog('Frederick Lundh', 'http://online.effbot.org/', - 'http://online.effbot.org/rss.xml') - ] - # okay. got tired here. if someone feels that he is missing, drop me - # a line ;-) - for blog in blogs: - session.add(blog) - session.commit() - print 'Initialized database, now run manage-plnt.py sync to get the posts' - - -def action_sync(): - """Sync the blogs in the planet. Call this from a cronjob.""" - from plnt.sync import sync - make_app().bind_to_context() - sync() - - -if __name__ == '__main__': - script.run() diff --git a/pythonPackages/Werkzeug-0.12.1/examples/manage-shorty.py b/pythonPackages/Werkzeug-0.12.1/examples/manage-shorty.py deleted file mode 100755 index 71ea3b27f4..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/manage-shorty.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python -import os -import tempfile -from werkzeug import script - -def make_app(): - from shorty.application import Shorty - filename = os.path.join(tempfile.gettempdir(), "shorty.db") - return Shorty('sqlite:///{0}'.format(filename)) - -def make_shell(): - from shorty import models, utils - application = make_app() - return locals() - -action_runserver = script.make_runserver(make_app, use_reloader=True) -action_shell = script.make_shell(make_shell) -action_initdb = lambda: make_app().init_database() - -script.run() diff --git a/pythonPackages/Werkzeug-0.12.1/examples/manage-simplewiki.py b/pythonPackages/Werkzeug-0.12.1/examples/manage-simplewiki.py deleted file mode 100755 index 2960b0f3f7..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/manage-simplewiki.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" - Manage SimpleWiki - ~~~~~~~~~~~~~~~~~ - - This script provides some basic commands to debug and test SimpleWiki. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import os -from werkzeug import script - - -def make_wiki(): - """Helper function that creates a new wiki instance.""" - from simplewiki import SimpleWiki - database_uri = os.environ.get('SIMPLEWIKI_DATABASE_URI') - return SimpleWiki(database_uri or 'sqlite:////tmp/simplewiki.db') - - -def shell_init_func(): - """ - Called on shell initialization. Adds useful stuff to the namespace. - """ - from simplewiki import database - wiki = make_wiki() - wiki.bind_to_context() - return { - 'wiki': wiki, - 'db': database - } - - -action_runserver = script.make_runserver(make_wiki, use_reloader=True) -action_shell = script.make_shell(shell_init_func) - - -def action_initdb(): - """Initialize the database""" - make_wiki().init_database() - - -if __name__ == '__main__': - script.run() diff --git a/pythonPackages/Werkzeug-0.12.1/examples/manage-webpylike.py b/pythonPackages/Werkzeug-0.12.1/examples/manage-webpylike.py deleted file mode 100755 index 6a9ca4abf3..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/manage-webpylike.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -""" - Manage web.py like application - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - A small example application that is built after the web.py tutorial. We - even use regular expression based dispatching. The original code can be - found on the `webpy.org webpage`__ in the tutorial section. - - __ http://webpy.org/tutorial2.en - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import os -import sys -sys.path.append(os.path.join(os.path.dirname(__file__), 'webpylike')) -from example import app -from werkzeug import script - -action_runserver = script.make_runserver(lambda: app) -action_shell = script.make_shell(lambda: {}) - -if __name__ == '__main__': - script.run() diff --git a/pythonPackages/Werkzeug-0.12.1/examples/partial/README b/pythonPackages/Werkzeug-0.12.1/examples/partial/README deleted file mode 100644 index b3f497641c..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/partial/README +++ /dev/null @@ -1,3 +0,0 @@ -This directory contains modules that have code but that are -not excutable. For example routing definitions to play around -in the python interactive prompt. diff --git a/pythonPackages/Werkzeug-0.12.1/examples/partial/complex_routing.py b/pythonPackages/Werkzeug-0.12.1/examples/partial/complex_routing.py deleted file mode 100644 index 18ce7b0afd..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/partial/complex_routing.py +++ /dev/null @@ -1,19 +0,0 @@ -from werkzeug.routing import Map, Rule, Subdomain, Submount, EndpointPrefix - -m = Map([ - # Static URLs - EndpointPrefix('static/', [ - Rule('/', endpoint='index'), - Rule('/about', endpoint='about'), - Rule('/help', endpoint='help'), - ]), - # Knowledge Base - Subdomain('kb', [EndpointPrefix('kb/', [ - Rule('/', endpoint='index'), - Submount('/browse', [ - Rule('/', endpoint='browse'), - Rule('//', defaults={'page': 1}, endpoint='browse'), - Rule('//', endpoint='browse') - ]) - ])]) -]) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/plnt/__init__.py b/pythonPackages/Werkzeug-0.12.1/examples/plnt/__init__.py deleted file mode 100644 index 7966c95758..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/plnt/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -""" - plnt - ~~~~ - - Noun. plnt (plant) -- a planet application that sounds like a herb. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -from plnt.webapp import Plnt diff --git a/pythonPackages/Werkzeug-0.12.1/examples/plnt/database.py b/pythonPackages/Werkzeug-0.12.1/examples/plnt/database.py deleted file mode 100644 index 4fa66f849e..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/plnt/database.py +++ /dev/null @@ -1,69 +0,0 @@ -# -*- coding: utf-8 -*- -""" - plnt.database - ~~~~~~~~~~~~~ - - The database definitions for the planet. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -from sqlalchemy import MetaData, Table, Column, ForeignKey, Boolean, \ - Integer, String, DateTime -from sqlalchemy.orm import dynamic_loader, scoped_session, create_session, \ - mapper -from plnt.utils import application, local_manager - - -def new_db_session(): - return create_session(application.database_engine, autoflush=True, - autocommit=False) - -metadata = MetaData() -session = scoped_session(new_db_session, local_manager.get_ident) - - -blog_table = Table('blogs', metadata, - Column('id', Integer, primary_key=True), - Column('name', String(120)), - Column('description', String), - Column('url', String(200)), - Column('feed_url', String(250)) -) - -entry_table = Table('entries', metadata, - Column('id', Integer, primary_key=True), - Column('blog_id', Integer, ForeignKey('blogs.id')), - Column('guid', String(200), unique=True), - Column('title', String(140)), - Column('url', String(200)), - Column('text', String), - Column('pub_date', DateTime), - Column('last_update', DateTime) -) - - -class Blog(object): - query = session.query_property() - - def __init__(self, name, url, feed_url, description=u''): - self.name = name - self.url = url - self.feed_url = feed_url - self.description = description - - def __repr__(self): - return '<%s %r>' % (self.__class__.__name__, self.url) - - -class Entry(object): - query = session.query_property() - - def __repr__(self): - return '<%s %r>' % (self.__class__.__name__, self.guid) - - -mapper(Entry, entry_table) -mapper(Blog, blog_table, properties=dict( - entries=dynamic_loader(Entry, backref='blog') -)) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/plnt/shared/style.css b/pythonPackages/Werkzeug-0.12.1/examples/plnt/shared/style.css deleted file mode 100644 index 2765f931d8..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/plnt/shared/style.css +++ /dev/null @@ -1,133 +0,0 @@ -body { - font-family: 'Luxi Sans', 'Lucida Sans', 'Verdana', sans-serif; - margin: 1em; - padding: 0; - background-color: #BDE1EC; - color: #0B2B35; -} - -a { - color: #50ACC4; -} - -a:hover { - color: #0B2B35; -} - -div.header { - display: block; - margin: -1em -1em 0 -1em; - padding: 1em; - background-color: #0B2B35; - color: white; -} - -div.header h1 { - font-family: 'Georgia', serif; - margin: 0; - font-size: 1.8em; -} - -div.header blockquote { - margin: 0; - padding: 0.5em 0 0 1em; - font-size: 0.9em; -} - -div.footer { - margin: 1em -1em -1em -1em; - padding: 0.5em; - color: #F3F7F8; - background-color: #1F6070; -} - -div.footer p { - margin: 0; - padding: 0; - font-size: 0.8em; - text-align: right; -} - -ul.navigation { - float: right; - padding: 0.7em 1em 0.7em 1em; - background-color: #F3F7F8; - border: 1px solid #85CADB; - border-right-color: #50ACC4; - border-bottom-color: #50ACC4; - list-style: none; -} - -ul.navigation li { - padding: 0.3em 0 0.3em 0; -} - -ul.navigation li a { - color: #0B2B35; -} - -ul.navigation li a:hover { - color: #50ACC4; -} - -div.pagination { - margin: 0.5em 0 0.5em 0; - padding: 0.7em; - text-align: center; - max-width: 50em; - background-color: white; - border: 1px solid #B1CDD4; -} - -div.day, div.page { - max-width: 50em; - background-color: white; - border: 1px solid #50ACC4; - margin: 1em 0 1em 0; - padding: 0.7em; -} - -div.day h2, div.page h2 { - margin: 0 0 0.5em 0; - padding: 0; - color: black; - font-size: 1.7em; -} - -div.page p { - margin: 0.7em 1em 0.7em 1em; - line-height: 1.5em; -} - -div.day div.entry { - margin: 0.5em 0.25em 0.5em 1em; - padding: 1em; - background-color: #F3F7F8; - border: 1px solid #85CADB; - border-left-color: #50ACC4; - border-top-color: #50ACC4; -} - -div.day div.entry h3 { - margin: 0; - padding: 0; -} - -div.day div.entry h3 a { - color: #1C6D81; - text-decoration: none; -} - -div.day div.entry p.meta { - color: #666; - font-size: 0.85em; - margin: 0.3em 0 0.6em 0; -} - -div.day div.entry p.meta a { - color: #666; -} - -div.day div.entry div.text { - padding: 0 0 0 0.5em; -} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/plnt/sync.py b/pythonPackages/Werkzeug-0.12.1/examples/plnt/sync.py deleted file mode 100644 index 8d2ea9a845..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/plnt/sync.py +++ /dev/null @@ -1,105 +0,0 @@ -# -*- coding: utf-8 -*- -""" - plnt.sync - ~~~~~~~~~ - - Does the synchronization. Called by "manage-plnt.py sync" - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -import sys -import feedparser -from time import time -from datetime import datetime -from werkzeug.utils import escape -from plnt.database import Blog, Entry, session -from plnt.utils import strip_tags, nl2p - - -HTML_MIMETYPES = set(['text/html', 'application/xhtml+xml']) - - -def sync(): - """ - Performs a synchronization. Articles that are already syncronized aren't - touched anymore. - """ - for blog in Blog.query.all(): - # parse the feed. feedparser.parse will never given an exception - # but the bozo bit might be defined. - feed = feedparser.parse(blog.feed_url) - blog_author = feed.get('author') or blog.name - blog_author_detail = feed.get('author_detail') - - for entry in feed.entries: - # get the guid. either the id if specified, otherwise the link. - # if none is available we skip the entry. - guid = entry.get('id') or entry.get('link') - if not guid: - continue - - # get an old entry for the guid to check if we need to update - # or recreate the item - old_entry = Entry.query.filter_by(guid=guid).first() - - # get title, url and text. skip if no title or no text is - # given. if the link is missing we use the blog link. - if 'title_detail' in entry: - title = entry.title_detail.get('value') or '' - if entry.title_detail.get('type') in HTML_MIMETYPES: - title = strip_tags(title) - else: - title = escape(title) - else: - title = entry.get('title') - url = entry.get('link') or blog.blog_url - text = 'content' in entry and entry.content[0] or \ - entry.get('summary_detail') - - if not title or not text: - continue - - # if we have an html text we use that, otherwise we HTML - # escape the text and use that one. We also handle XHTML - # with our tag soup parser for the moment. - if text.get('type') not in HTML_MIMETYPES: - text = escape(nl2p(text.get('value') or '')) - else: - text = text.get('value') or '' - - # no text? continue - if not text.strip(): - continue - - # get the pub date and updated date. This is rather complex - # because different feeds do different stuff - pub_date = entry.get('published_parsed') or \ - entry.get('created_parsed') or \ - entry.get('date_parsed') - updated = entry.get('updated_parsed') or pub_date - pub_date = pub_date or updated - - # if we don't have a pub_date we skip. - if not pub_date: - continue - - # convert the time tuples to datetime objects. - pub_date = datetime(*pub_date[:6]) - updated = datetime(*updated[:6]) - if old_entry and updated <= old_entry.last_update: - continue - - # create a new entry object based on the data collected or - # update the old one. - entry = old_entry or Entry() - entry.blog = blog - entry.guid = guid - entry.title = title - entry.url = url - entry.text = text - entry.pub_date = pub_date - entry.last_update = updated - session.add(entry) - - session.commit() diff --git a/pythonPackages/Werkzeug-0.12.1/examples/plnt/templates/about.html b/pythonPackages/Werkzeug-0.12.1/examples/plnt/templates/about.html deleted file mode 100644 index b3ff48c686..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/plnt/templates/about.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "layout.html" %} -{% block body %} -
-

About Plnt

-

- Plnt is a small example application written using the - Werkzeug WSGI toolkit, - the Jinja template language, - the SQLAlchemy database abstraction - layer and ORM and last but not least the awesome - feedparser library. -

-

- It's one of the example applications developed to show some of the - features werkzeug provides and could be the base of a real planet - software. -

-
-{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/plnt/templates/index.html b/pythonPackages/Werkzeug-0.12.1/examples/plnt/templates/index.html deleted file mode 100644 index 10b4d7a9de..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/plnt/templates/index.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "layout.html" %} -{% block body %} - {% for day in days %} -
-

{{ day.date.strftime('%d %B %Y') }}

- {%- for entry in day.entries %} -
-

{{ entry.title }}

-

by {{ entry.blog.name|e }} - at {{ entry.pub_date.strftime('%H:%m') }}

-
{{ entry.text }}
-
- {%- endfor %} -
- {%- endfor %} - - {% if pagination.pages > 1 %} - - {% endif %} -{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/plnt/templates/layout.html b/pythonPackages/Werkzeug-0.12.1/examples/plnt/templates/layout.html deleted file mode 100644 index 5906ca23fd..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/plnt/templates/layout.html +++ /dev/null @@ -1,23 +0,0 @@ - -Plnt Planet - - -
-

Plnt Planet

-
This is the Plnt Planet Werkzeug Example Application
-
- - - -
-{% block body %}{% endblock %} -
- - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/plnt/utils.py b/pythonPackages/Werkzeug-0.12.1/examples/plnt/utils.py deleted file mode 100644 index a01d329ae2..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/plnt/utils.py +++ /dev/null @@ -1,127 +0,0 @@ -# -*- coding: utf-8 -*- -""" - plnt.utils - ~~~~~~~~~~ - - The planet utilities. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -import re -from os import path -from jinja2 import Environment, FileSystemLoader -from werkzeug.local import Local, LocalManager -from werkzeug.urls import url_encode, url_quote -from werkzeug.utils import cached_property -from werkzeug.wrappers import Response -from werkzeug.routing import Map, Rule - - -# context locals. these two objects are use by the application to -# bind objects to the current context. A context is defined as the -# current thread and the current greenlet if there is greenlet support. -# the `get_request` and `get_application` functions look up the request -# and application objects from this local manager. -local = Local() -local_manager = LocalManager([local]) - - -# proxy objects -request = local('request') -application = local('application') -url_adapter = local('url_adapter') - - -# let's use jinja for templates this time -template_path = path.join(path.dirname(__file__), 'templates') -jinja_env = Environment(loader=FileSystemLoader(template_path)) - - -# the collected url patterns -url_map = Map([Rule('/shared/', endpoint='shared')]) -endpoints = {} - - -_par_re = re.compile(r'\n{2,}') -_entity_re = re.compile(r'&([^;]+);') -_striptags_re = re.compile(r'(|<[^>]*>)') - -from htmlentitydefs import name2codepoint -html_entities = name2codepoint.copy() -html_entities['apos'] = 39 -del name2codepoint - - -def expose(url_rule, endpoint=None, **kwargs): - """Expose this function to the web layer.""" - def decorate(f): - e = endpoint or f.__name__ - endpoints[e] = f - url_map.add(Rule(url_rule, endpoint=e, **kwargs)) - return f - return decorate - - -def render_template(template_name, **context): - """Render a template into a response.""" - tmpl = jinja_env.get_template(template_name) - context['url_for'] = url_for - return Response(tmpl.render(context), mimetype='text/html') - - -def nl2p(s): - """Add paragraphs to a text.""" - return u'\n'.join(u'

%s

' % p for p in _par_re.split(s)) - - -def url_for(endpoint, **kw): - """Simple function for URL generation.""" - return url_adapter.build(endpoint, kw) - - -def strip_tags(s): - """Resolve HTML entities and remove tags from a string.""" - def handle_match(m): - name = m.group(1) - if name in html_entities: - return unichr(html_entities[name]) - if name[:2] in ('#x', '#X'): - try: - return unichr(int(name[2:], 16)) - except ValueError: - return u'' - elif name.startswith('#'): - try: - return unichr(int(name[1:])) - except ValueError: - return u'' - return u'' - return _entity_re.sub(handle_match, _striptags_re.sub('', s)) - - -class Pagination(object): - """ - Paginate a SQLAlchemy query object. - """ - - def __init__(self, query, per_page, page, endpoint): - self.query = query - self.per_page = per_page - self.page = page - self.endpoint = endpoint - - @cached_property - def entries(self): - return self.query.offset((self.page - 1) * self.per_page) \ - .limit(self.per_page).all() - - @cached_property - def count(self): - return self.query.count() - - has_previous = property(lambda x: x.page > 1) - has_next = property(lambda x: x.page < x.pages) - previous = property(lambda x: url_for(x.endpoint, page=x.page - 1)) - next = property(lambda x: url_for(x.endpoint, page=x.page + 1)) - pages = property(lambda x: max(0, x.count - 1) // x.per_page + 1) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/plnt/views.py b/pythonPackages/Werkzeug-0.12.1/examples/plnt/views.py deleted file mode 100644 index 87153716cd..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/plnt/views.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -""" - plnt.views - ~~~~~~~~~~ - - Display the aggregated feeds. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -from datetime import datetime, date -from plnt.database import Blog, Entry -from plnt.utils import Pagination, expose, render_template - - -#: number of items per page -PER_PAGE = 30 - - -@expose('/', defaults={'page': 1}) -@expose('/page/') -def index(request, page): - """Show the index page or any an offset of it.""" - days = [] - days_found = set() - query = Entry.query.order_by(Entry.pub_date.desc()) - pagination = Pagination(query, PER_PAGE, page, 'index') - for entry in pagination.entries: - day = date(*entry.pub_date.timetuple()[:3]) - if day not in days_found: - days_found.add(day) - days.append({'date': day, 'entries': []}) - days[-1]['entries'].append(entry) - return render_template('index.html', days=days, pagination=pagination) - - -@expose('/about') -def about(request): - """Show the about page, so that we have another view func ;-)""" - return render_template('about.html') diff --git a/pythonPackages/Werkzeug-0.12.1/examples/plnt/webapp.py b/pythonPackages/Werkzeug-0.12.1/examples/plnt/webapp.py deleted file mode 100644 index c035dfd6ef..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/plnt/webapp.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- -""" - plnt.webapp - ~~~~~~~~~~~ - - The web part of the planet. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -from os import path -from sqlalchemy import create_engine -from werkzeug.wrappers import Request -from werkzeug.wsgi import ClosingIterator, SharedDataMiddleware -from werkzeug.exceptions import HTTPException, NotFound -from plnt.utils import local, local_manager, url_map, endpoints -from plnt.database import session, metadata - -# import the views module because it contains setup code -import plnt.views - -#: path to shared data -SHARED_DATA = path.join(path.dirname(__file__), 'shared') - - -class Plnt(object): - - def __init__(self, database_uri): - self.database_engine = create_engine(database_uri) - - self._dispatch = local_manager.middleware(self.dispatch_request) - self._dispatch = SharedDataMiddleware(self._dispatch, { - '/shared': SHARED_DATA - }) - - def init_database(self): - metadata.create_all(self.database_engine) - - def bind_to_context(self): - local.application = self - - def dispatch_request(self, environ, start_response): - self.bind_to_context() - local.request = request = Request(environ, start_response) - local.url_adapter = adapter = url_map.bind_to_environ(environ) - try: - endpoint, values = adapter.match(request.path) - response = endpoints[endpoint](request, **values) - except HTTPException, e: - response = e - return ClosingIterator(response(environ, start_response), - session.remove) - - def __call__(self, environ, start_response): - return self._dispatch(environ, start_response) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shortly/shortly.py b/pythonPackages/Werkzeug-0.12.1/examples/shortly/shortly.py deleted file mode 100644 index 1d95cafb9b..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shortly/shortly.py +++ /dev/null @@ -1,141 +0,0 @@ -# -*- coding: utf-8 -*- -""" - shortly - ~~~~~~~ - - A simple URL shortener using Werkzeug and redis. - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import os -import redis -import urlparse -from werkzeug.wrappers import Request, Response -from werkzeug.routing import Map, Rule -from werkzeug.exceptions import HTTPException, NotFound -from werkzeug.wsgi import SharedDataMiddleware -from werkzeug.utils import redirect - -from jinja2 import Environment, FileSystemLoader - - -def base36_encode(number): - assert number >= 0, 'positive integer required' - if number == 0: - return '0' - base36 = [] - while number != 0: - number, i = divmod(number, 36) - base36.append('0123456789abcdefghijklmnopqrstuvwxyz'[i]) - return ''.join(reversed(base36)) - - -def is_valid_url(url): - parts = urlparse.urlparse(url) - return parts.scheme in ('http', 'https') - - -def get_hostname(url): - return urlparse.urlparse(url).netloc - - -class Shortly(object): - - def __init__(self, config): - self.redis = redis.Redis(config['redis_host'], config['redis_port']) - template_path = os.path.join(os.path.dirname(__file__), 'templates') - self.jinja_env = Environment(loader=FileSystemLoader(template_path), - autoescape=True) - self.jinja_env.filters['hostname'] = get_hostname - - self.url_map = Map([ - Rule('/', endpoint='new_url'), - Rule('/', endpoint='follow_short_link'), - Rule('/+', endpoint='short_link_details') - ]) - - def on_new_url(self, request): - error = None - url = '' - if request.method == 'POST': - url = request.form['url'] - if not is_valid_url(url): - error = 'Please enter a valid URL' - else: - short_id = self.insert_url(url) - return redirect('/%s+' % short_id) - return self.render_template('new_url.html', error=error, url=url) - - def on_follow_short_link(self, request, short_id): - link_target = self.redis.get('url-target:' + short_id) - if link_target is None: - raise NotFound() - self.redis.incr('click-count:' + short_id) - return redirect(link_target) - - def on_short_link_details(self, request, short_id): - link_target = self.redis.get('url-target:' + short_id) - if link_target is None: - raise NotFound() - click_count = int(self.redis.get('click-count:' + short_id) or 0) - return self.render_template('short_link_details.html', - link_target=link_target, - short_id=short_id, - click_count=click_count - ) - - def error_404(self): - response = self.render_template('404.html') - response.status_code = 404 - return response - - def insert_url(self, url): - short_id = self.redis.get('reverse-url:' + url) - if short_id is not None: - return short_id - url_num = self.redis.incr('last-url-id') - short_id = base36_encode(url_num) - self.redis.set('url-target:' + short_id, url) - self.redis.set('reverse-url:' + url, short_id) - return short_id - - def render_template(self, template_name, **context): - t = self.jinja_env.get_template(template_name) - return Response(t.render(context), mimetype='text/html') - - def dispatch_request(self, request): - adapter = self.url_map.bind_to_environ(request.environ) - try: - endpoint, values = adapter.match() - return getattr(self, 'on_' + endpoint)(request, **values) - except NotFound, e: - return self.error_404() - except HTTPException, e: - return e - - def wsgi_app(self, environ, start_response): - request = Request(environ) - response = self.dispatch_request(request) - return response(environ, start_response) - - def __call__(self, environ, start_response): - return self.wsgi_app(environ, start_response) - - -def create_app(redis_host='localhost', redis_port=6379, with_static=True): - app = Shortly({ - 'redis_host': redis_host, - 'redis_port': redis_port - }) - if with_static: - app.wsgi_app = SharedDataMiddleware(app.wsgi_app, { - '/static': os.path.join(os.path.dirname(__file__), 'static') - }) - return app - - -if __name__ == '__main__': - from werkzeug.serving import run_simple - app = create_app() - run_simple('127.0.0.1', 5000, app, use_debugger=True, use_reloader=True) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shortly/static/style.css b/pythonPackages/Werkzeug-0.12.1/examples/shortly/static/style.css deleted file mode 100644 index 2b87e572a3..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shortly/static/style.css +++ /dev/null @@ -1,17 +0,0 @@ -body { background: #E8EFF0; margin: 0; padding: 0; } -body, input { font-family: 'Helvetica Neue', Arial, - sans-serif; font-weight: 300; font-size: 18px; } -.box { width: 500px; margin: 60px auto; padding: 20px; - background: white; box-shadow: 0 1px 4px #BED1D4; - border-radius: 2px; } -a { color: #11557C; } -h1, h2 { margin: 0; color: #11557C; } -h1 a { text-decoration: none; } -h2 { font-weight: normal; font-size: 24px; } -.tagline { color: #888; font-style: italic; margin: 0 0 20px 0; } -.link div { overflow: auto; font-size: 0.8em; white-space: pre; - padding: 4px 10px; margin: 5px 0; background: #E5EAF1; } -dt { font-weight: normal; } -.error { background: #E8EFF0; padding: 3px 8px; color: #11557C; - font-size: 0.9em; border-radius: 2px; } -.urlinput { width: 300px; } diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/404.html b/pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/404.html deleted file mode 100644 index 1df4aca371..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/404.html +++ /dev/null @@ -1,6 +0,0 @@ -{% extends "layout.html" %} -{% block title %}Page Not Found{% endblock %} -{% block body %} -

Page Not Found

-

I am sorry, but no such page was found here. -{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/layout.html b/pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/layout.html deleted file mode 100644 index 26f64dd3d7..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/layout.html +++ /dev/null @@ -1,8 +0,0 @@ - -{% block title %}{% endblock %} | shortly - -

-

shortly

-

Shortly is a URL shortener written with Werkzeug - {% block body %}{% endblock %} -

diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/new_url.html b/pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/new_url.html deleted file mode 100644 index a1553c5177..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/new_url.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "layout.html" %} -{% block title %}Create New Short URL{% endblock %} -{% block body %} -

Submit URL

-
- {% if error %} -

Error: {{ error }} - {% endif %} -

URL: - - -

-{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/short_link_details.html b/pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/short_link_details.html deleted file mode 100644 index 98b95e791e..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shortly/templates/short_link_details.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "layout.html" %} -{% block title %}Details about /{{ short_id }}{% endblock %} -{% block body %} -

/{{ short_id }}

-
-
Target host: -
{{ link_target|hostname }} -
Full link -
Click count: -
{{ click_count }} -
-{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shorty/__init__.py b/pythonPackages/Werkzeug-0.12.1/examples/shorty/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shorty/application.py b/pythonPackages/Werkzeug-0.12.1/examples/shorty/application.py deleted file mode 100644 index d17dc078c7..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shorty/application.py +++ /dev/null @@ -1,42 +0,0 @@ -from sqlalchemy import create_engine -from werkzeug.wrappers import Request -from werkzeug.wsgi import ClosingIterator, SharedDataMiddleware -from werkzeug.exceptions import HTTPException, NotFound -from shorty.utils import STATIC_PATH, session, local, local_manager, \ - metadata, url_map - -import shorty.models -from shorty import views - - -class Shorty(object): - - def __init__(self, db_uri): - local.application = self - self.database_engine = create_engine(db_uri, convert_unicode=True) - - self.dispatch = SharedDataMiddleware(self.dispatch, { - '/static': STATIC_PATH - }) - - def init_database(self): - metadata.create_all(self.database_engine) - - def dispatch(self, environ, start_response): - local.application = self - request = Request(environ) - local.url_adapter = adapter = url_map.bind_to_environ(environ) - try: - endpoint, values = adapter.match() - handler = getattr(views, endpoint) - response = handler(request, **values) - except NotFound, e: - response = views.not_found(request) - response.status_code = 404 - except HTTPException, e: - response = e - return ClosingIterator(response(environ, start_response), - [session.remove, local_manager.cleanup]) - - def __call__(self, environ, start_response): - return self.dispatch(environ, start_response) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shorty/models.py b/pythonPackages/Werkzeug-0.12.1/examples/shorty/models.py deleted file mode 100644 index 78b5f1df30..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shorty/models.py +++ /dev/null @@ -1,35 +0,0 @@ -from datetime import datetime -from sqlalchemy import Table, Column, String, Boolean, DateTime -from sqlalchemy.orm import mapper -from shorty.utils import session, metadata, url_for, get_random_uid - -url_table = Table('urls', metadata, - Column('uid', String(140), primary_key=True), - Column('target', String(500)), - Column('added', DateTime), - Column('public', Boolean) -) - -class URL(object): - query = session.query_property() - - def __init__(self, target, public=True, uid=None, added=None): - self.target = target - self.public = public - self.added = added or datetime.utcnow() - if not uid: - while 1: - uid = get_random_uid() - if not URL.query.get(uid): - break - self.uid = uid - session.add(self) - - @property - def short_url(self): - return url_for('link', uid=self.uid, _external=True) - - def __repr__(self): - return '' % self.uid - -mapper(URL, url_table) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shorty/static/style.css b/pythonPackages/Werkzeug-0.12.1/examples/shorty/static/style.css deleted file mode 100644 index 787632f084..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shorty/static/style.css +++ /dev/null @@ -1,108 +0,0 @@ -body { - background-color: #333; - font-family: 'Lucida Sans', 'Verdana', sans-serif; - font-size: 16px; - margin: 3em 0 3em 0; - padding: 0; - text-align: center; -} - -a { - color: #0C4850; -} - -a:hover { - color: #1C818F; -} - -h1 { - width: 500px; - background-color: #24C0CE; - text-align: center; - font-size: 3em; - margin: 0 auto 0 auto; - padding: 0; -} - -h1 a { - display: block; - padding: 0.3em; - color: #fff; - text-decoration: none; -} - -h1 a:hover { - color: #ADEEF7; - background-color: #0E8A96; -} - -div.footer { - margin: 0 auto 0 auto; - font-size: 13px; - text-align: right; - padding: 10px; - width: 480px; - background-color: #004C63; - color: white; -} - -div.footer a { - color: #A0E9FF; -} - -div.body { - margin: 0 auto 0 auto; - padding: 20px; - width: 460px; - background-color: #98CE24; - color: black; -} - -div.body h2 { - margin: 0 0 0.5em 0; - text-align: center; -} - -div.body input { - margin: 0.2em 0 0.2em 0; - font-family: 'Lucida Sans', 'Verdana', sans-serif; - font-size: 20px; - background-color: #CCEB98; - color: black; -} - -div.body #url { - width: 400px; -} - -div.body #alias { - width: 300px; - margin-right: 10px; -} - -div.body #submit { - width: 90px; -} - -div.body p { - margin: 0; - padding: 0.2em 0 0.2em 0; -} - -div.body ul { - margin: 1em 0 1em 0; - padding: 0; - list-style: none; -} - -div.error { - margin: 1em 0 1em 0; - border: 2px solid #AC0202; - background-color: #9E0303; - font-weight: bold; - color: white; -} - -div.pagination { - font-size: 13px; -} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/display.html b/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/display.html deleted file mode 100644 index 83d5685946..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/display.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends 'layout.html' %} -{% block body %} -

Shortened URL

-

- The URL {{ url.target|urlize(40, true) }} - was shortened to {{ url.short_url|urlize }}. -

-{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/layout.html b/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/layout.html deleted file mode 100644 index 8715740e3d..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/layout.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - Shorty - - - -

Shorty

-
{% block body %}{% endblock %}
- - - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/list.html b/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/list.html deleted file mode 100644 index 6dd7dffed9..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/list.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends 'layout.html' %} -{% block body %} -

List of URLs

-
    - {%- for url in pagination.entries %} -
  • {{ url.uid|e }} » - {{ url.target|urlize(38, true) }}
  • - {%- else %} -
  • no URLs shortened yet
  • - {%- endfor %} -
- -{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/new.html b/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/new.html deleted file mode 100644 index 8a5de5818b..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/new.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends 'layout.html' %} -{% block body %} -

Create a Shorty-URL!

- {% if error %}
{{ error }}
{% endif %} -
-

Enter the URL you want to shorten

-

-

Optionally you can give the URL a memorable name

-

{# - #}

-

-

-
-{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/not_found.html b/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/not_found.html deleted file mode 100644 index bd45566845..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shorty/templates/not_found.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends 'layout.html' %} -{% block body %} -

Page Not Found

-

- The page you have requested does not exist on this server. What about - adding a new URL? -

-{% endblock %} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shorty/utils.py b/pythonPackages/Werkzeug-0.12.1/examples/shorty/utils.py deleted file mode 100644 index fdcbda39de..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shorty/utils.py +++ /dev/null @@ -1,74 +0,0 @@ -from os import path -from urlparse import urlparse -from random import sample, randrange -from jinja2 import Environment, FileSystemLoader -from werkzeug.local import Local, LocalManager -from werkzeug.utils import cached_property -from werkzeug.wrappers import Response -from werkzeug.routing import Map, Rule -from sqlalchemy import MetaData -from sqlalchemy.orm import create_session, scoped_session - - -TEMPLATE_PATH = path.join(path.dirname(__file__), 'templates') -STATIC_PATH = path.join(path.dirname(__file__), 'static') -ALLOWED_SCHEMES = frozenset(['http', 'https', 'ftp', 'ftps']) -URL_CHARS = 'abcdefghijkmpqrstuvwxyzABCDEFGHIJKLMNPQRST23456789' - -local = Local() -local_manager = LocalManager([local]) -application = local('application') - -metadata = MetaData() -url_map = Map([Rule('/static/', endpoint='static', build_only=True)]) - -session = scoped_session(lambda: create_session(application.database_engine, - autocommit=False, - autoflush=False)) -jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_PATH)) - - -def expose(rule, **kw): - def decorate(f): - kw['endpoint'] = f.__name__ - url_map.add(Rule(rule, **kw)) - return f - return decorate - -def url_for(endpoint, _external=False, **values): - return local.url_adapter.build(endpoint, values, force_external=_external) -jinja_env.globals['url_for'] = url_for - -def render_template(template, **context): - return Response(jinja_env.get_template(template).render(**context), - mimetype='text/html') - -def validate_url(url): - return urlparse(url)[0] in ALLOWED_SCHEMES - -def get_random_uid(): - return ''.join(sample(URL_CHARS, randrange(3, 9))) - - -class Pagination(object): - - def __init__(self, query, per_page, page, endpoint): - self.query = query - self.per_page = per_page - self.page = page - self.endpoint = endpoint - - @cached_property - def count(self): - return self.query.count() - - @cached_property - def entries(self): - return self.query.offset((self.page - 1) * self.per_page) \ - .limit(self.per_page).all() - - has_previous = property(lambda x: x.page > 1) - has_next = property(lambda x: x.page < x.pages) - previous = property(lambda x: url_for(x.endpoint, page=x.page - 1)) - next = property(lambda x: url_for(x.endpoint, page=x.page + 1)) - pages = property(lambda x: max(0, x.count - 1) // x.per_page + 1) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/shorty/views.py b/pythonPackages/Werkzeug-0.12.1/examples/shorty/views.py deleted file mode 100644 index fa4269a3ac..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/shorty/views.py +++ /dev/null @@ -1,52 +0,0 @@ -from werkzeug.utils import redirect -from werkzeug.exceptions import NotFound -from shorty.utils import session, Pagination, render_template, expose, \ - validate_url, url_for -from shorty.models import URL - -@expose('/') -def new(request): - error = url = '' - if request.method == 'POST': - url = request.form.get('url') - alias = request.form.get('alias') - if not validate_url(url): - error = "I'm sorry but you cannot shorten this URL." - elif alias: - if len(alias) > 140: - error = 'Your alias is too long' - elif '/' in alias: - error = 'Your alias might not include a slash' - elif URL.query.get(alias): - error = 'The alias you have requested exists already' - if not error: - uid = URL(url, 'private' not in request.form, alias).uid - session.commit() - return redirect(url_for('display', uid=uid)) - return render_template('new.html', error=error, url=url) - -@expose('/display/') -def display(request, uid): - url = URL.query.get(uid) - if not url: - raise NotFound() - return render_template('display.html', url=url) - -@expose('/u/') -def link(request, uid): - url = URL.query.get(uid) - if not url: - raise NotFound() - return redirect(url.target, 301) - -@expose('/list/', defaults={'page': 1}) -@expose('/list/') -def list(request, page): - query = URL.query.filter_by(public=True) - pagination = Pagination(query, 30, page, 'list') - if pagination.page > 1 and not pagination.entries: - raise NotFound() - return render_template('list.html', pagination=pagination) - -def not_found(request): - return render_template('not_found.html') diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/__init__.py b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/__init__.py deleted file mode 100644 index 06ebea91b4..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -""" - simplewiki - ~~~~~~~~~~ - - Very simple wiki application based on Genshi, Werkzeug and SQLAlchemy. - Additionally the creoleparser is used for the wiki markup. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -from simplewiki.application import SimpleWiki diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/actions.py b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/actions.py deleted file mode 100644 index 2078c29375..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/actions.py +++ /dev/null @@ -1,187 +0,0 @@ -# -*- coding: utf-8 -*- -""" - simplewiki.actions - ~~~~~~~~~~~~~~~~~~ - - The per page actions. The actions are defined in the URL with the - `action` parameter and directly dispatched to the functions in this - module. In the module the actions are prefixed with 'on_', so be - careful not to name any other objects in the module with the same - prefix unless you want to act them as actions. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -from difflib import unified_diff -from simplewiki.utils import Response, generate_template, parse_creole, \ - href, redirect, format_datetime -from simplewiki.database import RevisionedPage, Page, Revision, session - - -def on_show(request, page_name): - """Displays the page the user requests.""" - revision_id = request.args.get('rev', type=int) - query = RevisionedPage.query.filter_by(name=page_name) - if revision_id: - query = query.filter_by(revision_id=revision_id) - revision_requested = True - else: - query = query.order_by(RevisionedPage.revision_id.desc()) - revision_requested = False - page = query.first() - if page is None: - return page_missing(request, page_name, revision_requested) - return Response(generate_template('action_show.html', - page=page - )) - - -def on_edit(request, page_name): - """Edit the current revision of a page.""" - change_note = error = '' - revision = Revision.query.filter( - (Page.name == page_name) & - (Page.page_id == Revision.page_id) - ).order_by(Revision.revision_id.desc()).first() - if revision is None: - page = None - else: - page = revision.page - - if request.method == 'POST': - text = request.form.get('text') - if request.form.get('cancel') or \ - revision and revision.text == text: - return redirect(href(page.name)) - elif not text: - error = 'You cannot save empty revisions.' - else: - change_note = request.form.get('change_note', '') - if page is None: - page = Page(page_name) - session.add(page) - session.add(Revision(page, text, change_note)) - session.commit() - return redirect(href(page.name)) - - return Response(generate_template('action_edit.html', - revision=revision, - page=page, - new=page is None, - page_name=page_name, - change_note=change_note, - error=error - )) - - -def on_log(request, page_name): - """Show the list of recent changes.""" - page = Page.query.filter_by(name=page_name).first() - if page is None: - return page_missing(request, page_name, False) - return Response(generate_template('action_log.html', - page=page - )) - - -def on_diff(request, page_name): - """Show the diff between two revisions.""" - old = request.args.get('old', type=int) - new = request.args.get('new', type=int) - error = '' - diff = page = old_rev = new_rev = None - - if not (old and new): - error = 'No revisions specified.' - else: - revisions = dict((x.revision_id, x) for x in Revision.query.filter( - (Revision.revision_id.in_((old, new))) & - (Revision.page_id == Page.page_id) & - (Page.name == page_name) - )) - if len(revisions) != 2: - error = 'At least one of the revisions requested ' \ - 'does not exist.' - else: - new_rev = revisions[new] - old_rev = revisions[old] - page = old_rev.page - diff = unified_diff( - (old_rev.text + '\n').splitlines(True), - (new_rev.text + '\n').splitlines(True), - page.name, page.name, - format_datetime(old_rev.timestamp), - format_datetime(new_rev.timestamp), - 3 - ) - - return Response(generate_template('action_diff.html', - error=error, - old_revision=old_rev, - new_revision=new_rev, - page=page, - diff=diff - )) - - -def on_revert(request, page_name): - """Revert an old revision.""" - rev_id = request.args.get('rev', type=int) - - old_revision = page = None - error = 'No such revision' - - if request.method == 'POST' and request.form.get('cancel'): - return redirect(href(page_name)) - - if rev_id: - old_revision = Revision.query.filter( - (Revision.revision_id == rev_id) & - (Revision.page_id == Page.page_id) & - (Page.name == page_name) - ).first() - if old_revision: - new_revision = Revision.query.filter( - (Revision.page_id == Page.page_id) & - (Page.name == page_name) - ).order_by(Revision.revision_id.desc()).first() - if old_revision == new_revision: - error = 'You tried to revert the current active ' \ - 'revision.' - elif old_revision.text == new_revision.text: - error = 'There are no changes between the current ' \ - 'revision and the revision you want to ' \ - 'restore.' - else: - error = '' - page = old_revision.page - if request.method == 'POST': - change_note = request.form.get('change_note', '') - change_note = 'revert' + (change_note and ': ' + - change_note or '') - session.add(Revision(page, old_revision.text, - change_note)) - session.commit() - return redirect(href(page_name)) - - return Response(generate_template('action_revert.html', - error=error, - old_revision=old_revision, - page=page - )) - - -def page_missing(request, page_name, revision_requested, protected=False): - """Displayed if page or revision does not exist.""" - return Response(generate_template('page_missing.html', - page_name=page_name, - revision_requested=revision_requested, - protected=protected - ), status=404) - - -def missing_action(request, action): - """Displayed if a user tried to access a action that does not exist.""" - return Response(generate_template('missing_action.html', - action=action - ), status=404) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/application.py b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/application.py deleted file mode 100644 index c8f3bbc8dd..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/application.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding: utf-8 -*- -""" - simplewiki.application - ~~~~~~~~~~~~~~~~~~~~~~ - - This module implements the wiki WSGI application which dispatches - requests to specific wiki pages and actions. - - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -from os import path -from sqlalchemy import create_engine -from werkzeug.utils import redirect -from werkzeug.wsgi import ClosingIterator, SharedDataMiddleware -from simplewiki.utils import Request, Response, local, local_manager, href -from simplewiki.database import session, metadata -from simplewiki import actions -from simplewiki.specialpages import pages, page_not_found - - -#: path to shared data -SHARED_DATA = path.join(path.dirname(__file__), 'shared') - - -class SimpleWiki(object): - """ - Our central WSGI application. - """ - - def __init__(self, database_uri): - self.database_engine = create_engine(database_uri) - - # apply our middlewares. we apply the middlewars *inside* the - # application and not outside of it so that we never lose the - # reference to the `SimpleWiki` object. - self._dispatch = SharedDataMiddleware(self.dispatch_request, { - '/_shared': SHARED_DATA - }) - - # free the context locals at the end of the request - self._dispatch = local_manager.make_middleware(self._dispatch) - - def init_database(self): - """Called from the management script to generate the db.""" - metadata.create_all(bind=self.database_engine) - - def bind_to_context(self): - """ - Useful for the shell. Binds the application to the current active - context. It's automatically called by the shell command. - """ - local.application = self - - def dispatch_request(self, environ, start_response): - """Dispatch an incoming request.""" - # set up all the stuff we want to have for this request. That is - # creating a request object, propagating the application to the - # current context and instanciating the database session. - self.bind_to_context() - request = Request(environ) - request.bind_to_context() - - # get the current action from the url and normalize the page name - # which is just the request path - action_name = request.args.get('action') or 'show' - page_name = u'_'.join([x for x in request.path.strip('/') - .split() if x]) - - # redirect to the Main_Page if the user requested the index - if not page_name: - response = redirect(href('Main_Page')) - - # check special pages - elif page_name.startswith('Special:'): - if page_name[8:] not in pages: - response = page_not_found(request, page_name) - else: - response = pages[page_name[8:]](request) - - # get the callback function for the requested action from the - # action module. It's "on_" + the action name. If it doesn't - # exists call the missing_action method from the same module. - else: - action = getattr(actions, 'on_' + action_name, None) - if action is None: - response = actions.missing_action(request, action_name) - else: - response = action(request, page_name) - - # make sure the session is removed properly - return ClosingIterator(response(environ, start_response), - session.remove) - - def __call__(self, environ, start_response): - """Just forward a WSGI call to the first internal middleware.""" - return self._dispatch(environ, start_response) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/database.py b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/database.py deleted file mode 100644 index 03991fa398..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/database.py +++ /dev/null @@ -1,131 +0,0 @@ -# -*- coding: utf-8 -*- -""" - simplewiki.database - ~~~~~~~~~~~~~~~~~~~ - - The database. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -from datetime import datetime -from sqlalchemy import Table, Column, Integer, String, DateTime, \ - ForeignKey, MetaData, join -from sqlalchemy.orm import relation, create_session, scoped_session, \ - mapper -from simplewiki.utils import application, local_manager, parse_creole - - -# create a global metadata -metadata = MetaData() - - -def new_db_session(): - """ - This function creates a new session if there is no session yet for - the current context. It looks up the application and if it finds - one it creates a session bound to the active database engine in that - application. If there is no application bound to the context it - raises an exception. - """ - return create_session(application.database_engine, autoflush=True, - autocommit=False) - - -# and create a new global session factory. Calling this object gives -# you the current active session -session = scoped_session(new_db_session, local_manager.get_ident) - - -# our database tables. -page_table = Table('pages', metadata, - Column('page_id', Integer, primary_key=True), - Column('name', String(60), unique=True) -) - -revision_table = Table('revisions', metadata, - Column('revision_id', Integer, primary_key=True), - Column('page_id', Integer, ForeignKey('pages.page_id')), - Column('timestamp', DateTime), - Column('text', String), - Column('change_note', String(200)) -) - - -class Revision(object): - """ - Represents one revision of a page. - This is useful for editing particular revision of pages or creating - new revisions. It's also used for the diff system and the revision - log. - """ - query = session.query_property() - - def __init__(self, page, text, change_note='', timestamp=None): - if isinstance(page, (int, long)): - self.page_id = page - else: - self.page = page - self.text = text - self.change_note = change_note - self.timestamp = timestamp or datetime.utcnow() - - def render(self): - """Render the page text into a genshi stream.""" - return parse_creole(self.text) - - def __repr__(self): - return '<%s %r:%r>' % ( - self.__class__.__name__, - self.page_id, - self.revision_id - ) - - -class Page(object): - """ - Represents a simple page without any revisions. This is for example - used in the page index where the page contents are not relevant. - """ - query = session.query_property() - - def __init__(self, name): - self.name = name - - @property - def title(self): - return self.name.replace('_', ' ') - - def __repr__(self): - return '<%s %r>' % (self.__class__.__name__, self.name) - - -class RevisionedPage(Page, Revision): - """ - Represents a wiki page with a revision. Thanks to multiple inhertiance - and the ability of SQLAlchemy to map to joins we can combine `Page` and - `Revision` into one class here. - """ - query = session.query_property() - - def __init__(self): - raise TypeError('cannot create WikiPage instances, use the Page and ' - 'Revision classes for data manipulation.') - - def __repr__(self): - return '<%s %r:%r>' % ( - self.__class__.__name__, - self.name, - self.revision_id - ) - - -# setup mappers -mapper(Revision, revision_table) -mapper(Page, page_table, properties=dict( - revisions=relation(Revision, backref='page', - order_by=Revision.revision_id.desc()) -)) -mapper(RevisionedPage, join(page_table, revision_table), properties=dict( - page_id=[page_table.c.page_id, revision_table.c.page_id], -)) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/shared/style.css b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/shared/style.css deleted file mode 100644 index be03246814..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/shared/style.css +++ /dev/null @@ -1,210 +0,0 @@ -body { - font-family: 'Luxi Sans', 'Lucida Sans', 'Trebuchet MS', sans-serif; - margin: 2em 1em 2em 1em; - padding: 0; - background: #1C0424; -} - -a { - color: #6A2F7E; -} - -a:hover { - color: #3D0F4D; -} - -pre { - border: 1px solid #ccc; - background-color: white; - font-family: 'Consolas', 'Monaco', 'Bitstream Vera Sans', monospace; - font-size: 0.9em; - padding: 0.3em; -} - -table { - border: 2px solid #ccc; - border-collapse: collapse; -} - -table td, table th { - border: 1px solid #ccc; - padding: 0.4em; -} - -div.bodywrapper { - margin: 0 auto 0 auto; - max-width: 50em; - background: #F1EBF3; - border: 1px solid #4C1068; - padding: 0; - color: #111; -} - -div.header { - background-color: #320846; - color: white; -} - -div.header h1 { - margin: 0; - padding: 0.4em; - font-size: 1.7em; -} - -div.header h1 a { - text-decoration: none; - color: white; -} - -div.header h1 a:hover { - color: #6A2F7E; -} - -div.contents { - padding: 1em; - margin: 0; - border: 1px solid #3D0F4D; -} - -div.footer { - padding: 0.5em; - background: #15031B; - color: white; - font-size: 0.8em; - text-align: right; - color: white; -} - -div.contents h1, div.contents h2, div.contents h3, div.contents h4, -div.contents h5 { - margin: 0; - padding: 0.3em 0 0.2em 0; - color: #3D0F4D; -} - -div.contents h1 { font-size: 1.7em; } -div.contents h2 { font-size: 1.6em; } -div.contents h3 { font-size: 1.4em; } -div.contents h4 { font-size: 1.2em; } -div.contents h5 { font-size: 1em; } - -div.contents p { - margin: 0; - padding: 0.3em 0 0.3em 0; - line-height: 1.5em; -} - -div.contents div.navigation { - padding: 0 0 0.3em 0; - margin: 0 0 0.3em 0; - border-bottom: 1px solid #6A2F7E; - font-size: 0.85em; - color: #555; -} - -div.contents div.navigation a { - padding: 0 0.2em 0 0.2em; - font-weight: bold; - color: #555; -} - -div.contents div.navigation a:hover { - color: #6A2F7E; -} - -div.contents div.navigation a.active { - background-color: #ccc; - text-decoration: none; -} - -div.contents div.page_meta { - font-size: 0.7em; - color: #555; - float: right; -} - -textarea { - width: 99%; - font-family: 'Consolas', 'Monaco', 'Bitstream Vera Sans', monospace; - font-size: 0.9em; - padding: 0.3em; - margin: 0.5em 0 0.5em 0; -} - -input { - font-family: 'Luxi Sans', 'Lucida Sans', 'Trebuchet MS', sans-serif; -} - -table.revisions, table.changes { - border-collapse: collapse; - border: 1px solid #6A2F7E; - background: #fdfdfd; - width: 100%; - margin: 1em 0 0.5em 0; -} - -table.revisions th, table.changes th { - background-color: #6A2F7E; - color: white; - padding: 0.1em 0.6em 0.1em 0.6em; - font-size: 0.8em; - border: none; -} - -table.revisions td, table.changes td { - padding: 0.2em 0.5em 0.2em 0.5em; - font-size: 0.9em; - border: none; -} - -table.revisions .timestamp, table.changes .timestamp { - text-align: left; - width: 10em; -} - -table.revisions td.timestamp, table.changes td.timestamp { - color: #444; -} - -table.revisions .change_note, table.changes .change_note { - text-align: left; -} - -table.revisions td.change_note, table.changes td.change_note { - font-style: italic; -} - -table.revisions th.diff input { - background-color: #3D0F4D; - color: white; - border: 1px solid #1C0424; -} - -table.revisions .diff { - width: 5em; - text-align: right; -} - -table.revisions .actions { - width: 8em; - text-align: left; -} - -table.revisions td.actions { - font-size: 0.75em; -} - -table.revisions tr.odd, table.changes tr.odd { - background-color: #f7f7f7; -} - -pre.udiff { - overflow: auto; - font-size: 0.75em; -} - -div.pagination { - font-size: 0.9em; - padding: 0.5em 0 0.5em 0; - text-align: center; -} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/specialpages.py b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/specialpages.py deleted file mode 100644 index 218e762b65..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/specialpages.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -""" - simplewiki.specialpages - ~~~~~~~~~~~~~~~~~~~~~~~ - - This module contains special pages such as the recent changes page. - - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -from simplewiki.utils import Response, Pagination, generate_template, href -from simplewiki.database import RevisionedPage, Page -from simplewiki.actions import page_missing - - - -def page_index(request): - """Index of all pages.""" - letters = {} - for page in Page.query.order_by(Page.name): - letters.setdefault(page.name.capitalize()[0], []).append(page) - return Response(generate_template('page_index.html', - letters=sorted(letters.items()) - )) - - -def recent_changes(request): - """Display the recent changes.""" - page = max(1, request.args.get('page', type=int)) - query = RevisionedPage.query \ - .order_by(RevisionedPage.revision_id.desc()) - return Response(generate_template('recent_changes.html', - pagination=Pagination(query, 20, page, 'Special:Recent_Changes') - )) - - -def page_not_found(request, page_name): - """ - Displays an error message if a user tried to access - a not existing special page. - """ - return page_missing(request, page_name, True) - - -pages = { - 'Index': page_index, - 'Recent_Changes': recent_changes -} diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_diff.html b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_diff.html deleted file mode 100644 index 4a8edf87f9..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_diff.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - View Diff - - - -

Diff for “${page.title}

-

- Below you can see the differences between the revision from - ${format_datetime(old_revision.timestamp)} and the - revision from ${format_datetime(new_revision.timestamp)} in unified - diff format. -

-
${diff}
-
- -

Cannot Display Diff

-

${error}

-
- - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_edit.html b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_edit.html deleted file mode 100644 index d1efbcb2dc..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_edit.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - ${new and 'Create' or 'Edit'} Page - - -

${new and 'Create' or 'Edit'} “${page.title or page_name}”

-

- You can now ${new and 'create' or 'modify'} the page contents. To - format your text you can use creole markup. -

-

${error}

-
-

-
- - - -
-
- - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_log.html b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_log.html deleted file mode 100644 index 9cef6f63c9..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_log.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - Revisions for “${page.title}” - - -

Revisions for “${page.title}

-

- In this list you can see all the revisions of the requested page. -

-
- - - - - - - - - - - - - - -
DateChange NoteActions
${format_datetime(revision.timestamp)}${revision.change_note} - - - - show - | - revert - -
-
- - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_revert.html b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_revert.html deleted file mode 100644 index e7194e7689..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_revert.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - Revert Old Revision - - - -

Revert Old Revision of “${page.title}

-

- If you want to restore the old revision from - ${format_datetime(old_revision.timestamp)} enter your change - note and click “Revert”. -

-
-
- - - -
-
-
- -

Cannot Revert

-

${error}

-
- - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_show.html b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_show.html deleted file mode 100644 index caaf8d254b..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/action_show.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - ${page.title} - - - ${page.render()} - - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/layout.html b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/layout.html deleted file mode 100644 index 0762cab9fe..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/layout.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - <py:if - test="title">${title} — </py:if>SimpleWiki - - ${select('*[local-name()!="title"]')} - - - - -
- -
-
- This revision - was created on ${format_datetime(page.timestamp)}. -
- - ${select('*|text()')} -
- -
- -
- diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/macros.xml b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/macros.xml deleted file mode 100644 index 14bebd83b3..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/macros.xml +++ /dev/null @@ -1,18 +0,0 @@ -
- - - - - -
diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/missing_action.html b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/missing_action.html deleted file mode 100644 index 4051317e4c..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/missing_action.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - Action Not Found - - -

Action “${action}” Not Found

-

The requested action does not exist.

-

Try to access the same URL without parameters.

- - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/page_index.html b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/page_index.html deleted file mode 100644 index 7c0a463f9a..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/page_index.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - Index - - -

Index

- -

${letter}

- -
- - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/page_missing.html b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/page_missing.html deleted file mode 100644 index c352c4b4ea..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/page_missing.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - Page Not Found - - -

Page Not Found

-

The page you requested does not exist.

-

- It also could be that there is no such revision of that page. -

-

- Feel free to create such a page. -

-

- Although this page does not exist by now you cannot create it because - the system protected the page name for future use. -

- - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/recent_changes.html b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/recent_changes.html deleted file mode 100644 index 51657923be..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/templates/recent_changes.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - Recent Changes - - -

Recent Changes

- - - - - - - - - - - -
DatePageChange Note
${format_datetime(entry.timestamp)}${entry.title}${entry.change_note}
- ${render_pagination(pagination)} - - diff --git a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/utils.py b/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/utils.py deleted file mode 100644 index 1f24a19e4c..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/simplewiki/utils.py +++ /dev/null @@ -1,147 +0,0 @@ -# -*- coding: utf-8 -*- -""" - simplewiki.utils - ~~~~~~~~~~~~~~~~ - - This module implements various utility functions and classes used all - over the application. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -import difflib -import creoleparser -from os import path -from genshi import Stream -from genshi.template import TemplateLoader -from werkzeug.local import Local, LocalManager -from werkzeug.urls import url_encode, url_quote -from werkzeug.utils import cached_property, redirect -from werkzeug.wrappers import BaseRequest, BaseResponse - - -# calculate the path to the templates an create the template loader -TEMPLATE_PATH = path.join(path.dirname(__file__), 'templates') -template_loader = TemplateLoader(TEMPLATE_PATH, auto_reload=True, - variable_lookup='lenient') - - -# context locals. these two objects are use by the application to -# bind objects to the current context. A context is defined as the -# current thread and the current greenlet if there is greenlet support. -local = Local() -local_manager = LocalManager([local]) -request = local('request') -application = local('application') - -# create a new creole parser -creole_parser = creoleparser.Parser( - dialect=creoleparser.create_dialect(creoleparser.creole10_base, - wiki_links_base_url='', - wiki_links_path_func=lambda page_name: href(page_name), - wiki_links_space_char='_', - no_wiki_monospace=True - ), - method='html' -) - - -def generate_template(template_name, **context): - """Load and generate a template.""" - context.update( - href=href, - format_datetime=format_datetime - ) - return template_loader.load(template_name).generate(**context) - - -def parse_creole(markup): - """Parse some creole markup and create a genshi stream.""" - return creole_parser.generate(markup) - - -def href(*args, **kw): - """ - Simple function for URL generation. Position arguments are used for the - URL path and keyword arguments are used for the url parameters. - """ - result = [(request and request.script_root or '') + '/'] - for idx, arg in enumerate(args): - result.append((idx and '/' or '') + url_quote(arg)) - if kw: - result.append('?' + url_encode(kw)) - return ''.join(result) - - -def format_datetime(obj): - """Format a datetime object.""" - return obj.strftime('%Y-%m-%d %H:%M') - - -class Request(BaseRequest): - """ - Simple request subclass that allows to bind the object to the - current context. - """ - - def bind_to_context(self): - local.request = self - - -class Response(BaseResponse): - """ - Encapsulates a WSGI response. Unlike the default response object werkzeug - provides, this accepts a genshi stream and will automatically render it - to html. This makes it possible to switch to xhtml or html5 easily. - """ - - default_mimetype = 'text/html' - - def __init__(self, response=None, status=200, headers=None, mimetype=None, - content_type=None): - if isinstance(response, Stream): - response = response.render('html', encoding=None, doctype='html') - BaseResponse.__init__(self, response, status, headers, mimetype, - content_type) - - -class Pagination(object): - """ - Paginate a SQLAlchemy query object. - """ - - def __init__(self, query, per_page, page, link): - self.query = query - self.per_page = per_page - self.page = page - self.link = link - self._count = None - - @cached_property - def entries(self): - return self.query.offset((self.page - 1) * self.per_page) \ - .limit(self.per_page).all() - - @property - def has_previous(self): - return self.page > 1 - - @property - def has_next(self): - return self.page < self.pages - - @property - def previous(self): - return href(self.link, page=self.page - 1) - - @property - def next(self): - return href(self.link, page=self.page + 1) - - @cached_property - def count(self): - return self.query.count() - - @property - def pages(self): - return max(0, self.count - 1) // self.per_page + 1 diff --git a/pythonPackages/Werkzeug-0.12.1/examples/upload.py b/pythonPackages/Werkzeug-0.12.1/examples/upload.py deleted file mode 100644 index 7c8395f06a..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/upload.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python -""" - Simple Upload Application - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - All uploaded files are directly send back to the client. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from werkzeug.serving import run_simple -from werkzeug.wrappers import BaseRequest, BaseResponse -from werkzeug.wsgi import wrap_file - - -def view_file(req): - if not 'uploaded_file' in req.files: - return BaseResponse('no file uploaded') - f = req.files['uploaded_file'] - return BaseResponse(wrap_file(req.environ, f), mimetype=f.content_type, - direct_passthrough=True) - - -def upload_file(req): - return BaseResponse(''' -

Upload File

-
- - -
- ''', mimetype='text/html') - - -def application(environ, start_response): - req = BaseRequest(environ) - if req.method == 'POST': - resp = view_file(req) - else: - resp = upload_file(req) - return resp(environ, start_response) - - -if __name__ == '__main__': - run_simple('localhost', 5000, application, use_debugger=True) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/webpylike/example.py b/pythonPackages/Werkzeug-0.12.1/examples/webpylike/example.py deleted file mode 100644 index dc7ef7b767..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/webpylike/example.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Example application based on weblikepy - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - The application from th web.py tutorial. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -from webpylike import WebPyApp, View, Response - - -urls = ( - '/', 'index', - '/about', 'about' -) - - -class index(View): - def GET(self): - return Response('Hello World') - - -class about(View): - def GET(self): - return Response('This is the about page') - - -app = WebPyApp(urls, globals()) diff --git a/pythonPackages/Werkzeug-0.12.1/examples/webpylike/webpylike.py b/pythonPackages/Werkzeug-0.12.1/examples/webpylike/webpylike.py deleted file mode 100644 index 66f1957e52..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/examples/webpylike/webpylike.py +++ /dev/null @@ -1,69 +0,0 @@ -# -*- coding: utf-8 -*- -""" - webpylike - ~~~~~~~~~ - - This module implements web.py like dispatching. What this module does - not implement is a stream system that hooks into sys.stdout like web.py - provides. I consider this bad design. - - :copyright: (c) 2009 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD. -""" -import re -from werkzeug.wrappers import BaseRequest, BaseResponse -from werkzeug.exceptions import HTTPException, MethodNotAllowed, \ - NotImplemented, NotFound - - -class Request(BaseRequest): - """Encapsulates a request.""" - - -class Response(BaseResponse): - """Encapsulates a response.""" - - -class View(object): - """Baseclass for our views.""" - - def __init__(self, app, req): - self.app = app - self.req = req - - def GET(self): - raise MethodNotAllowed() - POST = DELETE = PUT = GET - - def HEAD(self): - return self.GET() - - -class WebPyApp(object): - """ - An interface to a web.py like application. It works like the web.run - function in web.py - """ - - def __init__(self, urls, views): - self.urls = [(re.compile('^%s$' % urls[i]), urls[i + 1]) - for i in xrange(0, len(urls), 2)] - self.views = views - - def __call__(self, environ, start_response): - try: - req = Request(environ) - for regex, view in self.urls: - match = regex.match(req.path) - if match is not None: - view = self.views[view](self, req) - if req.method not in ('GET', 'HEAD', 'POST', - 'DELETE', 'PUT'): - raise NotImplemented() - resp = getattr(view, req.method)(*match.groups()) - break - else: - raise NotFound() - except HTTPException, e: - resp = e - return resp(environ, start_response) diff --git a/pythonPackages/Werkzeug-0.12.1/setup.cfg b/pythonPackages/Werkzeug-0.12.1/setup.cfg deleted file mode 100644 index adcff6c3d6..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/setup.cfg +++ /dev/null @@ -1,22 +0,0 @@ -[aliases] -release = egg_info -RDb '' - -[tool:pytest] -norecursedirs = .* env* docs *.egg tests/hypothesis - -[bdist_wheel] -universal = 1 - -[metadata] -license_file = LICENSE - -[flake8] -ignore = E126,E241,E272,E305,E402,E731,W503 -exclude = .tox,examples,docs -max-line-length = 100 - -[egg_info] -tag_build = -tag_date = 0 -tag_svn_revision = 0 - diff --git a/pythonPackages/Werkzeug-0.12.1/setup.py b/pythonPackages/Werkzeug-0.12.1/setup.py deleted file mode 100644 index 76f770d487..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/setup.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Werkzeug -======== - -Werkzeug started as simple collection of various utilities for WSGI -applications and has become one of the most advanced WSGI utility -modules. It includes a powerful debugger, full featured request and -response objects, HTTP utilities to handle entity tags, cache control -headers, HTTP dates, cookie handling, file uploads, a powerful URL -routing system and a bunch of community contributed addon modules. - -Werkzeug is unicode aware and doesn't enforce a specific template -engine, database adapter or anything else. It doesn't even enforce -a specific way of handling requests and leaves all that up to the -developer. It's most useful for end user applications which should work -on as many server environments as possible (such as blogs, wikis, -bulletin boards, etc.). - -Details and example applications are available on the -`Werkzeug website `_. - - -Features --------- - -- unicode awareness - -- request and response objects - -- various utility functions for dealing with HTTP headers such as - `Accept` and `Cache-Control` headers. - -- thread local objects with proper cleanup at request end - -- an interactive debugger - -- A simple WSGI server with support for threading and forking - with an automatic reloader. - -- a flexible URL routing system with REST support. - -- fully WSGI compatible - - -Development Version -------------------- - -The Werkzeug development version can be installed by cloning the git -repository from `github`_:: - - git clone git@github.com:pallets/werkzeug.git - -.. _github: http://github.com/pallets/werkzeug -""" -import ast -import re -try: - from setuptools import setup, Command -except ImportError: - from distutils.core import setup, Command - - -_version_re = re.compile(r'__version__\s+=\s+(.*)') - -with open('werkzeug/__init__.py', 'rb') as f: - version = str(ast.literal_eval(_version_re.search( - f.read().decode('utf-8')).group(1))) - - -class TestCommand(Command): - user_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def run(self): - import pytest - pytest.cmdline.main(args=[]) - - -setup( - name='Werkzeug', - version=version, - url='http://werkzeug.pocoo.org/', - license='BSD', - author='Armin Ronacher', - author_email='armin.ronacher@active-4.com', - description='The Swiss Army knife of Python web development', - long_description=__doc__, - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Environment :: Web Environment', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: BSD License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.6', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', - 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', - 'Topic :: Software Development :: Libraries :: Python Modules' - ], - packages=['werkzeug', 'werkzeug.debug', 'werkzeug.contrib'], - extras_require={ - 'watchdog': ['watchdog'], - 'termcolor': ['termcolor'], - }, - cmdclass=dict(test=TestCommand), - include_package_data=True, - zip_safe=False, - platforms='any' -) diff --git a/pythonPackages/Werkzeug-0.12.1/tests/__init__.py b/pythonPackages/Werkzeug-0.12.1/tests/__init__.py deleted file mode 100644 index 2b32b12be9..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests - ~~~~~ - - Contains all test Werkzeug tests. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -from __future__ import with_statement - - -def strict_eq(x, y): - '''Equality test bypassing the implicit string conversion in Python 2''' - __tracebackhide__ = True - assert x == y - assert issubclass(type(x), type(y)) or issubclass(type(y), type(x)) - if isinstance(x, dict) and isinstance(y, dict): - x = sorted(x.items()) - y = sorted(y.items()) - elif isinstance(x, set) and isinstance(y, set): - x = sorted(x) - y = sorted(y) - assert repr(x) == repr(y) diff --git a/pythonPackages/Werkzeug-0.12.1/tests/conftest.py b/pythonPackages/Werkzeug-0.12.1/tests/conftest.py deleted file mode 100644 index 8d89ffab48..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/conftest.py +++ /dev/null @@ -1,165 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.conftest - ~~~~~~~~~~~~~~ - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" - -from __future__ import with_statement - -import os -import signal -import sys -import textwrap -import time - -import requests -import pytest - -from werkzeug import serving -from werkzeug.utils import cached_property -from werkzeug._compat import to_bytes - - -try: - __import__('pytest_xprocess') -except ImportError: - @pytest.fixture - def subprocess(): - pytest.skip('pytest-xprocess not installed.') -else: - @pytest.fixture - def subprocess(xprocess): - return xprocess - - -def _patch_reloader_loop(): - def f(x): - print('reloader loop finished') - return time.sleep(x) - - import werkzeug._reloader - werkzeug._reloader.ReloaderLoop._sleep = staticmethod(f) - - -def _get_pid_middleware(f): - def inner(environ, start_response): - if environ['PATH_INFO'] == '/_getpid': - start_response('200 OK', [('Content-Type', 'text/plain')]) - return [to_bytes(str(os.getpid()))] - return f(environ, start_response) - return inner - - -def _dev_server(): - _patch_reloader_loop() - sys.path.insert(0, sys.argv[1]) - import testsuite_app - app = _get_pid_middleware(testsuite_app.app) - serving.run_simple(hostname='localhost', application=app, - **testsuite_app.kwargs) - -if __name__ == '__main__': - _dev_server() - - -class _ServerInfo(object): - xprocess = None - addr = None - url = None - port = None - last_pid = None - - def __init__(self, xprocess, addr, url, port): - self.xprocess = xprocess - self.addr = addr - self.url = url - self.port = port - - @cached_property - def logfile(self): - return self.xprocess.getinfo('dev_server').logpath.open() - - def request_pid(self): - for i in range(20): - time.sleep(0.1 * i) - try: - self.last_pid = int(requests.get(self.url + '/_getpid', - verify=False).text) - return self.last_pid - except Exception as e: # urllib also raises socketerrors - print(self.url) - print(e) - return False - - def wait_for_reloader(self): - old_pid = self.last_pid - for i in range(20): - time.sleep(0.1 * i) - new_pid = self.request_pid() - if not new_pid: - raise RuntimeError('Server is down.') - if self.request_pid() != old_pid: - return - raise RuntimeError('Server did not reload.') - - def wait_for_reloader_loop(self): - for i in range(20): - time.sleep(0.1 * i) - line = self.logfile.readline() - if 'reloader loop finished' in line: - return - - -@pytest.fixture -def dev_server(tmpdir, subprocess, request, monkeypatch): - '''Run werkzeug.serving.run_simple in its own process. - - :param application: String for the module that will be created. The module - must have a global ``app`` object, a ``kwargs`` dict is also available - whose values will be passed to ``run_simple``. - ''' - def run_dev_server(application): - app_pkg = tmpdir.mkdir('testsuite_app') - appfile = app_pkg.join('__init__.py') - appfile.write('\n\n'.join(( - 'kwargs = dict(port=5001)', - textwrap.dedent(application) - ))) - - monkeypatch.delitem(sys.modules, 'testsuite_app', raising=False) - monkeypatch.syspath_prepend(str(tmpdir)) - import testsuite_app - port = testsuite_app.kwargs['port'] - - if testsuite_app.kwargs.get('ssl_context', None): - url_base = 'https://localhost:{0}'.format(port) - else: - url_base = 'http://localhost:{0}'.format(port) - - info = _ServerInfo( - subprocess, - 'localhost:{0}'.format(port), - url_base, - port - ) - - def preparefunc(cwd): - args = [sys.executable, __file__, str(tmpdir)] - return info.request_pid, args - - subprocess.ensure('dev_server', preparefunc, restart=True) - - def teardown(): - # Killing the process group that runs the server, not just the - # parent process attached. xprocess is confused about Werkzeug's - # reloader and won't help here. - pid = info.last_pid - os.killpg(os.getpgid(pid), signal.SIGTERM) - request.addfinalizer(teardown) - - return info - - return run_dev_server diff --git a/pythonPackages/Werkzeug-0.12.1/tests/contrib/__init__.py b/pythonPackages/Werkzeug-0.12.1/tests/contrib/__init__.py deleted file mode 100644 index 415dbd1226..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/contrib/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.contrib - ~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests the contrib modules. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" diff --git a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_atom.py b/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_atom.py deleted file mode 100644 index e79e6c68fd..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_atom.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.atom - ~~~~~~~~~~ - - Tests the cache system - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import datetime -import pytest - -from werkzeug.contrib.atom import format_iso8601, AtomFeed, FeedEntry - - -class TestAtomFeed(object): - """ - Testcase for the `AtomFeed` class - """ - - def test_atom_no_args(self): - with pytest.raises(ValueError): - AtomFeed() - - def test_atom_title_no_id(self): - with pytest.raises(ValueError): - AtomFeed(title='test_title') - - def test_atom_add_one(self): - a = AtomFeed(title='test_title', id=1) - f = FeedEntry( - title='test_title', id=1, updated=datetime.datetime.now()) - assert len(a.entries) == 0 - a.add(f) - assert len(a.entries) == 1 - - def test_atom_add_one_kwargs(self): - a = AtomFeed(title='test_title', id=1) - assert len(a.entries) == 0 - a.add(title='test_title', id=1, updated=datetime.datetime.now()) - assert len(a.entries) == 1 - assert isinstance(a.entries[0], FeedEntry) - - def test_atom_to_str(self): - updated_time = datetime.datetime.now() - expected_repr = ''' - - - test_title - 1 - %s - Werkzeug - - ''' % format_iso8601(updated_time) - a = AtomFeed(title='test_title', id=1, updated=updated_time) - assert str(a).strip().replace(' ', '') == \ - expected_repr.strip().replace(' ', '') - - -class TestFeedEntry(object): - """ - Test case for the `FeedEntry` object - """ - - def test_feed_entry_no_args(self): - with pytest.raises(ValueError): - FeedEntry() - - def test_feed_entry_no_id(self): - with pytest.raises(ValueError): - FeedEntry(title='test_title') - - def test_feed_entry_no_updated(self): - with pytest.raises(ValueError): - FeedEntry(title='test_title', id=1) - - def test_feed_entry_to_str(self): - updated_time = datetime.datetime.now() - expected_feed_entry_str = ''' - - test_title - 1 - %s - - ''' % format_iso8601(updated_time) - - f = FeedEntry(title='test_title', id=1, updated=updated_time) - assert str(f).strip().replace(' ', '') == \ - expected_feed_entry_str.strip().replace(' ', '') - - -def test_format_iso8601(): - # naive datetime should be treated as utc - dt = datetime.datetime(2014, 8, 31, 2, 5, 6) - assert format_iso8601(dt) == '2014-08-31T02:05:06Z' - - # tz-aware datetime - dt = datetime.datetime(2014, 8, 31, 11, 5, 6, tzinfo=KST()) - assert format_iso8601(dt) == '2014-08-31T11:05:06+09:00' - - -class KST(datetime.tzinfo): - - """KST implementation for test_format_iso8601().""" - - def utcoffset(self, dt): - return datetime.timedelta(hours=9) - - def tzname(self, dt): - return 'KST' - - def dst(self, dt): - return datetime.timedelta(0) diff --git a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_cache.py b/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_cache.py deleted file mode 100644 index 5585ef4b45..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_cache.py +++ /dev/null @@ -1,269 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.cache - ~~~~~~~~~~~ - - Tests the cache system - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import pytest -import os -import random - -from werkzeug.contrib import cache - -try: - import redis -except ImportError: - redis = None - -try: - import pylibmc as memcache -except ImportError: - try: - from google.appengine.api import memcache - except ImportError: - try: - import memcache - except ImportError: - memcache = None - - -class CacheTests(object): - _can_use_fast_sleep = True - - @pytest.fixture - def make_cache(self): - '''Return a cache class or factory.''' - raise NotImplementedError() - - @pytest.fixture - def fast_sleep(self, monkeypatch): - if self._can_use_fast_sleep: - def sleep(delta): - orig_time = cache.time - monkeypatch.setattr(cache, 'time', lambda: orig_time() + delta) - - return sleep - else: - import time - return time.sleep - - @pytest.fixture - def c(self, make_cache): - '''Return a cache instance.''' - return make_cache() - - def test_generic_get_dict(self, c): - assert c.set('a', 'a') - assert c.set('b', 'b') - d = c.get_dict('a', 'b') - assert 'a' in d - assert 'a' == d['a'] - assert 'b' in d - assert 'b' == d['b'] - - def test_generic_set_get(self, c): - for i in range(3): - assert c.set(str(i), i * i) - for i in range(3): - result = c.get(str(i)) - assert result == i * i, result - - def test_generic_get_set(self, c): - assert c.set('foo', ['bar']) - assert c.get('foo') == ['bar'] - - def test_generic_get_many(self, c): - assert c.set('foo', ['bar']) - assert c.set('spam', 'eggs') - assert list(c.get_many('foo', 'spam')) == [['bar'], 'eggs'] - - def test_generic_set_many(self, c): - assert c.set_many({'foo': 'bar', 'spam': ['eggs']}) - assert c.get('foo') == 'bar' - assert c.get('spam') == ['eggs'] - - def test_generic_expire(self, c, fast_sleep): - assert c.set('foo', 'bar', 1) - fast_sleep(5) - assert c.get('foo') is None - - def test_generic_add(self, c): - # sanity check that add() works like set() - assert c.add('foo', 'bar') - assert c.get('foo') == 'bar' - assert not c.add('foo', 'qux') - assert c.get('foo') == 'bar' - - def test_generic_delete(self, c): - assert c.add('foo', 'bar') - assert c.get('foo') == 'bar' - assert c.delete('foo') - assert c.get('foo') is None - - def test_generic_delete_many(self, c): - assert c.add('foo', 'bar') - assert c.add('spam', 'eggs') - assert c.delete_many('foo', 'spam') - assert c.get('foo') is None - assert c.get('spam') is None - - def test_generic_inc_dec(self, c): - assert c.set('foo', 1) - assert c.inc('foo') == c.get('foo') == 2 - assert c.dec('foo') == c.get('foo') == 1 - assert c.delete('foo') - - def test_generic_true_false(self, c): - assert c.set('foo', True) - assert c.get('foo') in (True, 1) - assert c.set('bar', False) - assert c.get('bar') in (False, 0) - - def test_generic_no_timeout(self, c, fast_sleep): - # Timeouts of zero should cause the cache to never expire - c.set('foo', 'bar', 0) - fast_sleep(random.randint(1, 5)) - assert c.get('foo') == 'bar' - - def test_generic_timeout(self, c, fast_sleep): - # Check that cache expires when the timeout is reached - timeout = random.randint(1, 5) - c.set('foo', 'bar', timeout) - assert c.get('foo') == 'bar' - # sleep a bit longer than timeout to ensure there are no - # race conditions - fast_sleep(timeout + 5) - assert c.get('foo') is None - - def test_generic_has(self, c): - assert c.has('foo') in (False, 0) - assert c.has('spam') in (False, 0) - assert c.set('foo', 'bar') - assert c.has('foo') in (True, 1) - assert c.has('spam') in (False, 0) - c.delete('foo') - assert c.has('foo') in (False, 0) - assert c.has('spam') in (False, 0) - - -class TestSimpleCache(CacheTests): - - @pytest.fixture - def make_cache(self): - return cache.SimpleCache - - def test_purge(self): - c = cache.SimpleCache(threshold=2) - c.set('a', 'a') - c.set('b', 'b') - c.set('c', 'c') - c.set('d', 'd') - # Cache purges old items *before* it sets new ones. - assert len(c._cache) == 3 - - -class TestFileSystemCache(CacheTests): - - @pytest.fixture - def make_cache(self, tmpdir): - return lambda **kw: cache.FileSystemCache(cache_dir=str(tmpdir), **kw) - - def test_filesystemcache_prune(self, make_cache): - THRESHOLD = 13 - c = make_cache(threshold=THRESHOLD) - for i in range(2 * THRESHOLD): - assert c.set(str(i), i) - cache_files = os.listdir(c._path) - assert len(cache_files) <= THRESHOLD - - def test_filesystemcache_clear(self, c): - assert c.set('foo', 'bar') - cache_files = os.listdir(c._path) - assert len(cache_files) == 1 - assert c.clear() - cache_files = os.listdir(c._path) - assert len(cache_files) == 0 - - -# Don't use pytest marker -# https://bitbucket.org/hpk42/pytest/issue/568 -if redis is not None: - class TestRedisCache(CacheTests): - _can_use_fast_sleep = False - - @pytest.fixture(params=[ - ([], dict()), - ([redis.Redis()], dict()), - ([redis.StrictRedis()], dict()) - ]) - def make_cache(self, xprocess, request): - def preparefunc(cwd): - return 'server is now ready', ['redis-server'] - - xprocess.ensure('redis_server', preparefunc) - args, kwargs = request.param - c = cache.RedisCache(*args, key_prefix='werkzeug-test-case:', - **kwargs) - request.addfinalizer(c.clear) - return lambda: c - - def test_compat(self, c): - assert c._client.set(c.key_prefix + 'foo', 'Awesome') - assert c.get('foo') == b'Awesome' - assert c._client.set(c.key_prefix + 'foo', '42') - assert c.get('foo') == 42 - - -# Don't use pytest marker -# https://bitbucket.org/hpk42/pytest/issue/568 -if memcache is not None: - class TestMemcachedCache(CacheTests): - _can_use_fast_sleep = False - - @pytest.fixture - def make_cache(self, xprocess, request): - def preparefunc(cwd): - return '', ['memcached'] - - xprocess.ensure('memcached', preparefunc) - c = cache.MemcachedCache(key_prefix='werkzeug-test-case:') - request.addfinalizer(c.clear) - return lambda: c - - def test_compat(self, c): - assert c._client.set(c.key_prefix + 'foo', 'bar') - assert c.get('foo') == 'bar' - - def test_huge_timeouts(self, c): - # Timeouts greater than epoch are interpreted as POSIX timestamps - # (i.e. not relative to now, but relative to epoch) - import random - epoch = 2592000 - timeout = epoch + random.random() * 100 - c.set('foo', 'bar', timeout) - assert c.get('foo') == 'bar' - - -def _running_in_uwsgi(): - try: - import uwsgi # NOQA - except ImportError: - return False - else: - return True - - -@pytest.mark.skipif(not _running_in_uwsgi(), - reason="uWSGI module can't be imported outside of uWSGI") -class TestUWSGICache(CacheTests): - _can_use_fast_sleep = False - - @pytest.fixture - def make_cache(self, xprocess, request): - c = cache.UWSGICache(cache='werkzeugtest') - request.addfinalizer(c.clear) - return lambda: c diff --git a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_fixers.py b/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_fixers.py deleted file mode 100644 index 6998d15eeb..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_fixers.py +++ /dev/null @@ -1,186 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.fixers - ~~~~~~~~~~~~ - - Server / Browser fixers. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -from tests import strict_eq -from werkzeug.datastructures import ResponseCacheControl -from werkzeug.http import parse_cache_control_header - -from werkzeug.test import create_environ, Client -from werkzeug.wrappers import Request, Response -from werkzeug.contrib import fixers -from werkzeug.utils import redirect - - -@Request.application -def path_check_app(request): - return Response('PATH_INFO: %s\nSCRIPT_NAME: %s' % ( - request.environ.get('PATH_INFO', ''), - request.environ.get('SCRIPT_NAME', '') - )) - - -class TestServerFixer(object): - - def test_cgi_root_fix(self): - app = fixers.CGIRootFix(path_check_app) - response = Response.from_app( - app, - dict(create_environ(), - SCRIPT_NAME='/foo', - PATH_INFO='/bar', - SERVER_SOFTWARE='lighttpd/1.4.27')) - assert response.get_data() == b'PATH_INFO: /foo/bar\nSCRIPT_NAME: ' - - def test_cgi_root_fix_custom_app_root(self): - app = fixers.CGIRootFix(path_check_app, app_root='/baz/poop/') - response = Response.from_app( - app, - dict(create_environ(), - SCRIPT_NAME='/foo', - PATH_INFO='/bar')) - assert response.get_data() == b'PATH_INFO: /foo/bar\nSCRIPT_NAME: baz/poop' - - def test_path_info_from_request_uri_fix(self): - app = fixers.PathInfoFromRequestUriFix(path_check_app) - for key in 'REQUEST_URI', 'REQUEST_URL', 'UNENCODED_URL': - env = dict(create_environ(), SCRIPT_NAME='/test', PATH_INFO='/?????') - env[key] = '/test/foo%25bar?drop=this' - response = Response.from_app(app, env) - assert response.get_data() == b'PATH_INFO: /foo%bar\nSCRIPT_NAME: /test' - - def test_proxy_fix(self): - @Request.application - def app(request): - return Response('%s|%s' % ( - request.remote_addr, - # do not use request.host as this fixes too :) - request.environ['HTTP_HOST'] - )) - app = fixers.ProxyFix(app, num_proxies=2) - environ = dict( - create_environ(), - HTTP_X_FORWARDED_PROTO="https", - HTTP_X_FORWARDED_HOST='example.com', - HTTP_X_FORWARDED_FOR='1.2.3.4, 5.6.7.8', - REMOTE_ADDR='127.0.0.1', - HTTP_HOST='fake' - ) - - response = Response.from_app(app, environ) - - assert response.get_data() == b'1.2.3.4|example.com' - - # And we must check that if it is a redirection it is - # correctly done: - - redirect_app = redirect('/foo/bar.hml') - response = Response.from_app(redirect_app, environ) - - wsgi_headers = response.get_wsgi_headers(environ) - assert wsgi_headers['Location'] == 'https://example.com/foo/bar.hml' - - def test_proxy_fix_weird_enum(self): - @fixers.ProxyFix - @Request.application - def app(request): - return Response(request.remote_addr) - environ = dict( - create_environ(), - HTTP_X_FORWARDED_FOR=',', - REMOTE_ADDR='127.0.0.1', - ) - - response = Response.from_app(app, environ) - strict_eq(response.get_data(), b'127.0.0.1') - - def test_header_rewriter_fix(self): - @Request.application - def application(request): - return Response("", headers=[ - ('X-Foo', 'bar') - ]) - application = fixers.HeaderRewriterFix(application, ('X-Foo',), (('X-Bar', '42'),)) - response = Response.from_app(application, create_environ()) - assert response.headers['Content-Type'] == 'text/plain; charset=utf-8' - assert 'X-Foo' not in response.headers - assert response.headers['X-Bar'] == '42' - - -class TestBrowserFixer(object): - - def test_ie_fixes(self): - @fixers.InternetExplorerFix - @Request.application - def application(request): - response = Response('binary data here', mimetype='application/vnd.ms-excel') - response.headers['Vary'] = 'Cookie' - response.headers['Content-Disposition'] = 'attachment; filename=foo.xls' - return response - - c = Client(application, Response) - response = c.get('/', headers=[ - ('User-Agent', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)') - ]) - - # IE gets no vary - assert response.get_data() == b'binary data here' - assert 'vary' not in response.headers - assert response.headers['content-disposition'] == 'attachment; filename=foo.xls' - assert response.headers['content-type'] == 'application/vnd.ms-excel' - - # other browsers do - c = Client(application, Response) - response = c.get('/') - assert response.get_data() == b'binary data here' - assert 'vary' in response.headers - - cc = ResponseCacheControl() - cc.no_cache = True - - @fixers.InternetExplorerFix - @Request.application - def application(request): - response = Response('binary data here', mimetype='application/vnd.ms-excel') - response.headers['Pragma'] = ', '.join(pragma) - response.headers['Cache-Control'] = cc.to_header() - response.headers['Content-Disposition'] = 'attachment; filename=foo.xls' - return response - - # IE has no pragma or cache control - pragma = ('no-cache',) - c = Client(application, Response) - response = c.get('/', headers=[ - ('User-Agent', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)') - ]) - assert response.get_data() == b'binary data here' - assert 'pragma' not in response.headers - assert 'cache-control' not in response.headers - assert response.headers['content-disposition'] == 'attachment; filename=foo.xls' - - # IE has simplified pragma - pragma = ('no-cache', 'x-foo') - cc.proxy_revalidate = True - response = c.get('/', headers=[ - ('User-Agent', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)') - ]) - assert response.get_data() == b'binary data here' - assert response.headers['pragma'] == 'x-foo' - assert response.headers['cache-control'] == 'proxy-revalidate' - assert response.headers['content-disposition'] == 'attachment; filename=foo.xls' - - # regular browsers get everything - response = c.get('/') - assert response.get_data() == b'binary data here' - assert response.headers['pragma'] == 'no-cache, x-foo' - cc = parse_cache_control_header(response.headers['cache-control'], - cls=ResponseCacheControl) - assert cc.no_cache - assert cc.proxy_revalidate - assert response.headers['content-disposition'] == 'attachment; filename=foo.xls' diff --git a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_iterio.py b/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_iterio.py deleted file mode 100644 index f971277acd..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_iterio.py +++ /dev/null @@ -1,183 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.iterio - ~~~~~~~~~~~~ - - Tests the iterio object. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import pytest - -from tests import strict_eq -from werkzeug.contrib.iterio import IterIO, greenlet - - -class TestIterO(object): - - def test_basic_native(self): - io = IterIO(["Hello", "World", "1", "2", "3"]) - assert io.tell() == 0 - assert io.read(2) == "He" - assert io.tell() == 2 - assert io.read(3) == "llo" - assert io.tell() == 5 - io.seek(0) - assert io.read(5) == "Hello" - assert io.tell() == 5 - assert io._buf == "Hello" - assert io.read() == "World123" - assert io.tell() == 13 - io.close() - assert io.closed - - io = IterIO(["Hello\n", "World!"]) - assert io.readline() == 'Hello\n' - assert io._buf == 'Hello\n' - assert io.read() == 'World!' - assert io._buf == 'Hello\nWorld!' - assert io.tell() == 12 - io.seek(0) - assert io.readlines() == ['Hello\n', 'World!'] - - io = IterIO(['Line one\nLine ', 'two\nLine three']) - assert list(io) == ['Line one\n', 'Line two\n', 'Line three'] - io = IterIO(iter('Line one\nLine two\nLine three')) - assert list(io) == ['Line one\n', 'Line two\n', 'Line three'] - io = IterIO(['Line one\nL', 'ine', ' two', '\nLine three']) - assert list(io) == ['Line one\n', 'Line two\n', 'Line three'] - - io = IterIO(["foo\n", "bar"]) - io.seek(-4, 2) - assert io.read(4) == '\nbar' - - pytest.raises(IOError, io.seek, 2, 100) - io.close() - pytest.raises(ValueError, io.read) - - def test_basic_bytes(self): - io = IterIO([b"Hello", b"World", b"1", b"2", b"3"]) - assert io.tell() == 0 - assert io.read(2) == b"He" - assert io.tell() == 2 - assert io.read(3) == b"llo" - assert io.tell() == 5 - io.seek(0) - assert io.read(5) == b"Hello" - assert io.tell() == 5 - assert io._buf == b"Hello" - assert io.read() == b"World123" - assert io.tell() == 13 - io.close() - assert io.closed - - io = IterIO([b"Hello\n", b"World!"]) - assert io.readline() == b'Hello\n' - assert io._buf == b'Hello\n' - assert io.read() == b'World!' - assert io._buf == b'Hello\nWorld!' - assert io.tell() == 12 - io.seek(0) - assert io.readlines() == [b'Hello\n', b'World!'] - - io = IterIO([b"foo\n", b"bar"]) - io.seek(-4, 2) - assert io.read(4) == b'\nbar' - - pytest.raises(IOError, io.seek, 2, 100) - io.close() - pytest.raises(ValueError, io.read) - - def test_basic_unicode(self): - io = IterIO([u"Hello", u"World", u"1", u"2", u"3"]) - assert io.tell() == 0 - assert io.read(2) == u"He" - assert io.tell() == 2 - assert io.read(3) == u"llo" - assert io.tell() == 5 - io.seek(0) - assert io.read(5) == u"Hello" - assert io.tell() == 5 - assert io._buf == u"Hello" - assert io.read() == u"World123" - assert io.tell() == 13 - io.close() - assert io.closed - - io = IterIO([u"Hello\n", u"World!"]) - assert io.readline() == u'Hello\n' - assert io._buf == u'Hello\n' - assert io.read() == u'World!' - assert io._buf == u'Hello\nWorld!' - assert io.tell() == 12 - io.seek(0) - assert io.readlines() == [u'Hello\n', u'World!'] - - io = IterIO([u"foo\n", u"bar"]) - io.seek(-4, 2) - assert io.read(4) == u'\nbar' - - pytest.raises(IOError, io.seek, 2, 100) - io.close() - pytest.raises(ValueError, io.read) - - def test_sentinel_cases(self): - io = IterIO([]) - strict_eq(io.read(), '') - io = IterIO([], b'') - strict_eq(io.read(), b'') - io = IterIO([], u'') - strict_eq(io.read(), u'') - - io = IterIO([]) - strict_eq(io.read(), '') - io = IterIO([b'']) - strict_eq(io.read(), b'') - io = IterIO([u'']) - strict_eq(io.read(), u'') - - io = IterIO([]) - strict_eq(io.readline(), '') - io = IterIO([], b'') - strict_eq(io.readline(), b'') - io = IterIO([], u'') - strict_eq(io.readline(), u'') - - io = IterIO([]) - strict_eq(io.readline(), '') - io = IterIO([b'']) - strict_eq(io.readline(), b'') - io = IterIO([u'']) - strict_eq(io.readline(), u'') - - -@pytest.mark.skipif(greenlet is None, reason='Greenlet is not installed.') -class TestIterI(object): - - def test_basic(self): - def producer(out): - out.write('1\n') - out.write('2\n') - out.flush() - out.write('3\n') - iterable = IterIO(producer) - assert next(iterable) == '1\n2\n' - assert next(iterable) == '3\n' - pytest.raises(StopIteration, next, iterable) - - def test_sentinel_cases(self): - def producer_dummy_flush(out): - out.flush() - iterable = IterIO(producer_dummy_flush) - strict_eq(next(iterable), '') - - def producer_empty(out): - pass - iterable = IterIO(producer_empty) - pytest.raises(StopIteration, next, iterable) - - iterable = IterIO(producer_dummy_flush, b'') - strict_eq(next(iterable), b'') - iterable = IterIO(producer_dummy_flush, u'') - strict_eq(next(iterable), u'') diff --git a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_securecookie.py b/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_securecookie.py deleted file mode 100644 index 8a66136952..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_securecookie.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.securecookie - ~~~~~~~~~~~~~~~~~~ - - Tests the secure cookie. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -from werkzeug.utils import parse_cookie -from werkzeug.wrappers import Request, Response -from werkzeug.contrib.securecookie import SecureCookie - - -def test_basic_support(): - c = SecureCookie(secret_key=b'foo') - assert c.new - assert not c.modified - assert not c.should_save - c['x'] = 42 - assert c.modified - assert c.should_save - s = c.serialize() - - c2 = SecureCookie.unserialize(s, b'foo') - assert c is not c2 - assert not c2.new - assert not c2.modified - assert not c2.should_save - assert c2 == c - - c3 = SecureCookie.unserialize(s, b'wrong foo') - assert not c3.modified - assert not c3.new - assert c3 == {} - - -def test_wrapper_support(): - req = Request.from_values() - resp = Response() - c = SecureCookie.load_cookie(req, secret_key=b'foo') - assert c.new - c['foo'] = 42 - assert c.secret_key == b'foo' - c.save_cookie(resp) - - req = Request.from_values(headers={ - 'Cookie': 'session="%s"' % parse_cookie(resp.headers['set-cookie'])['session'] - }) - c2 = SecureCookie.load_cookie(req, secret_key=b'foo') - assert not c2.new - assert c2 == c diff --git a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_sessions.py b/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_sessions.py deleted file mode 100644 index d564542165..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_sessions.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.sessions - ~~~~~~~~~~~~~~ - - Added tests for the sessions. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import os -from tempfile import gettempdir - -from werkzeug.contrib.sessions import FilesystemSessionStore - - -def test_default_tempdir(): - store = FilesystemSessionStore() - assert store.path == gettempdir() - - -def test_basic_fs_sessions(tmpdir): - store = FilesystemSessionStore(str(tmpdir)) - x = store.new() - assert x.new - assert not x.modified - x['foo'] = [1, 2, 3] - assert x.modified - store.save(x) - - x2 = store.get(x.sid) - assert not x2.new - assert not x2.modified - assert x2 is not x - assert x2 == x - x2['test'] = 3 - assert x2.modified - assert not x2.new - store.save(x2) - - x = store.get(x.sid) - store.delete(x) - x2 = store.get(x.sid) - # the session is not new when it was used previously. - assert not x2.new - - -def test_non_urandom(tmpdir): - urandom = os.urandom - del os.urandom - try: - store = FilesystemSessionStore(str(tmpdir)) - store.new() - finally: - os.urandom = urandom - - -def test_renewing_fs_session(tmpdir): - store = FilesystemSessionStore(str(tmpdir), renew_missing=True) - x = store.new() - store.save(x) - store.delete(x) - x2 = store.get(x.sid) - assert x2.new - - -def test_fs_session_lising(tmpdir): - store = FilesystemSessionStore(str(tmpdir), renew_missing=True) - sessions = set() - for x in range(10): - sess = store.new() - store.save(sess) - sessions.add(sess.sid) - - listed_sessions = set(store.list()) - assert sessions == listed_sessions diff --git a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_wrappers.py b/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_wrappers.py deleted file mode 100644 index 6248243b90..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/contrib/test_wrappers.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.contrib.wrappers - ~~~~~~~~~~~~~~~~~~~~~~ - - Added tests for the sessions. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -from __future__ import with_statement - -from werkzeug.contrib import wrappers -from werkzeug import routing -from werkzeug.wrappers import Request, Response - - -def test_json_request_mixin(): - class MyRequest(wrappers.JSONRequestMixin, Request): - pass - req = MyRequest.from_values( - data=u'{"foä": "bar"}'.encode('utf-8'), - content_type='text/json' - ) - assert req.json == {u'foä': 'bar'} - - -def test_reverse_slash_behavior(): - class MyRequest(wrappers.ReverseSlashBehaviorRequestMixin, Request): - pass - req = MyRequest.from_values('/foo/bar', 'http://example.com/test') - assert req.url == 'http://example.com/test/foo/bar' - assert req.path == 'foo/bar' - assert req.script_root == '/test/' - - # make sure the routing system works with the slashes in - # reverse order as well. - map = routing.Map([routing.Rule('/foo/bar', endpoint='foo')]) - adapter = map.bind_to_environ(req.environ) - assert adapter.match() == ('foo', {}) - adapter = map.bind(req.host, req.script_root) - assert adapter.match(req.path) == ('foo', {}) - - -def test_dynamic_charset_request_mixin(): - class MyRequest(wrappers.DynamicCharsetRequestMixin, Request): - pass - env = {'CONTENT_TYPE': 'text/html'} - req = MyRequest(env) - assert req.charset == 'latin1' - - env = {'CONTENT_TYPE': 'text/html; charset=utf-8'} - req = MyRequest(env) - assert req.charset == 'utf-8' - - env = {'CONTENT_TYPE': 'application/octet-stream'} - req = MyRequest(env) - assert req.charset == 'latin1' - assert req.url_charset == 'latin1' - - MyRequest.url_charset = 'utf-8' - env = {'CONTENT_TYPE': 'application/octet-stream'} - req = MyRequest(env) - assert req.charset == 'latin1' - assert req.url_charset == 'utf-8' - - def return_ascii(x): - return "ascii" - env = {'CONTENT_TYPE': 'text/plain; charset=x-weird-charset'} - req = MyRequest(env) - req.unknown_charset = return_ascii - assert req.charset == 'ascii' - assert req.url_charset == 'utf-8' - - -def test_dynamic_charset_response_mixin(): - class MyResponse(wrappers.DynamicCharsetResponseMixin, Response): - default_charset = 'utf-7' - resp = MyResponse(mimetype='text/html') - assert resp.charset == 'utf-7' - resp.charset = 'utf-8' - assert resp.charset == 'utf-8' - assert resp.mimetype == 'text/html' - assert resp.mimetype_params == {'charset': 'utf-8'} - resp.mimetype_params['charset'] = 'iso-8859-15' - assert resp.charset == 'iso-8859-15' - resp.set_data(u'Hällo Wörld') - assert b''.join(resp.iter_encoded()) == \ - u'Hällo Wörld'.encode('iso-8859-15') - del resp.headers['content-type'] - try: - resp.charset = 'utf-8' - except TypeError: - pass - else: - assert False, 'expected type error on charset setting without ct' diff --git a/pythonPackages/Werkzeug-0.12.1/tests/hypothesis/__init__.py b/pythonPackages/Werkzeug-0.12.1/tests/hypothesis/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/pythonPackages/Werkzeug-0.12.1/tests/hypothesis/test_urls.py b/pythonPackages/Werkzeug-0.12.1/tests/hypothesis/test_urls.py deleted file mode 100644 index c610714db7..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/hypothesis/test_urls.py +++ /dev/null @@ -1,33 +0,0 @@ -import hypothesis -from hypothesis.strategies import text, dictionaries, lists, integers - -from werkzeug import urls -from werkzeug.datastructures import OrderedMultiDict - - -@hypothesis.given(text()) -def test_quote_unquote_text(t): - assert t == urls.url_unquote(urls.url_quote(t)) - - -@hypothesis.given(dictionaries(text(), text())) -def test_url_encoding_dict_str_str(d): - assert OrderedMultiDict(d) == urls.url_decode(urls.url_encode(d)) - - -@hypothesis.given(dictionaries(text(), lists(elements=text()))) -def test_url_encoding_dict_str_list(d): - assert OrderedMultiDict(d) == urls.url_decode(urls.url_encode(d)) - - -@hypothesis.given(dictionaries(text(), integers())) -def test_url_encoding_dict_str_int(d): - assert OrderedMultiDict({k: str(v) for k, v in d.items()}) == \ - urls.url_decode(urls.url_encode(d)) - - -@hypothesis.given(text(), text()) -def test_multidict_encode_decode_text(t1, t2): - d = OrderedMultiDict() - d.add(t1, t2) - assert d == urls.url_decode(urls.url_encode(d)) diff --git a/pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2png1txt/file1.png b/pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2png1txt/file1.png deleted file mode 100644 index 9b3422c61e5d23434d085834b82eed7a7363976e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 523 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 diff --git a/pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2png1txt/text.txt b/pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2png1txt/text.txt deleted file mode 100644 index c87634d527..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2png1txt/text.txt +++ /dev/null @@ -1 +0,0 @@ -example text \ No newline at end of file diff --git a/pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2pnglongtext/file1.png b/pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2pnglongtext/file1.png deleted file mode 100644 index 89c8129a490b329f3165f32fa0781701aab417ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 781 zcmV+o1M>WdP)4-QibtN)VXQDpczE`xXAkUjh%RI>;okxb7K@0kpyQ1k_Y(|Oe7$m(^ zNYX>mI||sUbmn+c3<&FnE=4u#()KBS^SH8e)Qs5i!#lY=$-1gbH6VluzU=m=EP78&5vQ z-?+fFP-G2l&l_QzYealK$;1Rl?FkzXR&Jv@fBPNjCr#AYRyJ7UJQ0v#?)7Ott=>3`#-pV!7>9}>Q1jL)H6h&gkP@3nI=+F3nA~M>u#(n* z8T!#8oEw&-mED4!h4s!N@Jo3S7N&Q6%6l3}nlcd~X@>;uelvPsSkXIgg~e+^T1zSf z3SNj(5%jK~i8@b;C9VHk(~TedF+gQSL8D5xnVSSWAVY>J9b+m>@{iq7_KE}go~11+5s4;8hc+i0Xa zI1j@EX5!S+Me6HNqKzU5YQwL;-W5$p%ZMKMeR<%zp69-~?<4?8|C8S?bklXr4v&Ov zb&06v2|-x?qB`90yn>Qi%Sh2^G4n)$ZdyvTPf9}1)_buUT7>`e2G&2VU@~Bb(o+Mz zi4)>IxlSY${Dj4k={-9RzU^W5g9|2V5RZ2ZulL9s2xQbZ@r6eP9Ra5u(s|C0Nj#&4>wTSkb?%#=9?@ z^oxDy-O@tyN{L@by(WWvQ3%CyEu8x{+#Jb4-h&K9Owi)2pgg+heWDyked|3R$$kL@A z#sp1v-r+=G4B8D6DqsDH0@7OztA7aT9qc1Py{()w`m``?Y0&gi2=ROcc-9+nU^I6< zT=e_Y=vSnG@?3Ue{BW5ONFttcE!R-R_W4O01|0-|K-YNXLo2`4Qv z`r1LxR6#yf3FB%T95gJnaKKivA~Z}S9A(ZxEDK}O3T04USJ P00000NkvXXu0mjf^IS-S diff --git a/pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2pnglongtext/request.txt b/pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2pnglongtext/request.txt deleted file mode 100644 index 489290b6730d72648b7a748c5c2984aa7af3c2a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2042 zcmdPZ#RCjYEDcNyOiav;EzK>=4J{1~j1A3AP0S4q%}p$Lxt#O!N>cMmbX_uw3-XII zOEUBGtQ6Ani*j{S5=#=T74i~uQ*D*fGILT5m8=y&G(;pZIXShUM6Vz(T?t`GNM%8) zl|p82VtT4RP==R_m#Z_t&z+Y`ii?4Pf!EW+B?w3hfG`Iekd*)YKM_c=q&xaLGBB(^ zVb0q163CY%U#85)$Dm{M7IGS!BGfoZ;{i(`nz>7|oj zdj}`V9RF)wcCIXknKQ*jv8g4XT2w{IdKT}|Jv!c(@9w>1mVCpf+o&k+n1`nB<||pn zez~u%Ji9i)0w?5owg>HY|MZD=BSU5a@7NFe*W{%KUc3SWO(#Xy`D$p2VZB= za{gDFZ8d$4J^q{cvcp2BRMjXbeUaVWec@YHE1aM0b=u~n;#~K(*^b=5rtMzzGA75Z z^R|Z ztvI%6(NxPB%%S&!1AN4t3_}^dhA7_2ZZ@cxTCic#oq5V0JDjAFntB8cFH7dMncisO ziZ`6%|3qg7|5Fudf4gJ%cO2LnkiwgLUOI7hwo8re$s;W8Z#kv;!}1oJEoi(JePmq< zL%001g|jq{+_)7W@^9l$+1&Gb2Mq#y_9dvZxFsp8O}Mk%?AP?&iC*DM zn0ihpBf`;p0pHs=;}u#-+1x9)v#|Yikb0wC9%!rBeydif^zze)s_hNiZn90`lWRXz z$Yhny_h$XBiFvj>t0vvBI+CItzoUPz)MoeQ_A{~}ea{@N=P+NLz~jX(&UfzE;-z{L z?OloipRZ|}D&F}vL1?yz)xO4#8Fx~FVRWrQ^4CSBInvV>PrchTxAp5er4Qbff?~_c zYfe>5dCW2rRLpE=d0S^(6(4cYI=}U3wo{b177JHgN08u`b@Mx|{JS)m7cS4@a9i-S zl~pTl#@Z7bE(R}cd9i-~$N10O=@-^Kt=x4b8JM0KJYD@<);T3K@p9qGsJgmT%c@4G zSv4hP0P|@+BA-r9lxY7Oy-lCBc}ZKO#tKc<2#x%kIbB_Tx2F|ncb)r|r#E-kS!Uh2 z!u+CJ7v9cTVr{{Hm^tmyl}oO#UI#4dRpQ7xyng>ZQD67d9dbWvDZ_bLpY z|0mzqE4f^HhOfURr?hj$Gfu~de~YZ{eAv@8DeAPx#SFvGE{%CnUR(UVoX%gX-Y6B- z^8Yj2HT$&*MhWegf|>Vq3O};l>8B#{r{(Cxm$ue?``#vgYvxwV66i1I+3H*oOHa` z%;V~F;nA9fF^tlGLyfJ%Lo=c$I-6;Cak7}{Nu`}qn5%W{fVAuv@3TAZ%ym1;(pC6x z;rG4VfAdRC?zGs;eoPS*`CJq6=kSS3OXZHS_?F#!=#s#5i&sc1{%Xr!g=Wbr&-cXoja&3b~#Ooe4 zu42QD$%kZ5uho$837eO8gg5BtVx~nYFS3?g4CGYTHT-qU@mz?bT`1?{ENK}Noh=0i z!Zs?I_^8OFo^#N1lqhog$vpE#q(Wj{ZbRi^hTiRhk+GVA79}!%JAAHxnR({Uyb`0` zpOvOA^yFN=bw2O>d|T(a!5dGcJk@*_za5zGWF6g3%QI+PK1lC;SCU#$0;~!_Sv)5{ oFI@q|2XV?XOEMIa@=Nnl5{oJ!viaGGIhon1#k#tb6bK;Q0IR$;-v9sr diff --git a/pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2pnglongtext/text.txt b/pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2pnglongtext/text.txt deleted file mode 100644 index 3bf804d543..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/multipart/firefox3-2pnglongtext/text.txt +++ /dev/null @@ -1,3 +0,0 @@ ---long text ---with boundary ---lookalikes-- \ No newline at end of file diff --git a/pythonPackages/Werkzeug-0.12.1/tests/multipart/ie6-2png1txt/file1.png b/pythonPackages/Werkzeug-0.12.1/tests/multipart/ie6-2png1txt/file1.png deleted file mode 100644 index 9b3422c61e5d23434d085834b82eed7a7363976e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 523 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 diff --git a/pythonPackages/Werkzeug-0.12.1/tests/multipart/ie6-2png1txt/text.txt b/pythonPackages/Werkzeug-0.12.1/tests/multipart/ie6-2png1txt/text.txt deleted file mode 100644 index 7c465b7a7c..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/multipart/ie6-2png1txt/text.txt +++ /dev/null @@ -1 +0,0 @@ -ie6 sucks :-/ \ No newline at end of file diff --git a/pythonPackages/Werkzeug-0.12.1/tests/multipart/ie7_full_path_request.txt b/pythonPackages/Werkzeug-0.12.1/tests/multipart/ie7_full_path_request.txt deleted file mode 100644 index acc4e2e1858f5888b7a9f64d47aae363145ffc90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30044 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 cM*|n+_b-i~S8HN)#RH5YnYUGP-mK>R8bw z2t8C_N?y`%B@?pVvm%P1(=O${na{Vw7Aotm+uS~f8Ro~wbIxHo`d;S7O>X_I!*}m4(;rQL3lRx0{4$S^45y5Zuub!<^(wd zDg1Ydq7a)PBNSH(^bYo1I&!_cv8F)Tfk3iCfaGzKcdABUEYJ~V4lNs7(L31l-D~h- zlLeyC;Rle^b>Pb0!o4OezZxjWAc9)nJe_NP=QDRgIAC4B#i)@%!f@-iPyu79xm3 z&=Ei~gdfA((>G@?t|CClgk~>+;;$k`$HzXCdi?6@>wW;(eSTM7w8{L??AcXUU@Ta{ zLrZBBKD>>5#ZOj$V zV$6R8et`Hsp^Y06t?}x?-BN{Jo+A{GLpF=}{yzmtYh)C=wic&;1MX^#S<^tIK8mw$ z9j5mS;s?n^1>U{8t&EN(863h(*qFLQ=;hn-R;7@>ex(0vvZCi*>q5p75xCt@M#zpM z*Z|q?@X7EteIjT$hYlRP@ApxiZy$PlmbH;D0hOKL_{*WZ;MR^|Dic+L1tK5@y>d4> zXDufE6I)H=Wxil#C-axq0i?$W%}gE53ocb3M9Ce~cq*pr4r68}P%}Rp!|ZI1=W3eKQ{(8&6eg2G=4KE}@YE!+_s=wG z)yj?Wi=|CWjtmfUw}tvT?>o~yi1Cr^9Fogm)I5&s5bN!p#FzaA_^&C@GMJ`fX;)}= z5K#fB0E~v<&l+~pTpQ_Hbc_JlkpsFSk>9$Ch@B!-R)IDix^hJgZHdi`3)**;A=W+} zt0nUFG38I&2bR2ge6xJwHJ&|-TDl&zbzpIUHhXn+ZJGP%0^v7ruA^itSBHJ0F6=jD>(Vqjq4_4IHF0@4B?%)tgEpWXX$^2@=JQ}@f$o;)eBWtvya_cwX@tTQ=kb3c{m+~33dOy=3Xa}O`~ z>wjKk^0bNi4l$(;rwf7(MlJG(Z(lY~*I%dPaH1tmzwyy}CAZ_p?Iu_KdG+db z9m9>gTe~DWQp%3z436btzBLMyM$o zn9fq-i%SxVfXO;PuPQa(aNrU)Q$8eNw@&u;2niHv*l+%RZ)LJ^n`eE>tX4y2L9s9I zl`_RWFD(ic5OEO+j1Hg4d{Hao@*=S?m#sWrr#2M?>T>;BC~$Vkkw4ttva-i#et)-j z`B9T*=ZN&;_qKE1KQ21AcUngPNA0&B7SpXiWMw-zB$_3fI~0yRFg11j&b{dT{0P=# ziH;pXM;|doOc8OZ+aRDAqQns*cR}i+)b=Rh+%ux*lg`w$)HVFDTi7ctxc1|#gLi{k zW9KQ0^gEk%|M+Lm>Y1G)vU{7@@;c^sS-p{$9hTU2ZO)Tj_MQ6?`$<>UdwX}U?demM zlsV*mW5zD$7f)}03|l&3U)_@b*_#$UkA3ZQOh|CY-2k@}eabf&Zod0)@`G8eQier4 zpUj^3-vj67%U4xT+d5I7aq8R$KTa>)^Wa)vqLy%I6RVN}+ukB`%XD3}zrxYJk5l(0 zq^f_OevNU-agMV-vS+#VLgigf%3iL}TK1YRIZZ9V*xqon@QgDikDfd5gjH~waXk-a zpP0|g-?7Vm%_C>4_|W!+hu`G%JOgf!##isAI!0Wg3j!gf{`eVK31)~|uk}|_H$^-%# zS1|OnJvc8_b}2^sWmHKI!;Oi|yObv0-__MIS1BZ{(M)bvkt=U*=h<%VTjf&~ui442 zR{iwV@Tvc8_Gx>nYBtwAGM#7J9koktOKC!3qgi!nN$$+wFPI*h=dW9wq8;AezcbnS z_hNau-V=XpSb~%^e)cX|w))M#kNJN-`CtCGc=L??Ha9%IYl5GAKCYcnrsGn_T+R_0 rU~oakh*tTnB(-8)c*)^C#N=sRU0yB#ZkE?q diff --git a/pythonPackages/Werkzeug-0.12.1/tests/multipart/opera8-2png1txt/text.txt b/pythonPackages/Werkzeug-0.12.1/tests/multipart/opera8-2png1txt/text.txt deleted file mode 100644 index ca01cb00fe..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/multipart/opera8-2png1txt/text.txt +++ /dev/null @@ -1 +0,0 @@ -blafasel öäü \ No newline at end of file diff --git a/pythonPackages/Werkzeug-0.12.1/tests/multipart/test_collect.py b/pythonPackages/Werkzeug-0.12.1/tests/multipart/test_collect.py deleted file mode 100644 index 395d8cb052..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/multipart/test_collect.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python -""" -Hacky helper application to collect form data. -""" -from werkzeug.serving import run_simple -from werkzeug.wrappers import Request, Response - - -def copy_stream(request): - from os import mkdir - from time import time - folder = 'request-%d' % time() - mkdir(folder) - environ = request.environ - f = open(folder + '/request.txt', 'wb+') - f.write(environ['wsgi.input'].read(int(environ['CONTENT_LENGTH']))) - f.flush() - f.seek(0) - environ['wsgi.input'] = f - request.stat_folder = folder - - -def stats(request): - copy_stream(request) - f1 = request.files['file1'] - f2 = request.files['file2'] - text = request.form['text'] - f1.save(request.stat_folder + '/file1.bin') - f2.save(request.stat_folder + '/file2.bin') - with open(request.stat_folder + '/text.txt', 'w') as f: - f.write(text.encode('utf-8')) - return Response('Done.') - - -def upload_file(request): - return Response(''' -

Upload File

-
-
-
-
- -
- ''', mimetype='text/html') - - -def application(environ, start_responseonse): - request = Request(environ) - if request.method == 'POST': - response = stats(request) - else: - response = upload_file(request) - return response(environ, start_responseonse) - - -if __name__ == '__main__': - run_simple('localhost', 5000, application, use_debugger=True) diff --git a/pythonPackages/Werkzeug-0.12.1/tests/multipart/webkit3-2png1txt/file1.png b/pythonPackages/Werkzeug-0.12.1/tests/multipart/webkit3-2png1txt/file1.png deleted file mode 100644 index afca0732a75933c67a30ff16d2c9b4c3abf1cf1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1002 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 BEyDl+ diff --git a/pythonPackages/Werkzeug-0.12.1/tests/multipart/webkit3-2png1txt/text.txt b/pythonPackages/Werkzeug-0.12.1/tests/multipart/webkit3-2png1txt/text.txt deleted file mode 100644 index baa1300852..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/multipart/webkit3-2png1txt/text.txt +++ /dev/null @@ -1 +0,0 @@ -this is another text with ümläüts \ No newline at end of file diff --git a/pythonPackages/Werkzeug-0.12.1/tests/res/test.txt b/pythonPackages/Werkzeug-0.12.1/tests/res/test.txt deleted file mode 100644 index a8efdcc31e..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/res/test.txt +++ /dev/null @@ -1 +0,0 @@ -FOUND diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_compat.py b/pythonPackages/Werkzeug-0.12.1/tests/test_compat.py deleted file mode 100644 index 0de048639a..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_compat.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.compat - ~~~~~~~~~~~~ - - Ensure that old stuff does not break on update. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -# This file shouldn't be linted: -# flake8: noqa - -import warnings - -from werkzeug.wrappers import Response -from werkzeug.test import create_environ - - -def test_old_imports(): - from werkzeug.utils import Headers, MultiDict, CombinedMultiDict, \ - Headers, EnvironHeaders - from werkzeug.http import Accept, MIMEAccept, CharsetAccept, \ - LanguageAccept, ETags, HeaderSet, WWWAuthenticate, \ - Authorization - - -def test_exposed_werkzeug_mod(): - import werkzeug - for key in werkzeug.__all__: - # deprecated, skip it - if key in ('templates', 'Template'): - continue - getattr(werkzeug, key) diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_datastructures.py b/pythonPackages/Werkzeug-0.12.1/tests/test_datastructures.py deleted file mode 100644 index 28bfa8b15e..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_datastructures.py +++ /dev/null @@ -1,978 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.datastructures - ~~~~~~~~~~~~~~~~~~~~ - - Tests the functionality of the provided Werkzeug - datastructures. - - Classes prefixed with an underscore are mixins and are not discovered by - the test runner. - - TODO: - - - FileMultiDict - - Immutable types undertested - - Split up dict tests - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -from __future__ import with_statement - -import pytest -from tests import strict_eq - - -import pickle -from contextlib import contextmanager -from copy import copy, deepcopy - -from werkzeug import datastructures -from werkzeug._compat import iterkeys, itervalues, iteritems, iterlists, \ - iterlistvalues, text_type, PY2 -from werkzeug.exceptions import BadRequestKeyError - - -class TestNativeItermethods(object): - - def test_basic(self): - @datastructures.native_itermethods(['keys', 'values', 'items']) - class StupidDict(object): - - def keys(self, multi=1): - return iter(['a', 'b', 'c'] * multi) - - def values(self, multi=1): - return iter([1, 2, 3] * multi) - - def items(self, multi=1): - return iter(zip(iterkeys(self, multi=multi), - itervalues(self, multi=multi))) - - d = StupidDict() - expected_keys = ['a', 'b', 'c'] - expected_values = [1, 2, 3] - expected_items = list(zip(expected_keys, expected_values)) - - assert list(iterkeys(d)) == expected_keys - assert list(itervalues(d)) == expected_values - assert list(iteritems(d)) == expected_items - - assert list(iterkeys(d, 2)) == expected_keys * 2 - assert list(itervalues(d, 2)) == expected_values * 2 - assert list(iteritems(d, 2)) == expected_items * 2 - - -class _MutableMultiDictTests(object): - storage_class = None - - def test_pickle(self): - cls = self.storage_class - - def create_instance(module=None): - if module is None: - d = cls() - else: - old = cls.__module__ - cls.__module__ = module - d = cls() - cls.__module__ = old - d.setlist(b'foo', [1, 2, 3, 4]) - d.setlist(b'bar', b'foo bar baz'.split()) - return d - - for protocol in range(pickle.HIGHEST_PROTOCOL + 1): - d = create_instance() - s = pickle.dumps(d, protocol) - ud = pickle.loads(s) - assert type(ud) == type(d) - assert ud == d - alternative = pickle.dumps(create_instance('werkzeug'), protocol) - assert pickle.loads(alternative) == d - ud[b'newkey'] = b'bla' - assert ud != d - - def test_basic_interface(self): - md = self.storage_class() - assert isinstance(md, dict) - - mapping = [('a', 1), ('b', 2), ('a', 2), ('d', 3), - ('a', 1), ('a', 3), ('d', 4), ('c', 3)] - md = self.storage_class(mapping) - - # simple getitem gives the first value - assert md['a'] == 1 - assert md['c'] == 3 - with pytest.raises(KeyError): - md['e'] - assert md.get('a') == 1 - - # list getitem - assert md.getlist('a') == [1, 2, 1, 3] - assert md.getlist('d') == [3, 4] - # do not raise if key not found - assert md.getlist('x') == [] - - # simple setitem overwrites all values - md['a'] = 42 - assert md.getlist('a') == [42] - - # list setitem - md.setlist('a', [1, 2, 3]) - assert md['a'] == 1 - assert md.getlist('a') == [1, 2, 3] - - # verify that it does not change original lists - l1 = [1, 2, 3] - md.setlist('a', l1) - del l1[:] - assert md['a'] == 1 - - # setdefault, setlistdefault - assert md.setdefault('u', 23) == 23 - assert md.getlist('u') == [23] - del md['u'] - - md.setlist('u', [-1, -2]) - - # delitem - del md['u'] - with pytest.raises(KeyError): - md['u'] - del md['d'] - assert md.getlist('d') == [] - - # keys, values, items, lists - assert list(sorted(md.keys())) == ['a', 'b', 'c'] - assert list(sorted(iterkeys(md))) == ['a', 'b', 'c'] - - assert list(sorted(itervalues(md))) == [1, 2, 3] - assert list(sorted(itervalues(md))) == [1, 2, 3] - - assert list(sorted(md.items())) == [('a', 1), ('b', 2), ('c', 3)] - assert list(sorted(md.items(multi=True))) == \ - [('a', 1), ('a', 2), ('a', 3), ('b', 2), ('c', 3)] - assert list(sorted(iteritems(md))) == [('a', 1), ('b', 2), ('c', 3)] - assert list(sorted(iteritems(md, multi=True))) == \ - [('a', 1), ('a', 2), ('a', 3), ('b', 2), ('c', 3)] - - assert list(sorted(md.lists())) == \ - [('a', [1, 2, 3]), ('b', [2]), ('c', [3])] - assert list(sorted(iterlists(md))) == \ - [('a', [1, 2, 3]), ('b', [2]), ('c', [3])] - - # copy method - c = md.copy() - assert c['a'] == 1 - assert c.getlist('a') == [1, 2, 3] - - # copy method 2 - c = copy(md) - assert c['a'] == 1 - assert c.getlist('a') == [1, 2, 3] - - # deepcopy method - c = md.deepcopy() - assert c['a'] == 1 - assert c.getlist('a') == [1, 2, 3] - - # deepcopy method 2 - c = deepcopy(md) - assert c['a'] == 1 - assert c.getlist('a') == [1, 2, 3] - - # update with a multidict - od = self.storage_class([('a', 4), ('a', 5), ('y', 0)]) - md.update(od) - assert md.getlist('a') == [1, 2, 3, 4, 5] - assert md.getlist('y') == [0] - - # update with a regular dict - md = c - od = {'a': 4, 'y': 0} - md.update(od) - assert md.getlist('a') == [1, 2, 3, 4] - assert md.getlist('y') == [0] - - # pop, poplist, popitem, popitemlist - assert md.pop('y') == 0 - assert 'y' not in md - assert md.poplist('a') == [1, 2, 3, 4] - assert 'a' not in md - assert md.poplist('missing') == [] - - # remaining: b=2, c=3 - popped = md.popitem() - assert popped in [('b', 2), ('c', 3)] - popped = md.popitemlist() - assert popped in [('b', [2]), ('c', [3])] - - # type conversion - md = self.storage_class({'a': '4', 'b': ['2', '3']}) - assert md.get('a', type=int) == 4 - assert md.getlist('b', type=int) == [2, 3] - - # repr - md = self.storage_class([('a', 1), ('a', 2), ('b', 3)]) - assert "('a', 1)" in repr(md) - assert "('a', 2)" in repr(md) - assert "('b', 3)" in repr(md) - - # add and getlist - md.add('c', '42') - md.add('c', '23') - assert md.getlist('c') == ['42', '23'] - md.add('c', 'blah') - assert md.getlist('c', type=int) == [42, 23] - - # setdefault - md = self.storage_class() - md.setdefault('x', []).append(42) - md.setdefault('x', []).append(23) - assert md['x'] == [42, 23] - - # to dict - md = self.storage_class() - md['foo'] = 42 - md.add('bar', 1) - md.add('bar', 2) - assert md.to_dict() == {'foo': 42, 'bar': 1} - assert md.to_dict(flat=False) == {'foo': [42], 'bar': [1, 2]} - - # popitem from empty dict - with pytest.raises(KeyError): - self.storage_class().popitem() - - with pytest.raises(KeyError): - self.storage_class().popitemlist() - - # key errors are of a special type - with pytest.raises(BadRequestKeyError): - self.storage_class()[42] - - # setlist works - md = self.storage_class() - md['foo'] = 42 - md.setlist('foo', [1, 2]) - assert md.getlist('foo') == [1, 2] - - -class _ImmutableDictTests(object): - storage_class = None - - def test_follows_dict_interface(self): - cls = self.storage_class - - data = {'foo': 1, 'bar': 2, 'baz': 3} - d = cls(data) - - assert d['foo'] == 1 - assert d['bar'] == 2 - assert d['baz'] == 3 - assert sorted(d.keys()) == ['bar', 'baz', 'foo'] - assert 'foo' in d - assert 'foox' not in d - assert len(d) == 3 - - def test_copies_are_mutable(self): - cls = self.storage_class - immutable = cls({'a': 1}) - with pytest.raises(TypeError): - immutable.pop('a') - - mutable = immutable.copy() - mutable.pop('a') - assert 'a' in immutable - assert mutable is not immutable - assert copy(immutable) is immutable - - def test_dict_is_hashable(self): - cls = self.storage_class - immutable = cls({'a': 1, 'b': 2}) - immutable2 = cls({'a': 2, 'b': 2}) - x = set([immutable]) - assert immutable in x - assert immutable2 not in x - x.discard(immutable) - assert immutable not in x - assert immutable2 not in x - x.add(immutable2) - assert immutable not in x - assert immutable2 in x - x.add(immutable) - assert immutable in x - assert immutable2 in x - - -class TestImmutableTypeConversionDict(_ImmutableDictTests): - storage_class = datastructures.ImmutableTypeConversionDict - - -class TestImmutableMultiDict(_ImmutableDictTests): - storage_class = datastructures.ImmutableMultiDict - - def test_multidict_is_hashable(self): - cls = self.storage_class - immutable = cls({'a': [1, 2], 'b': 2}) - immutable2 = cls({'a': [1], 'b': 2}) - x = set([immutable]) - assert immutable in x - assert immutable2 not in x - x.discard(immutable) - assert immutable not in x - assert immutable2 not in x - x.add(immutable2) - assert immutable not in x - assert immutable2 in x - x.add(immutable) - assert immutable in x - assert immutable2 in x - - -class TestImmutableDict(_ImmutableDictTests): - storage_class = datastructures.ImmutableDict - - -class TestImmutableOrderedMultiDict(_ImmutableDictTests): - storage_class = datastructures.ImmutableOrderedMultiDict - - def test_ordered_multidict_is_hashable(self): - a = self.storage_class([('a', 1), ('b', 1), ('a', 2)]) - b = self.storage_class([('a', 1), ('a', 2), ('b', 1)]) - assert hash(a) != hash(b) - - -class TestMultiDict(_MutableMultiDictTests): - storage_class = datastructures.MultiDict - - def test_multidict_pop(self): - make_d = lambda: self.storage_class({'foo': [1, 2, 3, 4]}) - d = make_d() - assert d.pop('foo') == 1 - assert not d - d = make_d() - assert d.pop('foo', 32) == 1 - assert not d - d = make_d() - assert d.pop('foos', 32) == 32 - assert d - - with pytest.raises(KeyError): - d.pop('foos') - - def test_multidict_pop_raise_badrequestkeyerror_for_empty_list_value(self): - mapping = [('a', 'b'), ('a', 'c')] - md = self.storage_class(mapping) - - md.setlistdefault('empty', []) - - with pytest.raises(KeyError): - md.pop('empty') - - def test_multidict_popitem_raise_badrequestkeyerror_for_empty_list_value(self): - mapping = [] - md = self.storage_class(mapping) - - md.setlistdefault('empty', []) - - with pytest.raises(KeyError): - md.popitem() - - def test_setlistdefault(self): - md = self.storage_class() - assert md.setlistdefault('u', [-1, -2]) == [-1, -2] - assert md.getlist('u') == [-1, -2] - assert md['u'] == -1 - - def test_iter_interfaces(self): - mapping = [('a', 1), ('b', 2), ('a', 2), ('d', 3), - ('a', 1), ('a', 3), ('d', 4), ('c', 3)] - md = self.storage_class(mapping) - assert list(zip(md.keys(), md.listvalues())) == list(md.lists()) - assert list(zip(md, iterlistvalues(md))) == list(iterlists(md)) - assert list(zip(iterkeys(md), iterlistvalues(md))) == \ - list(iterlists(md)) - - @pytest.mark.skipif(not PY2, reason='viewmethods work only for the 2-nd version.') - def test_view_methods(self): - mapping = [('a', 'b'), ('a', 'c')] - md = self.storage_class(mapping) - - vi = md.viewitems() - vk = md.viewkeys() - vv = md.viewvalues() - - assert list(vi) == list(md.items()) - assert list(vk) == list(md.keys()) - assert list(vv) == list(md.values()) - - md['k'] = 'n' - - assert list(vi) == list(md.items()) - assert list(vk) == list(md.keys()) - assert list(vv) == list(md.values()) - - @pytest.mark.skipif(not PY2, reason='viewmethods work only for the 2-nd version.') - def test_viewitems_with_multi(self): - mapping = [('a', 'b'), ('a', 'c')] - md = self.storage_class(mapping) - - vi = md.viewitems(multi=True) - - assert list(vi) == list(md.items(multi=True)) - - md['k'] = 'n' - - assert list(vi) == list(md.items(multi=True)) - - def test_getitem_raise_badrequestkeyerror_for_empty_list_value(self): - mapping = [('a', 'b'), ('a', 'c')] - md = self.storage_class(mapping) - - md.setlistdefault('empty', []) - - with pytest.raises(KeyError): - md['empty'] - - -class TestOrderedMultiDict(_MutableMultiDictTests): - storage_class = datastructures.OrderedMultiDict - - def test_ordered_interface(self): - cls = self.storage_class - - d = cls() - assert not d - d.add('foo', 'bar') - assert len(d) == 1 - d.add('foo', 'baz') - assert len(d) == 1 - assert list(iteritems(d)) == [('foo', 'bar')] - assert list(d) == ['foo'] - assert list(iteritems(d, multi=True)) == \ - [('foo', 'bar'), ('foo', 'baz')] - del d['foo'] - assert not d - assert len(d) == 0 - assert list(d) == [] - - d.update([('foo', 1), ('foo', 2), ('bar', 42)]) - d.add('foo', 3) - assert d.getlist('foo') == [1, 2, 3] - assert d.getlist('bar') == [42] - assert list(iteritems(d)) == [('foo', 1), ('bar', 42)] - - expected = ['foo', 'bar'] - - assert list(d.keys()) == expected - assert list(d) == expected - assert list(iterkeys(d)) == expected - - assert list(iteritems(d, multi=True)) == \ - [('foo', 1), ('foo', 2), ('bar', 42), ('foo', 3)] - assert len(d) == 2 - - assert d.pop('foo') == 1 - assert d.pop('blafasel', None) is None - assert d.pop('blafasel', 42) == 42 - assert len(d) == 1 - assert d.poplist('bar') == [42] - assert not d - - d.get('missingkey') is None - - d.add('foo', 42) - d.add('foo', 23) - d.add('bar', 2) - d.add('foo', 42) - assert d == datastructures.MultiDict(d) - id = self.storage_class(d) - assert d == id - d.add('foo', 2) - assert d != id - - d.update({'blah': [1, 2, 3]}) - assert d['blah'] == 1 - assert d.getlist('blah') == [1, 2, 3] - - # setlist works - d = self.storage_class() - d['foo'] = 42 - d.setlist('foo', [1, 2]) - assert d.getlist('foo') == [1, 2] - - with pytest.raises(BadRequestKeyError): - d.pop('missing') - with pytest.raises(BadRequestKeyError): - d['missing'] - - # popping - d = self.storage_class() - d.add('foo', 23) - d.add('foo', 42) - d.add('foo', 1) - assert d.popitem() == ('foo', 23) - with pytest.raises(BadRequestKeyError): - d.popitem() - assert not d - - d.add('foo', 23) - d.add('foo', 42) - d.add('foo', 1) - assert d.popitemlist() == ('foo', [23, 42, 1]) - - with pytest.raises(BadRequestKeyError): - d.popitemlist() - - # Unhashable - d = self.storage_class() - d.add('foo', 23) - pytest.raises(TypeError, hash, d) - - def test_iterables(self): - a = datastructures.MultiDict((("key_a", "value_a"),)) - b = datastructures.MultiDict((("key_b", "value_b"),)) - ab = datastructures.CombinedMultiDict((a, b)) - - assert sorted(ab.lists()) == [('key_a', ['value_a']), ('key_b', ['value_b'])] - assert sorted(ab.listvalues()) == [['value_a'], ['value_b']] - assert sorted(ab.keys()) == ["key_a", "key_b"] - - assert sorted(iterlists(ab)) == [('key_a', ['value_a']), ('key_b', ['value_b'])] - assert sorted(iterlistvalues(ab)) == [['value_a'], ['value_b']] - assert sorted(iterkeys(ab)) == ["key_a", "key_b"] - - -class TestCombinedMultiDict(object): - storage_class = datastructures.CombinedMultiDict - - def test_basic_interface(self): - d1 = datastructures.MultiDict([('foo', '1')]) - d2 = datastructures.MultiDict([('bar', '2'), ('bar', '3')]) - d = self.storage_class([d1, d2]) - - # lookup - assert d['foo'] == '1' - assert d['bar'] == '2' - assert d.getlist('bar') == ['2', '3'] - - assert sorted(d.items()) == [('bar', '2'), ('foo', '1')] - assert sorted(d.items(multi=True)) == \ - [('bar', '2'), ('bar', '3'), ('foo', '1')] - assert 'missingkey' not in d - assert 'foo' in d - - # type lookup - assert d.get('foo', type=int) == 1 - assert d.getlist('bar', type=int) == [2, 3] - - # get key errors for missing stuff - with pytest.raises(KeyError): - d['missing'] - - # make sure that they are immutable - with pytest.raises(TypeError): - d['foo'] = 'blub' - - # copies are immutable - d = d.copy() - with pytest.raises(TypeError): - d['foo'] = 'blub' - - # make sure lists merges - md1 = datastructures.MultiDict((("foo", "bar"),)) - md2 = datastructures.MultiDict((("foo", "blafasel"),)) - x = self.storage_class((md1, md2)) - assert list(iterlists(x)) == [('foo', ['bar', 'blafasel'])] - - def test_length(self): - d1 = datastructures.MultiDict([('foo', '1')]) - d2 = datastructures.MultiDict([('bar', '2')]) - assert len(d1) == len(d2) == 1 - d = self.storage_class([d1, d2]) - assert len(d) == 2 - d1.clear() - assert len(d1) == 0 - assert len(d) == 1 - - -class TestHeaders(object): - storage_class = datastructures.Headers - - def test_basic_interface(self): - headers = self.storage_class() - headers.add('Content-Type', 'text/plain') - headers.add('X-Foo', 'bar') - assert 'x-Foo' in headers - assert 'Content-type' in headers - - headers['Content-Type'] = 'foo/bar' - assert headers['Content-Type'] == 'foo/bar' - assert len(headers.getlist('Content-Type')) == 1 - - # list conversion - assert headers.to_wsgi_list() == [ - ('Content-Type', 'foo/bar'), - ('X-Foo', 'bar') - ] - assert str(headers) == ( - "Content-Type: foo/bar\r\n" - "X-Foo: bar\r\n" - "\r\n" - ) - assert str(self.storage_class()) == "\r\n" - - # extended add - headers.add('Content-Disposition', 'attachment', filename='foo') - assert headers['Content-Disposition'] == 'attachment; filename=foo' - - headers.add('x', 'y', z='"') - assert headers['x'] == r'y; z="\""' - - def test_defaults_and_conversion(self): - # defaults - headers = self.storage_class([ - ('Content-Type', 'text/plain'), - ('X-Foo', 'bar'), - ('X-Bar', '1'), - ('X-Bar', '2') - ]) - assert headers.getlist('x-bar') == ['1', '2'] - assert headers.get('x-Bar') == '1' - assert headers.get('Content-Type') == 'text/plain' - - assert headers.setdefault('X-Foo', 'nope') == 'bar' - assert headers.setdefault('X-Bar', 'nope') == '1' - assert headers.setdefault('X-Baz', 'quux') == 'quux' - assert headers.setdefault('X-Baz', 'nope') == 'quux' - headers.pop('X-Baz') - - # type conversion - assert headers.get('x-bar', type=int) == 1 - assert headers.getlist('x-bar', type=int) == [1, 2] - - # list like operations - assert headers[0] == ('Content-Type', 'text/plain') - assert headers[:1] == self.storage_class([('Content-Type', 'text/plain')]) - del headers[:2] - del headers[-1] - assert headers == self.storage_class([('X-Bar', '1')]) - - def test_copying(self): - a = self.storage_class([('foo', 'bar')]) - b = a.copy() - a.add('foo', 'baz') - assert a.getlist('foo') == ['bar', 'baz'] - assert b.getlist('foo') == ['bar'] - - def test_popping(self): - headers = self.storage_class([('a', 1)]) - assert headers.pop('a') == 1 - assert headers.pop('b', 2) == 2 - - with pytest.raises(KeyError): - headers.pop('c') - - def test_set_arguments(self): - a = self.storage_class() - a.set('Content-Disposition', 'useless') - a.set('Content-Disposition', 'attachment', filename='foo') - assert a['Content-Disposition'] == 'attachment; filename=foo' - - def test_reject_newlines(self): - h = self.storage_class() - - for variation in 'foo\nbar', 'foo\r\nbar', 'foo\rbar': - with pytest.raises(ValueError): - h['foo'] = variation - with pytest.raises(ValueError): - h.add('foo', variation) - with pytest.raises(ValueError): - h.add('foo', 'test', option=variation) - with pytest.raises(ValueError): - h.set('foo', variation) - with pytest.raises(ValueError): - h.set('foo', 'test', option=variation) - - def test_slicing(self): - # there's nothing wrong with these being native strings - # Headers doesn't care about the data types - h = self.storage_class() - h.set('X-Foo-Poo', 'bleh') - h.set('Content-Type', 'application/whocares') - h.set('X-Forwarded-For', '192.168.0.123') - h[:] = [(k, v) for k, v in h if k.startswith(u'X-')] - assert list(h) == [ - ('X-Foo-Poo', 'bleh'), - ('X-Forwarded-For', '192.168.0.123') - ] - - def test_bytes_operations(self): - h = self.storage_class() - h.set('X-Foo-Poo', 'bleh') - h.set('X-Whoops', b'\xff') - - assert h.get('x-foo-poo', as_bytes=True) == b'bleh' - assert h.get('x-whoops', as_bytes=True) == b'\xff' - - def test_to_wsgi_list(self): - h = self.storage_class() - h.set(u'Key', u'Value') - for key, value in h.to_wsgi_list(): - if PY2: - strict_eq(key, b'Key') - strict_eq(value, b'Value') - else: - strict_eq(key, u'Key') - strict_eq(value, u'Value') - - -class TestEnvironHeaders(object): - storage_class = datastructures.EnvironHeaders - - def test_basic_interface(self): - # this happens in multiple WSGI servers because they - # use a vary naive way to convert the headers; - broken_env = { - 'HTTP_CONTENT_TYPE': 'text/html', - 'CONTENT_TYPE': 'text/html', - 'HTTP_CONTENT_LENGTH': '0', - 'CONTENT_LENGTH': '0', - 'HTTP_ACCEPT': '*', - 'wsgi.version': (1, 0) - } - headers = self.storage_class(broken_env) - assert headers - assert len(headers) == 3 - assert sorted(headers) == [ - ('Accept', '*'), - ('Content-Length', '0'), - ('Content-Type', 'text/html') - ] - assert not self.storage_class({'wsgi.version': (1, 0)}) - assert len(self.storage_class({'wsgi.version': (1, 0)})) == 0 - - def test_return_type_is_unicode(self): - # environ contains native strings; we return unicode - headers = self.storage_class({ - 'HTTP_FOO': '\xe2\x9c\x93', - 'CONTENT_TYPE': 'text/plain', - }) - assert headers['Foo'] == u"\xe2\x9c\x93" - assert isinstance(headers['Foo'], text_type) - assert isinstance(headers['Content-Type'], text_type) - iter_output = dict(iter(headers)) - assert iter_output['Foo'] == u"\xe2\x9c\x93" - assert isinstance(iter_output['Foo'], text_type) - assert isinstance(iter_output['Content-Type'], text_type) - - def test_bytes_operations(self): - foo_val = '\xff' - h = self.storage_class({ - 'HTTP_X_FOO': foo_val - }) - - assert h.get('x-foo', as_bytes=True) == b'\xff' - assert h.get('x-foo') == u'\xff' - - -class TestHeaderSet(object): - storage_class = datastructures.HeaderSet - - def test_basic_interface(self): - hs = self.storage_class() - hs.add('foo') - hs.add('bar') - assert 'Bar' in hs - assert hs.find('foo') == 0 - assert hs.find('BAR') == 1 - assert hs.find('baz') < 0 - hs.discard('missing') - hs.discard('foo') - assert hs.find('foo') < 0 - assert hs.find('bar') == 0 - - with pytest.raises(IndexError): - hs.index('missing') - - assert hs.index('bar') == 0 - assert hs - hs.clear() - assert not hs - - -class TestImmutableList(object): - storage_class = datastructures.ImmutableList - - def test_list_hashable(self): - t = (1, 2, 3, 4) - l = self.storage_class(t) - assert hash(t) == hash(l) - assert t != l - - -def make_call_asserter(func=None): - """Utility to assert a certain number of function calls. - - :param func: Additional callback for each function call. - - >>> assert_calls, func = make_call_asserter() - >>> with assert_calls(2): - func() - func() - """ - - calls = [0] - - @contextmanager - def asserter(count, msg=None): - calls[0] = 0 - yield - assert calls[0] == count - - def wrapped(*args, **kwargs): - calls[0] += 1 - if func is not None: - return func(*args, **kwargs) - - return asserter, wrapped - - -class TestCallbackDict(object): - storage_class = datastructures.CallbackDict - - def test_callback_dict_reads(self): - assert_calls, func = make_call_asserter() - initial = {'a': 'foo', 'b': 'bar'} - dct = self.storage_class(initial=initial, on_update=func) - with assert_calls(0, 'callback triggered by read-only method'): - # read-only methods - dct['a'] - dct.get('a') - pytest.raises(KeyError, lambda: dct['x']) - 'a' in dct - list(iter(dct)) - dct.copy() - with assert_calls(0, 'callback triggered without modification'): - # methods that may write but don't - dct.pop('z', None) - dct.setdefault('a') - - def test_callback_dict_writes(self): - assert_calls, func = make_call_asserter() - initial = {'a': 'foo', 'b': 'bar'} - dct = self.storage_class(initial=initial, on_update=func) - with assert_calls(8, 'callback not triggered by write method'): - # always-write methods - dct['z'] = 123 - dct['z'] = 123 # must trigger again - del dct['z'] - dct.pop('b', None) - dct.setdefault('x') - dct.popitem() - dct.update([]) - dct.clear() - with assert_calls(0, 'callback triggered by failed del'): - pytest.raises(KeyError, lambda: dct.__delitem__('x')) - with assert_calls(0, 'callback triggered by failed pop'): - pytest.raises(KeyError, lambda: dct.pop('x')) - - -class TestCacheControl(object): - - def test_repr(self): - cc = datastructures.RequestCacheControl( - [("max-age", "0"), ("private", "True")], - ) - assert repr(cc) == "" - - -class TestAccept(object): - storage_class = datastructures.Accept - - def test_accept_basic(self): - accept = self.storage_class([('tinker', 0), ('tailor', 0.333), - ('soldier', 0.667), ('sailor', 1)]) - # check __getitem__ on indices - assert accept[3] == ('tinker', 0) - assert accept[2] == ('tailor', 0.333) - assert accept[1] == ('soldier', 0.667) - assert accept[0], ('sailor', 1) - # check __getitem__ on string - assert accept['tinker'] == 0 - assert accept['tailor'] == 0.333 - assert accept['soldier'] == 0.667 - assert accept['sailor'] == 1 - assert accept['spy'] == 0 - # check quality method - assert accept.quality('tinker') == 0 - assert accept.quality('tailor') == 0.333 - assert accept.quality('soldier') == 0.667 - assert accept.quality('sailor') == 1 - assert accept.quality('spy') == 0 - # check __contains__ - assert 'sailor' in accept - assert 'spy' not in accept - # check index method - assert accept.index('tinker') == 3 - assert accept.index('tailor') == 2 - assert accept.index('soldier') == 1 - assert accept.index('sailor') == 0 - with pytest.raises(ValueError): - accept.index('spy') - # check find method - assert accept.find('tinker') == 3 - assert accept.find('tailor') == 2 - assert accept.find('soldier') == 1 - assert accept.find('sailor') == 0 - assert accept.find('spy') == -1 - # check to_header method - assert accept.to_header() == \ - 'sailor,soldier;q=0.667,tailor;q=0.333,tinker;q=0' - # check best_match method - assert accept.best_match(['tinker', 'tailor', 'soldier', 'sailor'], - default=None) == 'sailor' - assert accept.best_match(['tinker', 'tailor', 'soldier'], - default=None) == 'soldier' - assert accept.best_match(['tinker', 'tailor'], default=None) == \ - 'tailor' - assert accept.best_match(['tinker'], default=None) is None - assert accept.best_match(['tinker'], default='x') == 'x' - - def test_accept_wildcard(self): - accept = self.storage_class([('*', 0), ('asterisk', 1)]) - assert '*' in accept - assert accept.best_match(['asterisk', 'star'], default=None) == \ - 'asterisk' - assert accept.best_match(['star'], default=None) is None - - @pytest.mark.skipif(True, reason='Werkzeug doesn\'t respect specificity.') - def test_accept_wildcard_specificity(self): - accept = self.storage_class([('asterisk', 0), ('star', 0.5), ('*', 1)]) - assert accept.best_match(['star', 'asterisk'], default=None) == 'star' - assert accept.best_match(['asterisk', 'star'], default=None) == 'star' - assert accept.best_match(['asterisk', 'times'], default=None) == \ - 'times' - assert accept.best_match(['asterisk'], default=None) is None - - -class TestFileStorage(object): - storage_class = datastructures.FileStorage - - def test_mimetype_always_lowercase(self): - file_storage = self.storage_class(content_type='APPLICATION/JSON') - assert file_storage.mimetype == 'application/json' - - def test_bytes_proper_sentinel(self): - # ensure we iterate over new lines and don't enter into an infinite loop - import io - unicode_storage = self.storage_class(io.StringIO(u"one\ntwo")) - for idx, line in enumerate(unicode_storage): - assert idx < 2 - assert idx == 1 - binary_storage = self.storage_class(io.BytesIO(b"one\ntwo")) - for idx, line in enumerate(binary_storage): - assert idx < 2 - assert idx == 1 diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_debug.py b/pythonPackages/Werkzeug-0.12.1/tests/test_debug.py deleted file mode 100644 index 8f1ecebd62..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_debug.py +++ /dev/null @@ -1,266 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.debug - ~~~~~~~~~~~ - - Tests some debug utilities. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import sys -import re -import io - -import pytest -import requests - -from werkzeug.debug import get_machine_id -from werkzeug.debug.repr import debug_repr, DebugReprGenerator, \ - dump, helper -from werkzeug.debug.console import HTMLStringO -from werkzeug.debug.tbtools import Traceback -from werkzeug._compat import PY2 - - -class TestDebugRepr(object): - - def test_basic_repr(self): - assert debug_repr([]) == u'[]' - assert debug_repr([1, 2]) == \ - u'[1, 2]' - assert debug_repr([1, 'test']) == \ - u'[1, \'test\']' - assert debug_repr([None]) == \ - u'[None]' - - def test_string_repr(self): - assert debug_repr('') == u'\'\'' - assert debug_repr('foo') == u'\'foo\'' - assert debug_repr('s' * 80) == u'\''\ - + 's' * 70 + ''\ - + 's' * 10 + '\'' - assert debug_repr('<' * 80) == u'\''\ - + '<' * 70 + ''\ - + '<' * 10 + '\'' - - def test_sequence_repr(self): - assert debug_repr(list(range(20))) == ( - u'[0, 1, ' - u'2, 3, ' - u'4, 5, ' - u'6, 7, ' - u'8, ' - u'9, 10, ' - u'11, 12, ' - u'13, 14, ' - u'15, 16, ' - u'17, 18, ' - u'19]' - ) - - def test_mapping_repr(self): - assert debug_repr({}) == u'{}' - assert debug_repr({'foo': 42}) == ( - u'{\'foo\'' - u': 42' - u'}' - ) - assert debug_repr(dict(zip(range(10), [None] * 10))) == ( - u'{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}' # noqa - ) - assert debug_repr((1, 'zwei', u'drei')) == ( - u'(1, \'' - u'zwei\', %s\'drei\')' - ) % ('u' if PY2 else '') - - def test_custom_repr(self): - class Foo(object): - - def __repr__(self): - return '' - assert debug_repr(Foo()) == \ - '<Foo 42>' - - def test_list_subclass_repr(self): - class MyList(list): - pass - assert debug_repr(MyList([1, 2])) == ( - u'tests.test_debug.MyList([' - u'1, 2])' - ) - - def test_regex_repr(self): - assert debug_repr(re.compile(r'foo\d')) == \ - u're.compile(r\'foo\\d\')' - # No ur'' in Py3 - # http://bugs.python.org/issue15096 - assert debug_repr(re.compile(u'foo\\d')) == ( - u're.compile(%sr\'foo\\d\')' % - ('u' if PY2 else '') - ) - - def test_set_repr(self): - assert debug_repr(frozenset('x')) == \ - u'frozenset([\'x\'])' - assert debug_repr(set('x')) == \ - u'set([\'x\'])' - - def test_recursive_repr(self): - a = [1] - a.append(a) - assert debug_repr(a) == u'[1, [...]]' - - def test_broken_repr(self): - class Foo(object): - - def __repr__(self): - raise Exception('broken!') - - assert debug_repr(Foo()) == ( - u'<broken repr (Exception: ' - u'broken!)>' - ) - - -class Foo(object): - x = 42 - y = 23 - - def __init__(self): - self.z = 15 - - -class TestDebugHelpers(object): - - def test_object_dumping(self): - drg = DebugReprGenerator() - out = drg.dump_object(Foo()) - assert re.search('Details for tests.test_debug.Foo object at', out) - assert re.search('x.*42', out, flags=re.DOTALL) - assert re.search('y.*23', out, flags=re.DOTALL) - assert re.search('z.*15', out, flags=re.DOTALL) - - out = drg.dump_object({'x': 42, 'y': 23}) - assert re.search('Contents of', out) - assert re.search('x.*42', out, flags=re.DOTALL) - assert re.search('y.*23', out, flags=re.DOTALL) - - out = drg.dump_object({'x': 42, 'y': 23, 23: 11}) - assert not re.search('Contents of', out) - - out = drg.dump_locals({'x': 42, 'y': 23}) - assert re.search('Local variables in frame', out) - assert re.search('x.*42', out, flags=re.DOTALL) - assert re.search('y.*23', out, flags=re.DOTALL) - - def test_debug_dump(self): - old = sys.stdout - sys.stdout = HTMLStringO() - try: - dump([1, 2, 3]) - x = sys.stdout.reset() - dump() - y = sys.stdout.reset() - finally: - sys.stdout = old - - assert 'Details for list object at' in x - assert '1' in x - assert 'Local variables in frame' in y - assert 'x' in y - assert 'old' in y - - def test_debug_help(self): - old = sys.stdout - sys.stdout = HTMLStringO() - try: - helper([1, 2, 3]) - x = sys.stdout.reset() - finally: - sys.stdout = old - - assert 'Help on list object' in x - assert '__delitem__' in x - - -class TestTraceback(object): - - def test_log(self): - try: - 1 / 0 - except ZeroDivisionError: - traceback = Traceback(*sys.exc_info()) - - buffer_ = io.BytesIO() if PY2 else io.StringIO() - traceback.log(buffer_) - assert buffer_.getvalue().strip() == traceback.plaintext.strip() - - def test_sourcelines_encoding(self): - source = (u'# -*- coding: latin1 -*-\n\n' - u'def foo():\n' - u' """höhö"""\n' - u' 1 / 0\n' - u'foo()').encode('latin1') - code = compile(source, filename='lol.py', mode='exec') - try: - eval(code) - except ZeroDivisionError: - traceback = Traceback(*sys.exc_info()) - - frames = traceback.frames - assert len(frames) == 3 - assert frames[1].filename == 'lol.py' - assert frames[2].filename == 'lol.py' - - class Loader(object): - - def get_source(self, module): - return source - - frames[1].loader = frames[2].loader = Loader() - assert frames[1].sourcelines == frames[2].sourcelines - assert [line.code for line in frames[1].get_annotated_lines()] == \ - [line.code for line in frames[2].get_annotated_lines()] - assert u'höhö' in frames[1].sourcelines[3] - - def test_filename_encoding(self, tmpdir, monkeypatch): - moduledir = tmpdir.mkdir('föö') - moduledir.join('bar.py').write('def foo():\n 1/0\n') - monkeypatch.syspath_prepend(str(moduledir)) - - import bar - - try: - bar.foo() - except ZeroDivisionError: - traceback = Traceback(*sys.exc_info()) - - assert u'föö' in u'\n'.join(frame.render() for frame in traceback.frames) - - -def test_get_machine_id(): - rv = get_machine_id() - assert isinstance(rv, bytes) - - -@pytest.mark.parametrize('crash', (True, False)) -def test_basic(dev_server, crash): - server = dev_server(''' - from werkzeug.debug import DebuggedApplication - - @DebuggedApplication - def app(environ, start_response): - if {crash}: - 1 / 0 - start_response('200 OK', [('Content-Type', 'text/html')]) - return [b'hello'] - '''.format(crash=crash)) - - r = requests.get(server.url) - assert r.status_code == 500 if crash else 200 - if crash: - assert 'The debugger caught an exception in your WSGI application' \ - in r.text - else: - assert r.text == 'hello' diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_exceptions.py b/pythonPackages/Werkzeug-0.12.1/tests/test_exceptions.py deleted file mode 100644 index f9d78217ba..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_exceptions.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.exceptions - ~~~~~~~~~~~~~~~~ - - The tests for the exception classes. - - TODO: - - - This is undertested. HTML is never checked - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import pytest - -from werkzeug import exceptions -from werkzeug.wrappers import Response -from werkzeug._compat import text_type - - -def test_proxy_exception(): - orig_resp = Response('Hello World') - with pytest.raises(exceptions.HTTPException) as excinfo: - exceptions.abort(orig_resp) - resp = excinfo.value.get_response({}) - assert resp is orig_resp - assert resp.get_data() == b'Hello World' - - -@pytest.mark.parametrize('test', [ - (exceptions.BadRequest, 400), - (exceptions.Unauthorized, 401), - (exceptions.Forbidden, 403), - (exceptions.NotFound, 404), - (exceptions.MethodNotAllowed, 405, ['GET', 'HEAD']), - (exceptions.NotAcceptable, 406), - (exceptions.RequestTimeout, 408), - (exceptions.Gone, 410), - (exceptions.LengthRequired, 411), - (exceptions.PreconditionFailed, 412), - (exceptions.RequestEntityTooLarge, 413), - (exceptions.RequestURITooLarge, 414), - (exceptions.UnsupportedMediaType, 415), - (exceptions.UnprocessableEntity, 422), - (exceptions.Locked, 423), - (exceptions.InternalServerError, 500), - (exceptions.NotImplemented, 501), - (exceptions.BadGateway, 502), - (exceptions.ServiceUnavailable, 503) -]) -def test_aborter_general(test): - exc_type = test[0] - args = test[1:] - - with pytest.raises(exc_type) as exc_info: - exceptions.abort(*args) - assert type(exc_info.value) is exc_type - - -def test_aborter_custom(): - myabort = exceptions.Aborter({1: exceptions.NotFound}) - pytest.raises(LookupError, myabort, 404) - pytest.raises(exceptions.NotFound, myabort, 1) - - myabort = exceptions.Aborter(extra={1: exceptions.NotFound}) - pytest.raises(exceptions.NotFound, myabort, 404) - pytest.raises(exceptions.NotFound, myabort, 1) - - -def test_exception_repr(): - exc = exceptions.NotFound() - assert text_type(exc) == ( - '404 Not Found: The requested URL was not found ' - 'on the server. If you entered the URL manually please check your ' - 'spelling and try again.') - assert repr(exc) == "" - - exc = exceptions.NotFound('Not There') - assert text_type(exc) == '404 Not Found: Not There' - assert repr(exc) == "" - - exc = exceptions.HTTPException('An error message') - assert text_type(exc) == '??? Unknown Error: An error message' - assert repr(exc) == "" - - -def test_special_exceptions(): - exc = exceptions.MethodNotAllowed(['GET', 'HEAD', 'POST']) - h = dict(exc.get_headers({})) - assert h['Allow'] == 'GET, HEAD, POST' - assert 'The method is not allowed' in exc.get_description() diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_formparser.py b/pythonPackages/Werkzeug-0.12.1/tests/test_formparser.py deleted file mode 100644 index c140476b7d..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_formparser.py +++ /dev/null @@ -1,445 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.formparser - ~~~~~~~~~~~~~~~~ - - Tests the form parsing facilities. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -from __future__ import with_statement - -import pytest - -from os.path import join, dirname - -from tests import strict_eq - -from werkzeug import formparser -from werkzeug.test import create_environ, Client -from werkzeug.wrappers import Request, Response -from werkzeug.exceptions import RequestEntityTooLarge -from werkzeug.datastructures import MultiDict -from werkzeug.formparser import parse_form_data, FormDataParser -from werkzeug._compat import BytesIO - - -@Request.application -def form_data_consumer(request): - result_object = request.args['object'] - if result_object == 'text': - return Response(repr(request.form['text'])) - f = request.files[result_object] - return Response(b'\n'.join(( - repr(f.filename).encode('ascii'), - repr(f.name).encode('ascii'), - repr(f.content_type).encode('ascii'), - f.stream.read() - ))) - - -def get_contents(filename): - with open(filename, 'rb') as f: - return f.read() - - -class TestFormParser(object): - - def test_limiting(self): - data = b'foo=Hello+World&bar=baz' - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='application/x-www-form-urlencoded', - method='POST') - req.max_content_length = 400 - strict_eq(req.form['foo'], u'Hello World') - - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='application/x-www-form-urlencoded', - method='POST') - req.max_form_memory_size = 7 - pytest.raises(RequestEntityTooLarge, lambda: req.form['foo']) - - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='application/x-www-form-urlencoded', - method='POST') - req.max_form_memory_size = 400 - strict_eq(req.form['foo'], u'Hello World') - - data = (b'--foo\r\nContent-Disposition: form-field; name=foo\r\n\r\n' - b'Hello World\r\n' - b'--foo\r\nContent-Disposition: form-field; name=bar\r\n\r\n' - b'bar=baz\r\n--foo--') - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - req.max_content_length = 4 - pytest.raises(RequestEntityTooLarge, lambda: req.form['foo']) - - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - req.max_content_length = 400 - strict_eq(req.form['foo'], u'Hello World') - - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - req.max_form_memory_size = 7 - pytest.raises(RequestEntityTooLarge, lambda: req.form['foo']) - - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - req.max_form_memory_size = 400 - strict_eq(req.form['foo'], u'Hello World') - - def test_missing_multipart_boundary(self): - data = (b'--foo\r\nContent-Disposition: form-field; name=foo\r\n\r\n' - b'Hello World\r\n' - b'--foo\r\nContent-Disposition: form-field; name=bar\r\n\r\n' - b'bar=baz\r\n--foo--') - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data', - method='POST') - assert req.form == {} - - def test_parse_form_data_put_without_content(self): - # A PUT without a Content-Type header returns empty data - - # Both rfc1945 and rfc2616 (1.0 and 1.1) say "Any HTTP/[1.0/1.1] message - # containing an entity-body SHOULD include a Content-Type header field - # defining the media type of that body." In the case where either - # headers are omitted, parse_form_data should still work. - env = create_environ('/foo', 'http://example.org/', method='PUT') - del env['CONTENT_TYPE'] - del env['CONTENT_LENGTH'] - - stream, form, files = formparser.parse_form_data(env) - strict_eq(stream.read(), b'') - strict_eq(len(form), 0) - strict_eq(len(files), 0) - - def test_parse_form_data_get_without_content(self): - env = create_environ('/foo', 'http://example.org/', method='GET') - del env['CONTENT_TYPE'] - del env['CONTENT_LENGTH'] - - stream, form, files = formparser.parse_form_data(env) - strict_eq(stream.read(), b'') - strict_eq(len(form), 0) - strict_eq(len(files), 0) - - def test_large_file(self): - data = b'x' * (1024 * 600) - req = Request.from_values(data={'foo': (BytesIO(data), 'test.txt')}, - method='POST') - # make sure we have a real file here, because we expect to be - # on the disk. > 1024 * 500 - assert hasattr(req.files['foo'].stream, u'fileno') - # close file to prevent fds from leaking - req.files['foo'].close() - - def test_streaming_parse(self): - data = b'x' * (1024 * 600) - - class StreamMPP(formparser.MultiPartParser): - - def parse(self, file, boundary, content_length): - i = iter(self.parse_lines(file, boundary, content_length, - cap_at_buffer=False)) - one = next(i) - two = next(i) - return self.cls(()), {'one': one, 'two': two} - - class StreamFDP(formparser.FormDataParser): - - def _sf_parse_multipart(self, stream, mimetype, - content_length, options): - form, files = StreamMPP( - self.stream_factory, self.charset, self.errors, - max_form_memory_size=self.max_form_memory_size, - cls=self.cls).parse(stream, options.get('boundary').encode('ascii'), - content_length) - return stream, form, files - parse_functions = {} - parse_functions.update(formparser.FormDataParser.parse_functions) - parse_functions['multipart/form-data'] = _sf_parse_multipart - - class StreamReq(Request): - form_data_parser_class = StreamFDP - req = StreamReq.from_values(data={'foo': (BytesIO(data), 'test.txt')}, - method='POST') - strict_eq('begin_file', req.files['one'][0]) - strict_eq(('foo', 'test.txt'), req.files['one'][1][1:]) - strict_eq('cont', req.files['two'][0]) - strict_eq(data, req.files['two'][1]) - - def test_parse_bad_content_type(self): - parser = FormDataParser() - assert parser.parse('', 'bad-mime-type', 0) == \ - ('', MultiDict([]), MultiDict([])) - - def test_parse_from_environ(self): - parser = FormDataParser() - stream, _, _ = parser.parse_from_environ({'wsgi.input': ''}) - assert stream is not None - - -class TestMultiPart(object): - - def test_basic(self): - resources = join(dirname(__file__), 'multipart') - client = Client(form_data_consumer, Response) - - repository = [ - ('firefox3-2png1txt', '---------------------------186454651713519341951581030105', [ - (u'anchor.png', 'file1', 'image/png', 'file1.png'), - (u'application_edit.png', 'file2', 'image/png', 'file2.png') - ], u'example text'), - ('firefox3-2pnglongtext', '---------------------------14904044739787191031754711748', [ - (u'accept.png', 'file1', 'image/png', 'file1.png'), - (u'add.png', 'file2', 'image/png', 'file2.png') - ], u'--long text\r\n--with boundary\r\n--lookalikes--'), - ('opera8-2png1txt', '----------zEO9jQKmLc2Cq88c23Dx19', [ - (u'arrow_branch.png', 'file1', 'image/png', 'file1.png'), - (u'award_star_bronze_1.png', 'file2', 'image/png', 'file2.png') - ], u'blafasel öäü'), - ('webkit3-2png1txt', '----WebKitFormBoundaryjdSFhcARk8fyGNy6', [ - (u'gtk-apply.png', 'file1', 'image/png', 'file1.png'), - (u'gtk-no.png', 'file2', 'image/png', 'file2.png') - ], u'this is another text with ümläüts'), - ('ie6-2png1txt', '---------------------------7d91b03a20128', [ - (u'file1.png', 'file1', 'image/x-png', 'file1.png'), - (u'file2.png', 'file2', 'image/x-png', 'file2.png') - ], u'ie6 sucks :-/') - ] - - for name, boundary, files, text in repository: - folder = join(resources, name) - data = get_contents(join(folder, 'request.txt')) - for filename, field, content_type, fsname in files: - response = client.post( - '/?object=' + field, - data=data, - content_type='multipart/form-data; boundary="%s"' % boundary, - content_length=len(data)) - lines = response.get_data().split(b'\n', 3) - strict_eq(lines[0], repr(filename).encode('ascii')) - strict_eq(lines[1], repr(field).encode('ascii')) - strict_eq(lines[2], repr(content_type).encode('ascii')) - strict_eq(lines[3], get_contents(join(folder, fsname))) - response = client.post( - '/?object=text', - data=data, - content_type='multipart/form-data; boundary="%s"' % boundary, - content_length=len(data)) - strict_eq(response.get_data(), repr(text).encode('utf-8')) - - def test_ie7_unc_path(self): - client = Client(form_data_consumer, Response) - data_file = join(dirname(__file__), 'multipart', 'ie7_full_path_request.txt') - data = get_contents(data_file) - boundary = '---------------------------7da36d1b4a0164' - response = client.post( - '/?object=cb_file_upload_multiple', - data=data, - content_type='multipart/form-data; boundary="%s"' % boundary, - content_length=len(data)) - lines = response.get_data().split(b'\n', 3) - strict_eq(lines[0], - repr(u'Sellersburg Town Council Meeting 02-22-2010doc.doc').encode('ascii')) - - def test_end_of_file(self): - # This test looks innocent but it was actually timeing out in - # the Werkzeug 0.5 release version (#394) - data = ( - b'--foo\r\n' - b'Content-Disposition: form-data; name="test"; filename="test.txt"\r\n' - b'Content-Type: text/plain\r\n\r\n' - b'file contents and no end' - ) - data = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - assert not data.files - assert not data.form - - def test_broken(self): - data = ( - '--foo\r\n' - 'Content-Disposition: form-data; name="test"; filename="test.txt"\r\n' - 'Content-Transfer-Encoding: base64\r\n' - 'Content-Type: text/plain\r\n\r\n' - 'broken base 64' - '--foo--' - ) - _, form, files = formparser.parse_form_data(create_environ( - data=data, method='POST', content_type='multipart/form-data; boundary=foo' - )) - assert not files - assert not form - - pytest.raises(ValueError, formparser.parse_form_data, - create_environ(data=data, method='POST', - content_type='multipart/form-data; boundary=foo'), - silent=False) - - def test_file_no_content_type(self): - data = ( - b'--foo\r\n' - b'Content-Disposition: form-data; name="test"; filename="test.txt"\r\n\r\n' - b'file contents\r\n--foo--' - ) - data = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - assert data.files['test'].filename == 'test.txt' - strict_eq(data.files['test'].read(), b'file contents') - - def test_extra_newline(self): - # this test looks innocent but it was actually timeing out in - # the Werkzeug 0.5 release version (#394) - data = ( - b'\r\n\r\n--foo\r\n' - b'Content-Disposition: form-data; name="foo"\r\n\r\n' - b'a string\r\n' - b'--foo--' - ) - data = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - assert not data.files - strict_eq(data.form['foo'], u'a string') - - def test_headers(self): - data = (b'--foo\r\n' - b'Content-Disposition: form-data; name="foo"; filename="foo.txt"\r\n' - b'X-Custom-Header: blah\r\n' - b'Content-Type: text/plain; charset=utf-8\r\n\r\n' - b'file contents, just the contents\r\n' - b'--foo--') - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - foo = req.files['foo'] - strict_eq(foo.mimetype, 'text/plain') - strict_eq(foo.mimetype_params, {'charset': 'utf-8'}) - strict_eq(foo.headers['content-type'], foo.content_type) - strict_eq(foo.content_type, 'text/plain; charset=utf-8') - strict_eq(foo.headers['x-custom-header'], 'blah') - - def test_nonstandard_line_endings(self): - for nl in b'\n', b'\r', b'\r\n': - data = nl.join(( - b'--foo', - b'Content-Disposition: form-data; name=foo', - b'', - b'this is just bar', - b'--foo', - b'Content-Disposition: form-data; name=bar', - b'', - b'blafasel', - b'--foo--' - )) - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; ' - 'boundary=foo', method='POST') - strict_eq(req.form['foo'], u'this is just bar') - strict_eq(req.form['bar'], u'blafasel') - - def test_failures(self): - def parse_multipart(stream, boundary, content_length): - parser = formparser.MultiPartParser(content_length) - return parser.parse(stream, boundary, content_length) - pytest.raises(ValueError, parse_multipart, BytesIO(), b'broken ', 0) - - data = b'--foo\r\n\r\nHello World\r\n--foo--' - pytest.raises(ValueError, parse_multipart, BytesIO(data), b'foo', len(data)) - - data = b'--foo\r\nContent-Disposition: form-field; name=foo\r\n' \ - b'Content-Transfer-Encoding: base64\r\n\r\nHello World\r\n--foo--' - pytest.raises(ValueError, parse_multipart, BytesIO(data), b'foo', len(data)) - - data = b'--foo\r\nContent-Disposition: form-field; name=foo\r\n\r\nHello World\r\n' - pytest.raises(ValueError, parse_multipart, BytesIO(data), b'foo', len(data)) - - x = formparser.parse_multipart_headers(['foo: bar\r\n', ' x test\r\n']) - strict_eq(x['foo'], 'bar\n x test') - pytest.raises(ValueError, formparser.parse_multipart_headers, - ['foo: bar\r\n', ' x test']) - - def test_bad_newline_bad_newline_assumption(self): - class ISORequest(Request): - charset = 'latin1' - contents = b'U2vlbmUgbORu' - data = b'--foo\r\nContent-Disposition: form-data; name="test"\r\n' \ - b'Content-Transfer-Encoding: base64\r\n\r\n' + \ - contents + b'\r\n--foo--' - req = ISORequest.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - strict_eq(req.form['test'], u'Sk\xe5ne l\xe4n') - - def test_empty_multipart(self): - environ = {} - data = b'--boundary--' - environ['REQUEST_METHOD'] = 'POST' - environ['CONTENT_TYPE'] = 'multipart/form-data; boundary=boundary' - environ['CONTENT_LENGTH'] = str(len(data)) - environ['wsgi.input'] = BytesIO(data) - stream, form, files = parse_form_data(environ, silent=False) - rv = stream.read() - assert rv == b'' - assert form == MultiDict() - assert files == MultiDict() - - -class TestMultiPartParser(object): - - def test_constructor_not_pass_stream_factory_and_cls(self): - parser = formparser.MultiPartParser() - - assert parser.stream_factory is formparser.default_stream_factory - assert parser.cls is MultiDict - - def test_constructor_pass_stream_factory_and_cls(self): - def stream_factory(): - pass - - parser = formparser.MultiPartParser(stream_factory=stream_factory, cls=dict) - - assert parser.stream_factory is stream_factory - assert parser.cls is dict - - -class TestInternalFunctions(object): - - def test_line_parser(self): - assert formparser._line_parse('foo') == ('foo', False) - assert formparser._line_parse('foo\r\n') == ('foo', True) - assert formparser._line_parse('foo\r') == ('foo', True) - assert formparser._line_parse('foo\n') == ('foo', True) - - def test_find_terminator(self): - lineiter = iter(b'\n\n\nfoo\nbar\nbaz'.splitlines(True)) - find_terminator = formparser.MultiPartParser()._find_terminator - line = find_terminator(lineiter) - assert line == b'foo' - assert list(lineiter) == [b'bar\n', b'baz'] - assert find_terminator([]) == b'' - assert find_terminator([b'']) == b'' diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_http.py b/pythonPackages/Werkzeug-0.12.1/tests/test_http.py deleted file mode 100644 index b77e3c384c..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_http.py +++ /dev/null @@ -1,529 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.http - ~~~~~~~~~~ - - HTTP parsing utilities. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import pytest - -from datetime import datetime - -from tests import strict_eq -from werkzeug._compat import itervalues, wsgi_encoding_dance - -from werkzeug import http, datastructures -from werkzeug.test import create_environ - - -class TestHTTPUtility(object): - - def test_accept(self): - a = http.parse_accept_header('en-us,ru;q=0.5') - assert list(itervalues(a)) == ['en-us', 'ru'] - assert a.best == 'en-us' - assert a.find('ru') == 1 - pytest.raises(ValueError, a.index, 'de') - assert a.to_header() == 'en-us,ru;q=0.5' - - def test_mime_accept(self): - a = http.parse_accept_header('text/xml,application/xml,' - 'application/xhtml+xml,' - 'application/foo;quiet=no; bar=baz;q=0.6,' - 'text/html;q=0.9,text/plain;q=0.8,' - 'image/png,*/*;q=0.5', - datastructures.MIMEAccept) - pytest.raises(ValueError, lambda: a['missing']) - assert a['image/png'] == 1 - assert a['text/plain'] == 0.8 - assert a['foo/bar'] == 0.5 - assert a['application/foo;quiet=no; bar=baz'] == 0.6 - assert a[a.find('foo/bar')] == ('*/*', 0.5) - - def test_accept_matches(self): - a = http.parse_accept_header('text/xml,application/xml,application/xhtml+xml,' - 'text/html;q=0.9,text/plain;q=0.8,' - 'image/png', datastructures.MIMEAccept) - assert a.best_match(['text/html', 'application/xhtml+xml']) == \ - 'application/xhtml+xml' - assert a.best_match(['text/html']) == 'text/html' - assert a.best_match(['foo/bar']) is None - assert a.best_match(['foo/bar', 'bar/foo'], default='foo/bar') == 'foo/bar' - assert a.best_match(['application/xml', 'text/xml']) == 'application/xml' - - def test_charset_accept(self): - a = http.parse_accept_header('ISO-8859-1,utf-8;q=0.7,*;q=0.7', - datastructures.CharsetAccept) - assert a['iso-8859-1'] == a['iso8859-1'] - assert a['iso-8859-1'] == 1 - assert a['UTF8'] == 0.7 - assert a['ebcdic'] == 0.7 - - def test_language_accept(self): - a = http.parse_accept_header('de-AT,de;q=0.8,en;q=0.5', - datastructures.LanguageAccept) - assert a.best == 'de-AT' - assert 'de_AT' in a - assert 'en' in a - assert a['de-at'] == 1 - assert a['en'] == 0.5 - - def test_set_header(self): - hs = http.parse_set_header('foo, Bar, "Blah baz", Hehe') - assert 'blah baz' in hs - assert 'foobar' not in hs - assert 'foo' in hs - assert list(hs) == ['foo', 'Bar', 'Blah baz', 'Hehe'] - hs.add('Foo') - assert hs.to_header() == 'foo, Bar, "Blah baz", Hehe' - - def test_list_header(self): - hl = http.parse_list_header('foo baz, blah') - assert hl == ['foo baz', 'blah'] - - def test_dict_header(self): - d = http.parse_dict_header('foo="bar baz", blah=42') - assert d == {'foo': 'bar baz', 'blah': '42'} - - def test_cache_control_header(self): - cc = http.parse_cache_control_header('max-age=0, no-cache') - assert cc.max_age == 0 - assert cc.no_cache - cc = http.parse_cache_control_header('private, community="UCI"', None, - datastructures.ResponseCacheControl) - assert cc.private - assert cc['community'] == 'UCI' - - c = datastructures.ResponseCacheControl() - assert c.no_cache is None - assert c.private is None - c.no_cache = True - assert c.no_cache == '*' - c.private = True - assert c.private == '*' - del c.private - assert c.private is None - assert c.to_header() == 'no-cache' - - def test_authorization_header(self): - a = http.parse_authorization_header('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') - assert a.type == 'basic' - assert a.username == 'Aladdin' - assert a.password == 'open sesame' - - a = http.parse_authorization_header('''Digest username="Mufasa", - realm="testrealm@host.invalid", - nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", - uri="/dir/index.html", - qop=auth, - nc=00000001, - cnonce="0a4f113b", - response="6629fae49393a05397450978507c4ef1", - opaque="5ccc069c403ebaf9f0171e9517f40e41"''') - assert a.type == 'digest' - assert a.username == 'Mufasa' - assert a.realm == 'testrealm@host.invalid' - assert a.nonce == 'dcd98b7102dd2f0e8b11d0f600bfb0c093' - assert a.uri == '/dir/index.html' - assert 'auth' in a.qop - assert a.nc == '00000001' - assert a.cnonce == '0a4f113b' - assert a.response == '6629fae49393a05397450978507c4ef1' - assert a.opaque == '5ccc069c403ebaf9f0171e9517f40e41' - - a = http.parse_authorization_header('''Digest username="Mufasa", - realm="testrealm@host.invalid", - nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", - uri="/dir/index.html", - response="e257afa1414a3340d93d30955171dd0e", - opaque="5ccc069c403ebaf9f0171e9517f40e41"''') - assert a.type == 'digest' - assert a.username == 'Mufasa' - assert a.realm == 'testrealm@host.invalid' - assert a.nonce == 'dcd98b7102dd2f0e8b11d0f600bfb0c093' - assert a.uri == '/dir/index.html' - assert a.response == 'e257afa1414a3340d93d30955171dd0e' - assert a.opaque == '5ccc069c403ebaf9f0171e9517f40e41' - - assert http.parse_authorization_header('') is None - assert http.parse_authorization_header(None) is None - assert http.parse_authorization_header('foo') is None - - def test_www_authenticate_header(self): - wa = http.parse_www_authenticate_header('Basic realm="WallyWorld"') - assert wa.type == 'basic' - assert wa.realm == 'WallyWorld' - wa.realm = 'Foo Bar' - assert wa.to_header() == 'Basic realm="Foo Bar"' - - wa = http.parse_www_authenticate_header('''Digest - realm="testrealm@host.com", - qop="auth,auth-int", - nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", - opaque="5ccc069c403ebaf9f0171e9517f40e41"''') - assert wa.type == 'digest' - assert wa.realm == 'testrealm@host.com' - assert 'auth' in wa.qop - assert 'auth-int' in wa.qop - assert wa.nonce == 'dcd98b7102dd2f0e8b11d0f600bfb0c093' - assert wa.opaque == '5ccc069c403ebaf9f0171e9517f40e41' - - wa = http.parse_www_authenticate_header('broken') - assert wa.type == 'broken' - - assert not http.parse_www_authenticate_header('').type - assert not http.parse_www_authenticate_header('') - - def test_etags(self): - assert http.quote_etag('foo') == '"foo"' - assert http.quote_etag('foo', True) == 'W/"foo"' - assert http.unquote_etag('"foo"') == ('foo', False) - assert http.unquote_etag('W/"foo"') == ('foo', True) - es = http.parse_etags('"foo", "bar", W/"baz", blar') - assert sorted(es) == ['bar', 'blar', 'foo'] - assert 'foo' in es - assert 'baz' not in es - assert es.contains_weak('baz') - assert 'blar' in es - assert es.contains_raw('W/"baz"') - assert es.contains_raw('"foo"') - assert sorted(es.to_header().split(', ')) == ['"bar"', '"blar"', '"foo"', 'W/"baz"'] - - def test_etags_nonzero(self): - etags = http.parse_etags('W/"foo"') - assert bool(etags) - assert etags.contains_raw('W/"foo"') - - def test_parse_date(self): - assert http.parse_date('Sun, 06 Nov 1994 08:49:37 GMT ') == datetime( - 1994, 11, 6, 8, 49, 37) - assert http.parse_date('Sunday, 06-Nov-94 08:49:37 GMT') == datetime(1994, 11, 6, 8, 49, 37) - assert http.parse_date(' Sun Nov 6 08:49:37 1994') == datetime(1994, 11, 6, 8, 49, 37) - assert http.parse_date('foo') is None - - def test_parse_date_overflows(self): - assert http.parse_date(' Sun 02 Feb 1343 08:49:37 GMT') == datetime(1343, 2, 2, 8, 49, 37) - assert http.parse_date('Thu, 01 Jan 1970 00:00:00 GMT') == datetime(1970, 1, 1, 0, 0) - assert http.parse_date('Thu, 33 Jan 1970 00:00:00 GMT') is None - - def test_remove_entity_headers(self): - now = http.http_date() - headers1 = [('Date', now), ('Content-Type', 'text/html'), ('Content-Length', '0')] - headers2 = datastructures.Headers(headers1) - - http.remove_entity_headers(headers1) - assert headers1 == [('Date', now)] - - http.remove_entity_headers(headers2) - assert headers2 == datastructures.Headers([(u'Date', now)]) - - def test_remove_hop_by_hop_headers(self): - headers1 = [('Connection', 'closed'), ('Foo', 'bar'), - ('Keep-Alive', 'wtf')] - headers2 = datastructures.Headers(headers1) - - http.remove_hop_by_hop_headers(headers1) - assert headers1 == [('Foo', 'bar')] - - http.remove_hop_by_hop_headers(headers2) - assert headers2 == datastructures.Headers([('Foo', 'bar')]) - - def test_parse_options_header(self): - assert http.parse_options_header(None) == \ - ('', {}) - assert http.parse_options_header("") == \ - ('', {}) - assert http.parse_options_header(r'something; foo="other\"thing"') == \ - ('something', {'foo': 'other"thing'}) - assert http.parse_options_header(r'something; foo="other\"thing"; meh=42') == \ - ('something', {'foo': 'other"thing', 'meh': '42'}) - assert http.parse_options_header(r'something; foo="other\"thing"; meh=42; bleh') == \ - ('something', {'foo': 'other"thing', 'meh': '42', 'bleh': None}) - assert http.parse_options_header('something; foo="other;thing"; meh=42; bleh') == \ - ('something', {'foo': 'other;thing', 'meh': '42', 'bleh': None}) - assert http.parse_options_header('something; foo="otherthing"; meh=; bleh') == \ - ('something', {'foo': 'otherthing', 'meh': None, 'bleh': None}) - # Issue #404 - assert http.parse_options_header('multipart/form-data; name="foo bar"; ' - 'filename="bar foo"') == \ - ('multipart/form-data', {'name': 'foo bar', 'filename': 'bar foo'}) - # Examples from RFC - assert http.parse_options_header('audio/*; q=0.2, audio/basic') == \ - ('audio/*', {'q': '0.2'}) - assert http.parse_options_header('audio/*; q=0.2, audio/basic', multiple=True) == \ - ('audio/*', {'q': '0.2'}, "audio/basic", {}) - assert http.parse_options_header( - 'text/plain; q=0.5, text/html\n ' - 'text/x-dvi; q=0.8, text/x-c', - multiple=True) == \ - ('text/plain', {'q': '0.5'}, "text/html", {}, - "text/x-dvi", {'q': '0.8'}, "text/x-c", {}) - assert http.parse_options_header('text/plain; q=0.5, text/html\n' - ' ' - 'text/x-dvi; q=0.8, text/x-c') == \ - ('text/plain', {'q': '0.5'}) - # Issue #932 - assert http.parse_options_header( - 'form-data; ' - 'name="a_file"; ' - 'filename*=UTF-8\'\'' - '"%c2%a3%20and%20%e2%82%ac%20rates"') == \ - ('form-data', {'name': 'a_file', - 'filename': u'\xa3 and \u20ac rates'}) - assert http.parse_options_header( - 'form-data; ' - 'name*=UTF-8\'\'"%C5%AAn%C4%ADc%C5%8Dde%CC%BD"; ' - 'filename="some_file.txt"') == \ - ('form-data', {'name': u'\u016an\u012dc\u014dde\u033d', - 'filename': 'some_file.txt'}) - - def test_parse_options_header_broken_values(self): - # Issue #995 - assert http.parse_options_header(' ') == ('', {}) - assert http.parse_options_header(' , ') == ('', {}) - assert http.parse_options_header(' ; ') == ('', {}) - assert http.parse_options_header(' ,; ') == ('', {}) - assert http.parse_options_header(' , a ') == ('', {}) - assert http.parse_options_header(' ; a ') == ('', {}) - - def test_dump_options_header(self): - assert http.dump_options_header('foo', {'bar': 42}) == \ - 'foo; bar=42' - assert http.dump_options_header('foo', {'bar': 42, 'fizz': None}) in \ - ('foo; bar=42; fizz', 'foo; fizz; bar=42') - - def test_dump_header(self): - assert http.dump_header([1, 2, 3]) == '1, 2, 3' - assert http.dump_header([1, 2, 3], allow_token=False) == '"1", "2", "3"' - assert http.dump_header({'foo': 'bar'}, allow_token=False) == 'foo="bar"' - assert http.dump_header({'foo': 'bar'}) == 'foo=bar' - - def test_is_resource_modified(self): - env = create_environ() - - # ignore POST - env['REQUEST_METHOD'] = 'POST' - assert not http.is_resource_modified(env, etag='testing') - env['REQUEST_METHOD'] = 'GET' - - # etagify from data - pytest.raises(TypeError, http.is_resource_modified, env, - data='42', etag='23') - env['HTTP_IF_NONE_MATCH'] = http.generate_etag(b'awesome') - assert not http.is_resource_modified(env, data=b'awesome') - - env['HTTP_IF_MODIFIED_SINCE'] = http.http_date(datetime(2008, 1, 1, 12, 30)) - assert not http.is_resource_modified(env, - last_modified=datetime(2008, 1, 1, 12, 00)) - assert http.is_resource_modified(env, - last_modified=datetime(2008, 1, 1, 13, 00)) - - def test_is_resource_modified_for_range_requests(self): - env = create_environ() - - env['HTTP_IF_MODIFIED_SINCE'] = http.http_date(datetime(2008, 1, 1, 12, 30)) - env['HTTP_IF_RANGE'] = http.generate_etag(b'awesome_if_range') - # Range header not present, so If-Range should be ignored - assert not http.is_resource_modified(env, data=b'not_the_same', - ignore_if_range=False, - last_modified=datetime(2008, 1, 1, 12, 30)) - - env['HTTP_RANGE'] = '' - assert not http.is_resource_modified(env, data=b'awesome_if_range', - ignore_if_range=False) - assert http.is_resource_modified(env, data=b'not_the_same', - ignore_if_range=False) - - env['HTTP_IF_RANGE'] = http.http_date(datetime(2008, 1, 1, 13, 30)) - assert http.is_resource_modified(env, last_modified=datetime(2008, 1, 1, 14, 00), - ignore_if_range=False) - assert not http.is_resource_modified(env, last_modified=datetime(2008, 1, 1, 13, 30), - ignore_if_range=False) - assert http.is_resource_modified(env, last_modified=datetime(2008, 1, 1, 13, 30), - ignore_if_range=True) - - def test_date_formatting(self): - assert http.cookie_date(0) == 'Thu, 01-Jan-1970 00:00:00 GMT' - assert http.cookie_date(datetime(1970, 1, 1)) == 'Thu, 01-Jan-1970 00:00:00 GMT' - assert http.http_date(0) == 'Thu, 01 Jan 1970 00:00:00 GMT' - assert http.http_date(datetime(1970, 1, 1)) == 'Thu, 01 Jan 1970 00:00:00 GMT' - - def test_cookies(self): - strict_eq( - dict(http.parse_cookie('dismiss-top=6; CP=null*; PHPSESSID=0a539d42abc001cd' - 'c762809248d4beed; a=42; b="\\\";"')), - { - 'CP': u'null*', - 'PHPSESSID': u'0a539d42abc001cdc762809248d4beed', - 'a': u'42', - 'dismiss-top': u'6', - 'b': u'\";' - } - ) - rv = http.dump_cookie('foo', 'bar baz blub', 360, httponly=True, - sync_expires=False) - assert type(rv) is str - assert set(rv.split('; ')) == set(['HttpOnly', 'Max-Age=360', - 'Path=/', 'foo="bar baz blub"']) - - strict_eq(dict(http.parse_cookie('fo234{=bar; blub=Blah')), - {'fo234{': u'bar', 'blub': u'Blah'}) - - def test_cookie_quoting(self): - val = http.dump_cookie("foo", "?foo") - strict_eq(val, 'foo="?foo"; Path=/') - strict_eq(dict(http.parse_cookie(val)), {'foo': u'?foo'}) - - strict_eq(dict(http.parse_cookie(r'foo="foo\054bar"')), - {'foo': u'foo,bar'}) - - def test_cookie_domain_resolving(self): - val = http.dump_cookie('foo', 'bar', domain=u'\N{SNOWMAN}.com') - strict_eq(val, 'foo=bar; Domain=xn--n3h.com; Path=/') - - def test_cookie_unicode_dumping(self): - val = http.dump_cookie('foo', u'\N{SNOWMAN}') - h = datastructures.Headers() - h.add('Set-Cookie', val) - assert h['Set-Cookie'] == 'foo="\\342\\230\\203"; Path=/' - - cookies = http.parse_cookie(h['Set-Cookie']) - assert cookies['foo'] == u'\N{SNOWMAN}' - - def test_cookie_unicode_keys(self): - # Yes, this is technically against the spec but happens - val = http.dump_cookie(u'fö', u'fö') - assert val == wsgi_encoding_dance(u'fö="f\\303\\266"; Path=/', 'utf-8') - cookies = http.parse_cookie(val) - assert cookies[u'fö'] == u'fö' - - def test_cookie_unicode_parsing(self): - # This is actually a correct test. This is what is being submitted - # by firefox if you set an unicode cookie and we get the cookie sent - # in on Python 3 under PEP 3333. - cookies = http.parse_cookie(u'fö=fö') - assert cookies[u'fö'] == u'fö' - - def test_cookie_domain_encoding(self): - val = http.dump_cookie('foo', 'bar', domain=u'\N{SNOWMAN}.com') - strict_eq(val, 'foo=bar; Domain=xn--n3h.com; Path=/') - - val = http.dump_cookie('foo', 'bar', domain=u'.\N{SNOWMAN}.com') - strict_eq(val, 'foo=bar; Domain=.xn--n3h.com; Path=/') - - val = http.dump_cookie('foo', 'bar', domain=u'.foo.com') - strict_eq(val, 'foo=bar; Domain=.foo.com; Path=/') - - -class TestRange(object): - - def test_if_range_parsing(self): - rv = http.parse_if_range_header('"Test"') - assert rv.etag == 'Test' - assert rv.date is None - assert rv.to_header() == '"Test"' - - # weak information is dropped - rv = http.parse_if_range_header('W/"Test"') - assert rv.etag == 'Test' - assert rv.date is None - assert rv.to_header() == '"Test"' - - # broken etags are supported too - rv = http.parse_if_range_header('bullshit') - assert rv.etag == 'bullshit' - assert rv.date is None - assert rv.to_header() == '"bullshit"' - - rv = http.parse_if_range_header('Thu, 01 Jan 1970 00:00:00 GMT') - assert rv.etag is None - assert rv.date == datetime(1970, 1, 1) - assert rv.to_header() == 'Thu, 01 Jan 1970 00:00:00 GMT' - - for x in '', None: - rv = http.parse_if_range_header(x) - assert rv.etag is None - assert rv.date is None - assert rv.to_header() == '' - - def test_range_parsing(self): - rv = http.parse_range_header('bytes=52') - assert rv is None - - rv = http.parse_range_header('bytes=52-') - assert rv.units == 'bytes' - assert rv.ranges == [(52, None)] - assert rv.to_header() == 'bytes=52-' - - rv = http.parse_range_header('bytes=52-99') - assert rv.units == 'bytes' - assert rv.ranges == [(52, 100)] - assert rv.to_header() == 'bytes=52-99' - - rv = http.parse_range_header('bytes=52-99,-1000') - assert rv.units == 'bytes' - assert rv.ranges == [(52, 100), (-1000, None)] - assert rv.to_header() == 'bytes=52-99,-1000' - - rv = http.parse_range_header('bytes = 1 - 100') - assert rv.units == 'bytes' - assert rv.ranges == [(1, 101)] - assert rv.to_header() == 'bytes=1-100' - - rv = http.parse_range_header('AWesomes=0-999') - assert rv.units == 'awesomes' - assert rv.ranges == [(0, 1000)] - assert rv.to_header() == 'awesomes=0-999' - - rv = http.parse_range_header('bytes=-') - assert rv is None - - rv = http.parse_range_header('bytes=bullshit') - assert rv is None - - rv = http.parse_range_header('bytes=bullshit-1') - assert rv is None - - rv = http.parse_range_header('bytes=-bullshit') - assert rv is None - - rv = http.parse_range_header('bytes=52-99, bullshit') - assert rv is None - - def test_content_range_parsing(self): - rv = http.parse_content_range_header('bytes 0-98/*') - assert rv.units == 'bytes' - assert rv.start == 0 - assert rv.stop == 99 - assert rv.length is None - assert rv.to_header() == 'bytes 0-98/*' - - rv = http.parse_content_range_header('bytes 0-98/*asdfsa') - assert rv is None - - rv = http.parse_content_range_header('bytes 0-99/100') - assert rv.to_header() == 'bytes 0-99/100' - rv.start = None - rv.stop = None - assert rv.units == 'bytes' - assert rv.to_header() == 'bytes */100' - - rv = http.parse_content_range_header('bytes */100') - assert rv.start is None - assert rv.stop is None - assert rv.length == 100 - assert rv.units == 'bytes' - - -class TestRegression(object): - - def test_best_match_works(self): - # was a bug in 0.6 - rv = http.parse_accept_header('foo=,application/xml,application/xhtml+xml,' - 'text/html;q=0.9,text/plain;q=0.8,' - 'image/png,*/*;q=0.5', - datastructures.MIMEAccept).best_match(['foo/bar']) - assert rv == 'foo/bar' diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_internal.py b/pythonPackages/Werkzeug-0.12.1/tests/test_internal.py deleted file mode 100644 index 76d18a8a00..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_internal.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.internal - ~~~~~~~~~~~~~~ - - Internal tests. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import pytest - -from datetime import datetime -from warnings import filterwarnings, resetwarnings - -from werkzeug.wrappers import Request, Response - -from werkzeug import _internal as internal -from werkzeug.test import create_environ - - -def test_date_to_unix(): - assert internal._date_to_unix(datetime(1970, 1, 1)) == 0 - assert internal._date_to_unix(datetime(1970, 1, 1, 1, 0, 0)) == 3600 - assert internal._date_to_unix(datetime(1970, 1, 1, 1, 1, 1)) == 3661 - x = datetime(2010, 2, 15, 16, 15, 39) - assert internal._date_to_unix(x) == 1266250539 - - -def test_easteregg(): - req = Request.from_values('/?macgybarchakku') - resp = Response.force_type(internal._easteregg(None), req) - assert b'About Werkzeug' in resp.get_data() - assert b'the Swiss Army knife of Python web development' in resp.get_data() - - -def test_wrapper_internals(): - req = Request.from_values(data={'foo': 'bar'}, method='POST') - req._load_form_data() - assert req.form.to_dict() == {'foo': 'bar'} - - # second call does not break - req._load_form_data() - assert req.form.to_dict() == {'foo': 'bar'} - - # check reprs - assert repr(req) == "" - resp = Response() - assert repr(resp) == '' - resp.set_data('Hello World!') - assert repr(resp) == '' - resp.response = iter(['Test']) - assert repr(resp) == '' - - # unicode data does not set content length - response = Response([u'Hällo Wörld']) - headers = response.get_wsgi_headers(create_environ()) - assert u'Content-Length' not in headers - - response = Response([u'Hällo Wörld'.encode('utf-8')]) - headers = response.get_wsgi_headers(create_environ()) - assert u'Content-Length' in headers - - # check for internal warnings - filterwarnings('error', category=Warning) - response = Response() - environ = create_environ() - response.response = 'What the...?' - pytest.raises(Warning, lambda: list(response.iter_encoded())) - pytest.raises(Warning, lambda: list(response.get_app_iter(environ))) - response.direct_passthrough = True - pytest.raises(Warning, lambda: list(response.iter_encoded())) - pytest.raises(Warning, lambda: list(response.get_app_iter(environ))) - resetwarnings() diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_local.py b/pythonPackages/Werkzeug-0.12.1/tests/test_local.py deleted file mode 100644 index 94ce8b6d84..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_local.py +++ /dev/null @@ -1,207 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.local - ~~~~~~~~~~~~~~~~~~~~~~~~ - - Local and local proxy tests. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import pytest - -import time -import copy -from functools import partial -from threading import Thread - -from werkzeug import local - - -def test_basic_local(): - l = local.Local() - l.foo = 0 - values = [] - - def value_setter(idx): - time.sleep(0.01 * idx) - l.foo = idx - time.sleep(0.02) - values.append(l.foo) - threads = [Thread(target=value_setter, args=(x,)) - for x in [1, 2, 3]] - for thread in threads: - thread.start() - time.sleep(0.2) - assert sorted(values) == [1, 2, 3] - - def delfoo(): - del l.foo - delfoo() - pytest.raises(AttributeError, lambda: l.foo) - pytest.raises(AttributeError, delfoo) - - local.release_local(l) - - -def test_local_release(): - l = local.Local() - l.foo = 42 - local.release_local(l) - assert not hasattr(l, 'foo') - - ls = local.LocalStack() - ls.push(42) - local.release_local(ls) - assert ls.top is None - - -def test_local_proxy(): - foo = [] - ls = local.LocalProxy(lambda: foo) - ls.append(42) - ls.append(23) - ls[1:] = [1, 2, 3] - assert foo == [42, 1, 2, 3] - assert repr(foo) == repr(ls) - assert foo[0] == 42 - foo += [1] - assert list(foo) == [42, 1, 2, 3, 1] - - -def test_local_proxy_operations_math(): - foo = 2 - ls = local.LocalProxy(lambda: foo) - assert ls + 1 == 3 - assert 1 + ls == 3 - assert ls - 1 == 1 - assert 1 - ls == -1 - assert ls * 1 == 2 - assert 1 * ls == 2 - assert ls / 1 == 2 - assert 1.0 / ls == 0.5 - assert ls // 1.0 == 2.0 - assert 1.0 // ls == 0.0 - assert ls % 2 == 0 - assert 2 % ls == 0 - - -def test_local_proxy_operations_strings(): - foo = "foo" - ls = local.LocalProxy(lambda: foo) - assert ls + "bar" == "foobar" - assert "bar" + ls == "barfoo" - assert ls * 2 == "foofoo" - - foo = "foo %s" - assert ls % ("bar",) == "foo bar" - - -def test_local_stack(): - ident = local.get_ident() - - ls = local.LocalStack() - assert ident not in ls._local.__storage__ - assert ls.top is None - ls.push(42) - assert ident in ls._local.__storage__ - assert ls.top == 42 - ls.push(23) - assert ls.top == 23 - ls.pop() - assert ls.top == 42 - ls.pop() - assert ls.top is None - assert ls.pop() is None - assert ls.pop() is None - - proxy = ls() - ls.push([1, 2]) - assert proxy == [1, 2] - ls.push((1, 2)) - assert proxy == (1, 2) - ls.pop() - ls.pop() - assert repr(proxy) == '' - - assert ident not in ls._local.__storage__ - - -def test_local_proxies_with_callables(): - foo = 42 - ls = local.LocalProxy(lambda: foo) - assert ls == 42 - foo = [23] - ls.append(42) - assert ls == [23, 42] - assert foo == [23, 42] - - -def test_custom_idents(): - ident = 0 - l = local.Local() - stack = local.LocalStack() - local.LocalManager([l, stack], ident_func=lambda: ident) - - l.foo = 42 - stack.push({'foo': 42}) - ident = 1 - l.foo = 23 - stack.push({'foo': 23}) - ident = 0 - assert l.foo == 42 - assert stack.top['foo'] == 42 - stack.pop() - assert stack.top is None - ident = 1 - assert l.foo == 23 - assert stack.top['foo'] == 23 - stack.pop() - assert stack.top is None - - -def test_deepcopy_on_proxy(): - class Foo(object): - attr = 42 - - def __copy__(self): - return self - - def __deepcopy__(self, memo): - return self - f = Foo() - p = local.LocalProxy(lambda: f) - assert p.attr == 42 - assert copy.deepcopy(p) is f - assert copy.copy(p) is f - - a = [] - p2 = local.LocalProxy(lambda: [a]) - assert copy.copy(p2) == [a] - assert copy.copy(p2)[0] is a - - assert copy.deepcopy(p2) == [a] - assert copy.deepcopy(p2)[0] is not a - - -def test_local_proxy_wrapped_attribute(): - class SomeClassWithWrapped(object): - __wrapped__ = 'wrapped' - - def lookup_func(): - return 42 - - partial_lookup_func = partial(lookup_func) - - proxy = local.LocalProxy(lookup_func) - assert proxy.__wrapped__ is lookup_func - - partial_proxy = local.LocalProxy(partial_lookup_func) - assert partial_proxy.__wrapped__ == partial_lookup_func - - l = local.Local() - l.foo = SomeClassWithWrapped() - l.bar = 42 - - assert l('foo').__wrapped__ == 'wrapped' - pytest.raises(AttributeError, lambda: l('bar').__wrapped__) diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_routing.py b/pythonPackages/Werkzeug-0.12.1/tests/test_routing.py deleted file mode 100644 index dcdbc52de2..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_routing.py +++ /dev/null @@ -1,928 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.routing - ~~~~~~~~~~~~~ - - Routing tests. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import pytest - -import uuid - -from tests import strict_eq - -from werkzeug import routing as r -from werkzeug.wrappers import Response -from werkzeug.datastructures import ImmutableDict, MultiDict -from werkzeug.test import create_environ - - -def test_basic_routing(): - map = r.Map([ - r.Rule('/', endpoint='index'), - r.Rule('/foo', endpoint='foo'), - r.Rule('/bar/', endpoint='bar') - ]) - adapter = map.bind('example.org', '/') - assert adapter.match('/') == ('index', {}) - assert adapter.match('/foo') == ('foo', {}) - assert adapter.match('/bar/') == ('bar', {}) - pytest.raises(r.RequestRedirect, lambda: adapter.match('/bar')) - pytest.raises(r.NotFound, lambda: adapter.match('/blub')) - - adapter = map.bind('example.org', '/test') - with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match('/bar') - assert excinfo.value.new_url == 'http://example.org/test/bar/' - - adapter = map.bind('example.org', '/') - with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match('/bar') - assert excinfo.value.new_url == 'http://example.org/bar/' - - adapter = map.bind('example.org', '/') - with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match('/bar', query_args={'aha': 'muhaha'}) - assert excinfo.value.new_url == 'http://example.org/bar/?aha=muhaha' - - adapter = map.bind('example.org', '/') - with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match('/bar', query_args='aha=muhaha') - assert excinfo.value.new_url == 'http://example.org/bar/?aha=muhaha' - - adapter = map.bind_to_environ(create_environ('/bar?foo=bar', - 'http://example.org/')) - with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match() - assert excinfo.value.new_url == 'http://example.org/bar/?foo=bar' - - -def test_strict_slashes_redirect(): - map = r.Map([ - r.Rule('/bar/', endpoint='get', methods=["GET"]), - r.Rule('/bar', endpoint='post', methods=["POST"]), - ]) - adapter = map.bind('example.org', '/') - - # Check if the actual routes works - assert adapter.match('/bar/', method='GET') == ('get', {}) - assert adapter.match('/bar', method='POST') == ('post', {}) - - # Check if exceptions are correct - pytest.raises(r.RequestRedirect, adapter.match, '/bar', method='GET') - pytest.raises(r.MethodNotAllowed, adapter.match, '/bar/', method='POST') - - # Check differently defined order - map = r.Map([ - r.Rule('/bar', endpoint='post', methods=["POST"]), - r.Rule('/bar/', endpoint='get', methods=["GET"]), - ]) - adapter = map.bind('example.org', '/') - - # Check if the actual routes works - assert adapter.match('/bar/', method='GET') == ('get', {}) - assert adapter.match('/bar', method='POST') == ('post', {}) - - # Check if exceptions are correct - pytest.raises(r.RequestRedirect, adapter.match, '/bar', method='GET') - pytest.raises(r.MethodNotAllowed, adapter.match, '/bar/', method='POST') - - # Check what happens when only slash route is defined - map = r.Map([ - r.Rule('/bar/', endpoint='get', methods=["GET"]), - ]) - adapter = map.bind('example.org', '/') - - # Check if the actual routes works - assert adapter.match('/bar/', method='GET') == ('get', {}) - - # Check if exceptions are correct - pytest.raises(r.RequestRedirect, adapter.match, '/bar', method='GET') - pytest.raises(r.MethodNotAllowed, adapter.match, '/bar/', method='POST') - pytest.raises(r.MethodNotAllowed, adapter.match, '/bar', method='POST') - - -def test_environ_defaults(): - environ = create_environ("/foo") - strict_eq(environ["PATH_INFO"], '/foo') - m = r.Map([r.Rule("/foo", endpoint="foo"), r.Rule("/bar", endpoint="bar")]) - a = m.bind_to_environ(environ) - strict_eq(a.match("/foo"), ('foo', {})) - strict_eq(a.match(), ('foo', {})) - strict_eq(a.match("/bar"), ('bar', {})) - pytest.raises(r.NotFound, a.match, "/bars") - - -def test_environ_nonascii_pathinfo(): - environ = create_environ(u'/лошадь') - m = r.Map([ - r.Rule(u'/', endpoint='index'), - r.Rule(u'/лошадь', endpoint='horse') - ]) - a = m.bind_to_environ(environ) - strict_eq(a.match(u'/'), ('index', {})) - strict_eq(a.match(u'/лошадь'), ('horse', {})) - pytest.raises(r.NotFound, a.match, u'/барсук') - - -def test_basic_building(): - map = r.Map([ - r.Rule('/', endpoint='index'), - r.Rule('/foo', endpoint='foo'), - r.Rule('/bar/', endpoint='bar'), - r.Rule('/bar/', endpoint='bari'), - r.Rule('/bar/', endpoint='barf'), - r.Rule('/bar/', endpoint='barp'), - r.Rule('/hehe', endpoint='blah', subdomain='blah') - ]) - adapter = map.bind('example.org', '/', subdomain='blah') - - assert adapter.build('index', {}) == 'http://example.org/' - assert adapter.build('foo', {}) == 'http://example.org/foo' - assert adapter.build('bar', {'baz': 'blub'}) == \ - 'http://example.org/bar/blub' - assert adapter.build('bari', {'bazi': 50}) == 'http://example.org/bar/50' - multivalues = MultiDict([('bazi', 50), ('bazi', None)]) - assert adapter.build('bari', multivalues) == 'http://example.org/bar/50' - assert adapter.build('barf', {'bazf': 0.815}) == \ - 'http://example.org/bar/0.815' - assert adapter.build('barp', {'bazp': 'la/di'}) == \ - 'http://example.org/bar/la/di' - assert adapter.build('blah', {}) == '/hehe' - pytest.raises(r.BuildError, lambda: adapter.build('urks')) - - adapter = map.bind('example.org', '/test', subdomain='blah') - assert adapter.build('index', {}) == 'http://example.org/test/' - assert adapter.build('foo', {}) == 'http://example.org/test/foo' - assert adapter.build('bar', {'baz': 'blub'}) == \ - 'http://example.org/test/bar/blub' - assert adapter.build('bari', {'bazi': 50}) == 'http://example.org/test/bar/50' - assert adapter.build('barf', {'bazf': 0.815}) == 'http://example.org/test/bar/0.815' - assert adapter.build('barp', {'bazp': 'la/di'}) == 'http://example.org/test/bar/la/di' - assert adapter.build('blah', {}) == '/test/hehe' - - adapter = map.bind('example.org') - assert adapter.build('foo', {}) == '/foo' - assert adapter.build('foo', {}, force_external=True) == 'http://example.org/foo' - adapter = map.bind('example.org', url_scheme='') - assert adapter.build('foo', {}) == '/foo' - assert adapter.build('foo', {}, force_external=True) == '//example.org/foo' - - -def test_defaults(): - map = r.Map([ - r.Rule('/foo/', defaults={'page': 1}, endpoint='foo'), - r.Rule('/foo/', endpoint='foo') - ]) - adapter = map.bind('example.org', '/') - - assert adapter.match('/foo/') == ('foo', {'page': 1}) - pytest.raises(r.RequestRedirect, lambda: adapter.match('/foo/1')) - assert adapter.match('/foo/2') == ('foo', {'page': 2}) - assert adapter.build('foo', {}) == '/foo/' - assert adapter.build('foo', {'page': 1}) == '/foo/' - assert adapter.build('foo', {'page': 2}) == '/foo/2' - - -def test_greedy(): - map = r.Map([ - r.Rule('/foo', endpoint='foo'), - r.Rule('/', endpoint='bar'), - r.Rule('//', endpoint='bar') - ]) - adapter = map.bind('example.org', '/') - - assert adapter.match('/foo') == ('foo', {}) - assert adapter.match('/blub') == ('bar', {'bar': 'blub'}) - assert adapter.match('/he/he') == ('bar', {'bar': 'he', 'blub': 'he'}) - - assert adapter.build('foo', {}) == '/foo' - assert adapter.build('bar', {'bar': 'blub'}) == '/blub' - assert adapter.build('bar', {'bar': 'blub', 'blub': 'bar'}) == '/blub/bar' - - -def test_path(): - map = r.Map([ - r.Rule('/', defaults={'name': 'FrontPage'}, endpoint='page'), - r.Rule('/Special', endpoint='special'), - r.Rule('/', endpoint='year'), - r.Rule('/', endpoint='page'), - r.Rule('//edit', endpoint='editpage'), - r.Rule('//silly/', endpoint='sillypage'), - r.Rule('//silly//edit', endpoint='editsillypage'), - r.Rule('/Talk:', endpoint='talk'), - r.Rule('/User:', endpoint='user'), - r.Rule('/User:/', endpoint='userpage'), - r.Rule('/Files/', endpoint='files'), - ]) - adapter = map.bind('example.org', '/') - - assert adapter.match('/') == ('page', {'name': 'FrontPage'}) - pytest.raises(r.RequestRedirect, lambda: adapter.match('/FrontPage')) - assert adapter.match('/Special') == ('special', {}) - assert adapter.match('/2007') == ('year', {'year': 2007}) - assert adapter.match('/Some/Page') == ('page', {'name': 'Some/Page'}) - assert adapter.match('/Some/Page/edit') == ('editpage', {'name': 'Some/Page'}) - assert adapter.match('/Foo/silly/bar') == ('sillypage', {'name': 'Foo', 'name2': 'bar'}) - assert adapter.match( - '/Foo/silly/bar/edit') == ('editsillypage', {'name': 'Foo', 'name2': 'bar'}) - assert adapter.match('/Talk:Foo/Bar') == ('talk', {'name': 'Foo/Bar'}) - assert adapter.match('/User:thomas') == ('user', {'username': 'thomas'}) - assert adapter.match('/User:thomas/projects/werkzeug') == \ - ('userpage', {'username': 'thomas', 'name': 'projects/werkzeug'}) - assert adapter.match('/Files/downloads/werkzeug/0.2.zip') == \ - ('files', {'file': 'downloads/werkzeug/0.2.zip'}) - - -def test_dispatch(): - env = create_environ('/') - map = r.Map([ - r.Rule('/', endpoint='root'), - r.Rule('/foo/', endpoint='foo') - ]) - adapter = map.bind_to_environ(env) - - raise_this = None - - def view_func(endpoint, values): - if raise_this is not None: - raise raise_this - return Response(repr((endpoint, values))) - dispatch = lambda p, q=False: Response.force_type( - adapter.dispatch(view_func, p, catch_http_exceptions=q), - env - ) - - assert dispatch('/').data == b"('root', {})" - assert dispatch('/foo').status_code == 301 - raise_this = r.NotFound() - pytest.raises(r.NotFound, lambda: dispatch('/bar')) - assert dispatch('/bar', True).status_code == 404 - - -def test_http_host_before_server_name(): - env = { - 'HTTP_HOST': 'wiki.example.com', - 'SERVER_NAME': 'web0.example.com', - 'SERVER_PORT': '80', - 'SCRIPT_NAME': '', - 'PATH_INFO': '', - 'REQUEST_METHOD': 'GET', - 'wsgi.url_scheme': 'http' - } - map = r.Map([r.Rule('/', endpoint='index', subdomain='wiki')]) - adapter = map.bind_to_environ(env, server_name='example.com') - assert adapter.match('/') == ('index', {}) - assert adapter.build('index', force_external=True) == 'http://wiki.example.com/' - assert adapter.build('index') == '/' - - env['HTTP_HOST'] = 'admin.example.com' - adapter = map.bind_to_environ(env, server_name='example.com') - assert adapter.build('index') == 'http://wiki.example.com/' - - -def test_adapter_url_parameter_sorting(): - map = r.Map([r.Rule('/', endpoint='index')], sort_parameters=True, - sort_key=lambda x: x[1]) - adapter = map.bind('localhost', '/') - assert adapter.build('index', {'x': 20, 'y': 10, 'z': 30}, - force_external=True) == 'http://localhost/?y=10&x=20&z=30' - - -def test_request_direct_charset_bug(): - map = r.Map([r.Rule(u'/öäü/')]) - adapter = map.bind('localhost', '/') - - with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match(u'/öäü') - assert excinfo.value.new_url == 'http://localhost/%C3%B6%C3%A4%C3%BC/' - - -def test_request_redirect_default(): - map = r.Map([r.Rule(u'/foo', defaults={'bar': 42}), - r.Rule(u'/foo/')]) - adapter = map.bind('localhost', '/') - - with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match(u'/foo/42') - assert excinfo.value.new_url == 'http://localhost/foo' - - -def test_request_redirect_default_subdomain(): - map = r.Map([r.Rule(u'/foo', defaults={'bar': 42}, subdomain='test'), - r.Rule(u'/foo/', subdomain='other')]) - adapter = map.bind('localhost', '/', subdomain='other') - - with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match(u'/foo/42') - assert excinfo.value.new_url == 'http://test.localhost/foo' - - -def test_adapter_match_return_rule(): - rule = r.Rule('/foo/', endpoint='foo') - map = r.Map([rule]) - adapter = map.bind('localhost', '/') - assert adapter.match('/foo/', return_rule=True) == (rule, {}) - - -def test_server_name_interpolation(): - server_name = 'example.invalid' - map = r.Map([r.Rule('/', endpoint='index'), - r.Rule('/', endpoint='alt', subdomain='alt')]) - - env = create_environ('/', 'http://%s/' % server_name) - adapter = map.bind_to_environ(env, server_name=server_name) - assert adapter.match() == ('index', {}) - - env = create_environ('/', 'http://alt.%s/' % server_name) - adapter = map.bind_to_environ(env, server_name=server_name) - assert adapter.match() == ('alt', {}) - - env = create_environ('/', 'http://%s/' % server_name) - adapter = map.bind_to_environ(env, server_name='foo') - assert adapter.subdomain == '' - - -def test_rule_emptying(): - rule = r.Rule('/foo', {'meh': 'muh'}, 'x', ['POST'], - False, 'x', True, None) - rule2 = rule.empty() - assert rule.__dict__ == rule2.__dict__ - rule.methods.add('GET') - assert rule.__dict__ != rule2.__dict__ - rule.methods.discard('GET') - rule.defaults['meh'] = 'aha' - assert rule.__dict__ != rule2.__dict__ - - -def test_rule_unhashable(): - rule = r.Rule('/foo', {'meh': 'muh'}, 'x', ['POST'], - False, 'x', True, None) - pytest.raises(TypeError, hash, rule) - - -def test_rule_templates(): - testcase = r.RuleTemplate([ - r.Submount( - '/test/$app', - [r.Rule('/foo/', endpoint='handle_foo'), - r.Rule('/bar/', endpoint='handle_bar'), - r.Rule('/baz/', endpoint='handle_baz')]), - r.EndpointPrefix( - '${app}', - [r.Rule('/${app}-blah', endpoint='bar'), - r.Rule('/${app}-meh', endpoint='baz')]), - r.Subdomain( - '$app', - [r.Rule('/blah', endpoint='x_bar'), - r.Rule('/meh', endpoint='x_baz')]) - ]) - - url_map = r.Map( - [testcase(app='test1'), testcase(app='test2'), testcase(app='test3'), testcase(app='test4') - ]) - - out = sorted([(x.rule, x.subdomain, x.endpoint) - for x in url_map.iter_rules()]) - - assert out == ([ - ('/blah', 'test1', 'x_bar'), - ('/blah', 'test2', 'x_bar'), - ('/blah', 'test3', 'x_bar'), - ('/blah', 'test4', 'x_bar'), - ('/meh', 'test1', 'x_baz'), - ('/meh', 'test2', 'x_baz'), - ('/meh', 'test3', 'x_baz'), - ('/meh', 'test4', 'x_baz'), - ('/test/test1/bar/', '', 'handle_bar'), - ('/test/test1/baz/', '', 'handle_baz'), - ('/test/test1/foo/', '', 'handle_foo'), - ('/test/test2/bar/', '', 'handle_bar'), - ('/test/test2/baz/', '', 'handle_baz'), - ('/test/test2/foo/', '', 'handle_foo'), - ('/test/test3/bar/', '', 'handle_bar'), - ('/test/test3/baz/', '', 'handle_baz'), - ('/test/test3/foo/', '', 'handle_foo'), - ('/test/test4/bar/', '', 'handle_bar'), - ('/test/test4/baz/', '', 'handle_baz'), - ('/test/test4/foo/', '', 'handle_foo'), - ('/test1-blah', '', 'test1bar'), - ('/test1-meh', '', 'test1baz'), - ('/test2-blah', '', 'test2bar'), - ('/test2-meh', '', 'test2baz'), - ('/test3-blah', '', 'test3bar'), - ('/test3-meh', '', 'test3baz'), - ('/test4-blah', '', 'test4bar'), - ('/test4-meh', '', 'test4baz') - ]) - - -def test_non_string_parts(): - m = r.Map([ - r.Rule('/', endpoint='foo') - ]) - a = m.bind('example.com') - assert a.build('foo', {'foo': 42}) == '/42' - - -def test_complex_routing_rules(): - m = r.Map([ - r.Rule('/', endpoint='index'), - r.Rule('/', endpoint='an_int'), - r.Rule('/', endpoint='a_string'), - r.Rule('/foo/', endpoint='nested'), - r.Rule('/foobar/', endpoint='nestedbar'), - r.Rule('/foo//', endpoint='nested_show'), - r.Rule('/foo//edit', endpoint='nested_edit'), - r.Rule('/users/', endpoint='users', defaults={'page': 1}), - r.Rule('/users/page/', endpoint='users'), - r.Rule('/foox', endpoint='foox'), - r.Rule('//', endpoint='barx_path_path') - ]) - a = m.bind('example.com') - - assert a.match('/') == ('index', {}) - assert a.match('/42') == ('an_int', {'blub': 42}) - assert a.match('/blub') == ('a_string', {'blub': 'blub'}) - assert a.match('/foo/') == ('nested', {}) - assert a.match('/foobar/') == ('nestedbar', {}) - assert a.match('/foo/1/2/3/') == ('nested_show', {'testing': '1/2/3'}) - assert a.match('/foo/1/2/3/edit') == ('nested_edit', {'testing': '1/2/3'}) - assert a.match('/users/') == ('users', {'page': 1}) - assert a.match('/users/page/2') == ('users', {'page': 2}) - assert a.match('/foox') == ('foox', {}) - assert a.match('/1/2/3') == ('barx_path_path', {'bar': '1', 'blub': '2/3'}) - - assert a.build('index') == '/' - assert a.build('an_int', {'blub': 42}) == '/42' - assert a.build('a_string', {'blub': 'test'}) == '/test' - assert a.build('nested') == '/foo/' - assert a.build('nestedbar') == '/foobar/' - assert a.build('nested_show', {'testing': '1/2/3'}) == '/foo/1/2/3/' - assert a.build('nested_edit', {'testing': '1/2/3'}) == '/foo/1/2/3/edit' - assert a.build('users', {'page': 1}) == '/users/' - assert a.build('users', {'page': 2}) == '/users/page/2' - assert a.build('foox') == '/foox' - assert a.build('barx_path_path', {'bar': '1', 'blub': '2/3'}) == '/1/2/3' - - -def test_default_converters(): - class MyMap(r.Map): - default_converters = r.Map.default_converters.copy() - default_converters['foo'] = r.UnicodeConverter - assert isinstance(r.Map.default_converters, ImmutableDict) - m = MyMap([ - r.Rule('/a/', endpoint='a'), - r.Rule('/b/', endpoint='b'), - r.Rule('/c/', endpoint='c') - ], converters={'bar': r.UnicodeConverter}) - a = m.bind('example.org', '/') - assert a.match('/a/1') == ('a', {'a': '1'}) - assert a.match('/b/2') == ('b', {'b': '2'}) - assert a.match('/c/3') == ('c', {'c': '3'}) - assert 'foo' not in r.Map.default_converters - - -def test_uuid_converter(): - m = r.Map([ - r.Rule('/a/', endpoint='a') - ]) - a = m.bind('example.org', '/') - rooute, kwargs = a.match('/a/a8098c1a-f86e-11da-bd1a-00112444be1e') - assert type(kwargs['a_uuid']) == uuid.UUID - - -def test_converter_with_tuples(): - ''' - Regression test for https://github.com/pallets/werkzeug/issues/709 - ''' - class TwoValueConverter(r.BaseConverter): - - def __init__(self, *args, **kwargs): - super(TwoValueConverter, self).__init__(*args, **kwargs) - self.regex = r'(\w\w+)/(\w\w+)' - - def to_python(self, two_values): - one, two = two_values.split('/') - return one, two - - def to_url(self, values): - return "%s/%s" % (values[0], values[1]) - - map = r.Map([ - r.Rule('//', endpoint='handler') - ], converters={'two': TwoValueConverter}) - a = map.bind('example.org', '/') - route, kwargs = a.match('/qwert/yuiop/') - assert kwargs['foo'] == ('qwert', 'yuiop') - - -def test_build_append_unknown(): - map = r.Map([ - r.Rule('/bar/', endpoint='barf') - ]) - adapter = map.bind('example.org', '/', subdomain='blah') - assert adapter.build('barf', {'bazf': 0.815, 'bif': 1.0}) == \ - 'http://example.org/bar/0.815?bif=1.0' - assert adapter.build('barf', {'bazf': 0.815, 'bif': 1.0}, - append_unknown=False) == 'http://example.org/bar/0.815' - - -def test_build_append_multiple(): - map = r.Map([ - r.Rule('/bar/', endpoint='barf') - ]) - adapter = map.bind('example.org', '/', subdomain='blah') - params = {'bazf': 0.815, 'bif': [1.0, 3.0], 'pof': 2.0} - a, b = adapter.build('barf', params).split('?') - assert a == 'http://example.org/bar/0.815' - assert set(b.split('&')) == set('pof=2.0&bif=1.0&bif=3.0'.split('&')) - - -def test_method_fallback(): - map = r.Map([ - r.Rule('/', endpoint='index', methods=['GET']), - r.Rule('/', endpoint='hello_name', methods=['GET']), - r.Rule('/select', endpoint='hello_select', methods=['POST']), - r.Rule('/search_get', endpoint='search', methods=['GET']), - r.Rule('/search_post', endpoint='search', methods=['POST']) - ]) - adapter = map.bind('example.com') - assert adapter.build('index') == '/' - assert adapter.build('index', method='GET') == '/' - assert adapter.build('hello_name', {'name': 'foo'}) == '/foo' - assert adapter.build('hello_select') == '/select' - assert adapter.build('hello_select', method='POST') == '/select' - assert adapter.build('search') == '/search_get' - assert adapter.build('search', method='GET') == '/search_get' - assert adapter.build('search', method='POST') == '/search_post' - - -def test_implicit_head(): - url_map = r.Map([ - r.Rule('/get', methods=['GET'], endpoint='a'), - r.Rule('/post', methods=['POST'], endpoint='b') - ]) - adapter = url_map.bind('example.org') - assert adapter.match('/get', method='HEAD') == ('a', {}) - pytest.raises(r.MethodNotAllowed, adapter.match, - '/post', method='HEAD') - - -def test_pass_str_as_router_methods(): - with pytest.raises(TypeError): - r.Rule('/get', methods='GET') - - -def test_protocol_joining_bug(): - m = r.Map([r.Rule('/', endpoint='x')]) - a = m.bind('example.org') - assert a.build('x', {'foo': 'x:y'}) == '/x:y' - assert a.build('x', {'foo': 'x:y'}, force_external=True) == \ - 'http://example.org/x:y' - - -def test_allowed_methods_querying(): - m = r.Map([r.Rule('/', methods=['GET', 'HEAD']), - r.Rule('/foo', methods=['POST'])]) - a = m.bind('example.org') - assert sorted(a.allowed_methods('/foo')) == ['GET', 'HEAD', 'POST'] - - -def test_external_building_with_port(): - map = r.Map([ - r.Rule('/', endpoint='index'), - ]) - adapter = map.bind('example.org:5000', '/') - built_url = adapter.build('index', {}, force_external=True) - assert built_url == 'http://example.org:5000/', built_url - - -def test_external_building_with_port_bind_to_environ(): - map = r.Map([ - r.Rule('/', endpoint='index'), - ]) - adapter = map.bind_to_environ( - create_environ('/', 'http://example.org:5000/'), - server_name="example.org:5000" - ) - built_url = adapter.build('index', {}, force_external=True) - assert built_url == 'http://example.org:5000/', built_url - - -def test_external_building_with_port_bind_to_environ_wrong_servername(): - map = r.Map([ - r.Rule('/', endpoint='index'), - ]) - environ = create_environ('/', 'http://example.org:5000/') - adapter = map.bind_to_environ(environ, server_name="example.org") - assert adapter.subdomain == '' - - -def test_converter_parser(): - args, kwargs = r.parse_converter_args(u'test, a=1, b=3.0') - - assert args == ('test',) - assert kwargs == {'a': 1, 'b': 3.0} - - args, kwargs = r.parse_converter_args('') - assert not args and not kwargs - - args, kwargs = r.parse_converter_args('a, b, c,') - assert args == ('a', 'b', 'c') - assert not kwargs - - args, kwargs = r.parse_converter_args('True, False, None') - assert args == (True, False, None) - - args, kwargs = r.parse_converter_args('"foo", u"bar"') - assert args == ('foo', 'bar') - - -def test_alias_redirects(): - m = r.Map([ - r.Rule('/', endpoint='index'), - r.Rule('/index.html', endpoint='index', alias=True), - r.Rule('/users/', defaults={'page': 1}, endpoint='users'), - r.Rule('/users/index.html', defaults={'page': 1}, alias=True, - endpoint='users'), - r.Rule('/users/page/', endpoint='users'), - r.Rule('/users/page-.html', alias=True, endpoint='users'), - ]) - a = m.bind('example.com') - - def ensure_redirect(path, new_url, args=None): - with pytest.raises(r.RequestRedirect) as excinfo: - a.match(path, query_args=args) - assert excinfo.value.new_url == 'http://example.com' + new_url - - ensure_redirect('/index.html', '/') - ensure_redirect('/users/index.html', '/users/') - ensure_redirect('/users/page-2.html', '/users/page/2') - ensure_redirect('/users/page-1.html', '/users/') - ensure_redirect('/users/page-1.html', '/users/?foo=bar', {'foo': 'bar'}) - - assert a.build('index') == '/' - assert a.build('users', {'page': 1}) == '/users/' - assert a.build('users', {'page': 2}) == '/users/page/2' - - -@pytest.mark.parametrize('prefix', ('', '/aaa')) -def test_double_defaults(prefix): - m = r.Map([ - r.Rule(prefix + '/', defaults={'foo': 1, 'bar': False}, endpoint='x'), - r.Rule(prefix + '/', defaults={'bar': False}, endpoint='x'), - r.Rule(prefix + '/bar/', defaults={'foo': 1, 'bar': True}, endpoint='x'), - r.Rule(prefix + '/bar/', defaults={'bar': True}, endpoint='x') - ]) - a = m.bind('example.com') - - assert a.match(prefix + '/') == ('x', {'foo': 1, 'bar': False}) - assert a.match(prefix + '/2') == ('x', {'foo': 2, 'bar': False}) - assert a.match(prefix + '/bar/') == ('x', {'foo': 1, 'bar': True}) - assert a.match(prefix + '/bar/2') == ('x', {'foo': 2, 'bar': True}) - - assert a.build('x', {'foo': 1, 'bar': False}) == prefix + '/' - assert a.build('x', {'foo': 2, 'bar': False}) == prefix + '/2' - assert a.build('x', {'bar': False}) == prefix + '/' - assert a.build('x', {'foo': 1, 'bar': True}) == prefix + '/bar/' - assert a.build('x', {'foo': 2, 'bar': True}) == prefix + '/bar/2' - assert a.build('x', {'bar': True}) == prefix + '/bar/' - - -def test_host_matching(): - m = r.Map([ - r.Rule('/', endpoint='index', host='www.'), - r.Rule('/', endpoint='files', host='files.'), - r.Rule('/foo/', defaults={'page': 1}, host='www.', endpoint='x'), - r.Rule('/', host='files.', endpoint='x') - ], host_matching=True) - - a = m.bind('www.example.com') - assert a.match('/') == ('index', {'domain': 'example.com'}) - assert a.match('/foo/') == ('x', {'domain': 'example.com', 'page': 1}) - - with pytest.raises(r.RequestRedirect) as excinfo: - a.match('/foo') - assert excinfo.value.new_url == 'http://www.example.com/foo/' - - a = m.bind('files.example.com') - assert a.match('/') == ('files', {'domain': 'example.com'}) - assert a.match('/2') == ('x', {'domain': 'example.com', 'page': 2}) - - with pytest.raises(r.RequestRedirect) as excinfo: - a.match('/1') - assert excinfo.value.new_url == 'http://www.example.com/foo/' - - -def test_host_matching_building(): - m = r.Map([ - r.Rule('/', endpoint='index', host='www.domain.com'), - r.Rule('/', endpoint='foo', host='my.domain.com') - ], host_matching=True) - - www = m.bind('www.domain.com') - assert www.match('/') == ('index', {}) - assert www.build('index') == '/' - assert www.build('foo') == 'http://my.domain.com/' - - my = m.bind('my.domain.com') - assert my.match('/') == ('foo', {}) - assert my.build('foo') == '/' - assert my.build('index') == 'http://www.domain.com/' - - -def test_server_name_casing(): - m = r.Map([ - r.Rule('/', endpoint='index', subdomain='foo') - ]) - - env = create_environ() - env['SERVER_NAME'] = env['HTTP_HOST'] = 'FOO.EXAMPLE.COM' - a = m.bind_to_environ(env, server_name='example.com') - assert a.match('/') == ('index', {}) - - env = create_environ() - env['SERVER_NAME'] = '127.0.0.1' - env['SERVER_PORT'] = '5000' - del env['HTTP_HOST'] - a = m.bind_to_environ(env, server_name='example.com') - with pytest.raises(r.NotFound): - a.match() - - -def test_redirect_request_exception_code(): - exc = r.RequestRedirect('http://www.google.com/') - exc.code = 307 - env = create_environ() - strict_eq(exc.get_response(env).status_code, exc.code) - - -def test_redirect_path_quoting(): - url_map = r.Map([ - r.Rule('/', defaults={'page': 1}, endpoint='category'), - r.Rule('//page/', endpoint='category') - ]) - adapter = url_map.bind('example.com') - - with pytest.raises(r.RequestRedirect) as excinfo: - adapter.match('/foo bar/page/1') - response = excinfo.value.get_response({}) - strict_eq(response.headers['location'], - u'http://example.com/foo%20bar') - - -def test_unicode_rules(): - m = r.Map([ - r.Rule(u'/войти/', endpoint='enter'), - r.Rule(u'/foo+bar/', endpoint='foobar') - ]) - a = m.bind(u'☃.example.com') - with pytest.raises(r.RequestRedirect) as excinfo: - a.match(u'/войти') - strict_eq(excinfo.value.new_url, - 'http://xn--n3h.example.com/%D0%B2%D0%BE%D0%B9%D1%82%D0%B8/') - - endpoint, values = a.match(u'/войти/') - strict_eq(endpoint, 'enter') - strict_eq(values, {}) - - with pytest.raises(r.RequestRedirect) as excinfo: - a.match(u'/foo+bar') - strict_eq(excinfo.value.new_url, 'http://xn--n3h.example.com/foo+bar/') - - endpoint, values = a.match(u'/foo+bar/') - strict_eq(endpoint, 'foobar') - strict_eq(values, {}) - - url = a.build('enter', {}, force_external=True) - strict_eq(url, 'http://xn--n3h.example.com/%D0%B2%D0%BE%D0%B9%D1%82%D0%B8/') - - url = a.build('foobar', {}, force_external=True) - strict_eq(url, 'http://xn--n3h.example.com/foo+bar/') - - -def test_empty_path_info(): - m = r.Map([ - r.Rule("/", endpoint="index"), - ]) - - b = m.bind("example.com", script_name="/approot") - with pytest.raises(r.RequestRedirect) as excinfo: - b.match("") - assert excinfo.value.new_url == "http://example.com/approot/" - - a = m.bind("example.com") - with pytest.raises(r.RequestRedirect) as excinfo: - a.match("") - assert excinfo.value.new_url == "http://example.com/" - - -def test_map_repr(): - m = r.Map([ - r.Rule(u'/wat', endpoint='enter'), - r.Rule(u'/woop', endpoint='foobar') - ]) - rv = repr(m) - strict_eq(rv, - "Map([ foobar>, enter>])") - - -def test_empty_subclass_rules_with_custom_kwargs(): - class CustomRule(r.Rule): - - def __init__(self, string=None, custom=None, *args, **kwargs): - self.custom = custom - super(CustomRule, self).__init__(string, *args, **kwargs) - - rule1 = CustomRule(u'/foo', endpoint='bar') - try: - rule2 = rule1.empty() - assert rule1.rule == rule2.rule - except TypeError as e: # raised without fix in PR #675 - raise e - - -def test_finding_closest_match_by_endpoint(): - m = r.Map([ - r.Rule(u'/foo/', endpoint='users.here'), - r.Rule(u'/wat/', endpoint='admin.users'), - r.Rule(u'/woop', endpoint='foo.users'), - ]) - adapter = m.bind('example.com') - assert r.BuildError('admin.user', None, None, adapter).suggested.endpoint \ - == 'admin.users' - - -def test_finding_closest_match_by_values(): - rule_id = r.Rule(u'/user/id//', endpoint='users') - rule_slug = r.Rule(u'/user//', endpoint='users') - rule_random = r.Rule(u'/user/emails//', endpoint='users') - m = r.Map([rule_id, rule_slug, rule_random]) - adapter = m.bind('example.com') - assert r.BuildError('x', {'slug': ''}, None, adapter).suggested == \ - rule_slug - - -def test_finding_closest_match_by_method(): - post = r.Rule(u'/post/', endpoint='foobar', methods=['POST']) - get = r.Rule(u'/get/', endpoint='foobar', methods=['GET']) - put = r.Rule(u'/put/', endpoint='foobar', methods=['PUT']) - m = r.Map([post, get, put]) - adapter = m.bind('example.com') - assert r.BuildError('invalid', {}, 'POST', adapter).suggested == post - assert r.BuildError('invalid', {}, 'GET', adapter).suggested == get - assert r.BuildError('invalid', {}, 'PUT', adapter).suggested == put - - -def test_finding_closest_match_when_none_exist(): - m = r.Map([]) - assert not r.BuildError('invalid', {}, None, m.bind('test.com')).suggested - - -def test_error_message_without_suggested_rule(): - m = r.Map([ - r.Rule(u'/foo/', endpoint='world', methods=['GET']), - ]) - adapter = m.bind('example.com') - - with pytest.raises(r.BuildError) as excinfo: - adapter.build('urks') - assert str(excinfo.value).startswith( - "Could not build url for endpoint 'urks'." - ) - - with pytest.raises(r.BuildError) as excinfo: - adapter.build('world', method='POST') - assert str(excinfo.value).startswith( - "Could not build url for endpoint 'world' ('POST')." - ) - - with pytest.raises(r.BuildError) as excinfo: - adapter.build('urks', values={'user_id': 5}) - assert str(excinfo.value).startswith( - "Could not build url for endpoint 'urks' with values ['user_id']." - ) - - -def test_error_message_suggestion(): - m = r.Map([ - r.Rule(u'/foo//', endpoint='world', methods=['GET']), - ]) - adapter = m.bind('example.com') - - with pytest.raises(r.BuildError) as excinfo: - adapter.build('helloworld') - assert "Did you mean 'world' instead?" in str(excinfo.value) - - with pytest.raises(r.BuildError) as excinfo: - adapter.build('world') - assert "Did you forget to specify values ['id']?" in str(excinfo.value) - assert "Did you mean to use methods" not in str(excinfo.value) - - with pytest.raises(r.BuildError) as excinfo: - adapter.build('world', {'id': 2}, method='POST') - assert "Did you mean to use methods ['GET', 'HEAD']?" in str(excinfo.value) diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_security.py b/pythonPackages/Werkzeug-0.12.1/tests/test_security.py deleted file mode 100644 index 1632bcbc57..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_security.py +++ /dev/null @@ -1,145 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.security - ~~~~~~~~~~~~~~ - - Tests the security helpers. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import os -import pytest - -from werkzeug.security import check_password_hash, generate_password_hash, \ - safe_join, pbkdf2_hex, safe_str_cmp - - -def test_safe_str_cmp(): - assert safe_str_cmp('a', 'a') is True - assert safe_str_cmp(b'a', u'a') is True - assert safe_str_cmp('a', 'b') is False - assert safe_str_cmp(b'aaa', 'aa') is False - assert safe_str_cmp(b'aaa', 'bbb') is False - assert safe_str_cmp(b'aaa', u'aaa') is True - assert safe_str_cmp(u'aaa', u'aaa') is True - - -def test_safe_str_cmp_no_builtin(): - import werkzeug.security as sec - prev_value = sec._builtin_safe_str_cmp - sec._builtin_safe_str_cmp = None - assert safe_str_cmp('a', 'ab') is False - - assert safe_str_cmp('str', 'str') is True - assert safe_str_cmp('str1', 'str2') is False - sec._builtin_safe_str_cmp = prev_value - - -def test_password_hashing(): - hash0 = generate_password_hash('default') - assert check_password_hash(hash0, 'default') - assert hash0.startswith('pbkdf2:sha256:50000$') - - hash1 = generate_password_hash('default', 'sha1') - hash2 = generate_password_hash(u'default', method='sha1') - assert hash1 != hash2 - assert check_password_hash(hash1, 'default') - assert check_password_hash(hash2, 'default') - assert hash1.startswith('sha1$') - assert hash2.startswith('sha1$') - - with pytest.raises(TypeError): - check_password_hash('$made$up$', 'default') - - with pytest.raises(ValueError): - generate_password_hash('default', 'sha1', salt_length=0) - - fakehash = generate_password_hash('default', method='plain') - assert fakehash == 'plain$$default' - assert check_password_hash(fakehash, 'default') - - mhash = generate_password_hash(u'default', method='md5') - assert mhash.startswith('md5$') - assert check_password_hash(mhash, 'default') - - legacy = 'md5$$c21f969b5f03d33d43e04f8f136e7682' - assert check_password_hash(legacy, 'default') - - legacy = u'md5$$c21f969b5f03d33d43e04f8f136e7682' - assert check_password_hash(legacy, 'default') - - -def test_safe_join(): - assert safe_join('foo', 'bar/baz') == os.path.join('foo', 'bar/baz') - assert safe_join('foo', '../bar/baz') is None - if os.name == 'nt': - assert safe_join('foo', 'foo\\bar') is None - - -def test_safe_join_os_sep(): - import werkzeug.security as sec - prev_value = sec._os_alt_seps - sec._os_alt_seps = '*' - assert safe_join('foo', 'bar/baz*') is None - sec._os_alt_steps = prev_value - - -def test_pbkdf2(): - def check(data, salt, iterations, keylen, hashfunc, expected): - rv = pbkdf2_hex(data, salt, iterations, keylen, hashfunc) - assert rv == expected - - # From RFC 6070 - - # Assumes default keylen is 20 - # check('password', 'salt', 1, None, - # '0c60c80f961f0e71f3a9b524af6012062fe037a6') - check('password', 'salt', 1, 20, 'sha1', - '0c60c80f961f0e71f3a9b524af6012062fe037a6') - check('password', 'salt', 2, 20, 'sha1', - 'ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957') - check('password', 'salt', 4096, 20, 'sha1', - '4b007901b765489abead49d926f721d065a429c1') - check('passwordPASSWORDpassword', 'saltSALTsaltSALTsaltSALTsaltSALTsalt', - 4096, 25, 'sha1', '3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038') - check('pass\x00word', 'sa\x00lt', 4096, 16, 'sha1', - '56fa6aa75548099dcc37d7f03425e0c3') - - # PBKDF2-HMAC-SHA256 test vectors - check('password', 'salt', 1, 32, 'sha256', - '120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b') - check('password', 'salt', 2, 32, 'sha256', - 'ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43') - check('password', 'salt', 4096, 20, 'sha256', - 'c5e478d59288c841aa530db6845c4c8d962893a0') - - # This one is from the RFC but it just takes for ages - # check('password', 'salt', 16777216, 20, - # 'eefe3d61cd4da4e4e9945b3d6ba2158c2634e984') - - # From Crypt-PBKDF2 - check('password', 'ATHENA.MIT.EDUraeburn', 1, 16, 'sha1', - 'cdedb5281bb2f801565a1122b2563515') - check('password', 'ATHENA.MIT.EDUraeburn', 1, 32, 'sha1', - 'cdedb5281bb2f801565a1122b25635150ad1f7a04bb9f3a333ecc0e2e1f70837') - check('password', 'ATHENA.MIT.EDUraeburn', 2, 16, 'sha1', - '01dbee7f4a9e243e988b62c73cda935d') - check('password', 'ATHENA.MIT.EDUraeburn', 2, 32, 'sha1', - '01dbee7f4a9e243e988b62c73cda935da05378b93244ec8f48a99e61ad799d86') - check('password', 'ATHENA.MIT.EDUraeburn', 1200, 32, 'sha1', - '5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13') - check('X' * 64, 'pass phrase equals block size', 1200, 32, 'sha1', - '139c30c0966bc32ba55fdbf212530ac9c5ec59f1a452f5cc9ad940fea0598ed1') - check('X' * 65, 'pass phrase exceeds block size', 1200, 32, 'sha1', - '9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a') - - -def test_pbkdf2_non_native(): - import werkzeug.security as sec - prev_value = sec._has_native_pbkdf2 - sec._has_native_pbkdf2 = None - - assert pbkdf2_hex('password', 'salt', 1, 20, 'sha1') \ - == '0c60c80f961f0e71f3a9b524af6012062fe037a6' - sec._has_native_pbkdf2 = prev_value diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_serving.py b/pythonPackages/Werkzeug-0.12.1/tests/test_serving.py deleted file mode 100644 index 16ba900255..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_serving.py +++ /dev/null @@ -1,280 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.serving - ~~~~~~~~~~~~~ - - Added serving tests. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import os -import ssl -import subprocess -import textwrap - - -try: - import OpenSSL -except ImportError: - OpenSSL = None - -try: - import watchdog -except ImportError: - watchdog = None - -try: - import httplib -except ImportError: - from http import client as httplib - -import requests -import requests.exceptions -import pytest - -from werkzeug import __version__ as version, serving - - -def test_serving(dev_server): - server = dev_server('from werkzeug.testapp import test_app as app') - rv = requests.get('http://%s/?foo=bar&baz=blah' % server.addr).content - assert b'WSGI Information' in rv - assert b'foo=bar&baz=blah' in rv - assert b'Werkzeug/' + version.encode('ascii') in rv - - -def test_absolute_requests(dev_server): - server = dev_server(''' - def app(environ, start_response): - assert environ['HTTP_HOST'] == 'surelynotexisting.example.com:1337' - assert environ['PATH_INFO'] == '/index.htm' - addr = environ['HTTP_X_WERKZEUG_ADDR'] - assert environ['SERVER_PORT'] == addr.split(':')[1] - start_response('200 OK', [('Content-Type', 'text/html')]) - return [b'YES'] - ''') - - conn = httplib.HTTPConnection(server.addr) - conn.request('GET', 'http://surelynotexisting.example.com:1337/index.htm#ignorethis', - headers={'X-Werkzeug-Addr': server.addr}) - res = conn.getresponse() - assert res.read() == b'YES' - - -def test_double_slash_path(dev_server): - server = dev_server(''' - def app(environ, start_response): - assert 'fail' not in environ['HTTP_HOST'] - start_response('200 OK', [('Content-Type', 'text/plain')]) - return [b'YES'] - ''') - - r = requests.get(server.url + '//fail') - assert r.content == b'YES' - - -def test_broken_app(dev_server): - server = dev_server(''' - def app(environ, start_response): - 1 // 0 - ''') - - r = requests.get(server.url + '/?foo=bar&baz=blah') - assert r.status_code == 500 - assert 'Internal Server Error' in r.text - - -@pytest.mark.skipif(not hasattr(ssl, 'SSLContext'), - reason='Missing PEP 466 (Python 2.7.9+) or Python 3.') -@pytest.mark.skipif(OpenSSL is None, - reason='OpenSSL is required for cert generation.') -def test_stdlib_ssl_contexts(dev_server, tmpdir): - certificate, private_key = \ - serving.make_ssl_devcert(str(tmpdir.mkdir('certs'))) - - server = dev_server(''' - def app(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/html')]) - return [b'hello'] - - import ssl - ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) - ctx.load_cert_chain("%s", "%s") - kwargs['ssl_context'] = ctx - ''' % (certificate, private_key)) - - assert server.addr is not None - r = requests.get(server.url, verify=False) - assert r.content == b'hello' - - -@pytest.mark.skipif(OpenSSL is None, reason='OpenSSL is not installed.') -def test_ssl_context_adhoc(dev_server): - server = dev_server(''' - def app(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/html')]) - return [b'hello'] - - kwargs['ssl_context'] = 'adhoc' - ''') - r = requests.get(server.url, verify=False) - assert r.content == b'hello' - - -@pytest.mark.skipif(OpenSSL is None, reason='OpenSSL is not installed.') -def test_make_ssl_devcert(tmpdir): - certificate, private_key = \ - serving.make_ssl_devcert(str(tmpdir)) - assert os.path.isfile(certificate) - assert os.path.isfile(private_key) - - -@pytest.mark.skipif(watchdog is None, reason='Watchdog not installed.') -def test_reloader_broken_imports(tmpdir, dev_server): - # We explicitly assert that the server reloads on change, even though in - # this case the import could've just been retried. This is to assert - # correct behavior for apps that catch and cache import errors. - # - # Because this feature is achieved by recursively watching a large amount - # of directories, this only works for the watchdog reloader. The stat - # reloader is too inefficient to watch such a large amount of files. - - real_app = tmpdir.join('real_app.py') - real_app.write("lol syntax error") - - server = dev_server(''' - trials = [] - def app(environ, start_response): - assert not trials, 'should have reloaded' - trials.append(1) - import real_app - return real_app.real_app(environ, start_response) - - kwargs['use_reloader'] = True - kwargs['reloader_interval'] = 0.1 - kwargs['reloader_type'] = 'watchdog' - ''') - server.wait_for_reloader_loop() - - r = requests.get(server.url) - assert r.status_code == 500 - - real_app.write(textwrap.dedent(''' - def real_app(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/html')]) - return [b'hello'] - ''')) - server.wait_for_reloader() - - r = requests.get(server.url) - assert r.status_code == 200 - assert r.content == b'hello' - - -@pytest.mark.skipif(watchdog is None, reason='Watchdog not installed.') -def test_reloader_nested_broken_imports(tmpdir, dev_server): - real_app = tmpdir.mkdir('real_app') - real_app.join('__init__.py').write('from real_app.sub import real_app') - sub = real_app.mkdir('sub').join('__init__.py') - sub.write("lol syntax error") - - server = dev_server(''' - trials = [] - def app(environ, start_response): - assert not trials, 'should have reloaded' - trials.append(1) - import real_app - return real_app.real_app(environ, start_response) - - kwargs['use_reloader'] = True - kwargs['reloader_interval'] = 0.1 - kwargs['reloader_type'] = 'watchdog' - ''') - server.wait_for_reloader_loop() - - r = requests.get(server.url) - assert r.status_code == 500 - - sub.write(textwrap.dedent(''' - def real_app(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/html')]) - return [b'hello'] - ''')) - server.wait_for_reloader() - - r = requests.get(server.url) - assert r.status_code == 200 - assert r.content == b'hello' - - -def test_monkeypached_sleep(tmpdir): - # removing the staticmethod wrapper in the definition of - # ReloaderLoop._sleep works most of the time, since `sleep` is a c - # function, and unlike python functions which are descriptors, doesn't - # become a method when attached to a class. however, if the user has called - # `eventlet.monkey_patch` before importing `_reloader`, `time.sleep` is a - # python function, and subsequently calling `ReloaderLoop._sleep` fails - # with a TypeError. This test checks that _sleep is attached correctly. - script = tmpdir.mkdir('app').join('test.py') - script.write(textwrap.dedent(''' - import time - - def sleep(secs): - pass - - # simulate eventlet.monkey_patch by replacing the builtin sleep - # with a regular function before _reloader is imported - time.sleep = sleep - - from werkzeug._reloader import ReloaderLoop - ReloaderLoop()._sleep(0) - ''')) - subprocess.check_call(['python', str(script)]) - - -def test_wrong_protocol(dev_server): - # Assert that sending HTTPS requests to a HTTP server doesn't show a - # traceback - # See https://github.com/pallets/werkzeug/pull/838 - - server = dev_server(''' - def app(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/html')]) - return [b'hello'] - ''') - with pytest.raises(requests.exceptions.ConnectionError): - requests.get('https://%s/' % server.addr) - - log = server.logfile.read() - assert 'Traceback' not in log - assert '\n127.0.0.1' in log - - -def test_absent_content_length_and_content_type(dev_server): - server = dev_server(''' - def app(environ, start_response): - assert 'CONTENT_LENGTH' not in environ - assert 'CONTENT_TYPE' not in environ - start_response('200 OK', [('Content-Type', 'text/html')]) - return [b'YES'] - ''') - - r = requests.get(server.url) - assert r.content == b'YES' - - -def test_set_content_length_and_content_type_if_provided_by_client(dev_server): - server = dev_server(''' - def app(environ, start_response): - assert environ['CONTENT_LENGTH'] == '233' - assert environ['CONTENT_TYPE'] == 'application/json' - start_response('200 OK', [('Content-Type', 'text/html')]) - return [b'YES'] - ''') - - r = requests.get(server.url, headers={ - 'content_length': '233', - 'content_type': 'application/json' - }) - assert r.content == b'YES' diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_test.py b/pythonPackages/Werkzeug-0.12.1/tests/test_test.py deleted file mode 100644 index 6b776ffc4d..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_test.py +++ /dev/null @@ -1,651 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.test - ~~~~~~~~~~ - - Tests the testing tools. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -from __future__ import with_statement - -import pytest - -import sys -from io import BytesIO -from werkzeug._compat import iteritems, to_bytes, implements_iterator -from functools import partial - -from tests import strict_eq - -from werkzeug.wrappers import Request, Response, BaseResponse -from werkzeug.test import Client, EnvironBuilder, create_environ, \ - ClientRedirectError, stream_encode_multipart, run_wsgi_app -from werkzeug.utils import redirect -from werkzeug.formparser import parse_form_data -from werkzeug.datastructures import MultiDict, FileStorage - - -def cookie_app(environ, start_response): - """A WSGI application which sets a cookie, and returns as a response any - cookie which exists. - """ - response = Response(environ.get('HTTP_COOKIE', 'No Cookie'), - mimetype='text/plain') - response.set_cookie('test', 'test') - return response(environ, start_response) - - -def redirect_loop_app(environ, start_response): - response = redirect('http://localhost/some/redirect/') - return response(environ, start_response) - - -def redirect_with_get_app(environ, start_response): - req = Request(environ) - if req.url not in ('http://localhost/', - 'http://localhost/first/request', - 'http://localhost/some/redirect/'): - assert False, 'redirect_demo_app() did not expect URL "%s"' % req.url - if '/some/redirect' not in req.url: - response = redirect('http://localhost/some/redirect/') - else: - response = Response('current url: %s' % req.url) - return response(environ, start_response) - - -def redirect_with_post_app(environ, start_response): - req = Request(environ) - if req.url == 'http://localhost/some/redirect/': - assert req.method == 'GET', 'request should be GET' - assert not req.form, 'request should not have data' - response = Response('current url: %s' % req.url) - else: - response = redirect('http://localhost/some/redirect/') - return response(environ, start_response) - - -def external_redirect_demo_app(environ, start_response): - response = redirect('http://example.com/') - return response(environ, start_response) - - -def external_subdomain_redirect_demo_app(environ, start_response): - if 'test.example.com' in environ['HTTP_HOST']: - response = Response('redirected successfully to subdomain') - else: - response = redirect('http://test.example.com/login') - return response(environ, start_response) - - -def multi_value_post_app(environ, start_response): - req = Request(environ) - assert req.form['field'] == 'val1', req.form['field'] - assert req.form.getlist('field') == ['val1', 'val2'], req.form.getlist('field') - response = Response('ok') - return response(environ, start_response) - - -def test_cookie_forging(): - c = Client(cookie_app) - c.set_cookie('localhost', 'foo', 'bar') - appiter, code, headers = c.open() - strict_eq(list(appiter), [b'foo=bar']) - - -def test_set_cookie_app(): - c = Client(cookie_app) - appiter, code, headers = c.open() - assert 'Set-Cookie' in dict(headers) - - -def test_cookiejar_stores_cookie(): - c = Client(cookie_app) - appiter, code, headers = c.open() - assert 'test' in c.cookie_jar._cookies['localhost.local']['/'] - - -def test_no_initial_cookie(): - c = Client(cookie_app) - appiter, code, headers = c.open() - strict_eq(b''.join(appiter), b'No Cookie') - - -def test_resent_cookie(): - c = Client(cookie_app) - c.open() - appiter, code, headers = c.open() - strict_eq(b''.join(appiter), b'test=test') - - -def test_disable_cookies(): - c = Client(cookie_app, use_cookies=False) - c.open() - appiter, code, headers = c.open() - strict_eq(b''.join(appiter), b'No Cookie') - - -def test_cookie_for_different_path(): - c = Client(cookie_app) - c.open('/path1') - appiter, code, headers = c.open('/path2') - strict_eq(b''.join(appiter), b'test=test') - - -def test_environ_builder_basics(): - b = EnvironBuilder() - assert b.content_type is None - b.method = 'POST' - assert b.content_type is None - b.form['test'] = 'normal value' - assert b.content_type == 'application/x-www-form-urlencoded' - b.files.add_file('test', BytesIO(b'test contents'), 'test.txt') - assert b.files['test'].content_type == 'text/plain' - b.form['test_int'] = 1 - assert b.content_type == 'multipart/form-data' - - req = b.get_request() - b.close() - - strict_eq(req.url, u'http://localhost/') - strict_eq(req.method, 'POST') - strict_eq(req.form['test'], u'normal value') - assert req.files['test'].content_type == 'text/plain' - strict_eq(req.files['test'].filename, u'test.txt') - strict_eq(req.files['test'].read(), b'test contents') - - -def test_environ_builder_data(): - b = EnvironBuilder(data='foo') - assert b.input_stream.getvalue() == b'foo' - b = EnvironBuilder(data=b'foo') - assert b.input_stream.getvalue() == b'foo' - - b = EnvironBuilder(data={'foo': 'bar'}) - assert b.form['foo'] == 'bar' - b = EnvironBuilder(data={'foo': ['bar1', 'bar2']}) - assert b.form.getlist('foo') == ['bar1', 'bar2'] - - def check_list_content(b, length): - l = b.files.getlist('foo') - assert len(l) == length - for obj in l: - assert isinstance(obj, FileStorage) - - b = EnvironBuilder(data={'foo': BytesIO()}) - check_list_content(b, 1) - b = EnvironBuilder(data={'foo': [BytesIO(), BytesIO()]}) - check_list_content(b, 2) - - b = EnvironBuilder(data={'foo': (BytesIO(),)}) - check_list_content(b, 1) - b = EnvironBuilder(data={'foo': [(BytesIO(),), (BytesIO(),)]}) - check_list_content(b, 2) - - -def test_environ_builder_headers(): - b = EnvironBuilder(environ_base={'HTTP_USER_AGENT': 'Foo/0.1'}, - environ_overrides={'wsgi.version': (1, 1)}) - b.headers['X-Beat-My-Horse'] = 'very well sir' - env = b.get_environ() - strict_eq(env['HTTP_USER_AGENT'], 'Foo/0.1') - strict_eq(env['HTTP_X_BEAT_MY_HORSE'], 'very well sir') - strict_eq(env['wsgi.version'], (1, 1)) - - b.headers['User-Agent'] = 'Bar/1.0' - env = b.get_environ() - strict_eq(env['HTTP_USER_AGENT'], 'Bar/1.0') - - -def test_environ_builder_headers_content_type(): - b = EnvironBuilder(headers={'Content-Type': 'text/plain'}) - env = b.get_environ() - assert env['CONTENT_TYPE'] == 'text/plain' - b = EnvironBuilder(content_type='text/html', - headers={'Content-Type': 'text/plain'}) - env = b.get_environ() - assert env['CONTENT_TYPE'] == 'text/html' - - -def test_environ_builder_paths(): - b = EnvironBuilder(path='/foo', base_url='http://example.com/') - strict_eq(b.base_url, 'http://example.com/') - strict_eq(b.path, '/foo') - strict_eq(b.script_root, '') - strict_eq(b.host, 'example.com') - - b = EnvironBuilder(path='/foo', base_url='http://example.com/bar') - strict_eq(b.base_url, 'http://example.com/bar/') - strict_eq(b.path, '/foo') - strict_eq(b.script_root, '/bar') - strict_eq(b.host, 'example.com') - - b.host = 'localhost' - strict_eq(b.base_url, 'http://localhost/bar/') - b.base_url = 'http://localhost:8080/' - strict_eq(b.host, 'localhost:8080') - strict_eq(b.server_name, 'localhost') - strict_eq(b.server_port, 8080) - - b.host = 'foo.invalid' - b.url_scheme = 'https' - b.script_root = '/test' - env = b.get_environ() - strict_eq(env['SERVER_NAME'], 'foo.invalid') - strict_eq(env['SERVER_PORT'], '443') - strict_eq(env['SCRIPT_NAME'], '/test') - strict_eq(env['PATH_INFO'], '/foo') - strict_eq(env['HTTP_HOST'], 'foo.invalid') - strict_eq(env['wsgi.url_scheme'], 'https') - strict_eq(b.base_url, 'https://foo.invalid/test/') - - -def test_environ_builder_content_type(): - builder = EnvironBuilder() - assert builder.content_type is None - builder.method = 'POST' - assert builder.content_type is None - builder.method = 'PUT' - assert builder.content_type is None - builder.method = 'PATCH' - assert builder.content_type is None - builder.method = 'DELETE' - assert builder.content_type is None - builder.method = 'GET' - assert builder.content_type is None - builder.form['foo'] = 'bar' - assert builder.content_type == 'application/x-www-form-urlencoded' - builder.files.add_file('blafasel', BytesIO(b'foo'), 'test.txt') - assert builder.content_type == 'multipart/form-data' - req = builder.get_request() - strict_eq(req.form['foo'], u'bar') - strict_eq(req.files['blafasel'].read(), b'foo') - - -def test_environ_builder_stream_switch(): - d = MultiDict(dict(foo=u'bar', blub=u'blah', hu=u'hum')) - for use_tempfile in False, True: - stream, length, boundary = stream_encode_multipart( - d, use_tempfile, threshold=150) - assert isinstance(stream, BytesIO) != use_tempfile - - form = parse_form_data({'wsgi.input': stream, 'CONTENT_LENGTH': str(length), - 'CONTENT_TYPE': 'multipart/form-data; boundary="%s"' % - boundary})[1] - strict_eq(form, d) - stream.close() - - -def test_environ_builder_unicode_file_mix(): - for use_tempfile in False, True: - f = FileStorage(BytesIO(u'\N{SNOWMAN}'.encode('utf-8')), - 'snowman.txt') - d = MultiDict(dict(f=f, s=u'\N{SNOWMAN}')) - stream, length, boundary = stream_encode_multipart( - d, use_tempfile, threshold=150) - assert isinstance(stream, BytesIO) != use_tempfile - - _, form, files = parse_form_data({ - 'wsgi.input': stream, - 'CONTENT_LENGTH': str(length), - 'CONTENT_TYPE': 'multipart/form-data; boundary="%s"' % - boundary - }) - strict_eq(form['s'], u'\N{SNOWMAN}') - strict_eq(files['f'].name, 'f') - strict_eq(files['f'].filename, u'snowman.txt') - strict_eq(files['f'].read(), - u'\N{SNOWMAN}'.encode('utf-8')) - stream.close() - - -def test_create_environ(): - env = create_environ('/foo?bar=baz', 'http://example.org/') - expected = { - 'wsgi.multiprocess': False, - 'wsgi.version': (1, 0), - 'wsgi.run_once': False, - 'wsgi.errors': sys.stderr, - 'wsgi.multithread': False, - 'wsgi.url_scheme': 'http', - 'SCRIPT_NAME': '', - 'CONTENT_TYPE': '', - 'CONTENT_LENGTH': '0', - 'SERVER_NAME': 'example.org', - 'REQUEST_METHOD': 'GET', - 'HTTP_HOST': 'example.org', - 'PATH_INFO': '/foo', - 'SERVER_PORT': '80', - 'SERVER_PROTOCOL': 'HTTP/1.1', - 'QUERY_STRING': 'bar=baz' - } - for key, value in iteritems(expected): - assert env[key] == value - strict_eq(env['wsgi.input'].read(0), b'') - strict_eq(create_environ('/foo', 'http://example.com/')['SCRIPT_NAME'], '') - - -def test_file_closing(): - closed = [] - - class SpecialInput(object): - - def read(self, size): - return '' - - def close(self): - closed.append(self) - - create_environ(data={'foo': SpecialInput()}) - strict_eq(len(closed), 1) - builder = EnvironBuilder() - builder.files.add_file('blah', SpecialInput()) - builder.close() - strict_eq(len(closed), 2) - - -def test_follow_redirect(): - env = create_environ('/', base_url='http://localhost') - c = Client(redirect_with_get_app) - appiter, code, headers = c.open(environ_overrides=env, follow_redirects=True) - strict_eq(code, '200 OK') - strict_eq(b''.join(appiter), b'current url: http://localhost/some/redirect/') - - # Test that the :cls:`Client` is aware of user defined response wrappers - c = Client(redirect_with_get_app, response_wrapper=BaseResponse) - resp = c.get('/', follow_redirects=True) - strict_eq(resp.status_code, 200) - strict_eq(resp.data, b'current url: http://localhost/some/redirect/') - - # test with URL other than '/' to make sure redirected URL's are correct - c = Client(redirect_with_get_app, response_wrapper=BaseResponse) - resp = c.get('/first/request', follow_redirects=True) - strict_eq(resp.status_code, 200) - strict_eq(resp.data, b'current url: http://localhost/some/redirect/') - - -def test_follow_local_redirect(): - class LocalResponse(BaseResponse): - autocorrect_location_header = False - - def local_redirect_app(environ, start_response): - req = Request(environ) - if '/from/location' in req.url: - response = redirect('/to/location', Response=LocalResponse) - else: - response = Response('current path: %s' % req.path) - return response(environ, start_response) - - c = Client(local_redirect_app, response_wrapper=BaseResponse) - resp = c.get('/from/location', follow_redirects=True) - strict_eq(resp.status_code, 200) - strict_eq(resp.data, b'current path: /to/location') - - -def test_follow_redirect_with_post_307(): - def redirect_with_post_307_app(environ, start_response): - req = Request(environ) - if req.url == 'http://localhost/some/redirect/': - assert req.method == 'POST', 'request should be POST' - assert not req.form, 'request should not have data' - response = Response('current url: %s' % req.url) - else: - response = redirect('http://localhost/some/redirect/', code=307) - return response(environ, start_response) - - c = Client(redirect_with_post_307_app, response_wrapper=BaseResponse) - resp = c.post('/', follow_redirects=True, data='foo=blub+hehe&blah=42') - assert resp.status_code == 200 - assert resp.data == b'current url: http://localhost/some/redirect/' - - -def test_follow_external_redirect(): - env = create_environ('/', base_url='http://localhost') - c = Client(external_redirect_demo_app) - pytest.raises(RuntimeError, lambda: - c.get(environ_overrides=env, follow_redirects=True)) - - -def test_follow_external_redirect_on_same_subdomain(): - env = create_environ('/', base_url='http://example.com') - c = Client(external_subdomain_redirect_demo_app, allow_subdomain_redirects=True) - c.get(environ_overrides=env, follow_redirects=True) - - # check that this does not work for real external domains - env = create_environ('/', base_url='http://localhost') - pytest.raises(RuntimeError, lambda: - c.get(environ_overrides=env, follow_redirects=True)) - - # check that subdomain redirects fail if no `allow_subdomain_redirects` is applied - c = Client(external_subdomain_redirect_demo_app) - pytest.raises(RuntimeError, lambda: - c.get(environ_overrides=env, follow_redirects=True)) - - -def test_follow_redirect_loop(): - c = Client(redirect_loop_app, response_wrapper=BaseResponse) - with pytest.raises(ClientRedirectError): - c.get('/', follow_redirects=True) - - -def test_follow_redirect_with_post(): - c = Client(redirect_with_post_app, response_wrapper=BaseResponse) - resp = c.post('/', follow_redirects=True, data='foo=blub+hehe&blah=42') - strict_eq(resp.status_code, 200) - strict_eq(resp.data, b'current url: http://localhost/some/redirect/') - - -def test_path_info_script_name_unquoting(): - def test_app(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/plain')]) - return [environ['PATH_INFO'] + '\n' + environ['SCRIPT_NAME']] - c = Client(test_app, response_wrapper=BaseResponse) - resp = c.get('/foo%40bar') - strict_eq(resp.data, b'/foo@bar\n') - c = Client(test_app, response_wrapper=BaseResponse) - resp = c.get('/foo%40bar', 'http://localhost/bar%40baz') - strict_eq(resp.data, b'/foo@bar\n/bar@baz') - - -def test_multi_value_submit(): - c = Client(multi_value_post_app, response_wrapper=BaseResponse) - data = { - 'field': ['val1', 'val2'] - } - resp = c.post('/', data=data) - strict_eq(resp.status_code, 200) - c = Client(multi_value_post_app, response_wrapper=BaseResponse) - data = MultiDict({ - 'field': ['val1', 'val2'] - }) - resp = c.post('/', data=data) - strict_eq(resp.status_code, 200) - - -def test_iri_support(): - b = EnvironBuilder(u'/föö-bar', base_url=u'http://☃.net/') - strict_eq(b.path, '/f%C3%B6%C3%B6-bar') - strict_eq(b.base_url, 'http://xn--n3h.net/') - - -@pytest.mark.parametrize('buffered', (True, False)) -@pytest.mark.parametrize('iterable', (True, False)) -def test_run_wsgi_apps(buffered, iterable): - leaked_data = [] - - def simple_app(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/html')]) - return ['Hello World!'] - - def yielding_app(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/html')]) - yield 'Hello ' - yield 'World!' - - def late_start_response(environ, start_response): - yield 'Hello ' - yield 'World' - start_response('200 OK', [('Content-Type', 'text/html')]) - yield '!' - - def depends_on_close(environ, start_response): - leaked_data.append('harhar') - start_response('200 OK', [('Content-Type', 'text/html')]) - - class Rv(object): - - def __iter__(self): - yield 'Hello ' - yield 'World' - yield '!' - - def close(self): - assert leaked_data.pop() == 'harhar' - - return Rv() - - for app in (simple_app, yielding_app, late_start_response, - depends_on_close): - if iterable: - app = iterable_middleware(app) - app_iter, status, headers = run_wsgi_app(app, {}, buffered=buffered) - strict_eq(status, '200 OK') - strict_eq(list(headers), [('Content-Type', 'text/html')]) - strict_eq(''.join(app_iter), 'Hello World!') - - if hasattr(app_iter, 'close'): - app_iter.close() - assert not leaked_data - - -def test_run_wsgi_app_closing_iterator(): - got_close = [] - - @implements_iterator - class CloseIter(object): - - def __init__(self): - self.iterated = False - - def __iter__(self): - return self - - def close(self): - got_close.append(None) - - def __next__(self): - if self.iterated: - raise StopIteration() - self.iterated = True - return 'bar' - - def bar(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/plain')]) - return CloseIter() - - app_iter, status, headers = run_wsgi_app(bar, {}) - assert status == '200 OK' - assert list(headers) == [('Content-Type', 'text/plain')] - assert next(app_iter) == 'bar' - pytest.raises(StopIteration, partial(next, app_iter)) - app_iter.close() - - assert run_wsgi_app(bar, {}, True)[0] == ['bar'] - - assert len(got_close) == 2 - - -def iterable_middleware(app): - '''Guarantee that the app returns an iterable''' - def inner(environ, start_response): - rv = app(environ, start_response) - - class Iterable(object): - - def __iter__(self): - return iter(rv) - - if hasattr(rv, 'close'): - def close(self): - rv.close() - - return Iterable() - return inner - - -def test_multiple_cookies(): - @Request.application - def test_app(request): - response = Response(repr(sorted(request.cookies.items()))) - response.set_cookie(u'test1', b'foo') - response.set_cookie(u'test2', b'bar') - return response - client = Client(test_app, Response) - resp = client.get('/') - strict_eq(resp.data, b'[]') - resp = client.get('/') - strict_eq(resp.data, - to_bytes(repr([('test1', u'foo'), ('test2', u'bar')]), 'ascii')) - - -def test_correct_open_invocation_on_redirect(): - class MyClient(Client): - counter = 0 - - def open(self, *args, **kwargs): - self.counter += 1 - env = kwargs.setdefault('environ_overrides', {}) - env['werkzeug._foo'] = self.counter - return Client.open(self, *args, **kwargs) - - @Request.application - def test_app(request): - return Response(str(request.environ['werkzeug._foo'])) - - c = MyClient(test_app, response_wrapper=Response) - strict_eq(c.get('/').data, b'1') - strict_eq(c.get('/').data, b'2') - strict_eq(c.get('/').data, b'3') - - -def test_correct_encoding(): - req = Request.from_values(u'/\N{SNOWMAN}', u'http://example.com/foo') - strict_eq(req.script_root, u'/foo') - strict_eq(req.path, u'/\N{SNOWMAN}') - - -def test_full_url_requests_with_args(): - base = 'http://example.com/' - - @Request.application - def test_app(request): - return Response(request.args['x']) - client = Client(test_app, Response) - resp = client.get('/?x=42', base) - strict_eq(resp.data, b'42') - resp = client.get('http://www.example.com/?x=23', base) - strict_eq(resp.data, b'23') - - -def test_delete_requests_with_form(): - @Request.application - def test_app(request): - return Response(request.form.get('x', None)) - - client = Client(test_app, Response) - resp = client.delete('/', data={'x': 42}) - strict_eq(resp.data, b'42') - - -def test_post_with_file_descriptor(tmpdir): - c = Client(Response(), response_wrapper=Response) - f = tmpdir.join('some-file.txt') - f.write('foo') - with open(f.strpath, mode='rt') as data: - resp = c.post('/', data=data) - strict_eq(resp.status_code, 200) - with open(f.strpath, mode='rb') as data: - resp = c.post('/', data=data) - strict_eq(resp.status_code, 200) diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_urls.py b/pythonPackages/Werkzeug-0.12.1/tests/test_urls.py deleted file mode 100644 index a3408e85e1..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_urls.py +++ /dev/null @@ -1,409 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.urls - ~~~~~~~~~~ - - URL helper tests. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import pytest - -from tests import strict_eq - -from werkzeug.datastructures import OrderedMultiDict -from werkzeug import urls -from werkzeug._compat import text_type, NativeStringIO, BytesIO - - -def test_parsing(): - url = urls.url_parse('http://anon:hunter2@[2001:db8:0:1]:80/a/b/c') - assert url.netloc == 'anon:hunter2@[2001:db8:0:1]:80' - assert url.username == 'anon' - assert url.password == 'hunter2' - assert url.port == 80 - assert url.ascii_host == '2001:db8:0:1' - - assert url.get_file_location() == (None, None) # no file scheme - - -@pytest.mark.parametrize('implicit_format', (True, False)) -@pytest.mark.parametrize('localhost', ('127.0.0.1', '::1', 'localhost')) -def test_fileurl_parsing_windows(implicit_format, localhost, monkeypatch): - if implicit_format: - pathformat = None - monkeypatch.setattr('os.name', 'nt') - else: - pathformat = 'windows' - monkeypatch.delattr('os.name') # just to make sure it won't get used - - url = urls.url_parse('file:///C:/Documents and Settings/Foobar/stuff.txt') - assert url.netloc == '' - assert url.scheme == 'file' - assert url.get_file_location(pathformat) == \ - (None, r'C:\Documents and Settings\Foobar\stuff.txt') - - url = urls.url_parse('file://///server.tld/file.txt') - assert url.get_file_location(pathformat) == ('server.tld', r'file.txt') - - url = urls.url_parse('file://///server.tld') - assert url.get_file_location(pathformat) == ('server.tld', '') - - url = urls.url_parse('file://///%s' % localhost) - assert url.get_file_location(pathformat) == (None, '') - - url = urls.url_parse('file://///%s/file.txt' % localhost) - assert url.get_file_location(pathformat) == (None, r'file.txt') - - -def test_replace(): - url = urls.url_parse('http://de.wikipedia.org/wiki/Troll') - strict_eq(url.replace(query='foo=bar'), - urls.url_parse('http://de.wikipedia.org/wiki/Troll?foo=bar')) - strict_eq(url.replace(scheme='https'), - urls.url_parse('https://de.wikipedia.org/wiki/Troll')) - - -def test_quoting(): - strict_eq(urls.url_quote(u'\xf6\xe4\xfc'), '%C3%B6%C3%A4%C3%BC') - strict_eq(urls.url_unquote(urls.url_quote(u'#%="\xf6')), u'#%="\xf6') - strict_eq(urls.url_quote_plus('foo bar'), 'foo+bar') - strict_eq(urls.url_unquote_plus('foo+bar'), u'foo bar') - strict_eq(urls.url_quote_plus('foo+bar'), 'foo%2Bbar') - strict_eq(urls.url_unquote_plus('foo%2Bbar'), u'foo+bar') - strict_eq(urls.url_encode({b'a': None, b'b': b'foo bar'}), 'b=foo+bar') - strict_eq(urls.url_encode({u'a': None, u'b': u'foo bar'}), 'b=foo+bar') - strict_eq(urls.url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffsklärung)'), - 'http://de.wikipedia.org/wiki/Elf%20(Begriffskl%C3%A4rung)') - strict_eq(urls.url_quote_plus(42), '42') - strict_eq(urls.url_quote(b'\xff'), '%FF') - - -def test_bytes_unquoting(): - strict_eq(urls.url_unquote(urls.url_quote( - u'#%="\xf6', charset='latin1'), charset=None), b'#%="\xf6') - - -def test_url_decoding(): - x = urls.url_decode(b'foo=42&bar=23&uni=H%C3%A4nsel') - strict_eq(x['foo'], u'42') - strict_eq(x['bar'], u'23') - strict_eq(x['uni'], u'Hänsel') - - x = urls.url_decode(b'foo=42;bar=23;uni=H%C3%A4nsel', separator=b';') - strict_eq(x['foo'], u'42') - strict_eq(x['bar'], u'23') - strict_eq(x['uni'], u'Hänsel') - - x = urls.url_decode(b'%C3%9Ch=H%C3%A4nsel', decode_keys=True) - strict_eq(x[u'Üh'], u'Hänsel') - - -def test_url_bytes_decoding(): - x = urls.url_decode(b'foo=42&bar=23&uni=H%C3%A4nsel', charset=None) - strict_eq(x[b'foo'], b'42') - strict_eq(x[b'bar'], b'23') - strict_eq(x[b'uni'], u'Hänsel'.encode('utf-8')) - - -def test_streamed_url_decoding(): - item1 = u'a' * 100000 - item2 = u'b' * 400 - string = ('a=%s&b=%s&c=%s' % (item1, item2, item2)).encode('ascii') - gen = urls.url_decode_stream(BytesIO(string), limit=len(string), - return_iterator=True) - strict_eq(next(gen), ('a', item1)) - strict_eq(next(gen), ('b', item2)) - strict_eq(next(gen), ('c', item2)) - pytest.raises(StopIteration, lambda: next(gen)) - - -def test_stream_decoding_string_fails(): - pytest.raises(TypeError, urls.url_decode_stream, 'testing') - - -def test_url_encoding(): - strict_eq(urls.url_encode({'foo': 'bar 45'}), 'foo=bar+45') - d = {'foo': 1, 'bar': 23, 'blah': u'Hänsel'} - strict_eq(urls.url_encode(d, sort=True), 'bar=23&blah=H%C3%A4nsel&foo=1') - strict_eq(urls.url_encode(d, sort=True, separator=u';'), 'bar=23;blah=H%C3%A4nsel;foo=1') - - -def test_sorted_url_encode(): - strict_eq(urls.url_encode({u"a": 42, u"b": 23, 1: 1, 2: 2}, - sort=True, key=lambda i: text_type(i[0])), '1=1&2=2&a=42&b=23') - strict_eq(urls.url_encode({u'A': 1, u'a': 2, u'B': 3, 'b': 4}, sort=True, - key=lambda x: x[0].lower() + x[0]), 'A=1&a=2&B=3&b=4') - - -def test_streamed_url_encoding(): - out = NativeStringIO() - urls.url_encode_stream({'foo': 'bar 45'}, out) - strict_eq(out.getvalue(), 'foo=bar+45') - - d = {'foo': 1, 'bar': 23, 'blah': u'Hänsel'} - out = NativeStringIO() - urls.url_encode_stream(d, out, sort=True) - strict_eq(out.getvalue(), 'bar=23&blah=H%C3%A4nsel&foo=1') - out = NativeStringIO() - urls.url_encode_stream(d, out, sort=True, separator=u';') - strict_eq(out.getvalue(), 'bar=23;blah=H%C3%A4nsel;foo=1') - - gen = urls.url_encode_stream(d, sort=True) - strict_eq(next(gen), 'bar=23') - strict_eq(next(gen), 'blah=H%C3%A4nsel') - strict_eq(next(gen), 'foo=1') - pytest.raises(StopIteration, lambda: next(gen)) - - -def test_url_fixing(): - x = urls.url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffskl\xe4rung)') - assert x == 'http://de.wikipedia.org/wiki/Elf%20(Begriffskl%C3%A4rung)' - - x = urls.url_fix("http://just.a.test/$-_.+!*'(),") - assert x == "http://just.a.test/$-_.+!*'()," - - x = urls.url_fix('http://höhöhö.at/höhöhö/hähähä') - assert x == r'http://xn--hhh-snabb.at/h%C3%B6h%C3%B6h%C3%B6/h%C3%A4h%C3%A4h%C3%A4' - - -def test_url_fixing_filepaths(): - x = urls.url_fix(r'file://C:\Users\Administrator\My Documents\ÑÈáÇíí') - assert x == (r'file:///C%3A/Users/Administrator/My%20Documents/' - r'%C3%91%C3%88%C3%A1%C3%87%C3%AD%C3%AD') - - a = urls.url_fix(r'file:/C:/') - b = urls.url_fix(r'file://C:/') - c = urls.url_fix(r'file:///C:/') - assert a == b == c == r'file:///C%3A/' - - x = urls.url_fix(r'file://host/sub/path') - assert x == r'file://host/sub/path' - - x = urls.url_fix(r'file:///') - assert x == r'file:///' - - -def test_url_fixing_qs(): - x = urls.url_fix(b'http://example.com/?foo=%2f%2f') - assert x == 'http://example.com/?foo=%2f%2f' - - x = urls.url_fix('http://acronyms.thefreedictionary.com/' - 'Algebraic+Methods+of+Solving+the+Schr%C3%B6dinger+Equation') - assert x == ('http://acronyms.thefreedictionary.com/' - 'Algebraic+Methods+of+Solving+the+Schr%C3%B6dinger+Equation') - - -def test_iri_support(): - strict_eq(urls.uri_to_iri('http://xn--n3h.net/'), - u'http://\u2603.net/') - strict_eq( - urls.uri_to_iri(b'http://%C3%BCser:p%C3%A4ssword@xn--n3h.net/p%C3%A5th'), - u'http://\xfcser:p\xe4ssword@\u2603.net/p\xe5th') - strict_eq(urls.iri_to_uri(u'http://☃.net/'), 'http://xn--n3h.net/') - strict_eq( - urls.iri_to_uri(u'http://üser:pässword@☃.net/påth'), - 'http://%C3%BCser:p%C3%A4ssword@xn--n3h.net/p%C3%A5th') - - strict_eq(urls.uri_to_iri('http://test.com/%3Fmeh?foo=%26%2F'), - u'http://test.com/%3Fmeh?foo=%26%2F') - - # this should work as well, might break on 2.4 because of a broken - # idna codec - strict_eq(urls.uri_to_iri(b'/foo'), u'/foo') - strict_eq(urls.iri_to_uri(u'/foo'), '/foo') - - strict_eq(urls.iri_to_uri(u'http://föö.com:8080/bam/baz'), - 'http://xn--f-1gaa.com:8080/bam/baz') - - -def test_iri_safe_conversion(): - strict_eq(urls.iri_to_uri(u'magnet:?foo=bar'), - 'magnet:?foo=bar') - strict_eq(urls.iri_to_uri(u'itms-service://?foo=bar'), - 'itms-service:?foo=bar') - strict_eq(urls.iri_to_uri(u'itms-service://?foo=bar', - safe_conversion=True), - 'itms-service://?foo=bar') - - -def test_iri_safe_quoting(): - uri = 'http://xn--f-1gaa.com/%2F%25?q=%C3%B6&x=%3D%25#%25' - iri = u'http://föö.com/%2F%25?q=ö&x=%3D%25#%25' - strict_eq(urls.uri_to_iri(uri), iri) - strict_eq(urls.iri_to_uri(urls.uri_to_iri(uri)), uri) - - -def test_ordered_multidict_encoding(): - d = OrderedMultiDict() - d.add('foo', 1) - d.add('foo', 2) - d.add('foo', 3) - d.add('bar', 0) - d.add('foo', 4) - assert urls.url_encode(d) == 'foo=1&foo=2&foo=3&bar=0&foo=4' - - -def test_multidict_encoding(): - d = OrderedMultiDict() - d.add('2013-10-10T23:26:05.657975+0000', '2013-10-10T23:26:05.657975+0000') - assert urls.url_encode( - d) == '2013-10-10T23%3A26%3A05.657975%2B0000=2013-10-10T23%3A26%3A05.657975%2B0000' - - -def test_href(): - x = urls.Href('http://www.example.com/') - strict_eq(x(u'foo'), 'http://www.example.com/foo') - strict_eq(x.foo(u'bar'), 'http://www.example.com/foo/bar') - strict_eq(x.foo(u'bar', x=42), 'http://www.example.com/foo/bar?x=42') - strict_eq(x.foo(u'bar', class_=42), 'http://www.example.com/foo/bar?class=42') - strict_eq(x.foo(u'bar', {u'class': 42}), 'http://www.example.com/foo/bar?class=42') - pytest.raises(AttributeError, lambda: x.__blah__) - - x = urls.Href('blah') - strict_eq(x.foo(u'bar'), 'blah/foo/bar') - - pytest.raises(TypeError, x.foo, {u"foo": 23}, x=42) - - x = urls.Href('') - strict_eq(x('foo'), 'foo') - - -def test_href_url_join(): - x = urls.Href(u'test') - assert x(u'foo:bar') == u'test/foo:bar' - assert x(u'http://example.com/') == u'test/http://example.com/' - assert x.a() == u'test/a' - - -def test_href_past_root(): - base_href = urls.Href('http://www.blagga.com/1/2/3') - strict_eq(base_href('../foo'), 'http://www.blagga.com/1/2/foo') - strict_eq(base_href('../../foo'), 'http://www.blagga.com/1/foo') - strict_eq(base_href('../../../foo'), 'http://www.blagga.com/foo') - strict_eq(base_href('../../../../foo'), 'http://www.blagga.com/foo') - strict_eq(base_href('../../../../../foo'), 'http://www.blagga.com/foo') - strict_eq(base_href('../../../../../../foo'), 'http://www.blagga.com/foo') - - -def test_url_unquote_plus_unicode(): - # was broken in 0.6 - strict_eq(urls.url_unquote_plus(u'\x6d'), u'\x6d') - assert type(urls.url_unquote_plus(u'\x6d')) is text_type - - -def test_quoting_of_local_urls(): - rv = urls.iri_to_uri(u'/foo\x8f') - strict_eq(rv, '/foo%C2%8F') - assert type(rv) is str - - -def test_url_attributes(): - rv = urls.url_parse('http://foo%3a:bar%3a@[::1]:80/123?x=y#frag') - strict_eq(rv.scheme, 'http') - strict_eq(rv.auth, 'foo%3a:bar%3a') - strict_eq(rv.username, u'foo:') - strict_eq(rv.password, u'bar:') - strict_eq(rv.raw_username, 'foo%3a') - strict_eq(rv.raw_password, 'bar%3a') - strict_eq(rv.host, '::1') - assert rv.port == 80 - strict_eq(rv.path, '/123') - strict_eq(rv.query, 'x=y') - strict_eq(rv.fragment, 'frag') - - rv = urls.url_parse(u'http://\N{SNOWMAN}.com/') - strict_eq(rv.host, u'\N{SNOWMAN}.com') - strict_eq(rv.ascii_host, 'xn--n3h.com') - - -def test_url_attributes_bytes(): - rv = urls.url_parse(b'http://foo%3a:bar%3a@[::1]:80/123?x=y#frag') - strict_eq(rv.scheme, b'http') - strict_eq(rv.auth, b'foo%3a:bar%3a') - strict_eq(rv.username, u'foo:') - strict_eq(rv.password, u'bar:') - strict_eq(rv.raw_username, b'foo%3a') - strict_eq(rv.raw_password, b'bar%3a') - strict_eq(rv.host, b'::1') - assert rv.port == 80 - strict_eq(rv.path, b'/123') - strict_eq(rv.query, b'x=y') - strict_eq(rv.fragment, b'frag') - - -def test_url_joining(): - strict_eq(urls.url_join('/foo', '/bar'), '/bar') - strict_eq(urls.url_join('http://example.com/foo', '/bar'), - 'http://example.com/bar') - strict_eq(urls.url_join('file:///tmp/', 'test.html'), - 'file:///tmp/test.html') - strict_eq(urls.url_join('file:///tmp/x', 'test.html'), - 'file:///tmp/test.html') - strict_eq(urls.url_join('file:///tmp/x', '../../../x.html'), - 'file:///x.html') - - -def test_partial_unencoded_decode(): - ref = u'foo=정상처리'.encode('euc-kr') - x = urls.url_decode(ref, charset='euc-kr') - strict_eq(x['foo'], u'정상처리') - - -def test_iri_to_uri_idempotence_ascii_only(): - uri = u'http://www.idempoten.ce' - uri = urls.iri_to_uri(uri) - assert urls.iri_to_uri(uri) == uri - - -def test_iri_to_uri_idempotence_non_ascii(): - uri = u'http://\N{SNOWMAN}/\N{SNOWMAN}' - uri = urls.iri_to_uri(uri) - assert urls.iri_to_uri(uri) == uri - - -def test_uri_to_iri_idempotence_ascii_only(): - uri = 'http://www.idempoten.ce' - uri = urls.uri_to_iri(uri) - assert urls.uri_to_iri(uri) == uri - - -def test_uri_to_iri_idempotence_non_ascii(): - uri = 'http://xn--n3h/%E2%98%83' - uri = urls.uri_to_iri(uri) - assert urls.uri_to_iri(uri) == uri - - -def test_iri_to_uri_to_iri(): - iri = u'http://föö.com/' - uri = urls.iri_to_uri(iri) - assert urls.uri_to_iri(uri) == iri - - -def test_uri_to_iri_to_uri(): - uri = 'http://xn--f-rgao.com/%C3%9E' - iri = urls.uri_to_iri(uri) - assert urls.iri_to_uri(iri) == uri - - -def test_uri_iri_normalization(): - uri = 'http://xn--f-rgao.com/%E2%98%90/fred?utf8=%E2%9C%93' - iri = u'http://föñ.com/\N{BALLOT BOX}/fred?utf8=\u2713' - - tests = [ - u'http://föñ.com/\N{BALLOT BOX}/fred?utf8=\u2713', - u'http://xn--f-rgao.com/\u2610/fred?utf8=\N{CHECK MARK}', - b'http://xn--f-rgao.com/%E2%98%90/fred?utf8=%E2%9C%93', - u'http://xn--f-rgao.com/%E2%98%90/fred?utf8=%E2%9C%93', - u'http://föñ.com/\u2610/fred?utf8=%E2%9C%93', - b'http://xn--f-rgao.com/\xe2\x98\x90/fred?utf8=\xe2\x9c\x93', - ] - - for test in tests: - assert urls.uri_to_iri(test) == iri - assert urls.iri_to_uri(test) == uri - assert urls.uri_to_iri(urls.iri_to_uri(test)) == iri - assert urls.iri_to_uri(urls.uri_to_iri(test)) == uri - assert urls.uri_to_iri(urls.uri_to_iri(test)) == iri - assert urls.iri_to_uri(urls.iri_to_uri(test)) == uri diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_utils.py b/pythonPackages/Werkzeug-0.12.1/tests/test_utils.py deleted file mode 100644 index add8aa40c4..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_utils.py +++ /dev/null @@ -1,297 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.utils - ~~~~~~~~~~~ - - General utilities. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -from __future__ import with_statement - -import pytest - -from datetime import datetime -import inspect - -from werkzeug import utils -from werkzeug.datastructures import Headers -from werkzeug.http import parse_date, http_date -from werkzeug.wrappers import BaseResponse -from werkzeug.test import Client -from werkzeug._compat import text_type - - -def test_redirect(): - resp = utils.redirect(u'/füübär') - assert b'/f%C3%BC%C3%BCb%C3%A4r' in resp.get_data() - assert resp.headers['Location'] == '/f%C3%BC%C3%BCb%C3%A4r' - assert resp.status_code == 302 - - resp = utils.redirect(u'http://☃.net/', 307) - assert b'http://xn--n3h.net/' in resp.get_data() - assert resp.headers['Location'] == 'http://xn--n3h.net/' - assert resp.status_code == 307 - - resp = utils.redirect('http://example.com/', 305) - assert resp.headers['Location'] == 'http://example.com/' - assert resp.status_code == 305 - - -def test_redirect_no_unicode_header_keys(): - # Make sure all headers are native keys. This was a bug at one point - # due to an incorrect conversion. - resp = utils.redirect('http://example.com/', 305) - for key, value in resp.headers.items(): - assert type(key) == str - assert type(value) == text_type - assert resp.headers['Location'] == 'http://example.com/' - assert resp.status_code == 305 - - -def test_redirect_xss(): - location = 'http://example.com/?xss=">' - resp = utils.redirect(location) - assert b'' not in resp.get_data() - - location = 'http://example.com/?xss="onmouseover="alert(1)' - resp = utils.redirect(location) - assert b'href="http://example.com/?xss="onmouseover="alert(1)"' not in resp.get_data() - - -def test_redirect_with_custom_response_class(): - class MyResponse(BaseResponse): - pass - - location = "http://example.com/redirect" - resp = utils.redirect(location, Response=MyResponse) - - assert isinstance(resp, MyResponse) - assert resp.headers['Location'] == location - - -def test_cached_property(): - foo = [] - - class A(object): - - def prop(self): - foo.append(42) - return 42 - prop = utils.cached_property(prop) - - a = A() - p = a.prop - q = a.prop - assert p == q == 42 - assert foo == [42] - - foo = [] - - class A(object): - - def _prop(self): - foo.append(42) - return 42 - prop = utils.cached_property(_prop, name='prop') - del _prop - - a = A() - p = a.prop - q = a.prop - assert p == q == 42 - assert foo == [42] - - -def test_can_set_cached_property(): - class A(object): - - @utils.cached_property - def _prop(self): - return 'cached_property return value' - - a = A() - a._prop = 'value' - assert a._prop == 'value' - - -def test_inspect_treats_cached_property_as_property(): - class A(object): - - @utils.cached_property - def _prop(self): - return 'cached_property return value' - - attrs = inspect.classify_class_attrs(A) - for attr in attrs: - if attr.name == '_prop': - break - assert attr.kind == 'property' - - -def test_environ_property(): - class A(object): - environ = {'string': 'abc', 'number': '42'} - - string = utils.environ_property('string') - missing = utils.environ_property('missing', 'spam') - read_only = utils.environ_property('number') - number = utils.environ_property('number', load_func=int) - broken_number = utils.environ_property('broken_number', load_func=int) - date = utils.environ_property('date', None, parse_date, http_date, - read_only=False) - foo = utils.environ_property('foo') - - a = A() - assert a.string == 'abc' - assert a.missing == 'spam' - - def test_assign(): - a.read_only = 'something' - pytest.raises(AttributeError, test_assign) - assert a.number == 42 - assert a.broken_number is None - assert a.date is None - a.date = datetime(2008, 1, 22, 10, 0, 0, 0) - assert a.environ['date'] == 'Tue, 22 Jan 2008 10:00:00 GMT' - - -def test_escape(): - class Foo(str): - - def __html__(self): - return text_type(self) - assert utils.escape(None) == '' - assert utils.escape(42) == '42' - assert utils.escape('<>') == '<>' - assert utils.escape('"foo"') == '"foo"' - assert utils.escape(Foo('')) == '' - - -def test_unescape(): - assert utils.unescape('<ä>') == u'<ä>' - - -def test_import_string(): - import cgi - from werkzeug.debug import DebuggedApplication - assert utils.import_string('cgi.escape') is cgi.escape - assert utils.import_string(u'cgi.escape') is cgi.escape - assert utils.import_string('cgi:escape') is cgi.escape - assert utils.import_string('XXXXXXXXXXXX', True) is None - assert utils.import_string('cgi.XXXXXXXXXXXX', True) is None - assert utils.import_string(u'werkzeug.debug.DebuggedApplication') is DebuggedApplication - pytest.raises(ImportError, utils.import_string, 'XXXXXXXXXXXXXXXX') - pytest.raises(ImportError, utils.import_string, 'cgi.XXXXXXXXXX') - - -def test_import_string_attribute_error(tmpdir, monkeypatch): - monkeypatch.syspath_prepend(str(tmpdir)) - tmpdir.join('foo_test.py').write('from bar_test import value') - tmpdir.join('bar_test.py').write('raise AttributeError("screw you!")') - with pytest.raises(AttributeError) as foo_exc: - utils.import_string('foo_test') - assert 'screw you!' in str(foo_exc) - - with pytest.raises(AttributeError) as bar_exc: - utils.import_string('bar_test') - assert 'screw you!' in str(bar_exc) - - -def test_find_modules(): - assert list(utils.find_modules('werkzeug.debug')) == [ - 'werkzeug.debug.console', 'werkzeug.debug.repr', - 'werkzeug.debug.tbtools' - ] - - -def test_html_builder(): - html = utils.html - xhtml = utils.xhtml - assert html.p('Hello World') == '

Hello World

' - assert html.a('Test', href='#') == 'Test' - assert html.br() == '
' - assert xhtml.br() == '
' - assert html.img(src='foo') == '' - assert xhtml.img(src='foo') == '' - assert html.html(html.head( - html.title('foo'), - html.script(type='text/javascript') - )) == ( - 'foo' - ) - assert html('') == '<foo>' - assert html.input(disabled=True) == '' - assert xhtml.input(disabled=True) == '' - assert html.input(disabled='') == '' - assert xhtml.input(disabled='') == '' - assert html.input(disabled=None) == '' - assert xhtml.input(disabled=None) == '' - assert html.script('alert("Hello World");') == \ - '' - assert xhtml.script('alert("Hello World");') == \ - '' - - -def test_validate_arguments(): - take_none = lambda: None - take_two = lambda a, b: None - take_two_one_default = lambda a, b=0: None - - assert utils.validate_arguments(take_two, (1, 2,), {}) == ((1, 2), {}) - assert utils.validate_arguments(take_two, (1,), {'b': 2}) == ((1, 2), {}) - assert utils.validate_arguments(take_two_one_default, (1,), {}) == ((1, 0), {}) - assert utils.validate_arguments(take_two_one_default, (1, 2), {}) == ((1, 2), {}) - - pytest.raises(utils.ArgumentValidationError, - utils.validate_arguments, take_two, (), {}) - - assert utils.validate_arguments(take_none, (1, 2,), {'c': 3}) == ((), {}) - pytest.raises(utils.ArgumentValidationError, - utils.validate_arguments, take_none, (1,), {}, drop_extra=False) - pytest.raises(utils.ArgumentValidationError, - utils.validate_arguments, take_none, (), {'a': 1}, drop_extra=False) - - -def test_header_set_duplication_bug(): - headers = Headers([ - ('Content-Type', 'text/html'), - ('Foo', 'bar'), - ('Blub', 'blah') - ]) - headers['blub'] = 'hehe' - headers['blafasel'] = 'humm' - assert headers == Headers([ - ('Content-Type', 'text/html'), - ('Foo', 'bar'), - ('blub', 'hehe'), - ('blafasel', 'humm') - ]) - - -def test_append_slash_redirect(): - def app(env, sr): - return utils.append_slash_redirect(env)(env, sr) - client = Client(app, BaseResponse) - response = client.get('foo', base_url='http://example.org/app') - assert response.status_code == 301 - assert response.headers['Location'] == 'http://example.org/app/foo/' - - -def test_cached_property_doc(): - @utils.cached_property - def foo(): - """testing""" - return 42 - assert foo.__doc__ == 'testing' - assert foo.__name__ == 'foo' - assert foo.__module__ == __name__ - - -def test_secure_filename(): - assert utils.secure_filename('My cool movie.mov') == 'My_cool_movie.mov' - assert utils.secure_filename('../../../etc/passwd') == 'etc_passwd' - assert utils.secure_filename(u'i contain cool \xfcml\xe4uts.txt') == \ - 'i_contain_cool_umlauts.txt' diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_wrappers.py b/pythonPackages/Werkzeug-0.12.1/tests/test_wrappers.py deleted file mode 100644 index 973dc58102..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_wrappers.py +++ /dev/null @@ -1,1125 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.wrappers - ~~~~~~~~~~~~~~ - - Tests for the response and request objects. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import os - -import pytest - -import pickle -from io import BytesIO -from datetime import datetime -from werkzeug._compat import iteritems - -from tests import strict_eq - -from werkzeug import wrappers -from werkzeug.exceptions import SecurityError, RequestedRangeNotSatisfiable -from werkzeug.wsgi import LimitedStream, wrap_file -from werkzeug.datastructures import MultiDict, ImmutableOrderedMultiDict, \ - ImmutableList, ImmutableTypeConversionDict, CharsetAccept, \ - MIMEAccept, LanguageAccept, Accept, CombinedMultiDict -from werkzeug.test import Client, create_environ, run_wsgi_app -from werkzeug._compat import implements_iterator, text_type - - -class RequestTestResponse(wrappers.BaseResponse): - - """Subclass of the normal response class we use to test response - and base classes. Has some methods to test if things in the - response match. - """ - - def __init__(self, response, status, headers): - wrappers.BaseResponse.__init__(self, response, status, headers) - self.body_data = pickle.loads(self.get_data()) - - def __getitem__(self, key): - return self.body_data[key] - - -def request_demo_app(environ, start_response): - request = wrappers.BaseRequest(environ) - assert 'werkzeug.request' in environ - start_response('200 OK', [('Content-Type', 'text/plain')]) - return [pickle.dumps({ - 'args': request.args, - 'args_as_list': list(request.args.lists()), - 'form': request.form, - 'form_as_list': list(request.form.lists()), - 'environ': prepare_environ_pickle(request.environ), - 'data': request.get_data() - })] - - -def prepare_environ_pickle(environ): - result = {} - for key, value in iteritems(environ): - try: - pickle.dumps((key, value)) - except Exception: - continue - result[key] = value - return result - - -def assert_environ(environ, method): - strict_eq(environ['REQUEST_METHOD'], method) - strict_eq(environ['PATH_INFO'], '/') - strict_eq(environ['SCRIPT_NAME'], '') - strict_eq(environ['SERVER_NAME'], 'localhost') - strict_eq(environ['wsgi.version'], (1, 0)) - strict_eq(environ['wsgi.url_scheme'], 'http') - - -def test_base_request(): - client = Client(request_demo_app, RequestTestResponse) - - # get requests - response = client.get('/?foo=bar&foo=hehe') - strict_eq(response['args'], MultiDict([('foo', u'bar'), ('foo', u'hehe')])) - strict_eq(response['args_as_list'], [('foo', [u'bar', u'hehe'])]) - strict_eq(response['form'], MultiDict()) - strict_eq(response['form_as_list'], []) - strict_eq(response['data'], b'') - assert_environ(response['environ'], 'GET') - - # post requests with form data - response = client.post('/?blub=blah', data='foo=blub+hehe&blah=42', - content_type='application/x-www-form-urlencoded') - strict_eq(response['args'], MultiDict([('blub', u'blah')])) - strict_eq(response['args_as_list'], [('blub', [u'blah'])]) - strict_eq(response['form'], MultiDict([('foo', u'blub hehe'), ('blah', u'42')])) - strict_eq(response['data'], b'') - # currently we do not guarantee that the values are ordered correctly - # for post data. - # strict_eq(response['form_as_list'], [('foo', ['blub hehe']), ('blah', ['42'])]) - assert_environ(response['environ'], 'POST') - - # patch requests with form data - response = client.patch('/?blub=blah', data='foo=blub+hehe&blah=42', - content_type='application/x-www-form-urlencoded') - strict_eq(response['args'], MultiDict([('blub', u'blah')])) - strict_eq(response['args_as_list'], [('blub', [u'blah'])]) - strict_eq(response['form'], - MultiDict([('foo', u'blub hehe'), ('blah', u'42')])) - strict_eq(response['data'], b'') - assert_environ(response['environ'], 'PATCH') - - # post requests with json data - json = b'{"foo": "bar", "blub": "blah"}' - response = client.post('/?a=b', data=json, content_type='application/json') - strict_eq(response['data'], json) - strict_eq(response['args'], MultiDict([('a', u'b')])) - strict_eq(response['form'], MultiDict()) - - -def test_query_string_is_bytes(): - req = wrappers.Request.from_values(u'/?foo=%2f') - strict_eq(req.query_string, b'foo=%2f') - - -def test_request_repr(): - req = wrappers.Request.from_values('/foobar') - assert "" == repr(req) - # test with non-ascii characters - req = wrappers.Request.from_values('/привет') - assert "" == repr(req) - # test with unicode type for python 2 - req = wrappers.Request.from_values(u'/привет') - assert "" == repr(req) - - -def test_access_route(): - req = wrappers.Request.from_values(headers={ - 'X-Forwarded-For': '192.168.1.2, 192.168.1.1' - }) - req.environ['REMOTE_ADDR'] = '192.168.1.3' - assert req.access_route == ['192.168.1.2', '192.168.1.1'] - strict_eq(req.remote_addr, '192.168.1.3') - - req = wrappers.Request.from_values() - req.environ['REMOTE_ADDR'] = '192.168.1.3' - strict_eq(list(req.access_route), ['192.168.1.3']) - - -def test_url_request_descriptors(): - req = wrappers.Request.from_values('/bar?foo=baz', 'http://example.com/test') - strict_eq(req.path, u'/bar') - strict_eq(req.full_path, u'/bar?foo=baz') - strict_eq(req.script_root, u'/test') - strict_eq(req.url, u'http://example.com/test/bar?foo=baz') - strict_eq(req.base_url, u'http://example.com/test/bar') - strict_eq(req.url_root, u'http://example.com/test/') - strict_eq(req.host_url, u'http://example.com/') - strict_eq(req.host, 'example.com') - strict_eq(req.scheme, 'http') - - req = wrappers.Request.from_values('/bar?foo=baz', 'https://example.com/test') - strict_eq(req.scheme, 'https') - - -def test_url_request_descriptors_query_quoting(): - next = 'http%3A%2F%2Fwww.example.com%2F%3Fnext%3D%2Fbaz%23my%3Dhash' - req = wrappers.Request.from_values('/bar?next=' + next, 'http://example.com/') - assert req.path == u'/bar' - strict_eq(req.full_path, u'/bar?next=' + next) - strict_eq(req.url, u'http://example.com/bar?next=' + next) - - -def test_url_request_descriptors_hosts(): - req = wrappers.Request.from_values('/bar?foo=baz', 'http://example.com/test') - req.trusted_hosts = ['example.com'] - strict_eq(req.path, u'/bar') - strict_eq(req.full_path, u'/bar?foo=baz') - strict_eq(req.script_root, u'/test') - strict_eq(req.url, u'http://example.com/test/bar?foo=baz') - strict_eq(req.base_url, u'http://example.com/test/bar') - strict_eq(req.url_root, u'http://example.com/test/') - strict_eq(req.host_url, u'http://example.com/') - strict_eq(req.host, 'example.com') - strict_eq(req.scheme, 'http') - - req = wrappers.Request.from_values('/bar?foo=baz', 'https://example.com/test') - strict_eq(req.scheme, 'https') - - req = wrappers.Request.from_values('/bar?foo=baz', 'http://example.com/test') - req.trusted_hosts = ['example.org'] - pytest.raises(SecurityError, lambda: req.url) - pytest.raises(SecurityError, lambda: req.base_url) - pytest.raises(SecurityError, lambda: req.url_root) - pytest.raises(SecurityError, lambda: req.host_url) - pytest.raises(SecurityError, lambda: req.host) - - -def test_authorization_mixin(): - request = wrappers.Request.from_values(headers={ - 'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==' - }) - a = request.authorization - strict_eq(a.type, 'basic') - strict_eq(a.username, 'Aladdin') - strict_eq(a.password, 'open sesame') - - -def test_stream_only_mixing(): - request = wrappers.PlainRequest.from_values( - data=b'foo=blub+hehe', - content_type='application/x-www-form-urlencoded' - ) - assert list(request.files.items()) == [] - assert list(request.form.items()) == [] - pytest.raises(AttributeError, lambda: request.data) - strict_eq(request.stream.read(), b'foo=blub+hehe') - - -def test_base_response(): - # unicode - response = wrappers.BaseResponse(u'öäü') - strict_eq(response.get_data(), u'öäü'.encode('utf-8')) - - # writing - response = wrappers.Response('foo') - response.stream.write('bar') - strict_eq(response.get_data(), b'foobar') - - # set cookie - response = wrappers.BaseResponse() - response.set_cookie('foo', value='bar', max_age=60, expires=0, - path='/blub', domain='example.org') - strict_eq(response.headers.to_wsgi_list(), [ - ('Content-Type', 'text/plain; charset=utf-8'), - ('Set-Cookie', 'foo=bar; Domain=example.org; Expires=Thu, ' - '01-Jan-1970 00:00:00 GMT; Max-Age=60; Path=/blub') - ]) - - # delete cookie - response = wrappers.BaseResponse() - response.delete_cookie('foo') - strict_eq(response.headers.to_wsgi_list(), [ - ('Content-Type', 'text/plain; charset=utf-8'), - ('Set-Cookie', 'foo=; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/') - ]) - - # close call forwarding - closed = [] - - @implements_iterator - class Iterable(object): - - def __next__(self): - raise StopIteration() - - def __iter__(self): - return self - - def close(self): - closed.append(True) - response = wrappers.BaseResponse(Iterable()) - response.call_on_close(lambda: closed.append(True)) - app_iter, status, headers = run_wsgi_app(response, - create_environ(), - buffered=True) - strict_eq(status, '200 OK') - strict_eq(''.join(app_iter), '') - strict_eq(len(closed), 2) - - # with statement - del closed[:] - response = wrappers.BaseResponse(Iterable()) - with response: - pass - assert len(closed) == 1 - - -def test_response_status_codes(): - response = wrappers.BaseResponse() - response.status_code = 404 - strict_eq(response.status, '404 NOT FOUND') - response.status = '200 OK' - strict_eq(response.status_code, 200) - response.status = '999 WTF' - strict_eq(response.status_code, 999) - response.status_code = 588 - strict_eq(response.status_code, 588) - strict_eq(response.status, '588 UNKNOWN') - response.status = 'wtf' - strict_eq(response.status_code, 0) - strict_eq(response.status, '0 wtf') - - -def test_type_forcing(): - def wsgi_application(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/html')]) - return ['Hello World!'] - base_response = wrappers.BaseResponse('Hello World!', content_type='text/html') - - class SpecialResponse(wrappers.Response): - - def foo(self): - return 42 - - # good enough for this simple application, but don't ever use that in - # real world examples! - fake_env = {} - - for orig_resp in wsgi_application, base_response: - response = SpecialResponse.force_type(orig_resp, fake_env) - assert response.__class__ is SpecialResponse - strict_eq(response.foo(), 42) - strict_eq(response.get_data(), b'Hello World!') - assert response.content_type == 'text/html' - - # without env, no arbitrary conversion - pytest.raises(TypeError, SpecialResponse.force_type, wsgi_application) - - -def test_accept_mixin(): - request = wrappers.Request({ - 'HTTP_ACCEPT': 'text/xml,application/xml,application/xhtml+xml,' - 'text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5', - 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', - 'HTTP_ACCEPT_ENCODING': 'gzip,deflate', - 'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5' - }) - assert request.accept_mimetypes == MIMEAccept([ - ('text/xml', 1), ('image/png', 1), ('application/xml', 1), - ('application/xhtml+xml', 1), ('text/html', 0.9), - ('text/plain', 0.8), ('*/*', 0.5) - ]) - strict_eq(request.accept_charsets, CharsetAccept([ - ('ISO-8859-1', 1), ('utf-8', 0.7), ('*', 0.7) - ])) - strict_eq(request.accept_encodings, Accept([ - ('gzip', 1), ('deflate', 1)])) - strict_eq(request.accept_languages, LanguageAccept([ - ('en-us', 1), ('en', 0.5)])) - - request = wrappers.Request({'HTTP_ACCEPT': ''}) - strict_eq(request.accept_mimetypes, MIMEAccept()) - - -def test_etag_request_mixin(): - request = wrappers.Request({ - 'HTTP_CACHE_CONTROL': 'no-store, no-cache', - 'HTTP_IF_MATCH': 'W/"foo", bar, "baz"', - 'HTTP_IF_NONE_MATCH': 'W/"foo", bar, "baz"', - 'HTTP_IF_MODIFIED_SINCE': 'Tue, 22 Jan 2008 11:18:44 GMT', - 'HTTP_IF_UNMODIFIED_SINCE': 'Tue, 22 Jan 2008 11:18:44 GMT' - }) - assert request.cache_control.no_store - assert request.cache_control.no_cache - - for etags in request.if_match, request.if_none_match: - assert etags('bar') - assert etags.contains_raw('W/"foo"') - assert etags.contains_weak('foo') - assert not etags.contains('foo') - - assert request.if_modified_since == datetime(2008, 1, 22, 11, 18, 44) - assert request.if_unmodified_since == datetime(2008, 1, 22, 11, 18, 44) - - -def test_user_agent_mixin(): - user_agents = [ - ('Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.11) ' - 'Gecko/20071127 Firefox/2.0.0.11', 'firefox', 'macos', '2.0.0.11', - 'en-US'), - ('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; de-DE) Opera 8.54', - 'opera', 'windows', '8.54', 'de-DE'), - ('Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420 ' - '(KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3', - 'safari', 'iphone', '3.0', 'en'), - ('Bot Googlebot/2.1 ( http://www.googlebot.com/bot.html)', - 'google', None, '2.1', None), - ('Mozilla/5.0 (X11; CrOS armv7l 3701.81.0) AppleWebKit/537.31 ' - '(KHTML, like Gecko) Chrome/26.0.1410.57 Safari/537.31', - 'chrome', 'chromeos', '26.0.1410.57', None), - ('Mozilla/5.0 (Windows NT 6.3; Trident/7.0; .NET4.0E; rv:11.0) like Gecko', - 'msie', 'windows', '11.0', None), - ('Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE5-00/101.003; ' - 'Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) ' - 'NokiaBrowser/7.3.1.35 Mobile Safari/533.4 3gpp-gba', - 'safari', 'symbian', '533.4', None), - ('Mozilla/5.0 (X11; OpenBSD amd64; rv:45.0) Gecko/20100101 Firefox/45.0', - 'firefox', 'openbsd', '45.0', None), - ('Mozilla/5.0 (X11; NetBSD amd64; rv:45.0) Gecko/20100101 Firefox/45.0', - 'firefox', 'netbsd', '45.0', None), - ('Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/537.36 (KHTML, like Gecko) ' - 'Chrome/48.0.2564.103 Safari/537.36', - 'chrome', 'freebsd', '48.0.2564.103', None), - ('Mozilla/5.0 (X11; FreeBSD amd64; rv:45.0) Gecko/20100101 Firefox/45.0', - 'firefox', 'freebsd', '45.0', None), - ('Mozilla/5.0 (X11; U; NetBSD amd64; en-US; rv:) Gecko/20150921 SeaMonkey/1.1.18', - 'seamonkey', 'netbsd', '1.1.18', 'en-US'), - ('Mozilla/5.0 (Windows; U; Windows NT 6.2; WOW64; rv:1.8.0.7) ' - 'Gecko/20110321 MultiZilla/4.33.2.6a SeaMonkey/8.6.55', - 'seamonkey', 'windows', '8.6.55', None), - ('Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20120427 Firefox/12.0 SeaMonkey/2.9', - 'seamonkey', 'linux', '2.9', None), - ('Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)', - 'baidu', None, '2.0', None), - ('Mozilla/5.0 (X11; SunOS i86pc; rv:38.0) Gecko/20100101 Firefox/38.0', - 'firefox', 'solaris', '38.0', None), - ('Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.7.1', - 'firefox', 'linux', '38.0', None), - ('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' - 'Chrome/50.0.2661.75 Safari/537.36', - 'chrome', 'windows', '50.0.2661.75', None), - ('Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)', - 'bing', None, '2.0', None), - ('Mozilla/5.0 (X11; DragonFly x86_64) AppleWebKit/537.36 (KHTML, like Gecko) ' - 'Chrome/47.0.2526.106 Safari/537.36', 'chrome', 'dragonflybsd', '47.0.2526.106', None), - ('Mozilla/5.0 (X11; U; DragonFly i386; de; rv:1.9.1) Gecko/20090720 Firefox/3.5.1', - 'firefox', 'dragonflybsd', '3.5.1', 'de') - - ] - for ua, browser, platform, version, lang in user_agents: - request = wrappers.Request({'HTTP_USER_AGENT': ua}) - strict_eq(request.user_agent.browser, browser) - strict_eq(request.user_agent.platform, platform) - strict_eq(request.user_agent.version, version) - strict_eq(request.user_agent.language, lang) - assert bool(request.user_agent) - strict_eq(request.user_agent.to_header(), ua) - strict_eq(str(request.user_agent), ua) - - request = wrappers.Request({'HTTP_USER_AGENT': 'foo'}) - assert not request.user_agent - - -def test_stream_wrapping(): - class LowercasingStream(object): - - def __init__(self, stream): - self._stream = stream - - def read(self, size=-1): - return self._stream.read(size).lower() - - def readline(self, size=-1): - return self._stream.readline(size).lower() - - data = b'foo=Hello+World' - req = wrappers.Request.from_values( - '/', method='POST', data=data, - content_type='application/x-www-form-urlencoded') - req.stream = LowercasingStream(req.stream) - assert req.form['foo'] == 'hello world' - - -def test_data_descriptor_triggers_parsing(): - data = b'foo=Hello+World' - req = wrappers.Request.from_values( - '/', method='POST', data=data, - content_type='application/x-www-form-urlencoded') - - assert req.data == b'' - assert req.form['foo'] == u'Hello World' - - -def test_get_data_method_parsing_caching_behavior(): - data = b'foo=Hello+World' - req = wrappers.Request.from_values( - '/', method='POST', data=data, - content_type='application/x-www-form-urlencoded') - - # get_data() caches, so form stays available - assert req.get_data() == data - assert req.form['foo'] == u'Hello World' - assert req.get_data() == data - - # here we access the form data first, caching is bypassed - req = wrappers.Request.from_values( - '/', method='POST', data=data, - content_type='application/x-www-form-urlencoded') - assert req.form['foo'] == u'Hello World' - assert req.get_data() == b'' - - # Another case is uncached get data which trashes everything - req = wrappers.Request.from_values( - '/', method='POST', data=data, - content_type='application/x-www-form-urlencoded') - assert req.get_data(cache=False) == data - assert req.get_data(cache=False) == b'' - assert req.form == {} - - # Or we can implicitly start the form parser which is similar to - # the old .data behavior - req = wrappers.Request.from_values( - '/', method='POST', data=data, - content_type='application/x-www-form-urlencoded') - assert req.get_data(parse_form_data=True) == b'' - assert req.form['foo'] == u'Hello World' - - -def test_etag_response_mixin(): - response = wrappers.Response('Hello World') - assert response.get_etag() == (None, None) - response.add_etag() - assert response.get_etag() == ('b10a8db164e0754105b7a99be72e3fe5', False) - assert not response.cache_control - response.cache_control.must_revalidate = True - response.cache_control.max_age = 60 - response.headers['Content-Length'] = len(response.get_data()) - assert response.headers['Cache-Control'] in ('must-revalidate, max-age=60', - 'max-age=60, must-revalidate') - - assert 'date' not in response.headers - env = create_environ() - env.update({ - 'REQUEST_METHOD': 'GET', - 'HTTP_IF_NONE_MATCH': response.get_etag()[0] - }) - response.make_conditional(env) - assert 'date' in response.headers - - # after the thing is invoked by the server as wsgi application - # (we're emulating this here), there must not be any entity - # headers left and the status code would have to be 304 - resp = wrappers.Response.from_app(response, env) - assert resp.status_code == 304 - assert 'content-length' not in resp.headers - - # make sure date is not overriden - response = wrappers.Response('Hello World') - response.date = 1337 - d = response.date - response.make_conditional(env) - assert response.date == d - - # make sure content length is only set if missing - response = wrappers.Response('Hello World') - response.content_length = 999 - response.make_conditional(env) - assert response.content_length == 999 - - -def test_range_request_basic(): - env = create_environ() - response = wrappers.Response('Hello World') - env['HTTP_RANGE'] = 'bytes=0-4' - response.make_conditional(env, accept_ranges=True, complete_length=11) - assert response.status_code == 206 - assert response.headers['Accept-Ranges'] == 'bytes' - assert response.headers['Content-Range'] == 'bytes 0-4/11' - assert response.headers['Content-Length'] == '5' - assert response.data == b'Hello' - - -def test_range_request_out_of_bound(): - env = create_environ() - response = wrappers.Response('Hello World') - env['HTTP_RANGE'] = 'bytes=6-666' - response.make_conditional(env, accept_ranges=True, complete_length=11) - assert response.status_code == 206 - assert response.headers['Accept-Ranges'] == 'bytes' - assert response.headers['Content-Range'] == 'bytes 6-10/11' - assert response.headers['Content-Length'] == '5' - assert response.data == b'World' - - -def test_range_request_with_file(): - env = create_environ() - resources = os.path.join(os.path.dirname(__file__), 'res') - fname = os.path.join(resources, 'test.txt') - with open(fname, 'rb') as f: - fcontent = f.read() - with open(fname, 'rb') as f: - response = wrappers.Response(wrap_file(env, f)) - env['HTTP_RANGE'] = 'bytes=0-0' - response.make_conditional(env, accept_ranges=True, complete_length=len(fcontent)) - assert response.status_code == 206 - assert response.headers['Accept-Ranges'] == 'bytes' - assert response.headers['Content-Range'] == 'bytes 0-0/%d' % len(fcontent) - assert response.headers['Content-Length'] == '1' - assert response.data == fcontent[:1] - - -def test_range_request_with_complete_file(): - env = create_environ() - resources = os.path.join(os.path.dirname(__file__), 'res') - fname = os.path.join(resources, 'test.txt') - with open(fname, 'rb') as f: - fcontent = f.read() - with open(fname, 'rb') as f: - fsize = os.path.getsize(fname) - response = wrappers.Response(wrap_file(env, f)) - env['HTTP_RANGE'] = 'bytes=0-%d' % (fsize - 1) - response.make_conditional(env, accept_ranges=True, - complete_length=fsize) - assert response.status_code == 200 - assert response.headers['Accept-Ranges'] == 'bytes' - assert 'Content-Range' not in response.headers - assert response.headers['Content-Length'] == str(fsize) - assert response.data == fcontent - - -def test_range_request_without_complete_length(): - env = create_environ() - response = wrappers.Response('Hello World') - env['HTTP_RANGE'] = 'bytes=-' - response.make_conditional(env, accept_ranges=True, complete_length=None) - assert response.status_code == 200 - assert response.data == b'Hello World' - - -def test_invalid_range_request(): - env = create_environ() - response = wrappers.Response('Hello World') - env['HTTP_RANGE'] = 'bytes=-' - with pytest.raises(RequestedRangeNotSatisfiable): - response.make_conditional(env, accept_ranges=True, complete_length=11) - - -def test_etag_response_mixin_freezing(): - class WithFreeze(wrappers.ETagResponseMixin, wrappers.BaseResponse): - pass - - class WithoutFreeze(wrappers.BaseResponse, wrappers.ETagResponseMixin): - pass - - response = WithFreeze('Hello World') - response.freeze() - strict_eq(response.get_etag(), - (text_type(wrappers.generate_etag(b'Hello World')), False)) - response = WithoutFreeze('Hello World') - response.freeze() - assert response.get_etag() == (None, None) - response = wrappers.Response('Hello World') - response.freeze() - assert response.get_etag() == (None, None) - - -def test_authenticate_mixin(): - resp = wrappers.Response() - resp.www_authenticate.type = 'basic' - resp.www_authenticate.realm = 'Testing' - strict_eq(resp.headers['WWW-Authenticate'], u'Basic realm="Testing"') - resp.www_authenticate.realm = None - resp.www_authenticate.type = None - assert 'WWW-Authenticate' not in resp.headers - - -def test_authenticate_mixin_quoted_qop(): - # Example taken from https://github.com/pallets/werkzeug/issues/633 - resp = wrappers.Response() - resp.www_authenticate.set_digest('REALM', 'NONCE', qop=("auth", "auth-int")) - - actual = set((resp.headers['WWW-Authenticate'] + ',').split()) - expected = set('Digest nonce="NONCE", realm="REALM", qop="auth, auth-int",'.split()) - assert actual == expected - - resp.www_authenticate.set_digest('REALM', 'NONCE', qop=("auth",)) - - actual = set((resp.headers['WWW-Authenticate'] + ',').split()) - expected = set('Digest nonce="NONCE", realm="REALM", qop="auth",'.split()) - assert actual == expected - - -def test_response_stream_mixin(): - response = wrappers.Response() - response.stream.write('Hello ') - response.stream.write('World!') - assert response.response == ['Hello ', 'World!'] - assert response.get_data() == b'Hello World!' - - -def test_common_response_descriptors_mixin(): - response = wrappers.Response() - response.mimetype = 'text/html' - assert response.mimetype == 'text/html' - assert response.content_type == 'text/html; charset=utf-8' - assert response.mimetype_params == {'charset': 'utf-8'} - response.mimetype_params['x-foo'] = 'yep' - del response.mimetype_params['charset'] - assert response.content_type == 'text/html; x-foo=yep' - - now = datetime.utcnow().replace(microsecond=0) - - assert response.content_length is None - response.content_length = '42' - assert response.content_length == 42 - - for attr in 'date', 'age', 'expires': - assert getattr(response, attr) is None - setattr(response, attr, now) - assert getattr(response, attr) == now - - assert response.retry_after is None - response.retry_after = now - assert response.retry_after == now - - assert not response.vary - response.vary.add('Cookie') - response.vary.add('Content-Language') - assert 'cookie' in response.vary - assert response.vary.to_header() == 'Cookie, Content-Language' - response.headers['Vary'] = 'Content-Encoding' - assert response.vary.as_set() == set(['content-encoding']) - - response.allow.update(['GET', 'POST']) - assert response.headers['Allow'] == 'GET, POST' - - response.content_language.add('en-US') - response.content_language.add('fr') - assert response.headers['Content-Language'] == 'en-US, fr' - - -def test_common_request_descriptors_mixin(): - request = wrappers.Request.from_values( - content_type='text/html; charset=utf-8', - content_length='23', - headers={ - 'Referer': 'http://www.example.com/', - 'Date': 'Sat, 28 Feb 2009 19:04:35 GMT', - 'Max-Forwards': '10', - 'Pragma': 'no-cache', - 'Content-Encoding': 'gzip', - 'Content-MD5': '9a3bc6dbc47a70db25b84c6e5867a072' - } - ) - - assert request.content_type == 'text/html; charset=utf-8' - assert request.mimetype == 'text/html' - assert request.mimetype_params == {'charset': 'utf-8'} - assert request.content_length == 23 - assert request.referrer == 'http://www.example.com/' - assert request.date == datetime(2009, 2, 28, 19, 4, 35) - assert request.max_forwards == 10 - assert 'no-cache' in request.pragma - assert request.content_encoding == 'gzip' - assert request.content_md5 == '9a3bc6dbc47a70db25b84c6e5867a072' - - -def test_request_mimetype_always_lowercase(): - request = wrappers.Request.from_values(content_type='APPLICATION/JSON') - assert request.mimetype == 'application/json' - - -def test_shallow_mode(): - request = wrappers.Request({'QUERY_STRING': 'foo=bar'}, shallow=True) - assert request.args['foo'] == 'bar' - pytest.raises(RuntimeError, lambda: request.form['foo']) - - -def test_form_parsing_failed(): - data = b'--blah\r\n' - request = wrappers.Request.from_values( - input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST' - ) - assert not request.files - assert not request.form - - # Bad Content-Type - data = b'test' - request = wrappers.Request.from_values( - input_stream=BytesIO(data), - content_length=len(data), - content_type=', ', - method='POST' - ) - assert not request.form - - -def test_file_closing(): - data = (b'--foo\r\n' - b'Content-Disposition: form-data; name="foo"; filename="foo.txt"\r\n' - b'Content-Type: text/plain; charset=utf-8\r\n\r\n' - b'file contents, just the contents\r\n' - b'--foo--') - req = wrappers.Request.from_values( - input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST' - ) - foo = req.files['foo'] - assert foo.mimetype == 'text/plain' - assert foo.filename == 'foo.txt' - - assert foo.closed is False - req.close() - assert foo.closed is True - - -def test_file_closing_with(): - data = (b'--foo\r\n' - b'Content-Disposition: form-data; name="foo"; filename="foo.txt"\r\n' - b'Content-Type: text/plain; charset=utf-8\r\n\r\n' - b'file contents, just the contents\r\n' - b'--foo--') - req = wrappers.Request.from_values( - input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST' - ) - with req: - foo = req.files['foo'] - assert foo.mimetype == 'text/plain' - assert foo.filename == 'foo.txt' - - assert foo.closed is True - - -def test_url_charset_reflection(): - req = wrappers.Request.from_values() - req.charset = 'utf-7' - assert req.url_charset == 'utf-7' - - -def test_response_streamed(): - r = wrappers.Response() - assert not r.is_streamed - r = wrappers.Response("Hello World") - assert not r.is_streamed - r = wrappers.Response(["foo", "bar"]) - assert not r.is_streamed - - def gen(): - if 0: - yield None - r = wrappers.Response(gen()) - assert r.is_streamed - - -def test_response_iter_wrapping(): - def uppercasing(iterator): - for item in iterator: - yield item.upper() - - def generator(): - yield 'foo' - yield 'bar' - req = wrappers.Request.from_values() - resp = wrappers.Response(generator()) - del resp.headers['Content-Length'] - resp.response = uppercasing(resp.iter_encoded()) - actual_resp = wrappers.Response.from_app(resp, req.environ, buffered=True) - assert actual_resp.get_data() == b'FOOBAR' - - -def test_response_freeze(): - def generate(): - yield "foo" - yield "bar" - resp = wrappers.Response(generate()) - resp.freeze() - assert resp.response == [b'foo', b'bar'] - assert resp.headers['content-length'] == '6' - - -def test_other_method_payload(): - data = b'Hello World' - req = wrappers.Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='text/plain', - method='WHAT_THE_FUCK') - assert req.get_data() == data - assert isinstance(req.stream, LimitedStream) - - -def test_urlfication(): - resp = wrappers.Response() - resp.headers['Location'] = u'http://üser:pässword@☃.net/påth' - resp.headers['Content-Location'] = u'http://☃.net/' - headers = resp.get_wsgi_headers(create_environ()) - assert headers['location'] == \ - 'http://%C3%BCser:p%C3%A4ssword@xn--n3h.net/p%C3%A5th' - assert headers['content-location'] == 'http://xn--n3h.net/' - - -def test_new_response_iterator_behavior(): - req = wrappers.Request.from_values() - resp = wrappers.Response(u'Hello Wörld!') - - def get_content_length(resp): - headers = resp.get_wsgi_headers(req.environ) - return headers.get('content-length', type=int) - - def generate_items(): - yield "Hello " - yield u"Wörld!" - - # werkzeug encodes when set to `data` now, which happens - # if a string is passed to the response object. - assert resp.response == [u'Hello Wörld!'.encode('utf-8')] - assert resp.get_data() == u'Hello Wörld!'.encode('utf-8') - assert get_content_length(resp) == 13 - assert not resp.is_streamed - assert resp.is_sequence - - # try the same for manual assignment - resp.set_data(u'Wörd') - assert resp.response == [u'Wörd'.encode('utf-8')] - assert resp.get_data() == u'Wörd'.encode('utf-8') - assert get_content_length(resp) == 5 - assert not resp.is_streamed - assert resp.is_sequence - - # automatic generator sequence conversion - resp.response = generate_items() - assert resp.is_streamed - assert not resp.is_sequence - assert resp.get_data() == u'Hello Wörld!'.encode('utf-8') - assert resp.response == [b'Hello ', u'Wörld!'.encode('utf-8')] - assert not resp.is_streamed - assert resp.is_sequence - - # automatic generator sequence conversion - resp.response = generate_items() - resp.implicit_sequence_conversion = False - assert resp.is_streamed - assert not resp.is_sequence - pytest.raises(RuntimeError, lambda: resp.get_data()) - resp.make_sequence() - assert resp.get_data() == u'Hello Wörld!'.encode('utf-8') - assert resp.response == [b'Hello ', u'Wörld!'.encode('utf-8')] - assert not resp.is_streamed - assert resp.is_sequence - - # stream makes it a list no matter how the conversion is set - for val in True, False: - resp.implicit_sequence_conversion = val - resp.response = ("foo", "bar") - assert resp.is_sequence - resp.stream.write('baz') - assert resp.response == ['foo', 'bar', 'baz'] - - -def test_form_data_ordering(): - class MyRequest(wrappers.Request): - parameter_storage_class = ImmutableOrderedMultiDict - - req = MyRequest.from_values('/?foo=1&bar=0&foo=3') - assert list(req.args) == ['foo', 'bar'] - assert list(req.args.items(multi=True)) == [ - ('foo', '1'), - ('bar', '0'), - ('foo', '3') - ] - assert isinstance(req.args, ImmutableOrderedMultiDict) - assert isinstance(req.values, CombinedMultiDict) - assert req.values['foo'] == '1' - assert req.values.getlist('foo') == ['1', '3'] - - -def test_storage_classes(): - class MyRequest(wrappers.Request): - dict_storage_class = dict - list_storage_class = list - parameter_storage_class = dict - req = MyRequest.from_values('/?foo=baz', headers={ - 'Cookie': 'foo=bar' - }) - assert type(req.cookies) is dict - assert req.cookies == {'foo': 'bar'} - assert type(req.access_route) is list - - assert type(req.args) is dict - assert type(req.values) is CombinedMultiDict - assert req.values['foo'] == u'baz' - - req = wrappers.Request.from_values(headers={ - 'Cookie': 'foo=bar' - }) - assert type(req.cookies) is ImmutableTypeConversionDict - assert req.cookies == {'foo': 'bar'} - assert type(req.access_route) is ImmutableList - - MyRequest.list_storage_class = tuple - req = MyRequest.from_values() - assert type(req.access_route) is tuple - - -def test_response_headers_passthrough(): - headers = wrappers.Headers() - resp = wrappers.Response(headers=headers) - assert resp.headers is headers - - -def test_response_304_no_content_length(): - resp = wrappers.Response('Test', status=304) - env = create_environ() - assert 'content-length' not in resp.get_wsgi_headers(env) - - -def test_ranges(): - # basic range stuff - req = wrappers.Request.from_values() - assert req.range is None - req = wrappers.Request.from_values(headers={'Range': 'bytes=0-499'}) - assert req.range.ranges == [(0, 500)] - - resp = wrappers.Response() - resp.content_range = req.range.make_content_range(1000) - assert resp.content_range.units == 'bytes' - assert resp.content_range.start == 0 - assert resp.content_range.stop == 500 - assert resp.content_range.length == 1000 - assert resp.headers['Content-Range'] == 'bytes 0-499/1000' - - resp.content_range.unset() - assert 'Content-Range' not in resp.headers - - resp.headers['Content-Range'] = 'bytes 0-499/1000' - assert resp.content_range.units == 'bytes' - assert resp.content_range.start == 0 - assert resp.content_range.stop == 500 - assert resp.content_range.length == 1000 - - -def test_auto_content_length(): - resp = wrappers.Response('Hello World!') - assert resp.content_length == 12 - - resp = wrappers.Response(['Hello World!']) - assert resp.content_length is None - assert resp.get_wsgi_headers({})['Content-Length'] == '12' - - -def test_stream_content_length(): - resp = wrappers.Response() - resp.stream.writelines(['foo', 'bar', 'baz']) - assert resp.get_wsgi_headers({})['Content-Length'] == '9' - - resp = wrappers.Response() - resp.make_conditional({'REQUEST_METHOD': 'GET'}) - resp.stream.writelines(['foo', 'bar', 'baz']) - assert resp.get_wsgi_headers({})['Content-Length'] == '9' - - resp = wrappers.Response('foo') - resp.stream.writelines(['bar', 'baz']) - assert resp.get_wsgi_headers({})['Content-Length'] == '9' - - -def test_disabled_auto_content_length(): - class MyResponse(wrappers.Response): - automatically_set_content_length = False - resp = MyResponse('Hello World!') - assert resp.content_length is None - - resp = MyResponse(['Hello World!']) - assert resp.content_length is None - assert 'Content-Length' not in resp.get_wsgi_headers({}) - - resp = MyResponse() - resp.make_conditional({ - 'REQUEST_METHOD': 'GET' - }) - assert resp.content_length is None - assert 'Content-Length' not in resp.get_wsgi_headers({}) - - -def test_location_header_autocorrect(): - env = create_environ() - - class MyResponse(wrappers.Response): - autocorrect_location_header = False - resp = MyResponse('Hello World!') - resp.headers['Location'] = '/test' - assert resp.get_wsgi_headers(env)['Location'] == '/test' - - resp = wrappers.Response('Hello World!') - resp.headers['Location'] = '/test' - assert resp.get_wsgi_headers(env)['Location'] == 'http://localhost/test' - - -def test_modified_url_encoding(): - class ModifiedRequest(wrappers.Request): - url_charset = 'euc-kr' - - req = ModifiedRequest.from_values(u'/?foo=정상처리'.encode('euc-kr')) - strict_eq(req.args['foo'], u'정상처리') - - -def test_request_method_case_sensitivity(): - req = wrappers.Request({'REQUEST_METHOD': 'get'}) - assert req.method == 'GET' - - -class TestSetCookie(object): - """Tests for :meth:`werkzeug.wrappers.BaseResponse.set_cookie`.""" - - def test_secure(self): - response = wrappers.BaseResponse() - response.set_cookie('foo', value='bar', max_age=60, expires=0, - path='/blub', domain='example.org', secure=True) - strict_eq(response.headers.to_wsgi_list(), [ - ('Content-Type', 'text/plain; charset=utf-8'), - ('Set-Cookie', 'foo=bar; Domain=example.org; Expires=Thu, ' - '01-Jan-1970 00:00:00 GMT; Max-Age=60; Secure; Path=/blub') - ]) - - def test_httponly(self): - response = wrappers.BaseResponse() - response.set_cookie('foo', value='bar', max_age=60, expires=0, - path='/blub', domain='example.org', secure=False, - httponly=True) - strict_eq(response.headers.to_wsgi_list(), [ - ('Content-Type', 'text/plain; charset=utf-8'), - ('Set-Cookie', 'foo=bar; Domain=example.org; Expires=Thu, ' - '01-Jan-1970 00:00:00 GMT; Max-Age=60; HttpOnly; Path=/blub') - ]) - - def test_secure_and_httponly(self): - response = wrappers.BaseResponse() - response.set_cookie('foo', value='bar', max_age=60, expires=0, - path='/blub', domain='example.org', secure=True, - httponly=True) - strict_eq(response.headers.to_wsgi_list(), [ - ('Content-Type', 'text/plain; charset=utf-8'), - ('Set-Cookie', 'foo=bar; Domain=example.org; Expires=Thu, ' - '01-Jan-1970 00:00:00 GMT; Max-Age=60; Secure; HttpOnly; ' - 'Path=/blub') - ]) diff --git a/pythonPackages/Werkzeug-0.12.1/tests/test_wsgi.py b/pythonPackages/Werkzeug-0.12.1/tests/test_wsgi.py deleted file mode 100644 index b7674c83c3..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/tests/test_wsgi.py +++ /dev/null @@ -1,460 +0,0 @@ -# -*- coding: utf-8 -*- -""" - tests.wsgi - ~~~~~~~~~~ - - Tests the WSGI utilities. - - :copyright: (c) 2014 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import os - -import pytest - -from os import path -from contextlib import closing - -from tests import strict_eq - -from werkzeug.wrappers import BaseResponse -from werkzeug.exceptions import BadRequest, ClientDisconnected -from werkzeug.test import Client, create_environ, run_wsgi_app -from werkzeug import wsgi -from werkzeug._compat import StringIO, BytesIO, NativeStringIO, to_native, \ - to_bytes -from werkzeug.wsgi import _RangeWrapper, wrap_file - - -def test_shareddatamiddleware_get_file_loader(): - app = wsgi.SharedDataMiddleware(None, {}) - assert callable(app.get_file_loader('foo')) - - -def test_shared_data_middleware(tmpdir): - def null_application(environ, start_response): - start_response('404 NOT FOUND', [('Content-Type', 'text/plain')]) - yield b'NOT FOUND' - - test_dir = str(tmpdir) - with open(path.join(test_dir, to_native(u'äöü', 'utf-8')), 'w') as test_file: - test_file.write(u'FOUND') - - app = wsgi.SharedDataMiddleware(null_application, { - '/': path.join(path.dirname(__file__), 'res'), - '/sources': path.join(path.dirname(__file__), 'res'), - '/pkg': ('werkzeug.debug', 'shared'), - '/foo': test_dir - }) - - for p in '/test.txt', '/sources/test.txt', '/foo/äöü': - app_iter, status, headers = run_wsgi_app(app, create_environ(p)) - assert status == '200 OK' - with closing(app_iter) as app_iter: - data = b''.join(app_iter).strip() - assert data == b'FOUND' - - app_iter, status, headers = run_wsgi_app( - app, create_environ('/pkg/debugger.js')) - with closing(app_iter) as app_iter: - contents = b''.join(app_iter) - assert b'$(function() {' in contents - - app_iter, status, headers = run_wsgi_app( - app, create_environ('/missing')) - assert status == '404 NOT FOUND' - assert b''.join(app_iter).strip() == b'NOT FOUND' - - -def test_dispatchermiddleware(): - def null_application(environ, start_response): - start_response('404 NOT FOUND', [('Content-Type', 'text/plain')]) - yield b'NOT FOUND' - - def dummy_application(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/plain')]) - yield to_bytes(environ['SCRIPT_NAME']) - - app = wsgi.DispatcherMiddleware(null_application, { - '/test1': dummy_application, - '/test2/very': dummy_application, - }) - tests = { - '/test1': ('/test1', '/test1/asfd', '/test1/very'), - '/test2/very': ('/test2/very', '/test2/very/long/path/after/script/name') - } - for name, urls in tests.items(): - for p in urls: - environ = create_environ(p) - app_iter, status, headers = run_wsgi_app(app, environ) - assert status == '200 OK' - assert b''.join(app_iter).strip() == to_bytes(name) - - app_iter, status, headers = run_wsgi_app( - app, create_environ('/missing')) - assert status == '404 NOT FOUND' - assert b''.join(app_iter).strip() == b'NOT FOUND' - - -def test_get_host(): - env = {'HTTP_X_FORWARDED_HOST': 'example.org', - 'SERVER_NAME': 'bullshit', 'HOST_NAME': 'ignore me dammit'} - assert wsgi.get_host(env) == 'example.org' - assert wsgi.get_host(create_environ('/', 'http://example.org')) == \ - 'example.org' - - -def test_get_host_multiple_forwarded(): - env = {'HTTP_X_FORWARDED_HOST': 'example.com, example.org', - 'SERVER_NAME': 'bullshit', 'HOST_NAME': 'ignore me dammit'} - assert wsgi.get_host(env) == 'example.com' - assert wsgi.get_host(create_environ('/', 'http://example.com')) == \ - 'example.com' - - -def test_get_host_validation(): - env = {'HTTP_X_FORWARDED_HOST': 'example.org', - 'SERVER_NAME': 'bullshit', 'HOST_NAME': 'ignore me dammit'} - assert wsgi.get_host(env, trusted_hosts=['.example.org']) == 'example.org' - pytest.raises(BadRequest, wsgi.get_host, env, - trusted_hosts=['example.com']) - - -def test_responder(): - def foo(environ, start_response): - return BaseResponse(b'Test') - client = Client(wsgi.responder(foo), BaseResponse) - response = client.get('/') - assert response.status_code == 200 - assert response.data == b'Test' - - -def test_pop_path_info(): - original_env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b///c'} - - # regular path info popping - def assert_tuple(script_name, path_info): - assert env.get('SCRIPT_NAME') == script_name - assert env.get('PATH_INFO') == path_info - env = original_env.copy() - pop = lambda: wsgi.pop_path_info(env) - - assert_tuple('/foo', '/a/b///c') - assert pop() == 'a' - assert_tuple('/foo/a', '/b///c') - assert pop() == 'b' - assert_tuple('/foo/a/b', '///c') - assert pop() == 'c' - assert_tuple('/foo/a/b///c', '') - assert pop() is None - - -def test_peek_path_info(): - env = { - 'SCRIPT_NAME': '/foo', - 'PATH_INFO': '/aaa/b///c' - } - - assert wsgi.peek_path_info(env) == 'aaa' - assert wsgi.peek_path_info(env) == 'aaa' - assert wsgi.peek_path_info(env, charset=None) == b'aaa' - assert wsgi.peek_path_info(env, charset=None) == b'aaa' - - -def test_path_info_and_script_name_fetching(): - env = create_environ(u'/\N{SNOWMAN}', u'http://example.com/\N{COMET}/') - assert wsgi.get_path_info(env) == u'/\N{SNOWMAN}' - assert wsgi.get_path_info(env, charset=None) == u'/\N{SNOWMAN}'.encode('utf-8') - assert wsgi.get_script_name(env) == u'/\N{COMET}' - assert wsgi.get_script_name(env, charset=None) == u'/\N{COMET}'.encode('utf-8') - - -def test_query_string_fetching(): - env = create_environ(u'/?\N{SNOWMAN}=\N{COMET}') - qs = wsgi.get_query_string(env) - strict_eq(qs, '%E2%98%83=%E2%98%84') - - -def test_limited_stream(): - class RaisingLimitedStream(wsgi.LimitedStream): - - def on_exhausted(self): - raise BadRequest('input stream exhausted') - - io = BytesIO(b'123456') - stream = RaisingLimitedStream(io, 3) - strict_eq(stream.read(), b'123') - pytest.raises(BadRequest, stream.read) - - io = BytesIO(b'123456') - stream = RaisingLimitedStream(io, 3) - strict_eq(stream.tell(), 0) - strict_eq(stream.read(1), b'1') - strict_eq(stream.tell(), 1) - strict_eq(stream.read(1), b'2') - strict_eq(stream.tell(), 2) - strict_eq(stream.read(1), b'3') - strict_eq(stream.tell(), 3) - pytest.raises(BadRequest, stream.read) - - io = BytesIO(b'123456\nabcdefg') - stream = wsgi.LimitedStream(io, 9) - strict_eq(stream.readline(), b'123456\n') - strict_eq(stream.readline(), b'ab') - - io = BytesIO(b'123456\nabcdefg') - stream = wsgi.LimitedStream(io, 9) - strict_eq(stream.readlines(), [b'123456\n', b'ab']) - - io = BytesIO(b'123456\nabcdefg') - stream = wsgi.LimitedStream(io, 9) - strict_eq(stream.readlines(2), [b'12']) - strict_eq(stream.readlines(2), [b'34']) - strict_eq(stream.readlines(), [b'56\n', b'ab']) - - io = BytesIO(b'123456\nabcdefg') - stream = wsgi.LimitedStream(io, 9) - strict_eq(stream.readline(100), b'123456\n') - - io = BytesIO(b'123456\nabcdefg') - stream = wsgi.LimitedStream(io, 9) - strict_eq(stream.readlines(100), [b'123456\n', b'ab']) - - io = BytesIO(b'123456') - stream = wsgi.LimitedStream(io, 3) - strict_eq(stream.read(1), b'1') - strict_eq(stream.read(1), b'2') - strict_eq(stream.read(), b'3') - strict_eq(stream.read(), b'') - - io = BytesIO(b'123456') - stream = wsgi.LimitedStream(io, 3) - strict_eq(stream.read(-1), b'123') - - io = BytesIO(b'123456') - stream = wsgi.LimitedStream(io, 0) - strict_eq(stream.read(-1), b'') - - io = StringIO(u'123456') - stream = wsgi.LimitedStream(io, 0) - strict_eq(stream.read(-1), u'') - - io = StringIO(u'123\n456\n') - stream = wsgi.LimitedStream(io, 8) - strict_eq(list(stream), [u'123\n', u'456\n']) - - -def test_limited_stream_disconnection(): - io = BytesIO(b'A bit of content') - - # disconnect detection on out of bytes - stream = wsgi.LimitedStream(io, 255) - with pytest.raises(ClientDisconnected): - stream.read() - - # disconnect detection because file close - io = BytesIO(b'x' * 255) - io.close() - stream = wsgi.LimitedStream(io, 255) - with pytest.raises(ClientDisconnected): - stream.read() - - -def test_path_info_extraction(): - x = wsgi.extract_path_info('http://example.com/app', '/app/hello') - assert x == u'/hello' - x = wsgi.extract_path_info('http://example.com/app', - 'https://example.com/app/hello') - assert x == u'/hello' - x = wsgi.extract_path_info('http://example.com/app/', - 'https://example.com/app/hello') - assert x == u'/hello' - x = wsgi.extract_path_info('http://example.com/app/', - 'https://example.com/app') - assert x == u'/' - x = wsgi.extract_path_info(u'http://☃.net/', u'/fööbär') - assert x == u'/fööbär' - x = wsgi.extract_path_info(u'http://☃.net/x', u'http://☃.net/x/fööbär') - assert x == u'/fööbär' - - env = create_environ(u'/fööbär', u'http://☃.net/x/') - x = wsgi.extract_path_info(env, u'http://☃.net/x/fööbär') - assert x == u'/fööbär' - - x = wsgi.extract_path_info('http://example.com/app/', - 'https://example.com/a/hello') - assert x is None - x = wsgi.extract_path_info('http://example.com/app/', - 'https://example.com/app/hello', - collapse_http_schemes=False) - assert x is None - - -def test_get_host_fallback(): - assert wsgi.get_host({ - 'SERVER_NAME': 'foobar.example.com', - 'wsgi.url_scheme': 'http', - 'SERVER_PORT': '80' - }) == 'foobar.example.com' - assert wsgi.get_host({ - 'SERVER_NAME': 'foobar.example.com', - 'wsgi.url_scheme': 'http', - 'SERVER_PORT': '81' - }) == 'foobar.example.com:81' - - -def test_get_current_url_unicode(): - env = create_environ() - env['QUERY_STRING'] = 'foo=bar&baz=blah&meh=\xcf' - rv = wsgi.get_current_url(env) - strict_eq(rv, - u'http://localhost/?foo=bar&baz=blah&meh=\ufffd') - - -def test_multi_part_line_breaks(): - data = 'abcdef\r\nghijkl\r\nmnopqrstuvwxyz\r\nABCDEFGHIJK' - test_stream = NativeStringIO(data) - lines = list(wsgi.make_line_iter(test_stream, limit=len(data), - buffer_size=16)) - assert lines == ['abcdef\r\n', 'ghijkl\r\n', 'mnopqrstuvwxyz\r\n', - 'ABCDEFGHIJK'] - - data = 'abc\r\nThis line is broken by the buffer length.' \ - '\r\nFoo bar baz' - test_stream = NativeStringIO(data) - lines = list(wsgi.make_line_iter(test_stream, limit=len(data), - buffer_size=24)) - assert lines == ['abc\r\n', 'This line is broken by the buffer ' - 'length.\r\n', 'Foo bar baz'] - - -def test_multi_part_line_breaks_bytes(): - data = b'abcdef\r\nghijkl\r\nmnopqrstuvwxyz\r\nABCDEFGHIJK' - test_stream = BytesIO(data) - lines = list(wsgi.make_line_iter(test_stream, limit=len(data), - buffer_size=16)) - assert lines == [b'abcdef\r\n', b'ghijkl\r\n', b'mnopqrstuvwxyz\r\n', - b'ABCDEFGHIJK'] - - data = b'abc\r\nThis line is broken by the buffer length.' \ - b'\r\nFoo bar baz' - test_stream = BytesIO(data) - lines = list(wsgi.make_line_iter(test_stream, limit=len(data), - buffer_size=24)) - assert lines == [b'abc\r\n', b'This line is broken by the buffer ' - b'length.\r\n', b'Foo bar baz'] - - -def test_multi_part_line_breaks_problematic(): - data = 'abc\rdef\r\nghi' - for x in range(1, 10): - test_stream = NativeStringIO(data) - lines = list(wsgi.make_line_iter(test_stream, limit=len(data), - buffer_size=4)) - assert lines == ['abc\r', 'def\r\n', 'ghi'] - - -def test_iter_functions_support_iterators(): - data = ['abcdef\r\nghi', 'jkl\r\nmnopqrstuvwxyz\r', '\nABCDEFGHIJK'] - lines = list(wsgi.make_line_iter(data)) - assert lines == ['abcdef\r\n', 'ghijkl\r\n', 'mnopqrstuvwxyz\r\n', - 'ABCDEFGHIJK'] - - -def test_make_chunk_iter(): - data = [u'abcdefXghi', u'jklXmnopqrstuvwxyzX', u'ABCDEFGHIJK'] - rv = list(wsgi.make_chunk_iter(data, 'X')) - assert rv == [u'abcdef', u'ghijkl', u'mnopqrstuvwxyz', u'ABCDEFGHIJK'] - - data = u'abcdefXghijklXmnopqrstuvwxyzXABCDEFGHIJK' - test_stream = StringIO(data) - rv = list(wsgi.make_chunk_iter(test_stream, 'X', limit=len(data), - buffer_size=4)) - assert rv == [u'abcdef', u'ghijkl', u'mnopqrstuvwxyz', u'ABCDEFGHIJK'] - - -def test_make_chunk_iter_bytes(): - data = [b'abcdefXghi', b'jklXmnopqrstuvwxyzX', b'ABCDEFGHIJK'] - rv = list(wsgi.make_chunk_iter(data, 'X')) - assert rv == [b'abcdef', b'ghijkl', b'mnopqrstuvwxyz', b'ABCDEFGHIJK'] - - data = b'abcdefXghijklXmnopqrstuvwxyzXABCDEFGHIJK' - test_stream = BytesIO(data) - rv = list(wsgi.make_chunk_iter(test_stream, 'X', limit=len(data), - buffer_size=4)) - assert rv == [b'abcdef', b'ghijkl', b'mnopqrstuvwxyz', b'ABCDEFGHIJK'] - - data = b'abcdefXghijklXmnopqrstuvwxyzXABCDEFGHIJK' - test_stream = BytesIO(data) - rv = list(wsgi.make_chunk_iter(test_stream, 'X', limit=len(data), - buffer_size=4, cap_at_buffer=True)) - assert rv == [b'abcd', b'ef', b'ghij', b'kl', b'mnop', b'qrst', b'uvwx', - b'yz', b'ABCD', b'EFGH', b'IJK'] - - -def test_lines_longer_buffer_size(): - data = '1234567890\n1234567890\n' - for bufsize in range(1, 15): - lines = list(wsgi.make_line_iter(NativeStringIO(data), limit=len(data), - buffer_size=4)) - assert lines == ['1234567890\n', '1234567890\n'] - - -def test_lines_longer_buffer_size_cap(): - data = '1234567890\n1234567890\n' - for bufsize in range(1, 15): - lines = list(wsgi.make_line_iter(NativeStringIO(data), limit=len(data), - buffer_size=4, cap_at_buffer=True)) - assert lines == ['1234', '5678', '90\n', '1234', '5678', '90\n'] - - -def test_range_wrapper(): - response = BaseResponse(b'Hello World') - range_wrapper = _RangeWrapper(response.response, 6, 4) - assert next(range_wrapper) == b'Worl' - - response = BaseResponse(b'Hello World') - range_wrapper = _RangeWrapper(response.response, 1, 0) - with pytest.raises(StopIteration): - next(range_wrapper) - - response = BaseResponse(b'Hello World') - range_wrapper = _RangeWrapper(response.response, 6, 100) - assert next(range_wrapper) == b'World' - - response = BaseResponse((x for x in (b'He', b'll', b'o ', b'Wo', b'rl', b'd'))) - range_wrapper = _RangeWrapper(response.response, 6, 4) - assert not range_wrapper.seekable - assert next(range_wrapper) == b'Wo' - assert next(range_wrapper) == b'rl' - - response = BaseResponse((x for x in (b'He', b'll', b'o W', b'o', b'rld'))) - range_wrapper = _RangeWrapper(response.response, 6, 4) - assert next(range_wrapper) == b'W' - assert next(range_wrapper) == b'o' - assert next(range_wrapper) == b'rl' - with pytest.raises(StopIteration): - next(range_wrapper) - - response = BaseResponse((x for x in (b'Hello', b' World'))) - range_wrapper = _RangeWrapper(response.response, 1, 1) - assert next(range_wrapper) == b'e' - with pytest.raises(StopIteration): - next(range_wrapper) - - resources = os.path.join(os.path.dirname(__file__), 'res') - env = create_environ() - with open(os.path.join(resources, 'test.txt'), 'rb') as f: - response = BaseResponse(wrap_file(env, f)) - range_wrapper = _RangeWrapper(response.response, 1, 2) - assert range_wrapper.seekable - assert next(range_wrapper) == b'OU' - with pytest.raises(StopIteration): - next(range_wrapper) - - with open(os.path.join(resources, 'test.txt'), 'rb') as f: - response = BaseResponse(wrap_file(env, f)) - range_wrapper = _RangeWrapper(response.response, 2) - assert next(range_wrapper) == b'UND\n' - with pytest.raises(StopIteration): - next(range_wrapper) diff --git a/pythonPackages/Werkzeug-0.12.1/werkzeug/__init__.py b/pythonPackages/Werkzeug-0.12.1/werkzeug/__init__.py deleted file mode 100644 index ac216f0807..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/werkzeug/__init__.py +++ /dev/null @@ -1,151 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug - ~~~~~~~~ - - Werkzeug is the Swiss Army knife of Python web development. - - It provides useful classes and functions for any WSGI application to make - the life of a python web developer much easier. All of the provided - classes are independent from each other so you can mix it with any other - library. - - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from types import ModuleType -import sys - -from werkzeug._compat import iteritems - -__version__ = '0.12.1' - - -# This import magic raises concerns quite often which is why the implementation -# and motivation is explained here in detail now. -# -# The majority of the functions and classes provided by Werkzeug work on the -# HTTP and WSGI layer. There is no useful grouping for those which is why -# they are all importable from "werkzeug" instead of the modules where they are -# implemented. The downside of that is, that now everything would be loaded at -# once, even if unused. -# -# The implementation of a lazy-loading module in this file replaces the -# werkzeug package when imported from within. Attribute access to the werkzeug -# module will then lazily import from the modules that implement the objects. - - -# import mapping to objects in other modules -all_by_module = { - 'werkzeug.debug': ['DebuggedApplication'], - 'werkzeug.local': ['Local', 'LocalManager', 'LocalProxy', 'LocalStack', - 'release_local'], - 'werkzeug.serving': ['run_simple'], - 'werkzeug.test': ['Client', 'EnvironBuilder', 'create_environ', - 'run_wsgi_app'], - 'werkzeug.testapp': ['test_app'], - 'werkzeug.exceptions': ['abort', 'Aborter'], - 'werkzeug.urls': ['url_decode', 'url_encode', 'url_quote', - 'url_quote_plus', 'url_unquote', 'url_unquote_plus', - 'url_fix', 'Href', 'iri_to_uri', 'uri_to_iri'], - 'werkzeug.formparser': ['parse_form_data'], - 'werkzeug.utils': ['escape', 'environ_property', 'append_slash_redirect', - 'redirect', 'cached_property', 'import_string', - 'dump_cookie', 'parse_cookie', 'unescape', - 'format_string', 'find_modules', 'header_property', - 'html', 'xhtml', 'HTMLBuilder', 'validate_arguments', - 'ArgumentValidationError', 'bind_arguments', - 'secure_filename'], - 'werkzeug.wsgi': ['get_current_url', 'get_host', 'pop_path_info', - 'peek_path_info', 'SharedDataMiddleware', - 'DispatcherMiddleware', 'ClosingIterator', 'FileWrapper', - 'make_line_iter', 'LimitedStream', 'responder', - 'wrap_file', 'extract_path_info'], - 'werkzeug.datastructures': ['MultiDict', 'CombinedMultiDict', 'Headers', - 'EnvironHeaders', 'ImmutableList', - 'ImmutableDict', 'ImmutableMultiDict', - 'TypeConversionDict', - 'ImmutableTypeConversionDict', 'Accept', - 'MIMEAccept', 'CharsetAccept', - 'LanguageAccept', 'RequestCacheControl', - 'ResponseCacheControl', 'ETags', 'HeaderSet', - 'WWWAuthenticate', 'Authorization', - 'FileMultiDict', 'CallbackDict', 'FileStorage', - 'OrderedMultiDict', 'ImmutableOrderedMultiDict' - ], - 'werkzeug.useragents': ['UserAgent'], - 'werkzeug.http': ['parse_etags', 'parse_date', 'http_date', 'cookie_date', - 'parse_cache_control_header', 'is_resource_modified', - 'parse_accept_header', 'parse_set_header', 'quote_etag', - 'unquote_etag', 'generate_etag', 'dump_header', - 'parse_list_header', 'parse_dict_header', - 'parse_authorization_header', - 'parse_www_authenticate_header', 'remove_entity_headers', - 'is_entity_header', 'remove_hop_by_hop_headers', - 'parse_options_header', 'dump_options_header', - 'is_hop_by_hop_header', 'unquote_header_value', - 'quote_header_value', 'HTTP_STATUS_CODES'], - 'werkzeug.wrappers': ['BaseResponse', 'BaseRequest', 'Request', 'Response', - 'AcceptMixin', 'ETagRequestMixin', - 'ETagResponseMixin', 'ResponseStreamMixin', - 'CommonResponseDescriptorsMixin', 'UserAgentMixin', - 'AuthorizationMixin', 'WWWAuthenticateMixin', - 'CommonRequestDescriptorsMixin'], - 'werkzeug.security': ['generate_password_hash', 'check_password_hash'], - # the undocumented easteregg ;-) - 'werkzeug._internal': ['_easteregg'] -} - -# modules that should be imported when accessed as attributes of werkzeug -attribute_modules = frozenset(['exceptions', 'routing', 'script']) - - -object_origins = {} -for module, items in iteritems(all_by_module): - for item in items: - object_origins[item] = module - - -class module(ModuleType): - - """Automatically import objects from the modules.""" - - def __getattr__(self, name): - if name in object_origins: - module = __import__(object_origins[name], None, None, [name]) - for extra_name in all_by_module[module.__name__]: - setattr(self, extra_name, getattr(module, extra_name)) - return getattr(module, name) - elif name in attribute_modules: - __import__('werkzeug.' + name) - return ModuleType.__getattribute__(self, name) - - def __dir__(self): - """Just show what we want to show.""" - result = list(new_module.__all__) - result.extend(('__file__', '__path__', '__doc__', '__all__', - '__docformat__', '__name__', '__path__', - '__package__', '__version__')) - return result - -# keep a reference to this module so that it's not garbage collected -old_module = sys.modules['werkzeug'] - - -# setup the new module and patch it into the dict of loaded modules -new_module = sys.modules['werkzeug'] = module('werkzeug') -new_module.__dict__.update({ - '__file__': __file__, - '__package__': 'werkzeug', - '__path__': __path__, - '__doc__': __doc__, - '__version__': __version__, - '__all__': tuple(object_origins) + tuple(attribute_modules), - '__docformat__': 'restructuredtext en' -}) - - -# Due to bootstrapping issues we need to import exceptions here. -# Don't ask :-( -__import__('werkzeug.exceptions') diff --git a/pythonPackages/Werkzeug-0.12.1/werkzeug/_compat.py b/pythonPackages/Werkzeug-0.12.1/werkzeug/_compat.py deleted file mode 100644 index fda038b97b..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/werkzeug/_compat.py +++ /dev/null @@ -1,206 +0,0 @@ -# flake8: noqa -# This whole file is full of lint errors -import codecs -import sys -import operator -import functools -import warnings - -try: - import builtins -except ImportError: - import __builtin__ as builtins - - -PY2 = sys.version_info[0] == 2 -WIN = sys.platform.startswith('win') - -_identity = lambda x: x - -if PY2: - unichr = unichr - text_type = unicode - string_types = (str, unicode) - integer_types = (int, long) - - iterkeys = lambda d, *args, **kwargs: d.iterkeys(*args, **kwargs) - itervalues = lambda d, *args, **kwargs: d.itervalues(*args, **kwargs) - iteritems = lambda d, *args, **kwargs: d.iteritems(*args, **kwargs) - - iterlists = lambda d, *args, **kwargs: d.iterlists(*args, **kwargs) - iterlistvalues = lambda d, *args, **kwargs: d.iterlistvalues(*args, **kwargs) - - int_to_byte = chr - iter_bytes = iter - - exec('def reraise(tp, value, tb=None):\n raise tp, value, tb') - - def fix_tuple_repr(obj): - def __repr__(self): - cls = self.__class__ - return '%s(%s)' % (cls.__name__, ', '.join( - '%s=%r' % (field, self[index]) - for index, field in enumerate(cls._fields) - )) - obj.__repr__ = __repr__ - return obj - - def implements_iterator(cls): - cls.next = cls.__next__ - del cls.__next__ - return cls - - def implements_to_string(cls): - cls.__unicode__ = cls.__str__ - cls.__str__ = lambda x: x.__unicode__().encode('utf-8') - return cls - - def native_string_result(func): - def wrapper(*args, **kwargs): - return func(*args, **kwargs).encode('utf-8') - return functools.update_wrapper(wrapper, func) - - def implements_bool(cls): - cls.__nonzero__ = cls.__bool__ - del cls.__bool__ - return cls - - from itertools import imap, izip, ifilter - range_type = xrange - - from StringIO import StringIO - from cStringIO import StringIO as BytesIO - NativeStringIO = BytesIO - - def make_literal_wrapper(reference): - return _identity - - def normalize_string_tuple(tup): - """Normalizes a string tuple to a common type. Following Python 2 - rules, upgrades to unicode are implicit. - """ - if any(isinstance(x, text_type) for x in tup): - return tuple(to_unicode(x) for x in tup) - return tup - - def try_coerce_native(s): - """Try to coerce a unicode string to native if possible. Otherwise, - leave it as unicode. - """ - try: - return to_native(s) - except UnicodeError: - return s - - wsgi_get_bytes = _identity - - def wsgi_decoding_dance(s, charset='utf-8', errors='replace'): - return s.decode(charset, errors) - - def wsgi_encoding_dance(s, charset='utf-8', errors='replace'): - if isinstance(s, bytes): - return s - return s.encode(charset, errors) - - def to_bytes(x, charset=sys.getdefaultencoding(), errors='strict'): - if x is None: - return None - if isinstance(x, (bytes, bytearray, buffer)): - return bytes(x) - if isinstance(x, unicode): - return x.encode(charset, errors) - raise TypeError('Expected bytes') - - def to_native(x, charset=sys.getdefaultencoding(), errors='strict'): - if x is None or isinstance(x, str): - return x - return x.encode(charset, errors) - -else: - unichr = chr - text_type = str - string_types = (str, ) - integer_types = (int, ) - - iterkeys = lambda d, *args, **kwargs: iter(d.keys(*args, **kwargs)) - itervalues = lambda d, *args, **kwargs: iter(d.values(*args, **kwargs)) - iteritems = lambda d, *args, **kwargs: iter(d.items(*args, **kwargs)) - - iterlists = lambda d, *args, **kwargs: iter(d.lists(*args, **kwargs)) - iterlistvalues = lambda d, *args, **kwargs: iter(d.listvalues(*args, **kwargs)) - - int_to_byte = operator.methodcaller('to_bytes', 1, 'big') - iter_bytes = functools.partial(map, int_to_byte) - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - fix_tuple_repr = _identity - implements_iterator = _identity - implements_to_string = _identity - implements_bool = _identity - native_string_result = _identity - imap = map - izip = zip - ifilter = filter - range_type = range - - from io import StringIO, BytesIO - NativeStringIO = StringIO - - _latin1_encode = operator.methodcaller('encode', 'latin1') - - def make_literal_wrapper(reference): - if isinstance(reference, text_type): - return _identity - return _latin1_encode - - def normalize_string_tuple(tup): - """Ensures that all types in the tuple are either strings - or bytes. - """ - tupiter = iter(tup) - is_text = isinstance(next(tupiter, None), text_type) - for arg in tupiter: - if isinstance(arg, text_type) != is_text: - raise TypeError('Cannot mix str and bytes arguments (got %s)' - % repr(tup)) - return tup - - try_coerce_native = _identity - wsgi_get_bytes = _latin1_encode - - def wsgi_decoding_dance(s, charset='utf-8', errors='replace'): - return s.encode('latin1').decode(charset, errors) - - def wsgi_encoding_dance(s, charset='utf-8', errors='replace'): - if isinstance(s, text_type): - s = s.encode(charset) - return s.decode('latin1', errors) - - def to_bytes(x, charset=sys.getdefaultencoding(), errors='strict'): - if x is None: - return None - if isinstance(x, (bytes, bytearray, memoryview)): # noqa - return bytes(x) - if isinstance(x, str): - return x.encode(charset, errors) - raise TypeError('Expected bytes') - - def to_native(x, charset=sys.getdefaultencoding(), errors='strict'): - if x is None or isinstance(x, str): - return x - return x.decode(charset, errors) - - -def to_unicode(x, charset=sys.getdefaultencoding(), errors='strict', - allow_none_charset=False): - if x is None: - return None - if not isinstance(x, bytes): - return text_type(x) - if charset is None and allow_none_charset: - return x - return x.decode(charset, errors) diff --git a/pythonPackages/Werkzeug-0.12.1/werkzeug/_internal.py b/pythonPackages/Werkzeug-0.12.1/werkzeug/_internal.py deleted file mode 100644 index 3d1ee09095..0000000000 --- a/pythonPackages/Werkzeug-0.12.1/werkzeug/_internal.py +++ /dev/null @@ -1,418 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug._internal - ~~~~~~~~~~~~~~~~~~ - - This module provides internally used helpers and constants. - - :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import re -import string -import inspect -from weakref import WeakKeyDictionary -from datetime import datetime, date -from itertools import chain - -from werkzeug._compat import iter_bytes, text_type, BytesIO, int_to_byte, \ - range_type, integer_types - - -_logger = None -_empty_stream = BytesIO() -_signature_cache = WeakKeyDictionary() -_epoch_ord = date(1970, 1, 1).toordinal() -_cookie_params = set((b'expires', b'path', b'comment', - b'max-age', b'secure', b'httponly', - b'version')) -_legal_cookie_chars = (string.ascii_letters + - string.digits + - u"!#$%&'*+-.^_`|~:").encode('ascii') - -_cookie_quoting_map = { - b',': b'\\054', - b';': b'\\073', - b'"': b'\\"', - b'\\': b'\\\\', -} -for _i in chain(range_type(32), range_type(127, 256)): - _cookie_quoting_map[int_to_byte(_i)] = ('\\%03o' % _i).encode('latin1') - - -_octal_re = re.compile(b'\\\\[0-3][0-7][0-7]') -_quote_re = re.compile(b'[\\\\].') -_legal_cookie_chars_re = b'[\w\d!#%&\'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=]' -_cookie_re = re.compile(b""" - (?P[^=]+) - \s*=\s* - (?P - "(?:[^\\\\"]|\\\\.)*" | - (?:.*?) - ) - \s*; -""", flags=re.VERBOSE) - - -class _Missing(object): - - def __repr__(self): - return 'no value' - - def __reduce__(self): - return '_missing' - -_missing = _Missing() - - -def _get_environ(obj): - env = getattr(obj, 'environ', obj) - assert isinstance(env, dict), \ - '%r is not a WSGI environment (has to be a dict)' % type(obj).__name__ - return env - - -def _log(type, message, *args, **kwargs): - """Log into the internal werkzeug logger.""" - global _logger - if _logger is None: - import logging - _logger = logging.getLogger('werkzeug') - # Only set up a default log handler if the - # end-user application didn't set anything up. - if not logging.root.handlers and _logger.level == logging.NOTSET: - _logger.setLevel(logging.INFO) - handler = logging.StreamHandler() - _logger.addHandler(handler) - getattr(_logger, type)(message.rstrip(), *args, **kwargs) - - -def _parse_signature(func): - """Return a signature object for the function.""" - if hasattr(func, 'im_func'): - func = func.im_func - - # if we have a cached validator for this function, return it - parse = _signature_cache.get(func) - if parse is not None: - return parse - - # inspect the function signature and collect all the information - if hasattr(inspect, 'getfullargspec'): - tup = inspect.getfullargspec(func) - else: - tup = inspect.getargspec(func) - positional, vararg_var, kwarg_var, defaults = tup[:4] - defaults = defaults or () - arg_count = len(positional) - arguments = [] - for idx, name in enumerate(positional): - if isinstance(name, list): - raise TypeError('cannot parse functions that unpack tuples ' - 'in the function signature') - try: - default = defaults[idx - arg_count] - except IndexError: - param = (name, False, None) - else: - param = (name, True, default) - arguments.append(param) - arguments = tuple(arguments) - - def parse(args, kwargs): - new_args = [] - missing = [] - extra = {} - - # consume as many arguments as positional as possible - for idx, (name, has_default, default) in enumerate(arguments): - try: - new_args.append(args[idx]) - except IndexError: - try: - new_args.append(kwargs.pop(name)) - except KeyError: - if has_default: - new_args.append(default) - else: - missing.append(name) - else: - if name in kwargs: - extra[name] = kwargs.pop(name) - - # handle extra arguments - extra_positional = args[arg_count:] - if vararg_var is not None: - new_args.extend(extra_positional) - extra_positional = () - if kwargs and kwarg_var is None: - extra.update(kwargs) - kwargs = {} - - return new_args, kwargs, missing, extra, extra_positional, \ - arguments, vararg_var, kwarg_var - _signature_cache[func] = parse - return parse - - -def _date_to_unix(arg): - """Converts a timetuple, integer or datetime object into the seconds from - epoch in utc. - """ - if isinstance(arg, datetime): - arg = arg.utctimetuple() - elif isinstance(arg, integer_types + (float,)): - return int(arg) - year, month, day, hour, minute, second = arg[:6] - days = date(year, month, 1).toordinal() - _epoch_ord + day - 1 - hours = days * 24 + hour - minutes = hours * 60 + minute - seconds = minutes * 60 + second - return seconds - - -class _DictAccessorProperty(object): - - """Baseclass for `environ_property` and `header_property`.""" - read_only = False - - def __init__(self, name, default=None, load_func=None, dump_func=None, - read_only=None, doc=None): - self.name = name - self.default = default - self.load_func = load_func - self.dump_func = dump_func - if read_only is not None: - self.read_only = read_only - self.__doc__ = doc - - def __get__(self, obj, type=None): - if obj is None: - return self - storage = self.lookup(obj) - if self.name not in storage: - return self.default - rv = storage[self.name] - if self.load_func is not None: - try: - rv = self.load_func(rv) - except (ValueError, TypeError): - rv = self.default - return rv - - def __set__(self, obj, value): - if self.read_only: - raise AttributeError('read only property') - if self.dump_func is not None: - value = self.dump_func(value) - self.lookup(obj)[self.name] = value - - def __delete__(self, obj): - if self.read_only: - raise AttributeError('read only property') - self.lookup(obj).pop(self.name, None) - - def __repr__(self): - return '<%s %s>' % ( - self.__class__.__name__, - self.name - ) - - -def _cookie_quote(b): - buf = bytearray() - all_legal = True - _lookup = _cookie_quoting_map.get - _push = buf.extend - - for char in iter_bytes(b): - if char not in _legal_cookie_chars: - all_legal = False - char = _lookup(char, char) - _push(char) - - if all_legal: - return bytes(buf) - return bytes(b'"' + buf + b'"') - - -def _cookie_unquote(b): - if len(b) < 2: - return b - if b[:1] != b'"' or b[-1:] != b'"': - return b - - b = b[1:-1] - - i = 0 - n = len(b) - rv = bytearray() - _push = rv.extend - - while 0 <= i < n: - o_match = _octal_re.search(b, i) - q_match = _quote_re.search(b, i) - if not o_match and not q_match: - rv.extend(b[i:]) - break - j = k = -1 - if o_match: - j = o_match.start(0) - if q_match: - k = q_match.start(0) - if q_match and (not o_match or k < j): - _push(b[i:k]) - _push(b[k + 1:k + 2]) - i = k + 2 - else: - _push(b[i:j]) - rv.append(int(b[j + 1:j + 4], 8)) - i = j + 4 - - return bytes(rv) - - -def _cookie_parse_impl(b): - """Lowlevel cookie parsing facility that operates on bytes.""" - i = 0 - n = len(b) - - while i < n: - match = _cookie_re.search(b + b';', i) - if not match: - break - - key = match.group('key').strip() - value = match.group('val') - i = match.end(0) - - # Ignore parameters. We have no interest in them. - if key.lower() not in _cookie_params: - yield _cookie_unquote(key), _cookie_unquote(value) - - -def _encode_idna(domain): - # If we're given bytes, make sure they fit into ASCII - if not isinstance(domain, text_type): - domain.decode('ascii') - return domain - - # Otherwise check if it's already ascii, then return - try: - return domain.encode('ascii') - except UnicodeError: - pass - - # Otherwise encode each part separately - parts = domain.split('.') - for idx, part in enumerate(parts): - parts[idx] = part.encode('idna') - return b'.'.join(parts) - - -def _decode_idna(domain): - # If the input is a string try to encode it to ascii to - # do the idna decoding. if that fails because of an - # unicode error, then we already have a decoded idna domain - if isinstance(domain, text_type): - try: - domain = domain.encode('ascii') - except UnicodeError: - return domain - - # Decode each part separately. If a part fails, try to - # decode it with ascii and silently ignore errors. This makes - # most sense because the idna codec does not have error handling - parts = domain.split(b'.') - for idx, part in enumerate(parts): - try: - parts[idx] = part.decode('idna') - except UnicodeError: - parts[idx] = part.decode('ascii', 'ignore') - - return '.'.join(parts) - - -def _make_cookie_domain(domain): - if domain is None: - return None - domain = _encode_idna(domain) - if b':' in domain: - domain = domain.split(b':', 1)[0] - if b'.' in domain: - return domain - raise ValueError( - 'Setting \'domain\' for a cookie on a server running locally (ex: ' - 'localhost) is not supported by complying browsers. You should ' - 'have something like: \'127.0.0.1 localhost dev.localhost\' on ' - 'your hosts file and then point your server to run on ' - '\'dev.localhost\' and also set \'domain\' for \'dev.localhost\'' - ) - - -def _easteregg(app=None): - """Like the name says. But who knows how it works?""" - def bzzzzzzz(gyver): - import base64 - import zlib - return zlib.decompress(base64.b64decode(gyver)).decode('ascii') - gyver = u'\n'.join([x + (77 - len(x)) * u' ' for x in bzzzzzzz(b''' -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 -7f2zLkGNv8b191cD/3vs9Q833z8t''').splitlines()]) - - def easteregged(environ, start_response): - def injecting_start_response(status, headers, exc_info=None): - headers.append(('X-Powered-By', 'Werkzeug')) - return start_response(status, headers, exc_info) - if app is not None and environ.get('QUERY_STRING') != 'macgybarchakku': - return app(environ, injecting_start_response) - injecting_start_response('200 OK', [('Content-Type', 'text/html')]) - return [(u''' - - - -About Werkzeug - - - -

Werkzeug

-

the Swiss Army knife of Python web development.

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

%(title)s

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

%(title)s

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

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

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

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