parent
6dc00f7b2b
commit
b203a417ae
Binary file not shown.
@ -0,0 +1,24 @@ |
||||
Copyright (c) 2011-2017, Dan Crosta |
||||
All rights reserved. |
||||
|
||||
Redistribution and use in source and binary forms, with or without |
||||
modification, are permitted provided that the following conditions are met: |
||||
|
||||
* Redistributions of source code must retain the above copyright notice, |
||||
this list of conditions and the following disclaimer. |
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice, |
||||
this list of conditions and the following disclaimer in the documentation |
||||
and/or other materials provided with the distribution. |
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||
POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,43 @@ |
||||
Metadata-Version: 2.1 |
||||
Name: Flask-PyMongo |
||||
Version: 2.3.0 |
||||
Summary: PyMongo support for Flask applications |
||||
Home-page: http://flask-pymongo.readthedocs.org/ |
||||
Author: Dan Crosta |
||||
Author-email: dcrosta@late.am |
||||
License: BSD |
||||
Download-URL: https://github.com/dcrosta/flask-pymongo/tags |
||||
Platform: any |
||||
Classifier: Environment :: Web Environment |
||||
Classifier: Framework :: Flask |
||||
Classifier: Intended Audience :: Developers |
||||
Classifier: License :: OSI Approved :: BSD License |
||||
Classifier: Operating System :: OS Independent |
||||
Classifier: Programming Language :: Python :: 2.7 |
||||
Classifier: Programming Language :: Python :: 3.3 |
||||
Classifier: Programming Language :: Python :: 3.4 |
||||
Classifier: Programming Language :: Python :: 3.5 |
||||
Classifier: Programming Language :: Python :: 3.6 |
||||
Classifier: Programming Language :: Python |
||||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content |
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules |
||||
Requires-Dist: Flask (>=0.11) |
||||
Requires-Dist: PyMongo (>=3.3) |
||||
|
||||
|
||||
Flask-PyMongo |
||||
------------- |
||||
|
||||
MongoDB support for Flask applications. |
||||
|
||||
Flask-PyMongo is pip-installable: |
||||
|
||||
$ pip install Flask-PyMongo |
||||
|
||||
Documentation for Flask-PyMongo is available on `ReadTheDocs |
||||
<http://flask-pymongo.readthedocs.io/en/latest/>`_. |
||||
|
||||
Source code is hosted on `GitHub <https://github.com/dcrosta/flask-pymongo>`_. |
||||
Contributions are welcome! |
||||
|
||||
|
@ -0,0 +1,25 @@ |
||||
Flask_PyMongo-2.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 |
||||
Flask_PyMongo-2.3.0.dist-info/LICENSE,sha256=Ap8d3yrzplSqXFfool6NTo87qPxXRHk_ikV97lurKvY,1298 |
||||
Flask_PyMongo-2.3.0.dist-info/METADATA,sha256=YAaRh_44jnKkfE9PdipsdhwJeAFMSYdvHBcC0_Uz0Ok,1356 |
||||
Flask_PyMongo-2.3.0.dist-info/RECORD,, |
||||
Flask_PyMongo-2.3.0.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 |
||||
Flask_PyMongo-2.3.0.dist-info/pbr.json,sha256=Uog-jmFMzzyMUmvHpecWUp8hrfTHUIL8FHdBBkk0P6k,47 |
||||
Flask_PyMongo-2.3.0.dist-info/top_level.txt,sha256=D0YaRrox4mkWzPhTMnqwIP_A_L1SRd9krRPQCU3dDQU,14 |
||||
flask_pymongo/__init__.py,sha256=iiavXfDPhz37a1rM1XsyFn0XBdG4ykgdTsYUKLl9lCY,8968 |
||||
flask_pymongo/__pycache__/__init__.cpython-37.pyc,, |
||||
flask_pymongo/__pycache__/_version.cpython-37.pyc,, |
||||
flask_pymongo/__pycache__/wrappers.cpython-37.pyc,, |
||||
flask_pymongo/_version.py,sha256=wB_e6iDNGYA2lGSf9Do9xoBiacRXeGfjda4PNVbM_jk,122 |
||||
flask_pymongo/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 |
||||
flask_pymongo/tests/__pycache__/__init__.cpython-37.pyc,, |
||||
flask_pymongo/tests/__pycache__/test_config.cpython-37.pyc,, |
||||
flask_pymongo/tests/__pycache__/test_gridfs.cpython-37.pyc,, |
||||
flask_pymongo/tests/__pycache__/test_url_converter.cpython-37.pyc,, |
||||
flask_pymongo/tests/__pycache__/test_wrappers.cpython-37.pyc,, |
||||
flask_pymongo/tests/__pycache__/util.cpython-37.pyc,, |
||||
flask_pymongo/tests/test_config.py,sha256=P6Fw10liyMYUz78e9U4I1ir0Wb-ltxYtdTWYr8WPrSM,3363 |
||||
flask_pymongo/tests/test_gridfs.py,sha256=sc70aukyMW9erW0pZZaZoEBKi3dfp1w-AW8OnCR5EDw,3039 |
||||
flask_pymongo/tests/test_url_converter.py,sha256=u1Avnps0Cgr6UG0akZnD8mPScJEVfJSvjLVziIouUfY,605 |
||||
flask_pymongo/tests/test_wrappers.py,sha256=c-NCD3xuuM5hWyCBlbMIEW9bkOVTTITHegf7AO-UOig,1212 |
||||
flask_pymongo/tests/util.py,sha256=XB7xxpDDPRkxYH4gA6v-FtAOo7IGnE8NubAYoDtlZWA,1087 |
||||
flask_pymongo/wrappers.py,sha256=A24URUPDchBNiY7qfRO9PKc9UGi6eMzB-FqbHVeChNY,4269 |
@ -1,5 +1,5 @@ |
||||
Wheel-Version: 1.0 |
||||
Generator: bdist_wheel (0.24.0) |
||||
Generator: bdist_wheel (0.33.1) |
||||
Root-Is-Purelib: true |
||||
Tag: py2-none-any |
||||
Tag: py3-none-any |
@ -0,0 +1 @@ |
||||
{"is_release": false, "git_version": "775c8c3"} |
@ -0,0 +1 @@ |
||||
flask_pymongo |
@ -1,54 +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 <http://werkzeug.pocoo.org/>`_. |
||||
|
||||
|
||||
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 |
||||
|
||||
|
@ -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. |
@ -1,83 +0,0 @@ |
||||
Metadata-Version: 2.0 |
||||
Name: Werkzeug |
||||
Version: 0.12.2 |
||||
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 |
||||
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 |
||||
Provides-Extra: termcolor |
||||
Requires-Dist: termcolor; extra == 'termcolor' |
||||
Provides-Extra: watchdog |
||||
Requires-Dist: watchdog; extra == 'watchdog' |
||||
|
||||
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 <http://werkzeug.pocoo.org/>`_. |
||||
|
||||
|
||||
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 |
||||
|
||||
|
@ -1,95 +0,0 @@ |
||||
Werkzeug-0.12.2.dist-info/DESCRIPTION.rst,sha256=z9r9xqJ0fYSAn1Tz7KRBdFGDerL2y4pHWSW_72pUgTc,1591 |
||||
Werkzeug-0.12.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 |
||||
Werkzeug-0.12.2.dist-info/LICENSE.txt,sha256=F84h8-PZAuC-Hq-_252D3yhH6mqIc-WUbXUPbfOtjXM,1532 |
||||
Werkzeug-0.12.2.dist-info/METADATA,sha256=SphYykCCskmOJK7mV1-M2T1PTOrx5K3DJ8n3E5jA298,2738 |
||||
Werkzeug-0.12.2.dist-info/RECORD,, |
||||
Werkzeug-0.12.2.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110 |
||||
Werkzeug-0.12.2.dist-info/metadata.json,sha256=6taKobd3cQ5zOY5MVKlvuCJGaX7VPLaHYuRwzwwkORI,1276 |
||||
Werkzeug-0.12.2.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 |
||||
werkzeug/__init__.py,sha256=NDY8HsYsT3dguTLu4MhuH-GpQE5XS9aKhrdfwHnzOEk,6864 |
||||
werkzeug/__pycache__/__init__.cpython-37.pyc,, |
||||
werkzeug/__pycache__/_compat.cpython-37.pyc,, |
||||
werkzeug/__pycache__/_internal.cpython-37.pyc,, |
||||
werkzeug/__pycache__/_reloader.cpython-37.pyc,, |
||||
werkzeug/__pycache__/datastructures.cpython-37.pyc,, |
||||
werkzeug/__pycache__/exceptions.cpython-37.pyc,, |
||||
werkzeug/__pycache__/filesystem.cpython-37.pyc,, |
||||
werkzeug/__pycache__/formparser.cpython-37.pyc,, |
||||
werkzeug/__pycache__/http.cpython-37.pyc,, |
||||
werkzeug/__pycache__/local.cpython-37.pyc,, |
||||
werkzeug/__pycache__/posixemulation.cpython-37.pyc,, |
||||
werkzeug/__pycache__/routing.cpython-37.pyc,, |
||||
werkzeug/__pycache__/script.cpython-37.pyc,, |
||||
werkzeug/__pycache__/security.cpython-37.pyc,, |
||||
werkzeug/__pycache__/serving.cpython-37.pyc,, |
||||
werkzeug/__pycache__/test.cpython-37.pyc,, |
||||
werkzeug/__pycache__/testapp.cpython-37.pyc,, |
||||
werkzeug/__pycache__/urls.cpython-37.pyc,, |
||||
werkzeug/__pycache__/useragents.cpython-37.pyc,, |
||||
werkzeug/__pycache__/utils.cpython-37.pyc,, |
||||
werkzeug/__pycache__/wrappers.cpython-37.pyc,, |
||||
werkzeug/__pycache__/wsgi.cpython-37.pyc,, |
||||
werkzeug/_compat.py,sha256=8c4U9o6A_TR9nKCcTbpZNxpqCXcXDVIbFawwKM2s92c,6311 |
||||
werkzeug/_internal.py,sha256=sE2JbLnMzN9mRI1iipTYWrFAGEWaZVECqtHAiNEhqUE,13841 |
||||
werkzeug/_reloader.py,sha256=NkIXQCTa6b22wWLpXob_jIVUxux8LtAsfWehLkKt0iM,8816 |
||||
werkzeug/contrib/__init__.py,sha256=f7PfttZhbrImqpr5Ezre8CXgwvcGUJK7zWNpO34WWrw,623 |
||||
werkzeug/contrib/__pycache__/__init__.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/atom.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/cache.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/fixers.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/iterio.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/jsrouting.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/limiter.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/lint.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/profiler.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/sessions.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/testtools.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc,, |
||||
werkzeug/contrib/atom.py,sha256=qqfJcfIn2RYY-3hO3Oz0aLq9YuNubcPQ_KZcNsDwVJo,15575 |
||||
werkzeug/contrib/cache.py,sha256=nyUUxsS0MTHiFmu-481y9PHd8NvWH5pzCoEX1yA0mHY,30341 |
||||
werkzeug/contrib/fixers.py,sha256=gR06T-w71ur-tHQ_31kP_4jpOncPJ4Wc1dOqTvYusr8,10179 |
||||
werkzeug/contrib/iterio.py,sha256=RlqDvGhz0RneTpzE8dVc-yWCUv4nkPl1jEc_EDp2fH0,10814 |
||||
werkzeug/contrib/jsrouting.py,sha256=QTmgeDoKXvNK02KzXgx9lr3cAH6fAzpwF5bBdPNvJPs,8564 |
||||
werkzeug/contrib/limiter.py,sha256=iS8-ahPZ-JLRnmfIBzxpm7O_s3lPsiDMVWv7llAIDCI,1334 |
||||
werkzeug/contrib/lint.py,sha256=qZlmqiWJ5tQJOEzLnPmHWA8eUEpcBIWkAb_V2RKJg4o,12558 |
||||
werkzeug/contrib/profiler.py,sha256=ISwCWvwVyGpDLRBRpLjo_qUWma6GXYBrTAco4PEQSHY,5151 |
||||
werkzeug/contrib/securecookie.py,sha256=bDsAJmslkwmXjycnPjEjWtfLBvhz0ud4z3k7tdezUVs,12174 |
||||
werkzeug/contrib/sessions.py,sha256=39LVNvLbm5JWpbxM79WC2l87MJFbqeISARjwYbkJatw,12577 |
||||
werkzeug/contrib/testtools.py,sha256=G9xN-qeihJlhExrIZMCahvQOIDxdL9NiX874jiiHFMs,2453 |
||||
werkzeug/contrib/wrappers.py,sha256=v7OYlz7wQtDlS9fey75UiRZ1IkUWqCpzbhsLy4k14Hw,10398 |
||||
werkzeug/datastructures.py,sha256=rq0zICISMUetS3xvUVvrhIvyue9oUzrs_NU3b83zwuQ,89066 |
||||
werkzeug/debug/__init__.py,sha256=GTsOsjE3PqUAlsUVm2Mgc_KWA2kjjSsUz0JsM7Qu41w,17266 |
||||
werkzeug/debug/__pycache__/__init__.cpython-37.pyc,, |
||||
werkzeug/debug/__pycache__/console.cpython-37.pyc,, |
||||
werkzeug/debug/__pycache__/repr.cpython-37.pyc,, |
||||
werkzeug/debug/__pycache__/tbtools.cpython-37.pyc,, |
||||
werkzeug/debug/console.py,sha256=n3-dsKk1TsjnN-u4ZgmuWCU_HO0qw5IA7ttjhyyMM6I,5607 |
||||
werkzeug/debug/repr.py,sha256=bKqstDYGfECpeLerd48s_hxuqK4b6UWnjMu3d_DHO8I,9340 |
||||
werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 |
||||
werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 |
||||
werkzeug/debug/shared/debugger.js,sha256=PKPVYuyO4SX1hkqLOwCLvmIEO5154WatFYaXE-zIfKI,6264 |
||||
werkzeug/debug/shared/jquery.js,sha256=7LkWEzqTdpEfELxcZZlS6wAx5Ff13zZ83lYO2_ujj7g,95957 |
||||
werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 |
||||
werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 |
||||
werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818 |
||||
werkzeug/debug/shared/style.css,sha256=IEO0PC2pWmh2aEyGCaN--txuWsRCliuhlbEhPDFwh0A,6270 |
||||
werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 |
||||
werkzeug/debug/tbtools.py,sha256=rBudXCmkVdAKIcdhxANxgf09g6kQjJWW9_5bjSpr4OY,18451 |
||||
werkzeug/exceptions.py,sha256=3wp95Hqj9FqV8MdikV99JRcHse_fSMn27V8tgP5Hw2c,20505 |
||||
werkzeug/filesystem.py,sha256=hHWeWo_gqLMzTRfYt8-7n2wWcWUNTnDyudQDLOBEICE,2175 |
||||
werkzeug/formparser.py,sha256=DxN53eOCb6i7PxqtldrF2Kv9Mx00BqW297N4t-RxkWE,21241 |
||||
werkzeug/http.py,sha256=nrk-ASJzcKOuoBEz274TWA8jKt0CQSOBZuP_A0UASTA,36658 |
||||
werkzeug/local.py,sha256=QdQhWV5L8p1Y1CJ1CDStwxaUs24SuN5aebHwjVD08C8,14553 |
||||
werkzeug/posixemulation.py,sha256=xEF2Bxc-vUCPkiu4IbfWVd3LW7DROYAT-ExW6THqyzw,3519 |
||||
werkzeug/routing.py,sha256=g25wg0GNfff8WcfRlc1ZxTGvz1KbVj09w2S7wxopseQ,66746 |
||||
werkzeug/script.py,sha256=Jh9OAktqjLNc_IBBUatVM7uP5LDcbxaYA8n2ObnS4bo,11666 |
||||
werkzeug/security.py,sha256=Z0v0ojdo7T4FNyfIjx86BFQKwasy3ZR9euikIJDQYP8,9191 |
||||
werkzeug/serving.py,sha256=aAS3EgiD-VjemsYfSf1yqdjaGEfpB4I3M4PKlLotJLo,29069 |
||||
werkzeug/test.py,sha256=xnabNSpty66ftZiXHcoZaYFP1E4WUNxydw5Oe8Mjhoo,34795 |
||||
werkzeug/testapp.py,sha256=3HQRW1sHZKXuAjCvFMet4KXtQG3loYTFnvn6LWt-4zI,9396 |
||||
werkzeug/urls.py,sha256=fSbI4Gb29_p02Zk21VAZQRN1QdOVY9CNTgpb2rbajNQ,36710 |
||||
werkzeug/useragents.py,sha256=Ck3G977Y0Rzdk9wFcLpL0PyOrONtdK1_d2Zexb78cX4,5640 |
||||
werkzeug/utils.py,sha256=lkybtv_mq35zV1qhelvEcILTzrMUwZ9yon6E8XwapJE,22972 |
||||
werkzeug/wrappers.py,sha256=wceh1RhvhIZVzKuok3XMQ5jqjYYCEYv5JqKY3Nc_oRY,82986 |
||||
werkzeug/wsgi.py,sha256=TjPo5ups3NI1RVVGdMvd3XaceqFtqlMX5X169gWWFrQ,42838 |
@ -1 +0,0 @@ |
||||
{"license": "BSD", "name": "Werkzeug", "metadata_version": "2.0", "generator": "bdist_wheel (0.24.0)", "summary": "The Swiss Army knife of Python web development", "platform": "any", "run_requires": [{"requires": ["watchdog"], "extra": "watchdog"}, {"requires": ["termcolor"], "extra": "termcolor"}], "version": "0.12.2", "extensions": {"python.details": {"project_urls": {"Home": "http://werkzeug.pocoo.org/"}, "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "contacts": [{"role": "author", "email": "armin.ronacher@active-4.com", "name": "Armin Ronacher"}]}}, "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"], "extras": ["termcolor", "watchdog"]} |
@ -0,0 +1 @@ |
||||
pip |
@ -0,0 +1,28 @@ |
||||
Copyright 2007 Pallets |
||||
|
||||
Redistribution and use in source and binary forms, with or without |
||||
modification, are permitted provided that the following conditions are |
||||
met: |
||||
|
||||
1. Redistributions of source code must retain the above copyright |
||||
notice, this list of conditions and the following disclaimer. |
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright |
||||
notice, this list of conditions and the following disclaimer in the |
||||
documentation and/or other materials provided with the distribution. |
||||
|
||||
3. Neither the name of the copyright holder nor the names of its |
||||
contributors may be used to endorse or promote products derived from |
||||
this software without specific prior written permission. |
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
||||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED |
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,133 @@ |
||||
Metadata-Version: 2.1 |
||||
Name: Werkzeug |
||||
Version: 0.15.4 |
||||
Summary: The comprehensive WSGI web application library. |
||||
Home-page: https://palletsprojects.com/p/werkzeug/ |
||||
Author: Armin Ronacher |
||||
Author-email: armin.ronacher@active-4.com |
||||
Maintainer: The Pallets Team |
||||
Maintainer-email: contact@palletsprojects.com |
||||
License: BSD-3-Clause |
||||
Project-URL: Documentation, https://werkzeug.palletsprojects.com/ |
||||
Project-URL: Code, https://github.com/pallets/werkzeug |
||||
Project-URL: Issue tracker, https://github.com/pallets/werkzeug/issues |
||||
Platform: UNKNOWN |
||||
Classifier: Development Status :: 5 - Production/Stable |
||||
Classifier: Environment :: Web Environment |
||||
Classifier: Intended Audience :: Developers |
||||
Classifier: License :: OSI Approved :: BSD License |
||||
Classifier: Operating System :: OS Independent |
||||
Classifier: Programming Language :: Python |
||||
Classifier: Programming Language :: Python :: 2 |
||||
Classifier: Programming Language :: Python :: 2.7 |
||||
Classifier: Programming Language :: Python :: 3 |
||||
Classifier: Programming Language :: Python :: 3.4 |
||||
Classifier: Programming Language :: Python :: 3.5 |
||||
Classifier: Programming Language :: Python :: 3.6 |
||||
Classifier: Programming Language :: Python :: 3.7 |
||||
Classifier: Programming Language :: Python :: Implementation :: CPython |
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy |
||||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content |
||||
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI |
||||
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application |
||||
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware |
||||
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks |
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules |
||||
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* |
||||
Provides-Extra: dev |
||||
Requires-Dist: pytest ; extra == 'dev' |
||||
Requires-Dist: coverage ; extra == 'dev' |
||||
Requires-Dist: tox ; extra == 'dev' |
||||
Requires-Dist: sphinx ; extra == 'dev' |
||||
Requires-Dist: pallets-sphinx-themes ; extra == 'dev' |
||||
Requires-Dist: sphinx-issues ; extra == 'dev' |
||||
Provides-Extra: termcolor |
||||
Requires-Dist: termcolor ; extra == 'termcolor' |
||||
Provides-Extra: watchdog |
||||
Requires-Dist: watchdog ; extra == 'watchdog' |
||||
|
||||
Werkzeug |
||||
======== |
||||
|
||||
*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") |
||||
|
||||
Werkzeug is a comprehensive `WSGI`_ web application library. It began as |
||||
a simple collection of various utilities for WSGI applications and has |
||||
become one of the most advanced WSGI utility libraries. |
||||
|
||||
It includes: |
||||
|
||||
- An interactive debugger that allows inspecting stack traces and |
||||
source code in the browser with an interactive interpreter for any |
||||
frame in the stack. |
||||
- A full-featured request object with objects to interact with |
||||
headers, query args, form data, files, and cookies. |
||||
- A response object that can wrap other WSGI applications and handle |
||||
streaming data. |
||||
- A routing system for matching URLs to endpoints and generating URLs |
||||
for endpoints, with an extensible system for capturing variables |
||||
from URLs. |
||||
- HTTP utilities to handle entity tags, cache control, dates, user |
||||
agents, cookies, files, and more. |
||||
- A threaded WSGI server for use while developing applications |
||||
locally. |
||||
- A test client for simulating HTTP requests during testing without |
||||
requiring running a server. |
||||
|
||||
Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up |
||||
to the developer to choose a template engine, database adapter, and even |
||||
how to handle requests. It can be used to build all sorts of end user |
||||
applications such as blogs, wikis, or bulletin boards. |
||||
|
||||
`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while |
||||
providing more structure and patterns for defining powerful |
||||
applications. |
||||
|
||||
|
||||
Installing |
||||
---------- |
||||
|
||||
Install and update using `pip`_: |
||||
|
||||
.. code-block:: text |
||||
|
||||
pip install -U Werkzeug |
||||
|
||||
|
||||
A Simple Example |
||||
---------------- |
||||
|
||||
.. code-block:: python |
||||
|
||||
from werkzeug.wrappers import Request, Response |
||||
|
||||
@Request.application |
||||
def application(request): |
||||
return Response('Hello, World!') |
||||
|
||||
if __name__ == '__main__': |
||||
from werkzeug.serving import run_simple |
||||
run_simple('localhost', 4000, application) |
||||
|
||||
|
||||
Links |
||||
----- |
||||
|
||||
- Website: https://www.palletsprojects.com/p/werkzeug/ |
||||
- Documentation: https://werkzeug.palletsprojects.com/ |
||||
- Releases: https://pypi.org/project/Werkzeug/ |
||||
- Code: https://github.com/pallets/werkzeug |
||||
- Issue tracker: https://github.com/pallets/werkzeug/issues |
||||
- Test status: |
||||
|
||||
- Linux, Mac: https://travis-ci.org/pallets/werkzeug |
||||
- Windows: https://ci.appveyor.com/project/pallets/werkzeug |
||||
|
||||
- Test coverage: https://codecov.io/gh/pallets/werkzeug |
||||
- Official chat: https://discord.gg/t6rrQZH |
||||
|
||||
.. _WSGI: https://wsgi.readthedocs.io/en/latest/ |
||||
.. _Flask: https://www.palletsprojects.com/p/flask/ |
||||
.. _pip: https://pip.pypa.io/en/stable/quickstart/ |
||||
|
||||
|
@ -0,0 +1,119 @@ |
||||
Werkzeug-0.15.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 |
||||
Werkzeug-0.15.4.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 |
||||
Werkzeug-0.15.4.dist-info/METADATA,sha256=BFCzIm51w-fKsnG13iHz4No7Upu9-y_vJUq_rkY_bqY,4864 |
||||
Werkzeug-0.15.4.dist-info/RECORD,, |
||||
Werkzeug-0.15.4.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 |
||||
Werkzeug-0.15.4.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 |
||||
werkzeug/__init__.py,sha256=LBPc9xBJsifxGUsUY5EkreS0o_D8ixJD3YYSh9ARtxE,6805 |
||||
werkzeug/__pycache__/__init__.cpython-37.pyc,, |
||||
werkzeug/__pycache__/_compat.cpython-37.pyc,, |
||||
werkzeug/__pycache__/_internal.cpython-37.pyc,, |
||||
werkzeug/__pycache__/_reloader.cpython-37.pyc,, |
||||
werkzeug/__pycache__/datastructures.cpython-37.pyc,, |
||||
werkzeug/__pycache__/exceptions.cpython-37.pyc,, |
||||
werkzeug/__pycache__/filesystem.cpython-37.pyc,, |
||||
werkzeug/__pycache__/formparser.cpython-37.pyc,, |
||||
werkzeug/__pycache__/http.cpython-37.pyc,, |
||||
werkzeug/__pycache__/local.cpython-37.pyc,, |
||||
werkzeug/__pycache__/posixemulation.cpython-37.pyc,, |
||||
werkzeug/__pycache__/routing.cpython-37.pyc,, |
||||
werkzeug/__pycache__/security.cpython-37.pyc,, |
||||
werkzeug/__pycache__/serving.cpython-37.pyc,, |
||||
werkzeug/__pycache__/test.cpython-37.pyc,, |
||||
werkzeug/__pycache__/testapp.cpython-37.pyc,, |
||||
werkzeug/__pycache__/urls.cpython-37.pyc,, |
||||
werkzeug/__pycache__/useragents.cpython-37.pyc,, |
||||
werkzeug/__pycache__/utils.cpython-37.pyc,, |
||||
werkzeug/__pycache__/wsgi.cpython-37.pyc,, |
||||
werkzeug/_compat.py,sha256=oBEVVrJT4sqYdIZbUWmgV9T9w257RhTSDBlTjh0Zbb0,6431 |
||||
werkzeug/_internal.py,sha256=Wx7cpTRWqeBd0LAqobo0lCO4pNUW4oav6XKf7Taumgk,14590 |
||||
werkzeug/_reloader.py,sha256=8B8T1npsQT-96nGeVJjV1KXWK_ong6ZlTXOWgxfRLpg,11241 |
||||
werkzeug/contrib/__init__.py,sha256=EvNyiiCF49j5P0fZYJ3ZGe82ofXdSBvUNqWFwwBMibQ,553 |
||||
werkzeug/contrib/__pycache__/__init__.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/atom.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/cache.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/fixers.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/iterio.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/lint.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/profiler.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/sessions.cpython-37.pyc,, |
||||
werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc,, |
||||
werkzeug/contrib/atom.py,sha256=KpPJcTfzNW1J0VNQckCbVtVGBe3V8s451tOUya4qByI,15415 |
||||
werkzeug/contrib/cache.py,sha256=AEh5UIw-Ui7sHZnlpvrD7ueOKUhCaAD55FXiPtXbbRs,32115 |
||||
werkzeug/contrib/fixers.py,sha256=peEtAiIWYT5bh00EWEPOGKzGZXivOzVhhzKPvvzk1RM,9193 |
||||
werkzeug/contrib/iterio.py,sha256=KKHa_8aCF_uhoeQVyPGUwrivuB6y6nNdXYo2D2vzOA8,10928 |
||||
werkzeug/contrib/lint.py,sha256=NdIxP0E2kVt1xDIxoaIz3Rcl8ZdgmHaFbGTOaybGpN4,296 |
||||
werkzeug/contrib/profiler.py,sha256=k_oMLU-AtsVvQ9TxNdermY6FuzSTYr-WE-ZmWb_DMyU,1229 |
||||
werkzeug/contrib/securecookie.py,sha256=xbtElskGmtbiApgOJ5WhGgqGDs_68_PcWzqDIAY_QZY,13076 |
||||
werkzeug/contrib/sessions.py,sha256=oVXh_7-6_CWOMxDKqcaK05H8RpYoWqAd3al-KzMFPYs,13042 |
||||
werkzeug/contrib/wrappers.py,sha256=ZmNk0wpzD66yomPnQxapndZQs4c0kNJaRzqI-BVxeQk,13199 |
||||
werkzeug/datastructures.py,sha256=8HoA4Gu9i7ZWi5OBjx244OLWvDEE4JTQQUUTRoAYKog,91761 |
||||
werkzeug/debug/__init__.py,sha256=Bo3HvgTNY4NQ_2jROTSk3r1ScZcT_g_4EnuHTjKyrKM,18275 |
||||
werkzeug/debug/__pycache__/__init__.cpython-37.pyc,, |
||||
werkzeug/debug/__pycache__/console.cpython-37.pyc,, |
||||
werkzeug/debug/__pycache__/repr.cpython-37.pyc,, |
||||
werkzeug/debug/__pycache__/tbtools.cpython-37.pyc,, |
||||
werkzeug/debug/console.py,sha256=HoBL21bbcmtiCLqiLDJLZi1LYnWMZxjoXYH5WaZB1XY,5469 |
||||
werkzeug/debug/repr.py,sha256=lIwuhbyrMwVe3P_cFqNyqzHL7P93TLKod7lw9clydEw,9621 |
||||
werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 |
||||
werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 |
||||
werkzeug/debug/shared/debugger.js,sha256=rOhqZMRfpZnnu6_XCGn6wMWPhtfwRAcyZKksdIxPJas,6400 |
||||
werkzeug/debug/shared/jquery.js,sha256=FgpCb_KJQlLNfOu91ta32o_NMZxltwRo8QtmkMRdAu8,86927 |
||||
werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 |
||||
werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 |
||||
werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818 |
||||
werkzeug/debug/shared/style.css,sha256=_Y98F6dR2CBUZNKylsOdgSHjwVaVy717WqE3-xJVcmE,6581 |
||||
werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 |
||||
werkzeug/debug/tbtools.py,sha256=SkAAA4KKfwsXJinUbf-AEP4GqONTsR4uU7WPUloXcSE,20318 |
||||
werkzeug/exceptions.py,sha256=SNbLn_vitnNiG_nwirLT0k6Nf6CZ_1R0Fyk_ub2XCbE,23230 |
||||
werkzeug/filesystem.py,sha256=HzKl-j0Hd8Jl66j778UbPTAYNnY6vUZgYLlBZ0e7uw0,2101 |
||||
werkzeug/formparser.py,sha256=tN6SO4mn6RUsxRZq4qVBWXbNWNuasn2KaBznTieMaVk,21790 |
||||
werkzeug/http.py,sha256=t0ET2tySAf9ZWdEelVWJoLaZzFViYpjoUmiYHPz10-E,43304 |
||||
werkzeug/local.py,sha256=USVEcgIg-oCiUJFPIecFIW9jkIejfw4Fjf1u5yN-Np4,14456 |
||||
werkzeug/middleware/__init__.py,sha256=f1SFZo67IlW4k1uqKzNHxYQlsakUS-D6KK_j0e3jjwQ,549 |
||||
werkzeug/middleware/__pycache__/__init__.cpython-37.pyc,, |
||||
werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc,, |
||||
werkzeug/middleware/__pycache__/http_proxy.cpython-37.pyc,, |
||||
werkzeug/middleware/__pycache__/lint.cpython-37.pyc,, |
||||
werkzeug/middleware/__pycache__/profiler.cpython-37.pyc,, |
||||
werkzeug/middleware/__pycache__/proxy_fix.cpython-37.pyc,, |
||||
werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc,, |
||||
werkzeug/middleware/dispatcher.py,sha256=_-KoMzHtcISHS7ouWKAOraqlCLprdh83YOAn_8DjLp8,2240 |
||||
werkzeug/middleware/http_proxy.py,sha256=lRjTdMmghHiZuZrS7_UJ3gZc-vlFizhBbFZ-XZPLwIA,7117 |
||||
werkzeug/middleware/lint.py,sha256=ItTwuWJnflF8xMT1uqU_Ty1ryhux-CjeUfskqaUpxsw,12967 |
||||
werkzeug/middleware/profiler.py,sha256=8B_s23d6BGrU_q54gJsm6kcCbOJbTSqrXCsioHON0Xs,4471 |
||||
werkzeug/middleware/proxy_fix.py,sha256=Y86VcU2oAQ--x0mi4iFVJyEFMzp3Ao8q0zvr_SsrpNw,8506 |
||||
werkzeug/middleware/shared_data.py,sha256=6aUzMABeOLul0Krf5S_hs-T7oUc7ZIQ3B8tAO4p8C7E,8541 |
||||
werkzeug/posixemulation.py,sha256=gSSiv1SCmOyzOM_nq1ZaZCtxP__C5MeDJl_4yXJmi4Q,3541 |
||||
werkzeug/routing.py,sha256=51zsLuN3qZcpRxpy3K3XoEuL8kyFfuqo28MquJsjZjw,72902 |
||||
werkzeug/security.py,sha256=mfxfcM-D6U8LhsyDK5W_rnL1oVTZWgyt-E8E4FlSdrI,8026 |
||||
werkzeug/serving.py,sha256=tUFUMg7Bj9iw3nA8ZgC_czMDJJKN7vFskajEmgEFhzE,36597 |
||||
werkzeug/test.py,sha256=Cnb5xa3vLDL0hzFCH1fkG_YRpndViGQgCh4D744iSQk,40645 |
||||
werkzeug/testapp.py,sha256=hcKBzorVlSHC-uGvGXXjCm3FzCwGWq4yjbTG3Pr7MV8,9301 |
||||
werkzeug/urls.py,sha256=8yHdYI99N__-isoTwvGqvuj9QhOh66dd1Xh1DIp0q0g,39261 |
||||
werkzeug/useragents.py,sha256=FIonyUF790Ro8OG8cJqG1zixhg5YzXdHmkZbrnK0QRo,5965 |
||||
werkzeug/utils.py,sha256=O20Y0qWk5O1IWamC_A5gkmzR5cgBd3yDIHviwBTfNB0,27387 |
||||
werkzeug/wrappers/__init__.py,sha256=S4VioKAmF_av9Ec9zQvG71X1EOkYfPx1TYck9jyDiyY,1384 |
||||
werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc,, |
||||
werkzeug/wrappers/__pycache__/accept.cpython-37.pyc,, |
||||
werkzeug/wrappers/__pycache__/auth.cpython-37.pyc,, |
||||
werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc,, |
||||
werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc,, |
||||
werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc,, |
||||
werkzeug/wrappers/__pycache__/etag.cpython-37.pyc,, |
||||
werkzeug/wrappers/__pycache__/json.cpython-37.pyc,, |
||||
werkzeug/wrappers/__pycache__/request.cpython-37.pyc,, |
||||
werkzeug/wrappers/__pycache__/response.cpython-37.pyc,, |
||||
werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc,, |
||||
werkzeug/wrappers/accept.py,sha256=TIvjUc0g73fhTWX54wg_D9NNzKvpnG1X8u1w26tK1o8,1760 |
||||
werkzeug/wrappers/auth.py,sha256=Pmn6iaGHBrUyHbJpW0lZhO_q9RVoAa5QalaTqcavdAI,1158 |
||||
werkzeug/wrappers/base_request.py,sha256=k5mu1UU99X_xrPqmXj44pzJbkPRpgvwMuP2j9vl8QFU,26873 |
||||
werkzeug/wrappers/base_response.py,sha256=ZA1XlxtsbvG4SpbdOEMT5--z7aZM0w6C5y33W8wOXa4,27906 |
||||
werkzeug/wrappers/common_descriptors.py,sha256=OJ8jOwMun4L-BxCuFPkK1vaefx_-Y5IndVXvvn_ems4,12089 |
||||
werkzeug/wrappers/etag.py,sha256=TwMO1fvluXbBqnFTj2DvrCNa3mYhbHYe1UZAVzfXvuU,12533 |
||||
werkzeug/wrappers/json.py,sha256=HvK_A4NpO0sLqgb10sTJcoZydYOwyNiPCJPV7SVgcgE,4343 |
||||
werkzeug/wrappers/request.py,sha256=qPo2zmmBv4HxboywtWZb2pJL8OPXo07BUXBKw2j9Fi8,1338 |
||||
werkzeug/wrappers/response.py,sha256=vDZFEGzDOG0jjmS0uVVjeT3hqRt1hFaf15npnx7RD28,2329 |
||||
werkzeug/wrappers/user_agent.py,sha256=4bTgQKTLQmGUyxOREYOzbeiFP2VwIOE7E14AhUB5NqM,444 |
||||
werkzeug/wsgi.py,sha256=h-zyAeInwE6X6ciSnHI14ImA85adV-F861PmR7UGtRk,36681 |
@ -0,0 +1,6 @@ |
||||
Wheel-Version: 1.0 |
||||
Generator: bdist_wheel (0.33.1) |
||||
Root-Is-Purelib: true |
||||
Tag: py2-none-any |
||||
Tag: py3-none-any |
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,242 @@ |
||||
# Copyright 2009-present MongoDB, Inc. |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
|
||||
from uuid import UUID |
||||
|
||||
from bson.py3compat import PY3 |
||||
|
||||
"""Tools for representing BSON binary data. |
||||
""" |
||||
|
||||
BINARY_SUBTYPE = 0 |
||||
"""BSON binary subtype for binary data. |
||||
|
||||
This is the default subtype for binary data. |
||||
""" |
||||
|
||||
FUNCTION_SUBTYPE = 1 |
||||
"""BSON binary subtype for functions. |
||||
""" |
||||
|
||||
OLD_BINARY_SUBTYPE = 2 |
||||
"""Old BSON binary subtype for binary data. |
||||
|
||||
This is the old default subtype, the current |
||||
default is :data:`BINARY_SUBTYPE`. |
||||
""" |
||||
|
||||
OLD_UUID_SUBTYPE = 3 |
||||
"""Old BSON binary subtype for a UUID. |
||||
|
||||
:class:`uuid.UUID` instances will automatically be encoded |
||||
by :mod:`bson` using this subtype. |
||||
|
||||
.. versionadded:: 2.1 |
||||
""" |
||||
|
||||
UUID_SUBTYPE = 4 |
||||
"""BSON binary subtype for a UUID. |
||||
|
||||
This is the new BSON binary subtype for UUIDs. The |
||||
current default is :data:`OLD_UUID_SUBTYPE`. |
||||
|
||||
.. versionchanged:: 2.1 |
||||
Changed to subtype 4. |
||||
""" |
||||
|
||||
STANDARD = UUID_SUBTYPE |
||||
"""The standard UUID representation. |
||||
|
||||
:class:`uuid.UUID` instances will automatically be encoded to |
||||
and decoded from BSON binary, using RFC-4122 byte order with |
||||
binary subtype :data:`UUID_SUBTYPE`. |
||||
|
||||
.. versionadded:: 3.0 |
||||
""" |
||||
|
||||
PYTHON_LEGACY = OLD_UUID_SUBTYPE |
||||
"""The Python legacy UUID representation. |
||||
|
||||
:class:`uuid.UUID` instances will automatically be encoded to |
||||
and decoded from BSON binary, using RFC-4122 byte order with |
||||
binary subtype :data:`OLD_UUID_SUBTYPE`. |
||||
|
||||
.. versionadded:: 3.0 |
||||
""" |
||||
|
||||
JAVA_LEGACY = 5 |
||||
"""The Java legacy UUID representation. |
||||
|
||||
:class:`uuid.UUID` instances will automatically be encoded to |
||||
and decoded from BSON binary subtype :data:`OLD_UUID_SUBTYPE`, |
||||
using the Java driver's legacy byte order. |
||||
|
||||
.. versionchanged:: 3.6 |
||||
BSON binary subtype 4 is decoded using RFC-4122 byte order. |
||||
.. versionadded:: 2.3 |
||||
""" |
||||
|
||||
CSHARP_LEGACY = 6 |
||||
"""The C#/.net legacy UUID representation. |
||||
|
||||
:class:`uuid.UUID` instances will automatically be encoded to |
||||
and decoded from BSON binary subtype :data:`OLD_UUID_SUBTYPE`, |
||||
using the C# driver's legacy byte order. |
||||
|
||||
.. versionchanged:: 3.6 |
||||
BSON binary subtype 4 is decoded using RFC-4122 byte order. |
||||
.. versionadded:: 2.3 |
||||
""" |
||||
|
||||
ALL_UUID_SUBTYPES = (OLD_UUID_SUBTYPE, UUID_SUBTYPE) |
||||
ALL_UUID_REPRESENTATIONS = (STANDARD, PYTHON_LEGACY, JAVA_LEGACY, CSHARP_LEGACY) |
||||
UUID_REPRESENTATION_NAMES = { |
||||
PYTHON_LEGACY: 'PYTHON_LEGACY', |
||||
STANDARD: 'STANDARD', |
||||
JAVA_LEGACY: 'JAVA_LEGACY', |
||||
CSHARP_LEGACY: 'CSHARP_LEGACY'} |
||||
|
||||
MD5_SUBTYPE = 5 |
||||
"""BSON binary subtype for an MD5 hash. |
||||
""" |
||||
|
||||
USER_DEFINED_SUBTYPE = 128 |
||||
"""BSON binary subtype for any user defined structure. |
||||
""" |
||||
|
||||
|
||||
class Binary(bytes): |
||||
"""Representation of BSON binary data. |
||||
|
||||
This is necessary because we want to represent Python strings as |
||||
the BSON string type. We need to wrap binary data so we can tell |
||||
the difference between what should be considered binary data and |
||||
what should be considered a string when we encode to BSON. |
||||
|
||||
Raises TypeError if `data` is not an instance of :class:`bytes` |
||||
(:class:`str` in python 2) or `subtype` is not an instance of |
||||
:class:`int`. Raises ValueError if `subtype` is not in [0, 256). |
||||
|
||||
.. note:: |
||||
In python 3 instances of Binary with subtype 0 will be decoded |
||||
directly to :class:`bytes`. |
||||
|
||||
:Parameters: |
||||
- `data`: the binary data to represent |
||||
- `subtype` (optional): the `binary subtype |
||||
<http://bsonspec.org/#/specification>`_ |
||||
to use |
||||
""" |
||||
|
||||
_type_marker = 5 |
||||
|
||||
def __new__(cls, data, subtype=BINARY_SUBTYPE): |
||||
if not isinstance(data, bytes): |
||||
raise TypeError("data must be an instance of bytes") |
||||
if not isinstance(subtype, int): |
||||
raise TypeError("subtype must be an instance of int") |
||||
if subtype >= 256 or subtype < 0: |
||||
raise ValueError("subtype must be contained in [0, 256)") |
||||
self = bytes.__new__(cls, data) |
||||
self.__subtype = subtype |
||||
return self |
||||
|
||||
@property |
||||
def subtype(self): |
||||
"""Subtype of this binary data. |
||||
""" |
||||
return self.__subtype |
||||
|
||||
def __getnewargs__(self): |
||||
# Work around http://bugs.python.org/issue7382 |
||||
data = super(Binary, self).__getnewargs__()[0] |
||||
if PY3 and not isinstance(data, bytes): |
||||
data = data.encode('latin-1') |
||||
return data, self.__subtype |
||||
|
||||
def __eq__(self, other): |
||||
if isinstance(other, Binary): |
||||
return ((self.__subtype, bytes(self)) == |
||||
(other.subtype, bytes(other))) |
||||
# We don't return NotImplemented here because if we did then |
||||
# Binary("foo") == "foo" would return True, since Binary is a |
||||
# subclass of str... |
||||
return False |
||||
|
||||
def __hash__(self): |
||||
return super(Binary, self).__hash__() ^ hash(self.__subtype) |
||||
|
||||
def __ne__(self, other): |
||||
return not self == other |
||||
|
||||
def __repr__(self): |
||||
return "Binary(%s, %s)" % (bytes.__repr__(self), self.__subtype) |
||||
|
||||
|
||||
class UUIDLegacy(Binary): |
||||
"""UUID wrapper to support working with UUIDs stored as PYTHON_LEGACY. |
||||
|
||||
.. doctest:: |
||||
|
||||
>>> import uuid |
||||
>>> from bson.binary import Binary, UUIDLegacy, STANDARD |
||||
>>> from bson.codec_options import CodecOptions |
||||
>>> my_uuid = uuid.uuid4() |
||||
>>> coll = db.get_collection('test', |
||||
... CodecOptions(uuid_representation=STANDARD)) |
||||
>>> coll.insert_one({'uuid': Binary(my_uuid.bytes, 3)}).inserted_id |
||||
ObjectId('...') |
||||
>>> coll.count_documents({'uuid': my_uuid}) |
||||
0 |
||||
>>> coll.count_documents({'uuid': UUIDLegacy(my_uuid)}) |
||||
1 |
||||
>>> coll.find({'uuid': UUIDLegacy(my_uuid)})[0]['uuid'] |
||||
UUID('...') |
||||
>>> |
||||
>>> # Convert from subtype 3 to subtype 4 |
||||
>>> doc = coll.find_one({'uuid': UUIDLegacy(my_uuid)}) |
||||
>>> coll.replace_one({"_id": doc["_id"]}, doc).matched_count |
||||
1 |
||||
>>> coll.count_documents({'uuid': UUIDLegacy(my_uuid)}) |
||||
0 |
||||
>>> coll.count_documents({'uuid': {'$in': [UUIDLegacy(my_uuid), my_uuid]}}) |
||||
1 |
||||
>>> coll.find_one({'uuid': my_uuid})['uuid'] |
||||
UUID('...') |
||||
|
||||
Raises TypeError if `obj` is not an instance of :class:`~uuid.UUID`. |
||||
|
||||
:Parameters: |
||||
- `obj`: An instance of :class:`~uuid.UUID`. |
||||
""" |
||||
|
||||
def __new__(cls, obj): |
||||
if not isinstance(obj, UUID): |
||||
raise TypeError("obj must be an instance of uuid.UUID") |
||||
self = Binary.__new__(cls, obj.bytes, OLD_UUID_SUBTYPE) |
||||
self.__uuid = obj |
||||
return self |
||||
|
||||
def __getnewargs__(self): |
||||
# Support copy and deepcopy |
||||
return (self.__uuid,) |
||||
|
||||
@property |
||||
def uuid(self): |
||||
"""UUID instance wrapped by this UUIDLegacy instance. |
||||
""" |
||||
return self.__uuid |
||||
|
||||
def __repr__(self): |
||||
return "UUIDLegacy('%s')" % self.__uuid |
@ -0,0 +1,99 @@ |
||||
# Copyright 2009-present MongoDB, Inc. |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
|
||||
"""Tools for representing JavaScript code in BSON. |
||||
""" |
||||
|
||||
from bson.py3compat import abc, string_type, PY3, text_type |
||||
|
||||
|
||||
class Code(str): |
||||
"""BSON's JavaScript code type. |
||||
|
||||
Raises :class:`TypeError` if `code` is not an instance of |
||||
:class:`basestring` (:class:`str` in python 3) or `scope` |
||||
is not ``None`` or an instance of :class:`dict`. |
||||
|
||||
Scope variables can be set by passing a dictionary as the `scope` |
||||
argument or by using keyword arguments. If a variable is set as a |
||||
keyword argument it will override any setting for that variable in |
||||
the `scope` dictionary. |
||||
|
||||
:Parameters: |
||||
- `code`: A string containing JavaScript code to be evaluated or another |
||||
instance of Code. In the latter case, the scope of `code` becomes this |
||||
Code's :attr:`scope`. |
||||
- `scope` (optional): dictionary representing the scope in which |
||||
`code` should be evaluated - a mapping from identifiers (as |
||||
strings) to values. Defaults to ``None``. This is applied after any |
||||
scope associated with a given `code` above. |
||||
- `**kwargs` (optional): scope variables can also be passed as |
||||
keyword arguments. These are applied after `scope` and `code`. |
||||
|
||||
.. versionchanged:: 3.4 |
||||
The default value for :attr:`scope` is ``None`` instead of ``{}``. |
||||
|
||||
""" |
||||
|
||||
_type_marker = 13 |
||||
|
||||
def __new__(cls, code, scope=None, **kwargs): |
||||
if not isinstance(code, string_type): |
||||
raise TypeError("code must be an " |
||||
"instance of %s" % (string_type.__name__)) |
||||
|
||||
if not PY3 and isinstance(code, text_type): |
||||
self = str.__new__(cls, code.encode('utf8')) |
||||
else: |
||||
self = str.__new__(cls, code) |
||||
|
||||
try: |
||||
self.__scope = code.scope |
||||
except AttributeError: |
||||
self.__scope = None |
||||
|
||||
if scope is not None: |
||||
if not isinstance(scope, abc.Mapping): |
||||
raise TypeError("scope must be an instance of dict") |
||||
if self.__scope is not None: |
||||
self.__scope.update(scope) |
||||
else: |
||||
self.__scope = scope |
||||
|
||||
if kwargs: |
||||
if self.__scope is not None: |
||||
self.__scope.update(kwargs) |
||||
else: |
||||
self.__scope = kwargs |
||||
|
||||
return self |
||||
|
||||
@property |
||||
def scope(self): |
||||
"""Scope dictionary for this instance or ``None``. |
||||
""" |
||||
return self.__scope |
||||
|
||||
def __repr__(self): |
||||
return "Code(%s, %r)" % (str.__repr__(self), self.__scope) |
||||
|
||||
def __eq__(self, other): |
||||
if isinstance(other, Code): |
||||
return (self.__scope, str(self)) == (other.__scope, str(other)) |
||||
return False |
||||
|
||||
__hash__ = None |
||||
|
||||
def __ne__(self, other): |
||||
return not self == other |
@ -0,0 +1,334 @@ |
||||
# Copyright 2014-present MongoDB, Inc. |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
|
||||
"""Tools for specifying BSON codec options.""" |
||||
|
||||
import datetime |
||||
|
||||
from abc import abstractmethod |
||||
from collections import namedtuple |
||||
|
||||
from bson.py3compat import ABC, abc, abstractproperty, string_type |
||||
|
||||
from bson.binary import (ALL_UUID_REPRESENTATIONS, |
||||
PYTHON_LEGACY, |
||||
UUID_REPRESENTATION_NAMES) |
||||
|
||||
|
||||
_RAW_BSON_DOCUMENT_MARKER = 101 |
||||
|
||||
|
||||
def _raw_document_class(document_class): |
||||
"""Determine if a document_class is a RawBSONDocument class.""" |
||||
marker = getattr(document_class, '_type_marker', None) |
||||
return marker == _RAW_BSON_DOCUMENT_MARKER |
||||
|
||||
|
||||
class TypeEncoder(ABC): |
||||
"""Base class for defining type codec classes which describe how a |
||||
custom type can be transformed to one of the types BSON understands. |
||||
|
||||
Codec classes must implement the ``python_type`` attribute, and the |
||||
``transform_python`` method to support encoding. |
||||
|
||||
See :ref:`custom-type-type-codec` documentation for an example. |
||||
""" |
||||
@abstractproperty |
||||
def python_type(self): |
||||
"""The Python type to be converted into something serializable.""" |
||||
pass |
||||
|
||||
@abstractmethod |
||||
def transform_python(self, value): |
||||
"""Convert the given Python object into something serializable.""" |
||||
pass |
||||
|
||||
|
||||
class TypeDecoder(ABC): |
||||
"""Base class for defining type codec classes which describe how a |
||||
BSON type can be transformed to a custom type. |
||||
|
||||
Codec classes must implement the ``bson_type`` attribute, and the |
||||
``transform_bson`` method to support decoding. |
||||
|
||||
See :ref:`custom-type-type-codec` documentation for an example. |
||||
""" |
||||
@abstractproperty |
||||
def bson_type(self): |
||||
"""The BSON type to be converted into our own type.""" |
||||
pass |
||||
|
||||
@abstractmethod |
||||
def transform_bson(self, value): |
||||
"""Convert the given BSON value into our own type.""" |
||||
pass |
||||
|
||||
|
||||
class TypeCodec(TypeEncoder, TypeDecoder): |
||||
"""Base class for defining type codec classes which describe how a |
||||
custom type can be transformed to/from one of the types :mod:`bson` |
||||
can already encode/decode. |
||||
|
||||
Codec classes must implement the ``python_type`` attribute, and the |
||||
``transform_python`` method to support encoding, as well as the |
||||
``bson_type`` attribute, and the ``transform_bson`` method to support |
||||
decoding. |
||||
|
||||
See :ref:`custom-type-type-codec` documentation for an example. |
||||
""" |
||||
pass |
||||
|
||||
|
||||
class TypeRegistry(object): |
||||
"""Encapsulates type codecs used in encoding and / or decoding BSON, as |
||||
well as the fallback encoder. Type registries cannot be modified after |
||||
instantiation. |
||||
|
||||
``TypeRegistry`` can be initialized with an iterable of type codecs, and |
||||
a callable for the fallback encoder:: |
||||
|
||||
>>> from bson.codec_options import TypeRegistry |
||||
>>> type_registry = TypeRegistry([Codec1, Codec2, Codec3, ...], |
||||
... fallback_encoder) |
||||
|
||||
See :ref:`custom-type-type-registry` documentation for an example. |
||||
|
||||
:Parameters: |
||||
- `type_codecs` (optional): iterable of type codec instances. If |
||||
``type_codecs`` contains multiple codecs that transform a single |
||||
python or BSON type, the transformation specified by the type codec |
||||
occurring last prevails. A TypeError will be raised if one or more |
||||
type codecs modify the encoding behavior of a built-in :mod:`bson` |
||||
type. |
||||
- `fallback_encoder` (optional): callable that accepts a single, |
||||
unencodable python value and transforms it into a type that |
||||
:mod:`bson` can encode. See :ref:`fallback-encoder-callable` |
||||
documentation for an example. |
||||
""" |
||||
def __init__(self, type_codecs=None, fallback_encoder=None): |
||||
self.__type_codecs = list(type_codecs or []) |
||||
self._fallback_encoder = fallback_encoder |
||||
self._encoder_map = {} |
||||
self._decoder_map = {} |
||||
|
||||
if self._fallback_encoder is not None: |
||||
if not callable(fallback_encoder): |
||||
raise TypeError("fallback_encoder %r is not a callable" % ( |
||||
fallback_encoder)) |
||||
|
||||
for codec in self.__type_codecs: |
||||
is_valid_codec = False |
||||
if isinstance(codec, TypeEncoder): |
||||
self._validate_type_encoder(codec) |
||||
is_valid_codec = True |
||||
self._encoder_map[codec.python_type] = codec.transform_python |
||||
if isinstance(codec, TypeDecoder): |
||||
is_valid_codec = True |
||||
self._decoder_map[codec.bson_type] = codec.transform_bson |
||||
if not is_valid_codec: |
||||
raise TypeError( |
||||
"Expected an instance of %s, %s, or %s, got %r instead" % ( |
||||
TypeEncoder.__name__, TypeDecoder.__name__, |
||||
TypeCodec.__name__, codec)) |
||||
|
||||
def _validate_type_encoder(self, codec): |
||||
from bson import _BUILT_IN_TYPES |
||||
for pytype in _BUILT_IN_TYPES: |
||||
if issubclass(codec.python_type, pytype): |
||||
err_msg = ("TypeEncoders cannot change how built-in types are " |
||||
"encoded (encoder %s transforms type %s)" % |
||||
(codec, pytype)) |
||||
raise TypeError(err_msg) |
||||
|
||||
def __repr__(self): |
||||
return ('%s(type_codecs=%r, fallback_encoder=%r)' % ( |
||||
self.__class__.__name__, self.__type_codecs, |
||||
self._fallback_encoder)) |
||||
|
||||
def __eq__(self, other): |
||||
if not isinstance(other, type(self)): |
||||
return NotImplemented |
||||
return ((self._decoder_map == other._decoder_map) and |
||||
(self._encoder_map == other._encoder_map) and |
||||
(self._fallback_encoder == other._fallback_encoder)) |
||||
|
||||
|
||||
_options_base = namedtuple( |
||||
'CodecOptions', |
||||
('document_class', 'tz_aware', 'uuid_representation', |
||||
'unicode_decode_error_handler', 'tzinfo', 'type_registry')) |
||||
|
||||
|
||||
class CodecOptions(_options_base): |
||||
"""Encapsulates options used encoding and / or decoding BSON. |
||||
|
||||
The `document_class` option is used to define a custom type for use |
||||
decoding BSON documents. Access to the underlying raw BSON bytes for |
||||
a document is available using the :class:`~bson.raw_bson.RawBSONDocument` |
||||
type:: |
||||
|
||||
>>> from bson.raw_bson import RawBSONDocument |
||||
>>> from bson.codec_options import CodecOptions |
||||
>>> codec_options = CodecOptions(document_class=RawBSONDocument) |
||||
>>> coll = db.get_collection('test', codec_options=codec_options) |
||||
>>> doc = coll.find_one() |
||||
>>> doc.raw |
||||
'\\x16\\x00\\x00\\x00\\x07_id\\x00[0\\x165\\x91\\x10\\xea\\x14\\xe8\\xc5\\x8b\\x93\\x00' |
||||
|
||||
The document class can be any type that inherits from |
||||
:class:`~collections.MutableMapping`:: |
||||
|
||||
>>> class AttributeDict(dict): |
||||
... # A dict that supports attribute access. |
||||
... def __getattr__(self, key): |
||||
... return self[key] |
||||
... def __setattr__(self, key, value): |
||||
... self[key] = value |
||||
... |
||||
>>> codec_options = CodecOptions(document_class=AttributeDict) |
||||
>>> coll = db.get_collection('test', codec_options=codec_options) |
||||
>>> doc = coll.find_one() |
||||
>>> doc._id |
||||
ObjectId('5b3016359110ea14e8c58b93') |
||||
|
||||
See :doc:`/examples/datetimes` for examples using the `tz_aware` and |
||||
`tzinfo` options. |
||||
|
||||
See :class:`~bson.binary.UUIDLegacy` for examples using the |
||||
`uuid_representation` option. |
||||
|
||||
:Parameters: |
||||
- `document_class`: BSON documents returned in queries will be decoded |
||||
to an instance of this class. Must be a subclass of |
||||
:class:`~collections.MutableMapping`. Defaults to :class:`dict`. |
||||
- `tz_aware`: If ``True``, BSON datetimes will be decoded to timezone |
||||
aware instances of :class:`~datetime.datetime`. Otherwise they will be |
||||
naive. Defaults to ``False``. |
||||
- `uuid_representation`: The BSON representation to use when encoding |
||||
and decoding instances of :class:`~uuid.UUID`. Defaults to |
||||
:data:`~bson.binary.PYTHON_LEGACY`. |
||||
- `unicode_decode_error_handler`: The error handler to apply when |
||||
a Unicode-related error occurs during BSON decoding that would |
||||
otherwise raise :exc:`UnicodeDecodeError`. Valid options include |
||||
'strict', 'replace', and 'ignore'. Defaults to 'strict'. |
||||
- `tzinfo`: A :class:`~datetime.tzinfo` subclass that specifies the |
||||
timezone to/from which :class:`~datetime.datetime` objects should be |
||||
encoded/decoded. |
||||
- `type_registry`: Instance of :class:`TypeRegistry` used to customize |
||||
encoding and decoding behavior. |
||||
|
||||
.. versionadded:: 3.8 |
||||
`type_registry` attribute. |
||||
|
||||
.. warning:: Care must be taken when changing |
||||
`unicode_decode_error_handler` from its default value ('strict'). |
||||
The 'replace' and 'ignore' modes should not be used when documents |
||||
retrieved from the server will be modified in the client application |
||||
and stored back to the server. |
||||
""" |
||||
|
||||
def __new__(cls, document_class=dict, |
||||
tz_aware=False, uuid_representation=PYTHON_LEGACY, |
||||
unicode_decode_error_handler="strict", |
||||
tzinfo=None, type_registry=None): |
||||
if not (issubclass(document_class, abc.MutableMapping) or |
||||
_raw_document_class(document_class)): |
||||
raise TypeError("document_class must be dict, bson.son.SON, " |
||||
"bson.raw_bson.RawBSONDocument, or a " |
||||
"sublass of collections.MutableMapping") |
||||
if not isinstance(tz_aware, bool): |
||||
raise TypeError("tz_aware must be True or False") |
||||
if uuid_representation not in ALL_UUID_REPRESENTATIONS: |
||||
raise ValueError("uuid_representation must be a value " |
||||
"from bson.binary.ALL_UUID_REPRESENTATIONS") |
||||
if not isinstance(unicode_decode_error_handler, (string_type, None)): |
||||
raise ValueError("unicode_decode_error_handler must be a string " |
||||
"or None") |
||||
if tzinfo is not None: |
||||
if not isinstance(tzinfo, datetime.tzinfo): |
||||
raise TypeError( |
||||
"tzinfo must be an instance of datetime.tzinfo") |
||||
if not tz_aware: |
||||
raise ValueError( |
||||
"cannot specify tzinfo without also setting tz_aware=True") |
||||
|
||||
type_registry = type_registry or TypeRegistry() |
||||
|
||||
if not isinstance(type_registry, TypeRegistry): |
||||
raise TypeError("type_registry must be an instance of TypeRegistry") |
||||
|
||||
return tuple.__new__( |
||||
cls, (document_class, tz_aware, uuid_representation, |
||||
unicode_decode_error_handler, tzinfo, type_registry)) |
||||
|
||||
def _arguments_repr(self): |
||||
"""Representation of the arguments used to create this object.""" |
||||
document_class_repr = ( |
||||
'dict' if self.document_class is dict |
||||
else repr(self.document_class)) |
||||
|
||||
uuid_rep_repr = UUID_REPRESENTATION_NAMES.get(self.uuid_representation, |
||||
self.uuid_representation) |
||||
|
||||
return ('document_class=%s, tz_aware=%r, uuid_representation=%s, ' |
||||
'unicode_decode_error_handler=%r, tzinfo=%r, ' |
||||
'type_registry=%r' % |
||||
(document_class_repr, self.tz_aware, uuid_rep_repr, |
||||
self.unicode_decode_error_handler, self.tzinfo, |
||||
self.type_registry)) |
||||
|
||||
def __repr__(self): |
||||
return '%s(%s)' % (self.__class__.__name__, self._arguments_repr()) |
||||
|
||||
def with_options(self, **kwargs): |
||||
"""Make a copy of this CodecOptions, overriding some options:: |
||||
|
||||
>> |